MyGUI  3.0.1
MyGUI_List.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_LIST_H__
24 #define __MYGUI_LIST_H__
25 
26 #include "MyGUI_Prerequest.h"
27 #include "MyGUI_Widget.h"
28 #include "MyGUI_Any.h"
29 #include "MyGUI_EventPair.h"
30 
31 namespace MyGUI
32 {
33 
35 
37  public Widget
38  {
40 
41  public:
42  List();
43 
44  //------------------------------------------------------------------------------//
45  // манипуляции айтемами
46 
48  size_t getItemCount() const { return mItemsInfo.size(); }
49 
51  void insertItemAt(size_t _index, const UString& _name, Any _data = Any::Null);
52 
54  void addItem(const UString& _name, Any _data = Any::Null) { insertItemAt(ITEM_NONE, _name, _data); }
55 
57  void removeItemAt(size_t _index);
58 
60  void removeAllItems();
61 
63  void swapItemsAt(size_t _index1, size_t _index2);
64 
65 
67  size_t findItemIndexWith(const UString& _name);
68 
69 
70  //------------------------------------------------------------------------------//
71  // манипуляции выделениями
72 
74  size_t getIndexSelected() { return mIndexSelect; }
75 
77  void setIndexSelected(size_t _index);
78 
80  void clearIndexSelected() { setIndexSelected(ITEM_NONE); }
81 
82 
83  //------------------------------------------------------------------------------//
84  // манипуляции данными
85 
87  void setItemDataAt(size_t _index, Any _data);
88 
90  void clearItemDataAt(size_t _index) { setItemDataAt(_index, Any::Null); }
91 
93  template <typename ValueType>
94  ValueType * getItemDataAt(size_t _index, bool _throw = true)
95  {
96  MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "List::getItemDataAt");
97  return mItemsInfo[_index].second.castType<ValueType>(_throw);
98  }
99 
100 
101  //------------------------------------------------------------------------------//
102  // манипуляции отображением
103 
105  void setItemNameAt(size_t _index, const UString& _name);
106 
108  const UString& getItemNameAt(size_t _index);
109 
110 
111  //------------------------------------------------------------------------------//
112  // манипуляции выдимостью
113 
115  void beginToItemAt(size_t _index);
116 
118  void beginToItemFirst() { if (getItemCount()) beginToItemAt(0); }
119 
121  void beginToItemLast() { if (getItemCount()) beginToItemAt(getItemCount() - 1); }
122 
124  void beginToItemSelected() { if (getIndexSelected() != ITEM_NONE) beginToItemAt(getIndexSelected()); }
125 
126  //------------------------------------------------------------------------------//
127 
128  // видим ли мы элемент, полностью или нет
136  bool isItemVisibleAt(size_t _index, bool _fill = true);
138  bool isItemSelectedVisible(bool _fill = true) { return isItemVisibleAt(mIndexSelect, _fill); }
139 
140 
142  void setScrollVisible(bool _visible);
144  void setScrollPosition(size_t _position);
145 
146  //------------------------------------------------------------------------------------//
147 
149  virtual void setPosition(const IntPoint& _value);
151  virtual void setSize(const IntSize& _value);
153  virtual void setCoord(const IntCoord& _value);
154 
156  void setPosition(int _left, int _top) { setPosition(IntPoint(_left, _top)); }
158  void setSize(int _width, int _height) { setSize(IntSize(_width, _height)); }
160  void setCoord(int _left, int _top, int _width, int _height) { setCoord(IntCoord(_left, _top, _width, _height)); }
161 
162  // возвращает максимальную высоту вмещающую все строки и родительский бордюр
164  int getOptimalHeight();
165 
167  virtual void setProperty(const std::string& _key, const std::string& _value);
168 
169  /*event:*/
176 
183 
190 
197 
204 
205  /*internal:*/
206  // дебажная проверка на правильность выравнивания списка
207  void _checkAlign();
208 
209  // вспомогательные методы для составных списков
210  void _setItemFocus(size_t _position, bool _focus);
211  void _sendEventChangeScroll(size_t _position);
212 
213  virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name);
214 
215  /*obsolete:*/
216 #ifndef MYGUI_DONT_USE_OBSOLETE
217 
218  MYGUI_OBSOLETE("use : void Widget::setCoord(const IntCoord& _coord)")
219  void setPosition(const IntCoord& _coord) { setCoord(_coord); }
220  MYGUI_OBSOLETE("use : void Widget::setCoord(int _left, int _top, int _width, int _height)")
221  void setPosition(int _left, int _top, int _width, int _height) { setCoord(_left, _top, _width, _height); }
222 
223  MYGUI_OBSOLETE("use : size_t List::getIndexSelected()")
224  size_t getItemIndexSelected() { return getIndexSelected(); }
225  MYGUI_OBSOLETE("use : void List::setIndexSelected(size_t _index)")
226  void setItemSelectedAt(size_t _index) { setIndexSelected(_index); }
227  MYGUI_OBSOLETE("use : void List::clearIndexSelected()")
228  void clearItemSelected() { clearIndexSelected(); }
229 
230  MYGUI_OBSOLETE("use : void List::insertItemAt(size_t _index, const UString& _name)")
231  void insertItem(size_t _index, const UString& _item) { insertItemAt(_index, _item); }
232  MYGUI_OBSOLETE("use : void List::setItemNameAt(size_t _index, const UString& _name)")
233  void setItem(size_t _index, const UString& _item) { setItemNameAt(_index, _item); }
234  MYGUI_OBSOLETE("use : const UString& List::getItemNameAt(size_t _index)")
235  const UString& getItem(size_t _index) { return getItemNameAt(_index); }
236  MYGUI_OBSOLETE("use : void List::removeItemAt(size_t _index)")
237  void deleteItem(size_t _index) { removeItemAt(_index); }
238  MYGUI_OBSOLETE("use : void List::removeAllItems()")
239  void deleteAllItems() { removeAllItems(); }
240  MYGUI_OBSOLETE("use : size_t List::findItemIndexWith(const UString& _name)")
241  size_t findItem(const UString& _item) { return findItemIndexWith(_item); }
242  MYGUI_OBSOLETE("use : size_t List::getIndexSelected()")
243  size_t getItemSelect() { return getIndexSelected(); }
244  MYGUI_OBSOLETE("use : void List::clearIndexSelected()")
245  void resetItemSelect() { clearIndexSelected(); }
246  MYGUI_OBSOLETE("use : void List::setIndexSelected(size_t _index)")
247  void setItemSelect(size_t _index) { setIndexSelected(_index); }
248  MYGUI_OBSOLETE("use : void List::beginToItemAt(size_t _index)")
249  void beginToIndex(size_t _index) { beginToItemAt(_index); }
250  MYGUI_OBSOLETE("use : void List::beginToItemFirst()")
251  void beginToStart() { beginToItemFirst(); }
252  MYGUI_OBSOLETE("use : void List::beginToItemLast()")
253  void beginToEnd() { beginToItemLast(); }
254  MYGUI_OBSOLETE("use : void List::beginToItemSelected()")
255  void beginToSelect() { beginToItemSelected(); }
256  MYGUI_OBSOLETE("use : bool List::isItemVisibleAt(size_t _index, bool _fill)")
257  bool isItemVisible(size_t _index, bool _fill = true) { return isItemVisibleAt(_index, _fill); }
258  MYGUI_OBSOLETE("use : bool List::isItemSelectedVisible(bool _fill)")
259  bool isItemSelectVisible(bool _fill = true) { return isItemSelectedVisible(_fill); }
260 
261 #endif // MYGUI_DONT_USE_OBSOLETE
262 
263  protected:
264  virtual ~List();
265 
266  void baseChangeWidgetSkin(ResourceSkin* _info);
267 
268  void onMouseWheel(int _rel);
269  void onKeyLostFocus(Widget* _new);
270  void onKeySetFocus(Widget* _old);
271  void onKeyButtonPressed(KeyCode _key, Char _char);
272 
273  void notifyScrollChangePosition(VScroll* _sender, size_t _rel);
274  void notifyMousePressed(Widget* _sender, int _left, int _top, MouseButton _id);
275  void notifyMouseDoubleClick(Widget* _sender);
276  void notifyMouseWheel(Widget* _sender, int _rel);
277  void notifyMouseSetFocus(Widget* _sender, Widget* _old);
278  void notifyMouseLostFocus(Widget* _sender, Widget* _new);
279 
280  void updateScroll();
281  void updateLine(bool _reset = false);
282  void _setScrollView(size_t _position);
283 
284  // перерисовывает от индекса до низа
285  void _redrawItemRange(size_t _start = 0);
286 
287  // перерисовывает индекс
288  void _redrawItem(size_t _index);
289 
290  // ищет и выделяет елемент
291  void _selectIndex(size_t _index, bool _select);
292 
293  void _updateState() { setState(mIsFocus ? "pushed" : "normal"); }
294 
295  private:
296  void initialiseWidgetSkin(ResourceSkin* _info);
297  void shutdownWidgetSkin();
298  void _checkMapping(const std::string& _owner);
299 
300  Widget* _getClientWidget();
301  const Widget* _getClientWidget() const;
302 
303  private:
304  std::string mSkinLine;
305  VScroll* mWidgetScroll;
306 
307  // наши дети в строках
308  VectorWidgetPtr mWidgetLines;
309 
310  int mHeightLine; // высота одной строки
311  int mTopIndex; // индекс самого верхнего элемента
312  int mOffsetTop; // текущее смещение
313  int mRangeIndex; // размерность скрола
314  size_t mLastRedrawLine; // последняя перерисованная линия
315 
316  size_t mIndexSelect; // текущий выделенный элемент или ITEM_NONE
317  size_t mLineActive; // текущий виджет над которым мыша
318 
319  typedef std::pair<UString, Any> PairItem;
320  typedef std::vector<PairItem> VectorItemInfo;
321  VectorItemInfo mItemsInfo;
322 
323  // имеем ли мы фокус ввода
324  bool mIsFocus;
325  bool mNeedVisibleScroll;
326 
327  IntSize mOldSize;
328 
329  };
330 
331 } // namespace MyGUI
332 
333 #endif // __MYGUI_LIST_H__