MyGUI
3.0.3
|
00001 00007 /* 00008 This file is part of MyGUI. 00009 00010 MyGUI is free software: you can redistribute it and/or modify 00011 it under the terms of the GNU Lesser General Public License as published by 00012 the Free Software Foundation, either version 3 of the License, or 00013 (at your option) any later version. 00014 00015 MyGUI is distributed in the hope that it will be useful, 00016 but WITHOUT ANY WARRANTY; without even the implied warranty of 00017 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00018 GNU Lesser General Public License for more details. 00019 00020 You should have received a copy of the GNU Lesser General Public License 00021 along with MyGUI. If not, see <http://www.gnu.org/licenses/>. 00022 */ 00023 #ifndef __MYGUI_LIST_H__ 00024 #define __MYGUI_LIST_H__ 00025 00026 #include "MyGUI_Prerequest.h" 00027 #include "MyGUI_Widget.h" 00028 #include "MyGUI_Any.h" 00029 #include "MyGUI_EventPair.h" 00030 00031 namespace MyGUI 00032 { 00033 00034 typedef delegates::CDelegate2<List*, size_t> EventHandle_ListPtrSizeT; 00035 00036 class MYGUI_EXPORT List : 00037 public Widget 00038 { 00039 MYGUI_RTTI_DERIVED( List ) 00040 00041 public: 00042 List(); 00043 00044 //------------------------------------------------------------------------------// 00045 // манипуляции айтемами 00046 00048 size_t getItemCount() const { return mItemsInfo.size(); } 00049 00051 void insertItemAt(size_t _index, const UString& _name, Any _data = Any::Null); 00052 00054 void addItem(const UString& _name, Any _data = Any::Null) { insertItemAt(ITEM_NONE, _name, _data); } 00055 00057 void removeItemAt(size_t _index); 00058 00060 void removeAllItems(); 00061 00063 void swapItemsAt(size_t _index1, size_t _index2); 00064 00065 00067 size_t findItemIndexWith(const UString& _name); 00068 00069 00070 //------------------------------------------------------------------------------// 00071 // манипуляции выделениями 00072 00074 size_t getIndexSelected() { return mIndexSelect; } 00075 00077 void setIndexSelected(size_t _index); 00078 00080 void clearIndexSelected() { setIndexSelected(ITEM_NONE); } 00081 00082 00083 //------------------------------------------------------------------------------// 00084 // манипуляции данными 00085 00087 void setItemDataAt(size_t _index, Any _data); 00088 00090 void clearItemDataAt(size_t _index) { setItemDataAt(_index, Any::Null); } 00091 00093 template <typename ValueType> 00094 ValueType * getItemDataAt(size_t _index, bool _throw = true) 00095 { 00096 MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "List::getItemDataAt"); 00097 return mItemsInfo[_index].second.castType<ValueType>(_throw); 00098 } 00099 00100 00101 //------------------------------------------------------------------------------// 00102 // манипуляции отображением 00103 00105 void setItemNameAt(size_t _index, const UString& _name); 00106 00108 const UString& getItemNameAt(size_t _index); 00109 00110 00111 //------------------------------------------------------------------------------// 00112 // манипуляции выдимостью 00113 00115 void beginToItemAt(size_t _index); 00116 00118 void beginToItemFirst() { if (getItemCount()) beginToItemAt(0); } 00119 00121 void beginToItemLast() { if (getItemCount()) beginToItemAt(getItemCount() - 1); } 00122 00124 void beginToItemSelected() { if (getIndexSelected() != ITEM_NONE) beginToItemAt(getIndexSelected()); } 00125 00126 //------------------------------------------------------------------------------// 00127 00128 // видим ли мы элемент, полностью или нет 00136 bool isItemVisibleAt(size_t _index, bool _fill = true); 00138 bool isItemSelectedVisible(bool _fill = true) { return isItemVisibleAt(mIndexSelect, _fill); } 00139 00140 00142 void setScrollVisible(bool _visible); 00144 void setScrollPosition(size_t _position); 00145 00146 //------------------------------------------------------------------------------------// 00147 00149 virtual void setPosition(const IntPoint& _value); 00151 virtual void setSize(const IntSize& _value); 00153 virtual void setCoord(const IntCoord& _value); 00154 00156 void setPosition(int _left, int _top) { setPosition(IntPoint(_left, _top)); } 00158 void setSize(int _width, int _height) { setSize(IntSize(_width, _height)); } 00160 void setCoord(int _left, int _top, int _width, int _height) { setCoord(IntCoord(_left, _top, _width, _height)); } 00161 00162 // возвращает максимальную высоту вмещающую все строки и родительский бордюр 00164 int getOptimalHeight(); 00165 00167 virtual void setProperty(const std::string& _key, const std::string& _value); 00168 00169 /*event:*/ 00175 EventPair<EventHandle_WidgetSizeT, EventHandle_ListPtrSizeT> eventListSelectAccept; 00176 00182 EventPair<EventHandle_WidgetSizeT, EventHandle_ListPtrSizeT> eventListChangePosition; 00183 00189 EventPair<EventHandle_WidgetSizeT, EventHandle_ListPtrSizeT> eventListMouseItemActivate; 00190 00196 EventPair<EventHandle_WidgetSizeT, EventHandle_ListPtrSizeT> eventListMouseItemFocus; 00197 00203 EventPair<EventHandle_WidgetSizeT, EventHandle_ListPtrSizeT> eventListChangeScroll; 00204 00205 /*internal:*/ 00206 // дебажная проверка на правильность выравнивания списка 00207 void _checkAlign(); 00208 00209 // вспомогательные методы для составных списков 00210 void _setItemFocus(size_t _position, bool _focus); 00211 void _sendEventChangeScroll(size_t _position); 00212 00213 virtual void _initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name); 00214 00215 /*obsolete:*/ 00216 #ifndef MYGUI_DONT_USE_OBSOLETE 00217 00218 MYGUI_OBSOLETE("use : void Widget::setCoord(const IntCoord& _coord)") 00219 void setPosition(const IntCoord& _coord) { setCoord(_coord); } 00220 MYGUI_OBSOLETE("use : void Widget::setCoord(int _left, int _top, int _width, int _height)") 00221 void setPosition(int _left, int _top, int _width, int _height) { setCoord(_left, _top, _width, _height); } 00222 00223 MYGUI_OBSOLETE("use : size_t List::getIndexSelected()") 00224 size_t getItemIndexSelected() { return getIndexSelected(); } 00225 MYGUI_OBSOLETE("use : void List::setIndexSelected(size_t _index)") 00226 void setItemSelectedAt(size_t _index) { setIndexSelected(_index); } 00227 MYGUI_OBSOLETE("use : void List::clearIndexSelected()") 00228 void clearItemSelected() { clearIndexSelected(); } 00229 00230 MYGUI_OBSOLETE("use : void List::insertItemAt(size_t _index, const UString& _name)") 00231 void insertItem(size_t _index, const UString& _item) { insertItemAt(_index, _item); } 00232 MYGUI_OBSOLETE("use : void List::setItemNameAt(size_t _index, const UString& _name)") 00233 void setItem(size_t _index, const UString& _item) { setItemNameAt(_index, _item); } 00234 MYGUI_OBSOLETE("use : const UString& List::getItemNameAt(size_t _index)") 00235 const UString& getItem(size_t _index) { return getItemNameAt(_index); } 00236 MYGUI_OBSOLETE("use : void List::removeItemAt(size_t _index)") 00237 void deleteItem(size_t _index) { removeItemAt(_index); } 00238 MYGUI_OBSOLETE("use : void List::removeAllItems()") 00239 void deleteAllItems() { removeAllItems(); } 00240 MYGUI_OBSOLETE("use : size_t List::findItemIndexWith(const UString& _name)") 00241 size_t findItem(const UString& _item) { return findItemIndexWith(_item); } 00242 MYGUI_OBSOLETE("use : size_t List::getIndexSelected()") 00243 size_t getItemSelect() { return getIndexSelected(); } 00244 MYGUI_OBSOLETE("use : void List::clearIndexSelected()") 00245 void resetItemSelect() { clearIndexSelected(); } 00246 MYGUI_OBSOLETE("use : void List::setIndexSelected(size_t _index)") 00247 void setItemSelect(size_t _index) { setIndexSelected(_index); } 00248 MYGUI_OBSOLETE("use : void List::beginToItemAt(size_t _index)") 00249 void beginToIndex(size_t _index) { beginToItemAt(_index); } 00250 MYGUI_OBSOLETE("use : void List::beginToItemFirst()") 00251 void beginToStart() { beginToItemFirst(); } 00252 MYGUI_OBSOLETE("use : void List::beginToItemLast()") 00253 void beginToEnd() { beginToItemLast(); } 00254 MYGUI_OBSOLETE("use : void List::beginToItemSelected()") 00255 void beginToSelect() { beginToItemSelected(); } 00256 MYGUI_OBSOLETE("use : bool List::isItemVisibleAt(size_t _index, bool _fill)") 00257 bool isItemVisible(size_t _index, bool _fill = true) { return isItemVisibleAt(_index, _fill); } 00258 MYGUI_OBSOLETE("use : bool List::isItemSelectedVisible(bool _fill)") 00259 bool isItemSelectVisible(bool _fill = true) { return isItemSelectedVisible(_fill); } 00260 00261 #endif // MYGUI_DONT_USE_OBSOLETE 00262 00263 protected: 00264 virtual ~List(); 00265 00266 void baseChangeWidgetSkin(ResourceSkin* _info); 00267 00268 void onMouseWheel(int _rel); 00269 void onKeyLostFocus(Widget* _new); 00270 void onKeySetFocus(Widget* _old); 00271 void onKeyButtonPressed(KeyCode _key, Char _char); 00272 00273 void notifyScrollChangePosition(VScroll* _sender, size_t _rel); 00274 void notifyMousePressed(Widget* _sender, int _left, int _top, MouseButton _id); 00275 void notifyMouseDoubleClick(Widget* _sender); 00276 void notifyMouseWheel(Widget* _sender, int _rel); 00277 void notifyMouseSetFocus(Widget* _sender, Widget* _old); 00278 void notifyMouseLostFocus(Widget* _sender, Widget* _new); 00279 00280 void updateScroll(); 00281 void updateLine(bool _reset = false); 00282 void _setScrollView(size_t _position); 00283 00284 // перерисовывает от индекса до низа 00285 void _redrawItemRange(size_t _start = 0); 00286 00287 // перерисовывает индекс 00288 void _redrawItem(size_t _index); 00289 00290 // ищет и выделяет елемент 00291 void _selectIndex(size_t _index, bool _select); 00292 00293 void _updateState() { setState(mIsFocus ? "pushed" : "normal"); } 00294 00295 private: 00296 void initialiseWidgetSkin(ResourceSkin* _info); 00297 void shutdownWidgetSkin(); 00298 void _checkMapping(const std::string& _owner); 00299 00300 Widget* _getClientWidget(); 00301 const Widget* _getClientWidget() const; 00302 00303 private: 00304 std::string mSkinLine; 00305 VScroll* mWidgetScroll; 00306 00307 // наши дети в строках 00308 VectorWidgetPtr mWidgetLines; 00309 00310 int mHeightLine; // высота одной строки 00311 int mTopIndex; // индекс самого верхнего элемента 00312 int mOffsetTop; // текущее смещение 00313 int mRangeIndex; // размерность скрола 00314 size_t mLastRedrawLine; // последняя перерисованная линия 00315 00316 size_t mIndexSelect; // текущий выделенный элемент или ITEM_NONE 00317 size_t mLineActive; // текущий виджет над которым мыша 00318 00319 typedef std::pair<UString, Any> PairItem; 00320 typedef std::vector<PairItem> VectorItemInfo; 00321 VectorItemInfo mItemsInfo; 00322 00323 // имеем ли мы фокус ввода 00324 bool mIsFocus; 00325 bool mNeedVisibleScroll; 00326 00327 IntSize mOldSize; 00328 00329 }; 00330 00331 } // namespace MyGUI 00332 00333 #endif // __MYGUI_LIST_H__