Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/libraries/src/orxonox/overlays/notifications/NotificationQueue.h @ 5619

Last change on this file since 5619 was 5619, checked in by landauf, 15 years ago

Moved Notification and NotificationManger from overlays to the quest objects (NotificationOverlay and NotificationQueue remain with the other overlays).

Added a new interface NotificationListener. The NotificationManager sends notifications to all listeners. NotificationQueue is such a listener (through inheritance). This removes another dependency between orxonox and overlays.

  • Property svn:eol-style set to native
File size: 9.2 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 "OrxonoxPrereqs.h"
38
39#include <ctime>
40#include <map>
41#include <set>
42#include <string>
43
44#include "util/Math.h"
45#include "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        <NotificationQueue
74            name = "SuperQueue" //Name of your OverlayQueue.
75            maxSize = "5" //The maximum size of Notifications displayed.
76            notificationLength = "64" //The maximum number of characters of a Notification, that are displayed. (Default is 5)
77            displayTime = "30" //The time a Notification is displayed in seconds. (Default is 30)
78            targets = "target1, target2" //The senders this NotificationQueue displays Notifications from. (all, if all Notifications should be displayed.)
79            font = "VeraMono" //The font (Default is VeraMono)
80            fontSize = '0.4' //The font size. (Default is 0.025)
81            position = "0.0, .0.0" //The position of the NotificationQueue. (Default is 0.0,0.0)
82        />
83    @author
84        Damian 'Mozork' Frick
85    */
86
87    class _OrxonoxExport NotificationQueue : public OverlayGroup, public Tickable, public NotificationListener
88    {
89
90        public:
91            NotificationQueue(BaseObject* creator);
92            virtual ~NotificationQueue();
93
94            virtual void XMLPort(Element& xmlElement, XMLPort::Mode mode); //!< Method for creating a NotificationQueue object through XML.
95
96            virtual void tick(float dt); //!< To update from time to time.
97
98            void update(void); //!< Updates the queue.
99            void update(Notification* notification, const std::time_t & time); //!< Adds a Notification to the queue.
100
101            /**
102            @brief Returns the maximum number of Notifications displayed.
103            @return Returns maximum size.
104            */
105            inline int getMaxSize() const
106                { return this->maxSize_; }
107            /**
108            @brief Returns the current number of Notifications displayed.
109            @return Returns the size of the queue.
110            */
111            inline int getSize() const
112                { return this->size_; }
113            /**
114            @brief Returns the maximum length in characters a Notification message is allowed to have.
115            @return Returns the maximum Notification length.
116            */
117            inline int getNotificationLength() const
118                { return this->notificationLength_; }
119            /**
120            @brief Returns the time interval the Notification is displayed.
121            @return Returns the display time.
122            */
123            inline int getDisplayTime() const
124                { return this->displayTime_; }
125            /**
126            @brief Returns the position of the NotificationQueue.
127            @return Returns the position.
128            */
129            inline const Vector2 & getPosition() const
130                { return this->position_; }
131            /**
132            @brief Returns the font size used to display the Notifications.
133            @return  Returns the font size.
134            */
135            inline float getFontSize() const
136                { return this->fontSize_; }
137            /**
138            @brief Returns the font used to display the Notifications.
139            @return Returns the font.
140            */
141            inline const std::string & getFont() const
142                { return this->font_; }
143
144            /**
145            @brief Returns the targets of this queue, reps. the senders which Notifications are displayed in this queue.
146            @return Retuns a set of string holding the different targets.
147            */
148            inline const std::set<std::string> & getTargetsSet()
149                { return this->targets_; }
150            bool getTargets(std::string* string) const; //!< Returns a string consisting of the concatination of the targets.
151
152            /**
153            @brief Sets the position of the NotificationQueue.
154            @param pos The position.
155            */
156            inline void setPosition(Vector2 pos)
157                { this->position_ = pos; this->positionChanged(); }
158
159            void scroll(const Vector2 pos); //!< Scrolls the NotificationQueue, meaning all NotificationOverlays are moved the input vector.
160
161        private:
162            static const int DEFAULT_SIZE = 5; //!< The default maximum number of Notifications displayed.
163            static const int DEFAULT_LENGTH = 64; //!< The default maximum number of Notifications displayed.
164            static const int DEFAULT_DISPLAY_TIME = 30; //!< The default display time.
165            static const float DEFAULT_FONT_SIZE; //!< The default font size.
166
167            static const std::string DEFAULT_FONT; //!< The default font.
168            static const Vector2 DEFAULT_POSITION; //!< the default position.
169
170            int maxSize_; //!< The maximal number of Notifications displayed.
171            int size_; //!< The number of Notifications displayed.
172            int notificationLength_; //!< The maximal number of characters a Notification-message is allowed to have.
173            int displayTime_; //!< The time a Notification is displayed.
174            Vector2 position_; //!< The position of the NotificationQueue.
175
176            std::set<std::string> targets_; //!< The targets the Queue displays Notifications of.
177
178            float fontSize_; //!< The font size.
179            std::string font_; //!< The font.
180
181            std::multiset<NotificationOverlayContainer*, NotificationOverlayContainerCompare> containers_; //!< Multiset, because the ordering is based on, not necessarily unique, timestamps.
182            std::map<Notification*, NotificationOverlayContainer*> overlays_; //!< Mapping notifications to their corresponding overlay containers, for easier association and finding.
183
184            float tickTime_; //!< Helper variable, to not have to check for overlays that have been displayed too long, every tick.
185            NotificationOverlayContainer timeLimit_; //!< Helper object to check against to determine whether Notifications have expired.
186
187            void initialize(void); //!< Initializes the object.
188            void setDefaults(void); //!< Helper method to set the default values.
189
190            bool setMaxSize(int size); //!< Sets the maximum number of displayed Notifications.
191            bool setNotificationLength(int length); //!< Sets the maximum number of characters a Notification message displayed by this queue is allowed to have.
192            bool setDisplayTime(int time); //!< Sets the maximum number of seconds a Notification is displayed.
193
194            bool setTargets(const std::string & targets); //!< Set the targets of this queue.
195
196            bool setFontSize(float size); //!< Set the font size.
197            bool setFont(const std::string & font); //!< Set the font.
198
199            void positionChanged(void); //!< Aligns all the Notifications to the position of the NotificationQueue.
200
201            void addNotification(Notification* notification, const std::time_t & time); //!< Add a notification to the queue.
202            bool removeContainer(NotificationOverlayContainer* container); //!< Remove a container from the queue.
203
204            void clear(void); //!< Clear the queue.
205
206    };
207
208}
209
210#endif /* _NotificationOverlay_H__ */
Note: See TracBrowser for help on using the repository browser.