8
#ifndef __BASE_PANEL_VIEW_H__
9
#define __BASE_PANEL_VIEW_H__
12
#include "BaseLayout/BaseLayout.h"
13
#include "PanelView/BasePanelViewItem.h"
18
template <typename TypeCell>
23
typedef std::vector<BasePanelViewItem*> VectorCell;
26
BasePanelView(const std::string& _layout, MyGUI::Widget* _parent) :
27
BaseLayout(_layout, _parent),
30
mFirstInitialise(false)
32
mScrollView = mMainWidget->castType<MyGUI::ScrollView>();
34
// потом перенести в лейаут
35
mScrollView->setCanvasAlign(MyGUI::Align::HCenter | MyGUI::Align::Top);
36
mScrollView->setVisibleHScroll(false);
39
mOldClientWidth = mScrollView->getViewCoord().width;
41
MyGUI::Gui::getInstance().eventFrameStart += MyGUI::newDelegate(this, &BasePanelView::frameEnteredCheck);
44
virtual ~BasePanelView()
46
MyGUI::Gui::getInstance().eventFrameStart -= MyGUI::newDelegate(this, &BasePanelView::frameEnteredCheck);
51
MyGUI::Gui::getInstance().eventFrameStart -= MyGUI::newDelegate(this, &BasePanelView::frameEntered);
54
//! Get number of items
60
//! Insert an item into a list at a specified position
61
void insertItem(size_t _index, BasePanelViewItem* _item)
63
MYGUI_ASSERT_RANGE_INSERT(_index, mItems.size(), "BasePanelView::insertItem");
65
if (_index == MyGUI::ITEM_NONE)
66
_index = mItems.size();
67
MYGUI_ASSERT(findItem(_item) == MyGUI::ITEM_NONE, "panel allready exist");
69
// создаем лейаут базовой ячейки
70
BasePanelViewCell* cell = new TypeCell(mScrollView);
71
cell->eventUpdatePanel = MyGUI::newDelegate(this, &BasePanelView::notifyUpdatePanel);
73
// теперь основной лейаут ячейки
74
_item->_initialise(cell);
76
mItems.insert(mItems.begin() + _index, _item);
78
mFirstInitialise = true;
81
//! Add an item to the end of a list
82
void addItem(BasePanelViewItem* _item)
84
insertItem(MyGUI::ITEM_NONE, _item);
87
//! Get item from specified position
88
BasePanelViewItem* getItem(size_t _index)
90
MYGUI_ASSERT_RANGE(_index, mItems.size(), "BasePanelView::getItem");
91
return mItems[_index];
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)
97
for (VectorCell::iterator iter = mItems.begin(); iter != mItems.end(); ++iter)
100
return iter - mItems.begin();
102
return MyGUI::ITEM_NONE;
105
//! Remove item at a specified position
106
void removeItemAt(size_t _index)
108
MYGUI_ASSERT_RANGE(_index, mItems.size(), "BasePanelView::removeItemAt");
110
BasePanelViewCell* cell = mItems[_index]->getPanelCell();
111
mItems[_index]->_shutdown();
114
mItems.erase(mItems.begin() + _index);
118
//! Remove item at a specified position
119
void removeItem(BasePanelViewItem* _item)
121
size_t index = findItem(_item);
122
MYGUI_ASSERT(index != MyGUI::ITEM_NONE, "item is not found");
127
void removeAllItems()
129
for (VectorCell::iterator iter = mItems.begin(); iter != mItems.end(); ++iter)
131
BasePanelViewCell* cell = (*iter)->getPanelCell();
132
(*iter)->_shutdown();
141
// вычисляем максимальную высоту всего добра
143
for (VectorCell::iterator iter = mItems.begin(); iter != mItems.end(); ++iter)
145
MyGUI::Widget* widget = (*iter)->getPanelCell()->getMainWidget();
146
if (widget->getVisible())
148
height += widget->getHeight();
151
// ставим высоту холста, и спрашиваем получившуюся ширину клиента
152
mScrollView->setCanvasSize(0, height);
153
// ширина клиента могла поменятся
154
const MyGUI::IntSize& size = mScrollView->getViewCoord().size();
155
mScrollView->setCanvasSize(size.width, height);
157
bool change = mFirstInitialise;
158
if (mOldClientWidth != size.width)
160
mOldClientWidth = size.width;
164
// выравниваем все панели
166
for (VectorCell::iterator iter = mItems.begin(); iter != mItems.end(); ++iter)
168
MyGUI::Widget* widget = (*iter)->getPanelCell()->getMainWidget();
169
if (widget->getVisible() || mFirstInitialise)
171
height = widget->getHeight();
172
widget->setCoord(MyGUI::IntCoord(0, pos, size.width, height));
174
// оповещаем, что мы обновили ширину
176
(*iter)->notifyChangeWidth(size.width);
183
mFirstInitialise = false;
184
MyGUI::Gui::getInstance().eventFrameStart -= MyGUI::newDelegate(this, &BasePanelView::frameEntered);
187
// изменились размеры
188
// необходимо обновить все панели
194
MyGUI::Gui::getInstance().eventFrameStart += MyGUI::newDelegate(this, &BasePanelView::frameEntered);
199
void notifyUpdatePanel(BasePanelViewCell* _panel)
204
void frameEntered(float _time)
209
void frameEnteredCheck(float _time)
211
const MyGUI::IntSize& size = mMainWidget->getSize();
212
if (size != mOldSize)
220
MyGUI::ScrollView* mScrollView;
226
MyGUI::IntSize mOldSize;
227
bool mFirstInitialise;
232
#endif // __BASE_PANEL_VIEW_H__
8
#ifndef __BASE_PANEL_VIEW_H__
9
#define __BASE_PANEL_VIEW_H__
12
#include "BaseLayout/BaseLayout.h"
13
#include "PanelView/BasePanelViewItem.h"
18
template <typename TypeCell>
23
typedef std::vector<BasePanelViewItem*> VectorCell;
26
BasePanelView(const std::string& _layout, MyGUI::Widget* _parent) :
27
BaseLayout(_layout, _parent),
30
mFirstInitialise(false)
32
mScrollView = mMainWidget->castType<MyGUI::ScrollView>();
34
// потом перенести в лейаут
35
mScrollView->setCanvasAlign(MyGUI::Align::HCenter | MyGUI::Align::Top);
36
mScrollView->setVisibleHScroll(false);
39
mOldClientWidth = mScrollView->getViewCoord().width;
41
MyGUI::Gui::getInstance().eventFrameStart += MyGUI::newDelegate(this, &BasePanelView::frameEnteredCheck);
44
virtual ~BasePanelView()
46
MyGUI::Gui::getInstance().eventFrameStart -= MyGUI::newDelegate(this, &BasePanelView::frameEnteredCheck);
51
MyGUI::Gui::getInstance().eventFrameStart -= MyGUI::newDelegate(this, &BasePanelView::frameEntered);
54
//! Get number of items
60
//! Insert an item into a list at a specified position
61
void insertItem(size_t _index, BasePanelViewItem* _item)
63
MYGUI_ASSERT_RANGE_INSERT(_index, mItems.size(), "BasePanelView::insertItem");
65
if (_index == MyGUI::ITEM_NONE)
66
_index = mItems.size();
67
MYGUI_ASSERT(findItem(_item) == MyGUI::ITEM_NONE, "panel allready exist");
69
// создаем лейаут базовой ячейки
70
BasePanelViewCell* cell = new TypeCell(mScrollView);
71
cell->eventUpdatePanel = MyGUI::newDelegate(this, &BasePanelView::notifyUpdatePanel);
73
// теперь основной лейаут ячейки
74
_item->_initialise(cell);
76
mItems.insert(mItems.begin() + _index, _item);
78
mFirstInitialise = true;
81
//! Add an item to the end of a list
82
void addItem(BasePanelViewItem* _item)
84
insertItem(MyGUI::ITEM_NONE, _item);
87
//! Get item from specified position
88
BasePanelViewItem* getItem(size_t _index)
90
MYGUI_ASSERT_RANGE(_index, mItems.size(), "BasePanelView::getItem");
91
return mItems[_index];
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)
97
for (VectorCell::iterator iter = mItems.begin(); iter != mItems.end(); ++iter)
100
return iter - mItems.begin();
102
return MyGUI::ITEM_NONE;
105
//! Remove item at a specified position
106
void removeItemAt(size_t _index)
108
MYGUI_ASSERT_RANGE(_index, mItems.size(), "BasePanelView::removeItemAt");
110
BasePanelViewCell* cell = mItems[_index]->getPanelCell();
111
mItems[_index]->_shutdown();
114
mItems.erase(mItems.begin() + _index);
118
//! Remove item at a specified position
119
void removeItem(BasePanelViewItem* _item)
121
size_t index = findItem(_item);
122
MYGUI_ASSERT(index != MyGUI::ITEM_NONE, "item is not found");
127
void removeAllItems()
129
for (VectorCell::iterator iter = mItems.begin(); iter != mItems.end(); ++iter)
131
BasePanelViewCell* cell = (*iter)->getPanelCell();
132
(*iter)->_shutdown();
141
// вычисляем максимальную высоту всего добра
143
for (VectorCell::iterator iter = mItems.begin(); iter != mItems.end(); ++iter)
145
MyGUI::Widget* widget = (*iter)->getPanelCell()->getMainWidget();
146
if (widget->getVisible())
148
height += widget->getHeight();
151
// ставим высоту холста, и спрашиваем получившуюся ширину клиента
152
mScrollView->setCanvasSize(0, height);
153
// ширина клиента могла поменятся
154
const MyGUI::IntSize& size = mScrollView->getViewCoord().size();
155
mScrollView->setCanvasSize(size.width, height);
157
bool change = mFirstInitialise;
158
if (mOldClientWidth != size.width)
160
mOldClientWidth = size.width;
164
// выравниваем все панели
166
for (VectorCell::iterator iter = mItems.begin(); iter != mItems.end(); ++iter)
168
MyGUI::Widget* widget = (*iter)->getPanelCell()->getMainWidget();
169
if (widget->getVisible() || mFirstInitialise)
171
height = widget->getHeight();
172
widget->setCoord(MyGUI::IntCoord(0, pos, size.width, height));
174
// оповещаем, что мы обновили ширину
176
(*iter)->notifyChangeWidth(size.width);
183
mFirstInitialise = false;
184
MyGUI::Gui::getInstance().eventFrameStart -= MyGUI::newDelegate(this, &BasePanelView::frameEntered);
187
// изменились размеры
188
// необходимо обновить все панели
194
MyGUI::Gui::getInstance().eventFrameStart += MyGUI::newDelegate(this, &BasePanelView::frameEntered);
199
void notifyUpdatePanel(BasePanelViewCell* _panel)
204
void frameEntered(float _time)
209
void frameEnteredCheck(float _time)
211
const MyGUI::IntSize& size = mMainWidget->getSize();
212
if (size != mOldSize)
220
MyGUI::ScrollView* mScrollView;
226
MyGUI::IntSize mOldSize;
227
bool mFirstInitialise;
232
#endif // __BASE_PANEL_VIEW_H__