Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/presentation3/src/modules/questsystem/notifications/NotificationQueue.h @ 7038

Last change on this file since 7038 was 6945, checked in by dafrick, 15 years ago

A lot of cleanup, mostly increasing output levels, which means, that the console is no longer cluttered by lots and lots of Quest-stuff (the log file still is, but that should be ok…).
Also some possible bugs (or let's say pitfalls) removed, which have been around for a long time and didn't cause any problems so far. Now they never will.
Also, regarding my previous commit. Quests seem tu work just fine, even the second time the level is loaded, which is awesome.

Ergo: Questsystem/Notificationsystem segfault upon loading a level with Quests/Notifications in it twice is now officially resolved.

  • Property svn:eol-style set to native
File size: 9.4 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
31    @brief Definition of the NotificationQueue class.
32*/
33
34#ifndef _NotificationOueue_H__
35#define _NotificationOueue_H__
36
37#include "questsystem/QuestsystemPrereqs.h"
38
39#include <ctime>
40#include <map>
41#include <set>
42#include <string>
43
44#include "util/Math.h"
45#include "tools/interfaces/Tickable.h"
46#include "overlays/OverlayGroup.h"
47#include "interfaces/NotificationListener.h"
48
49namespace orxonox
50{
51
52    //! Container to allow easy handling.
53    struct NotificationOverlayContainer
54    {
55        NotificationOverlay* overlay; //!< Pointer to the NotificationOverlay, everything is about.
56        Notification* notification; //!< The Notification displayed by the overlay.
57        time_t time; //!< The time the Notification was sent and thus first displayed.
58        std::string name; //!< The name of the overlay.
59    };
60
61    //! Struct to allow ordering of NotificationOverlayContainers.
62    struct NotificationOverlayContainerCompare {
63        bool operator() (const NotificationOverlayContainer* const & a, const NotificationOverlayContainer* const & b) const
64            { return a->time < b->time; } //!< Ordered by time.
65    };
66
67    /**
68    @brief
69        Displays Notifications from specific senders.
70        Beware! The NotificationQueue is an OverlayGruop and thus cannot be be a sub-element of an OverlayGroup (at least no for now.)
71
72        Creating a NotificationQueue through XML goes as follows:
73        Be aware that the NotificationQueue must be inside the <Level></Level> tags or bad things will happen.
74        <NotificationQueue
75            name = "SuperQueue" //Name of your OverlayQueue.
76            maxSize = "5" //The maximum size of Notifications displayed.
77            notificationLength = "64" //The maximum number of characters of a Notification, that are displayed. (Default is 5)
78            displayTime = "30" //The time a Notification is displayed in seconds. (Default is 30)
79            targets = "target1, target2" //The senders this NotificationQueue displays Notifications from. (all, if all Notifications should be displayed.)
80            font = "VeraMono" //The font (Default is VeraMono)
81            fontSize = '0.4' //The font size. (Default is 0.025)
82            position = "0.0, .0.0" //The position of the NotificationQueue. (Default is 0.0,0.0)
83        />
84    @author
85        Damian 'Mozork' Frick
86    */
87
88    class _QuestsystemExport NotificationQueue : public OverlayGroup, public Tickable, public NotificationListener
89    {
90
91        public:
92            NotificationQueue(BaseObject* creator);
93            virtual ~NotificationQueue();
94
95            virtual void XMLPort(Element& xmlElement, XMLPort::Mode mode); //!< Method for creating a NotificationQueue object through XML.
96
97            virtual void tick(float dt); //!< To update from time to time.
98
99            void update(void); //!< Updates the queue.
100            void update(Notification* notification, const std::time_t & time); //!< Adds a Notification to the queue.
101
102            /**
103            @brief Returns the maximum number of Notifications displayed.
104            @return Returns maximum size.
105            */
106            inline int getMaxSize() const
107                { return this->maxSize_; }
108            /**
109            @brief Returns the current number of Notifications displayed.
110            @return Returns the size of the queue.
111            */
112            inline int getSize() const
113                { return this->size_; }
114            /**
115            @brief Returns the maximum length in characters a Notification message is allowed to have.
116            @return Returns the maximum Notification length.
117            */
118            inline int getNotificationLength() const
119                { return this->notificationLength_; }
120            /**
121            @brief Returns the time interval the Notification is displayed.
122            @return Returns the display time.
123            */
124            inline int getDisplayTime() const
125                { return this->displayTime_; }
126            /**
127            @brief Returns the position of the NotificationQueue.
128            @return Returns the position.
129            */
130            inline const Vector2 & getPosition() const
131                { return this->position_; }
132            /**
133            @brief Returns the font size used to display the Notifications.
134            @return  Returns the font size.
135            */
136            inline float getFontSize() const
137                { return this->fontSize_; }
138            /**
139            @brief Returns the font used to display the Notifications.
140            @return Returns the font.
141            */
142            inline const std::string & getFont() const
143                { return this->font_; }
144
145            /**
146            @brief Returns the targets of this queue, reps. the senders which Notifications are displayed in this queue.
147            @return Retuns a set of string holding the different targets.
148            */
149            inline const std::set<std::string> & getTargetsSet()
150                { return this->targets_; }
151            bool getTargets(std::string* string) const; //!< Returns a string consisting of the concatination of the targets.
152
153            /**
154            @brief Sets the position of the NotificationQueue.
155            @param pos The position.
156            */
157            inline void setPosition(Vector2 pos)
158                { this->position_ = pos; this->positionChanged(); }
159
160            void scroll(const Vector2 pos); //!< Scrolls the NotificationQueue, meaning all NotificationOverlays are moved the input vector.
161
162        private:
163            static const int DEFAULT_SIZE = 5; //!< The default maximum number of Notifications displayed.
164            static const int DEFAULT_LENGTH = 64; //!< The default maximum number of Notifications displayed.
165            static const int DEFAULT_DISPLAY_TIME = 30; //!< The default display time.
166            static const float DEFAULT_FONT_SIZE; //!< The default font size.
167
168            static const std::string DEFAULT_FONT; //!< The default font.
169            static const Vector2 DEFAULT_POSITION; //!< the default position.
170
171            int maxSize_; //!< The maximal number of Notifications displayed.
172            int size_; //!< The number of Notifications displayed.
173            int notificationLength_; //!< The maximal number of characters a Notification-message is allowed to have.
174            int displayTime_; //!< The time a Notification is displayed.
175            Vector2 position_; //!< The position of the NotificationQueue.
176
177            std::set<std::string> targets_; //!< The targets the Queue displays Notifications of.
178
179            float fontSize_; //!< The font size.
180            std::string font_; //!< The font.
181
182            std::multiset<NotificationOverlayContainer*, NotificationOverlayContainerCompare> containers_; //!< Multiset, because the ordering is based on, not necessarily unique, timestamps.
183            std::map<Notification*, NotificationOverlayContainer*> overlays_; //!< Mapping notifications to their corresponding overlay containers, for easier association and finding.
184
185            float tickTime_; //!< Helper variable, to not have to check for overlays that have been displayed too long, every tick.
186            NotificationOverlayContainer timeLimit_; //!< Helper object to check against to determine whether Notifications have expired.
187
188            bool registered_; //!< Helper variable to remember whether the NotificationQueue is registered already.
189
190            void initialize(void); //!< Initializes the object.
191            void setDefaults(void); //!< Helper method to set the default values.
192
193            bool setMaxSize(int size); //!< Sets the maximum number of displayed Notifications.
194            bool setNotificationLength(int length); //!< Sets the maximum number of characters a Notification message displayed by this queue is allowed to have.
195            bool setDisplayTime(int time); //!< Sets the maximum number of seconds a Notification is displayed.
196
197            bool setTargets(const std::string & targets); //!< Set the targets of this queue.
198
199            bool setFontSize(float size); //!< Set the font size.
200            bool setFont(const std::string & font); //!< Set the font.
201
202            void positionChanged(void); //!< Aligns all the Notifications to the position of the NotificationQueue.
203
204            void addNotification(Notification* notification, const std::time_t & time); //!< Add a notification to the queue.
205            bool removeContainer(NotificationOverlayContainer* container); //!< Remove a container from the queue.
206
207            void clear(void); //!< Clear the queue.
208
209    };
210
211}
212
213#endif /* _NotificationOverlay_H__ */
Note: See TracBrowser for help on using the repository browser.