MyGUI  3.0.1
MyGUI_ItemBox.h
Go to the documentation of this file.
1 
7 /*
8  This file is part of MyGUI.
9 
10  MyGUI is free software: you can redistribute it and/or modify
11  it under the terms of the GNU Lesser General Public License as published by
12  the Free Software Foundation, either version 3 of the License, or
13  (at your option) any later version.
14 
15  MyGUI is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  GNU Lesser General Public License for more details.
19 
20  You should have received a copy of the GNU Lesser General Public License
21  along with MyGUI. If not, see <http://www.gnu.org/licenses/>.
22 */
23 #ifndef __MYGUI_ITEM_BOX_H__
24 #define __MYGUI_ITEM_BOX_H__
25 
26 #include "MyGUI_Prerequest.h"
27 #include "MyGUI_DDContainer.h"
28 #include "MyGUI_IBItemInfo.h"
29 #include "MyGUI_Any.h"
30 #include "MyGUI_EventPair.h"
31 #include "MyGUI_ScrollViewBase.h"
32 
33 namespace MyGUI
34 {
35 
41 
43  public DDContainer,
44  protected ScrollViewBase
45  {
47 
48  public:
49  ItemBox();
50 
51  //------------------------------------------------------------------------------//
52  // манипуляции айтемами
53 
55  size_t getItemCount() const { return mItemsInfo.size(); }
56 
58  void insertItemAt(size_t _index, Any _data = Any::Null);
59 
61  void addItem(Any _data = Any::Null) { insertItemAt(ITEM_NONE, _data); }
62 
64  void removeItemAt(size_t _index);
65 
67  void removeAllItems();
68 
70  void redrawItemAt(size_t _index);
71 
73  void redrawAllItems();
74 
75 
76  //------------------------------------------------------------------------------//
77  // манипуляции выделениями
78 
80  size_t getIndexSelected() { return mIndexSelect; }
81 
83  void setIndexSelected(size_t _index);
84 
86  void clearIndexSelected() { setIndexSelected(ITEM_NONE); }
87 
88 
89  //------------------------------------------------------------------------------//
90  // манипуляции данными
91 
93  void setItemDataAt(size_t _index, Any _data);
94 
96  void clearItemDataAt(size_t _index) { setItemDataAt(_index, Any::Null); }
97 
99  template <typename ValueType>
100  ValueType * getItemDataAt(size_t _index, bool _throw = true)
101  {
102  MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "ItemBox::getItemDataAt");
103  return mItemsInfo[_index].data.castType<ValueType>(_throw);
104  }
105 
106 
108  void setItemBoxAlignVert(bool _value);
110  bool getItemBoxAlignVert() { return mAlignVert; }
111 
113  size_t getIndexByWidget(Widget* _widget);
114 
116  Widget* getWidgetDrag() { return mItemDrag; }
117 
123  Widget* getWidgetByIndex(size_t _index);
124 
126  void resetDrag();
127 
129  virtual void setPosition(const IntPoint& _value);
131  virtual void setSize(const IntSize& _value);
133  virtual void setCoord(const IntCoord& _value);
134 
136  void setPosition(int _left, int _top) { setPosition(IntPoint(_left, _top)); }
138  void setSize(int _width, int _height) { setSize(IntSize(_width, _height)); }
140  void setCoord(int _left, int _top, int _width, int _height) { setCoord(IntCoord(_left, _top, _width, _height)); }
141 
142  /*event:*/
149 
157 
165 
172 
179 
186 
193 
194 
195  /*internal:*/
196  virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name);
197 
198  /*obsolete:*/
199 #ifndef MYGUI_DONT_USE_OBSOLETE
200 
201  MYGUI_OBSOLETE("use : void Widget::setCoord(const IntCoord& _coord)")
202  void setPosition(const IntCoord& _coord) { setCoord(_coord); }
203  MYGUI_OBSOLETE("use : void Widget::setCoord(int _left, int _top, int _width, int _height)")
204  void setPosition(int _left, int _top, int _width, int _height) { setCoord(_left, _top, _width, _height); }
205 
206  MYGUI_OBSOLETE("use : size_t ItemBox::getItemIndexSelected()")
207  size_t getItemIndexSelected() { return getIndexSelected(); }
208  MYGUI_OBSOLETE("use : void ItemBox::setIndexSelected(size_t _index)")
209  void setItemSelectedAt(size_t _index) { setIndexSelected(_index); }
210  MYGUI_OBSOLETE("use : void ItemBox::clearIndexSelected()")
211  void clearItemSelected() { clearIndexSelected(); }
212 
213  MYGUI_OBSOLETE("use : void ItemBox::insertItemAt(size_t _index, Any _data)")
214  void insertItem(size_t _index, Any _data = Any::Null) { insertItemAt(_index, _data); }
215  MYGUI_OBSOLETE("use : void ItemBox::setItemDataAt(size_t _index, Any _data)")
216  void setItemData(size_t _index, Any _data) { setItemDataAt(_index, _data); }
217  MYGUI_OBSOLETE("use : void ItemBox::removeItemAt(size_t _index)")
218  void deleteItem(size_t _index) { removeItemAt(_index); }
219  MYGUI_OBSOLETE("use : void ItemBox::removeAllItems()")
220  void deleteAllItems() { removeAllItems(); }
221  MYGUI_OBSOLETE("use : size_t ItemBox::getIndexSelected()")
222  size_t getItemSelect() { return getIndexSelected(); }
223  MYGUI_OBSOLETE("use : void ItemBox::clearIndexSelected()")
224  void resetItemSelect() { clearIndexSelected(); }
225  MYGUI_OBSOLETE("use : void ItemBox::setIndexSelected(size_t _index)")
226  void setItemSelect(size_t _index) { setIndexSelected(_index); }
227 
228  MYGUI_OBSOLETE("use : Widget* ItemBox::getWidgetDrag()")
229  Widget* getWidgetDrop() { return getWidgetDrag(); }
230  MYGUI_OBSOLETE("use : void ItemBox::resetDrag()")
231  void resetDrop() { resetDrag(); }
232 
233 #endif // MYGUI_DONT_USE_OBSOLETE
234 
235 
236  protected:
237  virtual ~ItemBox();
238 
240  {
241  ItemDataInfo(Any _data) :
242  data(_data) { }
244  };
245  typedef std::vector<ItemDataInfo> VectorItemInfo;
246 
247  void baseChangeWidgetSkin(ResourceSkin* _info);
248 
249  virtual void onMouseButtonPressed(int _left, int _top, MouseButton _id);
250  virtual void onMouseButtonReleased(int _left, int _top, MouseButton _id);
251  virtual void onMouseDrag(int _left, int _top);
252 
253  virtual void onMouseWheel(int _rel);
254  virtual void onKeyLostFocus(Widget* _new);
255  virtual void onKeySetFocus(Widget* _old);
256 
257  void notifyKeyButtonPressed(Widget* _sender, KeyCode _key, Char _char);
258  void notifyKeyButtonReleased(Widget* _sender, KeyCode _key);
259  void notifyScrollChangePosition(VScroll* _sender, size_t _index);
260  void notifyMouseWheel(Widget* _sender, int _rel);
261  void notifyRootMouseChangeFocus(Widget* _sender, bool _focus);
262  void notifyMouseButtonDoubleClick(Widget* _sender);
263  void _requestGetContainer(Widget* _sender, Widget*& _container, size_t& _index);
264  void notifyMouseDrag(Widget* _sender, int _left, int _top);
265  void notifyMouseButtonPressed(Widget* _sender, int _left, int _top, MouseButton _id);
266  void notifyMouseButtonReleased(Widget* _sender, int _left, int _top, MouseButton _id);
267 
268 
269  virtual void removeDropItems();
270  virtual void updateDropItems();
271  virtual void updateDropItemsState(const DDWidgetState& _state);
272 
273  // Обновляет данные о айтемах, при изменении размеров
274  void updateMetrics();
275 
276  // просто обновляет все виджеты что видны
277  void _updateAllVisible(bool _redraw);
278 
279  void updateFromResize();
280 
281  // возвращает следующий айтем, если нет его, то создается
282  // запросы только последовательно
283  Widget* getItemWidget(size_t _index);
284 
285  void _setContainerItemInfo(size_t _index, bool _set, bool _accept);
286 
287  // сбрасываем старую подсветку
288  void resetCurrentActiveItem();
289  // ищет и устанавливает подсвеченный айтем
290  void findCurrentActiveItem();
291 
292  // запрашиваем у конейтера айтем по позиции мыши
293  virtual size_t _getContainerIndex(const IntPoint& _point);
294 
295  // сбрасывает зависимости, при любом колличественном изменении
296  virtual void _resetContainer(bool _update);
297 
298  private:
299  void initialiseWidgetSkin(ResourceSkin* _info);
300  void shutdownWidgetSkin();
301 
302  size_t calcIndexByWidget(Widget* _widget);
303 
304  void requestItemSize();
305 
306  virtual IntSize getContentSize();
307  virtual IntPoint getContentPosition();
308  virtual IntSize getViewSize() const;
309  virtual void eraseContent();
310  virtual size_t getHScrollPage();
311  virtual size_t getVScrollPage();
312  virtual Align getContentAlign();
313  virtual void setContentPosition(const IntPoint& _point);
314 
315  IntRect _getClientAbsoluteRect();
316  Widget* _getClientWidget();
317  const Widget* _getClientWidget() const;
318 
319  private:
320  // наши дети в строках
321  VectorWidgetPtr mVectorItems;
322 
323  // размер одного айтема
324  IntSize mSizeItem;
325 
326  // размерность скролла в пикселях
327  IntSize mContentSize;
328  // позиция скролла п пикселях
329  IntPoint mContentPosition;
330 
331  // колличество айтемов в одной строке
332  int mCountItemInLine;
333  // колличество линий
334  int mCountLines;
335 
336  // самая верхняя строка
337  int mFirstVisibleIndex;
338  // текущее смещение верхнего элемента в пикселях
339  // сколько его пикселей не видно сверху
340  int mFirstOffsetIndex;
341 
342  // текущий выделенный элемент или ITEM_NONE
343  size_t mIndexSelect;
344  // подсвеченный элемент или ITEM_NONE
345  size_t mIndexActive;
346  // индекс со свойством приема или ITEM_NONE
347  size_t mIndexAccept;
348  // индекс со свойством отказа или ITEM_NONE
349  size_t mIndexRefuse;
350 
351  // имеем ли мы фокус ввода
352  bool mIsFocus;
353 
354  // структура данных об айтеме
355  VectorItemInfo mItemsInfo;
356 
357  Widget* mItemDrag;
358  IntPoint mPointDragOffset;
359 
360  bool mAlignVert;
361 
362  std::string mDragLayer;
363 
364  };
365 
366 } // namespace MyGUI
367 
368 #endif // __MYGUI_ITEM_BOX_H__