Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/orxonox/overlays/OverlayGroup.cc @ 2961

Last change on this file since 2961 was 2911, checked in by landauf, 16 years ago

Merged r1-2096 of questsystem5 back to trunk

I hope there weren't more "hidden merge changes" in r2909 than the one in OverlayGroup (removeElement) (and related to this the adjustments in NotificationQueue).

The corresponding media commit seems not yet to be done, but it doesn't break the build.

  • Property svn:eol-style set to native
File size: 6.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 *      Reto Grieder
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29/**
30@file
31@brief Definition of the OverlayGroup class.
32*/
33
34#include "OrxonoxStableHeaders.h"
35#include "OverlayGroup.h"
36
37#include "util/Debug.h"
38#include "core/ConsoleCommand.h"
39#include "core/CoreIncludes.h"
40#include "core/Iterator.h"
41#include "core/XMLPort.h"
42#include "OrxonoxOverlay.h"
43
44namespace orxonox
45{
46    CreateFactory(OverlayGroup);
47
48    SetConsoleCommand(OverlayGroup, toggleVisibility, false).accessLevel(AccessLevel::User);
49    SetConsoleCommand(OverlayGroup, scaleGroup, false).accessLevel(AccessLevel::User);
50    SetConsoleCommand(OverlayGroup, scrollGroup, false).accessLevel(AccessLevel::User);
51
52    OverlayGroup::OverlayGroup(BaseObject* creator)
53        : BaseObject(creator)
54    {
55        RegisterObject(OverlayGroup);
56
57        this->owner_ = 0;
58
59        setScale(Vector2(1.0, 1.0));
60        setScroll(Vector2(0.0, 0.0));
61    }
62
63    OverlayGroup::~OverlayGroup()
64    {
65        for (std::set<OrxonoxOverlay*>::iterator it = hudElements_.begin(); it != hudElements_.end(); ++it)
66            delete (*it);
67    }
68
69    /**
70    @brief
71        Loads the group and all its children OrxonoxOverlays.
72    @copydoc
73        BaseObject::XMLPort()
74    */
75    void OverlayGroup::XMLPort(Element& xmlElement, XMLPort::Mode mode)
76    {
77        SUPER(OverlayGroup, XMLPort, xmlElement, mode);
78
79        XMLPortParam(OverlayGroup, "scale",  setScale,  getScale,  xmlElement, mode);
80        XMLPortParam(OverlayGroup, "scroll", setScroll, getScroll, xmlElement, mode);
81        // loads all the child elements
82        XMLPortObject(OverlayGroup, OrxonoxOverlay, "", addElement, getElement, xmlElement, mode);
83    }
84
85    //! Scales every element in the set.
86    void OverlayGroup::setScale(const Vector2& scale)
87    {
88        for (std::set<OrxonoxOverlay*>::iterator it = hudElements_.begin(); it != hudElements_.end(); ++it)
89            (*it)->scale(scale / this->scale_);
90        this->scale_ = scale;
91    }
92
93    //! Scrolls every element in the set.
94    void OverlayGroup::setScroll(const Vector2& scroll)
95    {
96        for (std::set<OrxonoxOverlay*>::iterator it = hudElements_.begin(); it != hudElements_.end(); ++it)
97            (*it)->scroll(scroll - this->scroll_);
98        this->scroll_ = scroll;
99    }
100
101    /**
102    @brief
103        Adds an element to the set (used when loading with XMLPort).
104    @remarks
105        The names of the OrxonoxOverlays have to be unique!
106    */
107    void OverlayGroup::addElement(OrxonoxOverlay* element)
108    {
109        hudElements_.insert(element);
110        element->setVisible(this->isVisible());
111        if (this->owner_)
112            element->setOwner(this->owner_);
113    }
114
115        /**
116    @brief
117        Removes an element from the map.
118    @param name
119        The name of the element that is removed.
120    @return
121        Returns true if there was such an element to remove, false if not.
122    */
123    bool OverlayGroup::removeElement(OrxonoxOverlay* element)
124    {
125        if(this->hudElements_.erase(element) == 0)
126            return false;
127        return true;
128    }
129
130    //! Returns a different element as long as index < hudElements_.size().
131    OrxonoxOverlay* OverlayGroup::getElement(unsigned int index)
132    {
133        if (index < this->hudElements_.size())
134        {
135            std::set<OrxonoxOverlay*>::const_iterator it = hudElements_.begin();
136            for (unsigned int i = 0; i != index; ++it, ++i)
137                ;
138            return (*it);
139        }
140        else
141            return 0;
142    }
143
144    //! Changes the visibility of all elements
145    void OverlayGroup::changedVisibility()
146    {
147        for (std::set<OrxonoxOverlay*>::iterator it = hudElements_.begin(); it != hudElements_.end(); ++it)
148            (*it)->setVisible(this->isVisible());
149    }
150
151    void OverlayGroup::setOwner(BaseObject* owner)
152    {
153        this->owner_ = owner;
154
155        for (std::set<OrxonoxOverlay*>::iterator it = hudElements_.begin(); it != hudElements_.end(); ++it)
156            (*it)->setOwner(owner);
157    }
158
159    //########### Console commands ############
160
161    /**
162    @brief
163        Hides/shows an overlay group by its name.
164    @param name
165        The name of the group defined BaseObject::setName() (usually done with the "name"
166        attribute in the xml file).
167    */
168    /*static*/ void OverlayGroup::toggleVisibility(const std::string& name)
169    {
170        for (ObjectList<OverlayGroup>::iterator it = ObjectList<OverlayGroup>::begin(); it; ++it)
171        {
172            if ((*it)->getName() == name)
173                (*it)->setVisible(!((*it)->isVisible()));
174        }
175    }
176
177    /**
178    @brief
179        Scales an overlay group by its name.
180    @param name
181        The name of the group defined BaseObject::setName() (usually done with the "name"
182        attribute in the xml file).
183    */
184    /*static*/ void OverlayGroup::scaleGroup(const std::string& name, float scale)
185    {
186        for (ObjectList<OverlayGroup>::iterator it = ObjectList<OverlayGroup>::begin(); it; ++it)
187        {
188            if ((*it)->getName() == name)
189                (*it)->scale(Vector2(scale, scale));
190        }
191    }
192
193    /**
194    @brief
195        Scrolls an overlay group by its name.
196    @param name
197        The name of the group defined BaseObject::setName() (usually done with the "name"
198        attribute in the xml file).
199    */
200    /*static*/ void OverlayGroup::scrollGroup(const std::string& name, const Vector2& scroll)
201    {
202        for (ObjectList<OverlayGroup>::iterator it = ObjectList<OverlayGroup>::begin(); it; ++it)
203        {
204            if ((*it)->getName() == name)
205                (*it)->scroll(scroll);
206        }
207    }
208}
Note: See TracBrowser for help on using the repository browser.