~ubuntu-branches/ubuntu/vivid/mygui/vivid

« back to all changes in this revision

Viewing changes to Common/PanelView/BasePanelView.h

  • Committer: Package Import Robot
  • Author(s): Scott Howard, Bret Curtis, Scott Howard
  • Date: 2014-09-18 17:57:48 UTC
  • mfrom: (1.1.1)
  • Revision ID: package-import@ubuntu.com-20140918175748-dd8va78mvpw1jbes
Tags: 3.2.1-1
[ Bret Curtis ]
* Updated license for majority of files from LGPL to Expat (MIT)

[ Scott Howard ]
* New upstream release
* Updated patch to add build option for system GLEW libraries
* All patches accepted upstream except shared_libraries.patch
* Bumped SONAME due to dropped symbols, updated *.symbols and package
  names
* Updated license of debian/* to Expat with permission of all authors
* Don't install Doxygen autogenerated md5 and map files (thanks
  lintian)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*!
2
 
        @file
3
 
        @author         Albert Semenov
4
 
        @date           08/2008
5
 
        @module
6
 
*/
7
 
 
8
 
#ifndef __BASE_PANEL_VIEW_H__
9
 
#define __BASE_PANEL_VIEW_H__
10
 
 
11
 
#include <MyGUI.h>
12
 
#include "BaseLayout/BaseLayout.h"
13
 
#include "PanelView/BasePanelViewItem.h"
14
 
 
15
 
namespace wraps
16
 
{
17
 
 
18
 
        template <typename TypeCell>
19
 
        class BasePanelView :
20
 
                public BaseLayout
21
 
        {
22
 
        public:
23
 
                typedef std::vector<BasePanelViewItem*> VectorCell;
24
 
 
25
 
        public:
26
 
                BasePanelView(const std::string& _layout, MyGUI::Widget* _parent) :
27
 
                        BaseLayout(_layout, _parent),
28
 
                        mNeedUpdate(false),
29
 
                        mOldClientWidth(0),
30
 
                        mFirstInitialise(false)
31
 
                {
32
 
                        mScrollView = mMainWidget->castType<MyGUI::ScrollView>();
33
 
 
34
 
                        // потом перенести в лейаут
35
 
                        mScrollView->setCanvasAlign(MyGUI::Align::HCenter | MyGUI::Align::Top);
36
 
                        mScrollView->setVisibleHScroll(false);
37
 
                        mNeedUpdate = false;
38
 
 
39
 
                        mOldClientWidth = mScrollView->getViewCoord().width;
40
 
 
41
 
                        MyGUI::Gui::getInstance().eventFrameStart += MyGUI::newDelegate(this, &BasePanelView::frameEnteredCheck);
42
 
                }
43
 
 
44
 
                virtual ~BasePanelView()
45
 
                {
46
 
                        MyGUI::Gui::getInstance().eventFrameStart -= MyGUI::newDelegate(this, &BasePanelView::frameEnteredCheck);
47
 
 
48
 
                        removeAllItems();
49
 
 
50
 
                        if (mNeedUpdate)
51
 
                                MyGUI::Gui::getInstance().eventFrameStart -= MyGUI::newDelegate(this, &BasePanelView::frameEntered);
52
 
                }
53
 
 
54
 
                //! Get number of items
55
 
                size_t getItemCount()
56
 
                {
57
 
                        return mItems.size();
58
 
                }
59
 
 
60
 
                //! Insert an item into a list at a specified position
61
 
                void insertItem(size_t _index, BasePanelViewItem* _item)
62
 
                {
63
 
                        MYGUI_ASSERT_RANGE_INSERT(_index, mItems.size(), "BasePanelView::insertItem");
64
 
 
65
 
                        if (_index == MyGUI::ITEM_NONE)
66
 
                                _index = mItems.size();
67
 
                        MYGUI_ASSERT(findItem(_item) == MyGUI::ITEM_NONE, "panel allready exist");
68
 
 
69
 
                        // создаем лейаут базовой ячейки
70
 
                        BasePanelViewCell* cell = new TypeCell(mScrollView);
71
 
                        cell->eventUpdatePanel = MyGUI::newDelegate(this, &BasePanelView::notifyUpdatePanel);
72
 
 
73
 
                        // теперь основной лейаут ячейки
74
 
                        _item->_initialise(cell);
75
 
 
76
 
                        mItems.insert(mItems.begin() + _index, _item);
77
 
                        setNeedUpdate();
78
 
                        mFirstInitialise = true;
79
 
                }
80
 
 
81
 
                //! Add an item to the end of a list
82
 
                void addItem(BasePanelViewItem* _item)
83
 
                {
84
 
                        insertItem(MyGUI::ITEM_NONE, _item);
85
 
                }
86
 
 
87
 
                //! Get item from specified position
88
 
                BasePanelViewItem* getItem(size_t _index)
89
 
                {
90
 
                        MYGUI_ASSERT_RANGE(_index, mItems.size(), "BasePanelView::getItem");
91
 
                        return mItems[_index];
92
 
                }
93
 
 
94
 
                //! Search item, returns the position of the first occurrence in list or ITEM_NONE if item not found
95
 
                size_t findItem(BasePanelViewItem* _item)
96
 
                {
97
 
                        for (VectorCell::iterator iter = mItems.begin(); iter != mItems.end(); ++iter)
98
 
                        {
99
 
                                if ((*iter) == _item)
100
 
                                        return iter - mItems.begin();
101
 
                        }
102
 
                        return MyGUI::ITEM_NONE;
103
 
                }
104
 
 
105
 
                //! Remove item at a specified position
106
 
                void removeItemAt(size_t _index)
107
 
                {
108
 
                        MYGUI_ASSERT_RANGE(_index, mItems.size(), "BasePanelView::removeItemAt");
109
 
 
110
 
                        BasePanelViewCell* cell = mItems[_index]->getPanelCell();
111
 
                        mItems[_index]->_shutdown();
112
 
                        delete cell;
113
 
 
114
 
                        mItems.erase(mItems.begin() + _index);
115
 
                        setNeedUpdate();
116
 
                }
117
 
 
118
 
                //! Remove item at a specified position
119
 
                void removeItem(BasePanelViewItem* _item)
120
 
                {
121
 
                        size_t index = findItem(_item);
122
 
                        MYGUI_ASSERT(index != MyGUI::ITEM_NONE, "item is not found");
123
 
                        removeItemAt(index);
124
 
                }
125
 
 
126
 
                //! Remove all items
127
 
                void removeAllItems()
128
 
                {
129
 
                        for (VectorCell::iterator iter = mItems.begin(); iter != mItems.end(); ++iter)
130
 
                        {
131
 
                                BasePanelViewCell* cell = (*iter)->getPanelCell();
132
 
                                (*iter)->_shutdown();
133
 
                                delete cell;
134
 
                        }
135
 
                        mItems.clear();
136
 
                        setNeedUpdate();
137
 
                }
138
 
 
139
 
                void updateView()
140
 
                {
141
 
                        // вычисляем максимальную высоту всего добра
142
 
                        int height = 0;
143
 
                        for (VectorCell::iterator iter = mItems.begin(); iter != mItems.end(); ++iter)
144
 
                        {
145
 
                                MyGUI::Widget* widget = (*iter)->getPanelCell()->getMainWidget();
146
 
                                if (widget->getVisible())
147
 
                                {
148
 
                                        height += widget->getHeight();
149
 
                                }
150
 
                        }
151
 
                        // ставим высоту холста, и спрашиваем получившуюся ширину клиента
152
 
                        mScrollView->setCanvasSize(0, height);
153
 
                        // ширина клиента могла поменятся
154
 
                        const MyGUI::IntSize& size = mScrollView->getViewCoord().size();
155
 
                        mScrollView->setCanvasSize(size.width, height);
156
 
 
157
 
                        bool change = mFirstInitialise;
158
 
                        if (mOldClientWidth != size.width)
159
 
                        {
160
 
                                mOldClientWidth = size.width;
161
 
                                change = true;
162
 
                        }
163
 
 
164
 
                        // выравниваем все панели
165
 
                        int pos = 0;
166
 
                        for (VectorCell::iterator iter = mItems.begin(); iter != mItems.end(); ++iter)
167
 
                        {
168
 
                                MyGUI::Widget* widget = (*iter)->getPanelCell()->getMainWidget();
169
 
                                if (widget->getVisible() || mFirstInitialise)
170
 
                                {
171
 
                                        height = widget->getHeight();
172
 
                                        widget->setCoord(MyGUI::IntCoord(0, pos, size.width, height));
173
 
 
174
 
                                        // оповещаем, что мы обновили ширину
175
 
                                        if (change)
176
 
                                                (*iter)->notifyChangeWidth(size.width);
177
 
 
178
 
                                        pos += height;
179
 
                                }
180
 
                        }
181
 
 
182
 
                        mNeedUpdate = false;
183
 
                        mFirstInitialise = false;
184
 
                        MyGUI::Gui::getInstance().eventFrameStart -= MyGUI::newDelegate(this, &BasePanelView::frameEntered);
185
 
                }
186
 
 
187
 
                // изменились размеры
188
 
                // необходимо обновить все панели
189
 
                void setNeedUpdate()
190
 
                {
191
 
                        if (!mNeedUpdate)
192
 
                        {
193
 
                                mNeedUpdate = true;
194
 
                                MyGUI::Gui::getInstance().eventFrameStart += MyGUI::newDelegate(this, &BasePanelView::frameEntered);
195
 
                        }
196
 
                }
197
 
 
198
 
        private:
199
 
                void notifyUpdatePanel(BasePanelViewCell* _panel)
200
 
                {
201
 
                        setNeedUpdate();
202
 
                }
203
 
 
204
 
                void frameEntered(float _time)
205
 
                {
206
 
                        updateView();
207
 
                }
208
 
 
209
 
                void frameEnteredCheck(float _time)
210
 
                {
211
 
                        const MyGUI::IntSize& size = mMainWidget->getSize();
212
 
                        if (size != mOldSize)
213
 
                        {
214
 
                                mOldSize = size;
215
 
                                setNeedUpdate();
216
 
                        }
217
 
                }
218
 
 
219
 
        protected:
220
 
                MyGUI::ScrollView* mScrollView;
221
 
 
222
 
        private:
223
 
                VectorCell mItems;
224
 
                bool mNeedUpdate;
225
 
                int mOldClientWidth;
226
 
                MyGUI::IntSize mOldSize;
227
 
                bool mFirstInitialise;
228
 
        };
229
 
 
230
 
} // namespace wraps
231
 
 
232
 
#endif // __BASE_PANEL_VIEW_H__
 
1
/*!
 
2
        @file
 
3
        @author         Albert Semenov
 
4
        @date           08/2008
 
5
        @module
 
6
*/
 
7
 
 
8
#ifndef __BASE_PANEL_VIEW_H__
 
9
#define __BASE_PANEL_VIEW_H__
 
10
 
 
11
#include <MyGUI.h>
 
12
#include "BaseLayout/BaseLayout.h"
 
13
#include "PanelView/BasePanelViewItem.h"
 
14
 
 
15
namespace wraps
 
16
{
 
17
 
 
18
        template <typename TypeCell>
 
19
        class BasePanelView :
 
20
                public BaseLayout
 
21
        {
 
22
        public:
 
23
                typedef std::vector<BasePanelViewItem*> VectorCell;
 
24
 
 
25
        public:
 
26
                BasePanelView(const std::string& _layout, MyGUI::Widget* _parent) :
 
27
                        BaseLayout(_layout, _parent),
 
28
                        mNeedUpdate(false),
 
29
                        mOldClientWidth(0),
 
30
                        mFirstInitialise(false)
 
31
                {
 
32
                        mScrollView = mMainWidget->castType<MyGUI::ScrollView>();
 
33
 
 
34
                        // потом перенести в лейаут
 
35
                        mScrollView->setCanvasAlign(MyGUI::Align::HCenter | MyGUI::Align::Top);
 
36
                        mScrollView->setVisibleHScroll(false);
 
37
                        mNeedUpdate = false;
 
38
 
 
39
                        mOldClientWidth = mScrollView->getViewCoord().width;
 
40
 
 
41
                        MyGUI::Gui::getInstance().eventFrameStart += MyGUI::newDelegate(this, &BasePanelView::frameEnteredCheck);
 
42
                }
 
43
 
 
44
                virtual ~BasePanelView()
 
45
                {
 
46
                        MyGUI::Gui::getInstance().eventFrameStart -= MyGUI::newDelegate(this, &BasePanelView::frameEnteredCheck);
 
47
 
 
48
                        removeAllItems();
 
49
 
 
50
                        if (mNeedUpdate)
 
51
                                MyGUI::Gui::getInstance().eventFrameStart -= MyGUI::newDelegate(this, &BasePanelView::frameEntered);
 
52
                }
 
53
 
 
54
                //! Get number of items
 
55
                size_t getItemCount()
 
56
                {
 
57
                        return mItems.size();
 
58
                }
 
59
 
 
60
                //! Insert an item into a list at a specified position
 
61
                void insertItem(size_t _index, BasePanelViewItem* _item)
 
62
                {
 
63
                        MYGUI_ASSERT_RANGE_INSERT(_index, mItems.size(), "BasePanelView::insertItem");
 
64
 
 
65
                        if (_index == MyGUI::ITEM_NONE)
 
66
                                _index = mItems.size();
 
67
                        MYGUI_ASSERT(findItem(_item) == MyGUI::ITEM_NONE, "panel allready exist");
 
68
 
 
69
                        // создаем лейаут базовой ячейки
 
70
                        BasePanelViewCell* cell = new TypeCell(mScrollView);
 
71
                        cell->eventUpdatePanel = MyGUI::newDelegate(this, &BasePanelView::notifyUpdatePanel);
 
72
 
 
73
                        // теперь основной лейаут ячейки
 
74
                        _item->_initialise(cell);
 
75
 
 
76
                        mItems.insert(mItems.begin() + _index, _item);
 
77
                        setNeedUpdate();
 
78
                        mFirstInitialise = true;
 
79
                }
 
80
 
 
81
                //! Add an item to the end of a list
 
82
                void addItem(BasePanelViewItem* _item)
 
83
                {
 
84
                        insertItem(MyGUI::ITEM_NONE, _item);
 
85
                }
 
86
 
 
87
                //! Get item from specified position
 
88
                BasePanelViewItem* getItem(size_t _index)
 
89
                {
 
90
                        MYGUI_ASSERT_RANGE(_index, mItems.size(), "BasePanelView::getItem");
 
91
                        return mItems[_index];
 
92
                }
 
93
 
 
94
                //! Search item, returns the position of the first occurrence in list or ITEM_NONE if item not found
 
95
                size_t findItem(BasePanelViewItem* _item)
 
96
                {
 
97
                        for (VectorCell::iterator iter = mItems.begin(); iter != mItems.end(); ++iter)
 
98
                        {
 
99
                                if ((*iter) == _item)
 
100
                                        return iter - mItems.begin();
 
101
                        }
 
102
                        return MyGUI::ITEM_NONE;
 
103
                }
 
104
 
 
105
                //! Remove item at a specified position
 
106
                void removeItemAt(size_t _index)
 
107
                {
 
108
                        MYGUI_ASSERT_RANGE(_index, mItems.size(), "BasePanelView::removeItemAt");
 
109
 
 
110
                        BasePanelViewCell* cell = mItems[_index]->getPanelCell();
 
111
                        mItems[_index]->_shutdown();
 
112
                        delete cell;
 
113
 
 
114
                        mItems.erase(mItems.begin() + _index);
 
115
                        setNeedUpdate();
 
116
                }
 
117
 
 
118
                //! Remove item at a specified position
 
119
                void removeItem(BasePanelViewItem* _item)
 
120
                {
 
121
                        size_t index = findItem(_item);
 
122
                        MYGUI_ASSERT(index != MyGUI::ITEM_NONE, "item is not found");
 
123
                        removeItemAt(index);
 
124
                }
 
125
 
 
126
                //! Remove all items
 
127
                void removeAllItems()
 
128
                {
 
129
                        for (VectorCell::iterator iter = mItems.begin(); iter != mItems.end(); ++iter)
 
130
                        {
 
131
                                BasePanelViewCell* cell = (*iter)->getPanelCell();
 
132
                                (*iter)->_shutdown();
 
133
                                delete cell;
 
134
                        }
 
135
                        mItems.clear();
 
136
                        setNeedUpdate();
 
137
                }
 
138
 
 
139
                void updateView()
 
140
                {
 
141
                        // вычисляем максимальную высоту всего добра
 
142
                        int height = 0;
 
143
                        for (VectorCell::iterator iter = mItems.begin(); iter != mItems.end(); ++iter)
 
144
                        {
 
145
                                MyGUI::Widget* widget = (*iter)->getPanelCell()->getMainWidget();
 
146
                                if (widget->getVisible())
 
147
                                {
 
148
                                        height += widget->getHeight();
 
149
                                }
 
150
                        }
 
151
                        // ставим высоту холста, и спрашиваем получившуюся ширину клиента
 
152
                        mScrollView->setCanvasSize(0, height);
 
153
                        // ширина клиента могла поменятся
 
154
                        const MyGUI::IntSize& size = mScrollView->getViewCoord().size();
 
155
                        mScrollView->setCanvasSize(size.width, height);
 
156
 
 
157
                        bool change = mFirstInitialise;
 
158
                        if (mOldClientWidth != size.width)
 
159
                        {
 
160
                                mOldClientWidth = size.width;
 
161
                                change = true;
 
162
                        }
 
163
 
 
164
                        // выравниваем все панели
 
165
                        int pos = 0;
 
166
                        for (VectorCell::iterator iter = mItems.begin(); iter != mItems.end(); ++iter)
 
167
                        {
 
168
                                MyGUI::Widget* widget = (*iter)->getPanelCell()->getMainWidget();
 
169
                                if (widget->getVisible() || mFirstInitialise)
 
170
                                {
 
171
                                        height = widget->getHeight();
 
172
                                        widget->setCoord(MyGUI::IntCoord(0, pos, size.width, height));
 
173
 
 
174
                                        // оповещаем, что мы обновили ширину
 
175
                                        if (change)
 
176
                                                (*iter)->notifyChangeWidth(size.width);
 
177
 
 
178
                                        pos += height;
 
179
                                }
 
180
                        }
 
181
 
 
182
                        mNeedUpdate = false;
 
183
                        mFirstInitialise = false;
 
184
                        MyGUI::Gui::getInstance().eventFrameStart -= MyGUI::newDelegate(this, &BasePanelView::frameEntered);
 
185
                }
 
186
 
 
187
                // изменились размеры
 
188
                // необходимо обновить все панели
 
189
                void setNeedUpdate()
 
190
                {
 
191
                        if (!mNeedUpdate)
 
192
                        {
 
193
                                mNeedUpdate = true;
 
194
                                MyGUI::Gui::getInstance().eventFrameStart += MyGUI::newDelegate(this, &BasePanelView::frameEntered);
 
195
                        }
 
196
                }
 
197
 
 
198
        private:
 
199
                void notifyUpdatePanel(BasePanelViewCell* _panel)
 
200
                {
 
201
                        setNeedUpdate();
 
202
                }
 
203
 
 
204
                void frameEntered(float _time)
 
205
                {
 
206
                        updateView();
 
207
                }
 
208
 
 
209
                void frameEnteredCheck(float _time)
 
210
                {
 
211
                        const MyGUI::IntSize& size = mMainWidget->getSize();
 
212
                        if (size != mOldSize)
 
213
                        {
 
214
                                mOldSize = size;
 
215
                                setNeedUpdate();
 
216
                        }
 
217
                }
 
218
 
 
219
        protected:
 
220
                MyGUI::ScrollView* mScrollView;
 
221
 
 
222
        private:
 
223
                VectorCell mItems;
 
224
                bool mNeedUpdate;
 
225
                int mOldClientWidth;
 
226
                MyGUI::IntSize mOldSize;
 
227
                bool mFirstInitialise;
 
228
        };
 
229
 
 
230
} // namespace wraps
 
231
 
 
232
#endif // __BASE_PANEL_VIEW_H__