Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/presentation/src/modules/notifications/NotificationQueueCEGUI.cc @ 8652

Last change on this file since 8652 was 8651, checked in by scheusso, 14 years ago

first attempt to make notifications synchronisable
not yet succeeded though (some callbacks missing)

  • Property svn:eol-style set to native
File size: 12.8 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Damian 'Mozork' Frick
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29/**
30    @file NotificationQueueCEGUI.cc
31    @brief Implementation of the NotificationQueueCEGUI class.
32*/
33
34#include "NotificationQueueCEGUI.h"
35
36#include <sstream>
37
38#include "core/CoreIncludes.h"
39#include "core/GameMode.h"
40#include "core/GUIManager.h"
41#include "core/LuaState.h"
42#include "util/Convert.h"
43
44#include "ToluaBindNotifications.h"
45
46namespace orxonox
47{
48
49    CreateFactory(NotificationQueueCEGUI);
50
51    // Register tolua_open function when loading the library.
52    DeclareToluaInterface(Notifications);
53
54    /*static*/ const std::string NotificationQueueCEGUI::NOTIFICATION_LAYER("NotificationLayer");
55
56    NotificationQueueCEGUI::NotificationQueueCEGUI(BaseObject* creator) : NotificationQueue(creator)
57    {
58        RegisterObject(NotificationQueueCEGUI);
59
60        this->initialize();
61        this->registerVariables();
62    }
63   
64    NotificationQueueCEGUI::~NotificationQueueCEGUI()
65    {
66        if(GameMode::showsGraphics())
67            GUIManager::getInstance().getLuaState()->doString(NotificationQueueCEGUI::NOTIFICATION_LAYER + ".removeQueue(\"" + this->getName() +  "\")");
68    }
69
70    /**
71    @brief
72        Initializes The NotificationQueueCEGUI.
73    */
74    void NotificationQueueCEGUI::initialize(void)
75    {
76        this->displaySize_ = Vector4(1.0, 0.0, 0.0, 0.0);
77        this->position_ = Vector4(0.0, 0.0, 0.0, 0.0);
78        this->alignment_ = "LeftAligned";
79        this->fontSize_ = 12;
80        this->fontColor_ = Vector4(1.0, 1.0, 1.0, 1.0);
81        this->fontColorStr_ = "FFFFFFFF";
82    }
83
84    void NotificationQueueCEGUI::XMLPort(Element& xmlelement, XMLPort::Mode mode)
85    {
86        SUPER(NotificationQueueCEGUI, XMLPort, xmlelement, mode);
87
88        XMLPortParam(NotificationQueueCEGUI, "position", setPosition, getPosition, xmlelement, mode);
89        XMLPortParam(NotificationQueueCEGUI, "fontSize", setFontSize, getFontSize, xmlelement, mode);
90        XMLPortParam(NotificationQueueCEGUI, "fontColor", setFontColor, getFontColor, xmlelement, mode);
91        XMLPortParam(NotificationQueueCEGUI, "alignment", setAlignment, getAlignment, xmlelement, mode);
92        XMLPortParam(NotificationQueueCEGUI, "displaySize", setDisplaySize, getDisplaySize, xmlelement, mode);
93    }
94   
95    void NotificationQueueCEGUI::registerVariables()
96    {
97        registerVariable( this->position_, VariableDirection::ToClient );
98        registerVariable( this->fontSize_, VariableDirection::ToClient );
99        registerVariable( this->fontColor_, VariableDirection::ToClient );
100        registerVariable( this->alignment_, VariableDirection::ToClient );
101        registerVariable( this->displaySize_, VariableDirection::ToClient );
102    }
103
104    /**
105    @brief
106        Destroys the NotificationQueueCEGUI.
107        Used in lua and NotificationManager.
108    @param noGraphics
109        If this is set to true (false is default), then the queue is not removed in lua. This is used to destroy the queue, after the GUIManager has been destroyed.
110    */
111    void NotificationQueueCEGUI::destroy(bool noGraphics)
112    {
113        // Remove the NotificationQueue in lua.
114        if(GameMode::showsGraphics() && !noGraphics)
115            GUIManager::getInstance().getLuaState()->doString(NotificationQueueCEGUI::NOTIFICATION_LAYER + ".removeQueue(\"" + this->getName() +  "\")");
116
117        NotificationQueue::destroy();
118    }
119
120    /**
121    @brief
122        Set the size of the window that displays the NotificationQueue.
123    @param size
124        The size is a vector with components:
125        - The relative width of the window. (A value between 0 and 1)
126        - The absolute width in pixels. (Additional to the relative width, can be negative)
127        - The relative height of the window. (A value between 0 and 1)
128        - The absolute height in pixels. (Additional to the relative width, can be negative.)
129        If both the 3rd and 4th component of size are set to 0 the height is set such that exactly as many Notifications fit as is the maximum size of the NotificationQueue (in terms of the number of Notifications).
130    */
131    void NotificationQueueCEGUI::setDisplaySize(const Vector4& size)
132    {
133        if(this->displaySize_ == size)
134            return;
135
136        if(size.x < 0.0 || size.x > 1.0 || size.z < 0.0 || size.z > 1.0)
137        {
138            COUT(2) << "The display size of the NotificationQueueCEGUI " << this->getName() << " was trying to be set, but the relative size was not in [0,1]. Aborting..." << endl;
139            return;
140        }
141
142        this->displaySize_ = size;
143        if(GameMode::showsGraphics())
144        {
145            if(size.z == 0.0 && size.w == 0.0)
146                GUIManager::getInstance().getLuaState()->doString(NotificationQueueCEGUI::NOTIFICATION_LAYER + ".resizeQueue(\"" + this->getName() + "\", " + multi_cast<std::string>(this->displaySize_.x) + ", " + multi_cast<std::string>(this->displaySize_.y) + ")");
147            else
148                GUIManager::getInstance().getLuaState()->doString(NotificationQueueCEGUI::NOTIFICATION_LAYER + ".resizeQueue(\"" + this->getName() + "\", " + multi_cast<std::string>(this->displaySize_.x) + ", " + multi_cast<std::string>(this->displaySize_.y) + ", " + multi_cast<std::string>(this->displaySize_.z) + ", " + multi_cast<std::string>(this->displaySize_.w) + ")");
149        }
150    }
151
152    /**
153    @brief
154        Set the position of the window that displays the NotificationQueue.
155    @param position
156        The position is a vector with components:
157        - The relative x-position of the window. (A value between 0 and 1)
158        - The absolute x-position in pixels. (Additional to the relative x-position, can be negative)
159        - The relative y-position of the window. (A value between 0 and 1)
160        - The absolute y-position in pixels. (Additional to the relative y-position, can be negative.)
161    */
162    void NotificationQueueCEGUI::setPosition(const Vector4& position)
163    {
164        if(this->position_ == position)
165            return;
166
167        if(position.x < 0.0 || position.x > 1.0 || position.z < 0.0 || position.z > 1.0)
168        {
169            COUT(2) << "The position the NotificationQueueCEGUI " << this->getName() << " was trying to be set, but the relative position was not in [0,1]. Aborting..." << endl;
170            return;
171        }
172
173        this->position_ = position;
174        if(GameMode::showsGraphics())
175            GUIManager::getInstance().getLuaState()->doString(NotificationQueueCEGUI::NOTIFICATION_LAYER + ".moveQueue(\"" + this->getName() + "\", " + multi_cast<std::string>(this->position_.x) + ", " + multi_cast<std::string>(this->position_.y) + ", " + multi_cast<std::string>(this->position_.z) + ", " + multi_cast<std::string>(this->position_.w) + ")");
176    }
177
178    /**
179    @brief
180        Set the horizontal alignment of the Notifications text.
181    @param alignment
182        The alignment of the Notifications, they are the possible string that the CEGUI Falagard StaticText HorzFormatting property can take.
183    @see http://cegui.org.uk/api_reference/classCEGUI_1_1FalagardStaticTextProperties_1_1HorzFormatting.html
184    */
185    void NotificationQueueCEGUI::setAlignment(const std::string& alignment)
186    {
187        if(this->alignment_ == alignment)
188            return;
189
190        // TODO: Check whether the alignment string is correct?
191        this->alignment_ = alignment;
192        if(GameMode::showsGraphics())
193            GUIManager::getInstance().getLuaState()->doString(NotificationQueueCEGUI::NOTIFICATION_LAYER + ".changeQueueAlignment(\"" + this->getName() + "\", \"" + this->alignment_ + "\")");
194    }
195
196    /**
197    @brief
198        Set the font size of the text displayed by this NotificationQueue.
199    @param size
200        The font size.
201    */
202    void NotificationQueueCEGUI::setFontSize(unsigned int size)
203    {
204        if(this->fontSize_ == size)
205            return;
206
207        this->fontSize_ = size;
208        if(GameMode::showsGraphics())
209            GUIManager::getInstance().getLuaState()->doString(NotificationQueueCEGUI::NOTIFICATION_LAYER + ".changeQueueFontSize(\"" + this->getName() + "\", " + multi_cast<std::string>(this->fontSize_) + ")");
210    }
211
212    /**
213    @brief
214        Set the font color if the text displayed by this NotificationQueue.
215    @param color
216        The color is a vector with the components being RGBA and taking values from 0 to 1.
217    */
218    void NotificationQueueCEGUI::setFontColor(const Vector4& color)
219    {
220        if(this->fontColor_ == color)
221            return;
222
223        this->fontColor_ = color;
224        // Convert to ARGB format.
225        std::stringstream stream;
226        for(unsigned int i = 0; i < 4; i++)
227            stream << std::hex << std::setw(2) << std::setfill('0') << int(this->fontColor_[(i+3)%4]*255);
228        this->fontColorStr_ = stream.str();
229        if(GameMode::showsGraphics())
230            GUIManager::getInstance().getLuaState()->doString(NotificationQueueCEGUI::NOTIFICATION_LAYER + ".changeQueueFontColor(\"" + this->getName() + "\", \"" + this->fontColorStr_ + "\")");
231    }
232
233    /**
234    @brief
235        Get the NotificationQueueCEGUI with the input name.
236    @param name
237        The name of the NotificationQueueCEGUI to be got.
238    @return
239        Returns a pointer to the NotificationQueueCEGUI, or NULL if it doesn't exist.
240    */
241    /*static*/ NotificationQueueCEGUI* NotificationQueueCEGUI::getQueue(const std::string& name)
242    {
243        NotificationQueue* queue = NotificationManager::getInstance().getQueue(name);
244        if(queue == NULL || !queue->isA(Class(NotificationQueueCEGUI)))
245            return NULL;
246        return static_cast<NotificationQueueCEGUI*>(queue);
247    }
248
249    /**
250    @brief
251        Is called by the NotificationQueue when a notification was pushed.
252    @param notification
253        The Notification that was pushed.
254    */
255    void NotificationQueueCEGUI::notificationPushed(Notification* notification)
256    {
257         // Push the Notification to the GUI.
258        if(GameMode::showsGraphics())
259            GUIManager::getInstance().getLuaState()->doString(NotificationQueueCEGUI::NOTIFICATION_LAYER + ".pushNotification(\"" + this->getName() + "\", \"" + notification->getMessage() + "\")");
260    }
261
262    /**
263    @brief
264        Is called by the NotificationQueue when a notification was popped.
265    */
266    void NotificationQueueCEGUI::notificationPopped(void)
267    {
268        // Pops the Notification from the GUI.
269        if(GameMode::showsGraphics())
270            GUIManager::getInstance().getLuaState()->doString(NotificationQueueCEGUI::NOTIFICATION_LAYER + ".popNotification(\"" + this->getName() + "\")");
271    }
272
273    /**
274    @brief Is called when a notification was removed.
275    @param index The index the removed notification was at.
276    */
277    void NotificationQueueCEGUI::notificationRemoved(unsigned int index)
278    {
279        // Removes the Notification from the GUI.
280        if(GameMode::showsGraphics())
281            GUIManager::getInstance().getLuaState()->doString(NotificationQueueCEGUI::NOTIFICATION_LAYER + ".removeNotification(\"" + this->getName() + "\", " + multi_cast<std::string>(index) + ")");
282    }
283
284    /**
285    @brief
286        Clears the NotificationQueue by removing all NotificationContainers.
287    @param noGraphics
288        If this is set to true the GUI is not informed of the clearing of the NotificationQueue. This is needed only internally.
289    */
290    void NotificationQueueCEGUI::clear(bool noGraphics)
291    {
292        NotificationQueue::clear(noGraphics);
293
294        // Clear the NotificationQueue in the GUI.
295        if(GameMode::showsGraphics() && !noGraphics)
296            GUIManager::getInstance().getLuaState()->doString(NotificationQueueCEGUI::NOTIFICATION_LAYER + ".clearQueue(\"" + this->getName() + "\")");
297    }
298
299    /**
300    @brief
301        Creates the NotificationQueue in lua.
302    */
303    void NotificationQueueCEGUI::create(void)
304    {
305        this->NotificationQueue::create();
306       
307        if(this->isRegistered() && GameMode::showsGraphics())
308            GUIManager::getInstance().getLuaState()->doString(NotificationQueueCEGUI::NOTIFICATION_LAYER + ".createQueue(\"" + this->getName() +  "\", " + multi_cast<std::string>(this->getMaxSize()) + ")");
309    }
310
311}
312
Note: See TracBrowser for help on using the repository browser.