MyGUI
3.2.0
|
00001 00006 /* 00007 This file is part of MyGUI. 00008 00009 MyGUI is free software: you can redistribute it and/or modify 00010 it under the terms of the GNU Lesser General Public License as published by 00011 the Free Software Foundation, either version 3 of the License, or 00012 (at your option) any later version. 00013 00014 MyGUI is distributed in the hope that it will be useful, 00015 but WITHOUT ANY WARRANTY; without even the implied warranty of 00016 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00017 GNU Lesser General Public License for more details. 00018 00019 You should have received a copy of the GNU Lesser General Public License 00020 along with MyGUI. If not, see <http://www.gnu.org/licenses/>. 00021 */ 00022 #ifndef __MYGUI_ITEM_BOX_H__ 00023 #define __MYGUI_ITEM_BOX_H__ 00024 00025 #include "MyGUI_Prerequest.h" 00026 #include "MyGUI_DDContainer.h" 00027 #include "MyGUI_IBItemInfo.h" 00028 #include "MyGUI_Any.h" 00029 #include "MyGUI_EventPair.h" 00030 #include "MyGUI_ScrollViewBase.h" 00031 00032 namespace MyGUI 00033 { 00034 00035 typedef delegates::CDelegate2<ItemBox*, Widget*> EventHandle_ItemBoxPtrWidgetPtr; 00036 typedef delegates::CDelegate3<ItemBox*, IntCoord&, bool> EventHandle_ItemBoxPtrIntCoordRefBool; 00037 typedef delegates::CDelegate3<ItemBox*, Widget*, const IBDrawItemInfo&> EventHandle_ItemBoxPtrWidgetPtrCIBCellDrawInfoRef; 00038 typedef delegates::CMultiDelegate2<ItemBox*, size_t> EventHandle_ItemBoxPtrSizeT; 00039 typedef delegates::CMultiDelegate2<ItemBox*, const IBNotifyItemData&> EventHandle_ItemBoxPtrCIBNotifyCellDataRef; 00040 00041 class MYGUI_EXPORT ItemBox : 00042 public DDContainer, 00043 protected ScrollViewBase, 00044 public MemberObsolete<ItemBox> 00045 { 00046 MYGUI_RTTI_DERIVED( ItemBox ) 00047 00048 public: 00049 ItemBox(); 00050 00051 //------------------------------------------------------------------------------// 00052 // манипуляции айтемами 00053 00055 size_t getItemCount() const; 00056 00058 void insertItemAt(size_t _index, Any _data = Any::Null); 00059 00061 void addItem(Any _data = Any::Null); 00062 00064 void removeItemAt(size_t _index); 00065 00067 void removeAllItems(); 00068 00070 void redrawItemAt(size_t _index); 00071 00073 void redrawAllItems(); 00074 00075 00076 //------------------------------------------------------------------------------// 00077 // манипуляции выделениями 00078 00080 size_t getIndexSelected() const; 00081 00083 void setIndexSelected(size_t _index); 00084 00086 void clearIndexSelected(); 00087 00088 00089 //------------------------------------------------------------------------------// 00090 // манипуляции данными 00091 00093 void setItemDataAt(size_t _index, Any _data); 00094 00096 void clearItemDataAt(size_t _index); 00097 00099 template <typename ValueType> 00100 ValueType* getItemDataAt(size_t _index, bool _throw = true) 00101 { 00102 MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "ItemBox::getItemDataAt"); 00103 return mItemsInfo[_index].data.castType<ValueType>(_throw); 00104 } 00105 00106 00108 void setVerticalAlignment(bool _value); 00110 bool getVerticalAlignment() const; 00111 00113 size_t getIndexByWidget(Widget* _widget); 00114 00116 Widget* getWidgetDrag(); 00117 00123 Widget* getWidgetByIndex(size_t _index); 00124 00126 void resetDrag(); 00127 00129 virtual void setPosition(const IntPoint& _value); 00131 virtual void setSize(const IntSize& _value); 00133 virtual void setCoord(const IntCoord& _value); 00134 00136 void setPosition(int _left, int _top); 00138 void setSize(int _width, int _height); 00140 void setCoord(int _left, int _top, int _width, int _height); 00141 00142 /*events:*/ 00148 EventHandle_ItemBoxPtrWidgetPtr 00149 requestCreateWidgetItem; 00150 00157 EventHandle_ItemBoxPtrIntCoordRefBool 00158 requestCoordItem; 00159 00166 EventHandle_ItemBoxPtrWidgetPtrCIBCellDrawInfoRef 00167 requestDrawItem; 00168 00174 EventHandle_ItemBoxPtrSizeT 00175 eventSelectItemAccept; 00176 00182 EventHandle_ItemBoxPtrSizeT 00183 eventChangeItemPosition; 00184 00190 EventHandle_ItemBoxPtrSizeT 00191 eventMouseItemActivate; 00192 00198 EventHandle_ItemBoxPtrCIBNotifyCellDataRef 00199 eventNotifyItem; 00200 00201 /*internal:*/ 00202 virtual void _resetContainer(bool _update); 00203 00204 protected: 00205 virtual void initialiseOverride(); 00206 virtual void shutdownOverride(); 00207 00208 struct ItemDataInfo 00209 { 00210 ItemDataInfo(Any _data) : 00211 data(_data) { } 00212 Any data; 00213 }; 00214 typedef std::vector<ItemDataInfo> VectorItemInfo; 00215 00216 virtual void onMouseButtonPressed(int _left, int _top, MouseButton _id); 00217 virtual void onMouseButtonReleased(int _left, int _top, MouseButton _id); 00218 virtual void onMouseDrag(int _left, int _top, MouseButton _id); 00219 00220 virtual void onMouseWheel(int _rel); 00221 virtual void onKeyLostFocus(Widget* _new); 00222 virtual void onKeySetFocus(Widget* _old); 00223 00224 void notifyKeyButtonPressed(Widget* _sender, KeyCode _key, Char _char); 00225 void notifyKeyButtonReleased(Widget* _sender, KeyCode _key); 00226 void notifyScrollChangePosition(ScrollBar* _sender, size_t _index); 00227 void notifyMouseWheel(Widget* _sender, int _rel); 00228 void notifyRootMouseChangeFocus(Widget* _sender, bool _focus); 00229 void notifyMouseButtonDoubleClick(Widget* _sender); 00230 virtual size_t _getItemIndex(Widget* _item); 00231 void notifyMouseDrag(Widget* _sender, int _left, int _top, MouseButton _id); 00232 void notifyMouseButtonPressed(Widget* _sender, int _left, int _top, MouseButton _id); 00233 void notifyMouseButtonReleased(Widget* _sender, int _left, int _top, MouseButton _id); 00234 00235 00236 virtual void removeDropItems(); 00237 virtual void updateDropItems(); 00238 virtual void updateDropItemsState(const DDWidgetState& _state); 00239 00240 // Обновляет данные о айтемах, при изменении размеров 00241 void updateMetrics(); 00242 00243 // просто обновляет все виджеты что видны 00244 void _updateAllVisible(bool _redraw); 00245 00246 void updateFromResize(); 00247 00248 // возвращает следующий айтем, если нет его, то создается 00249 // запросы только последовательно 00250 Widget* getItemWidget(size_t _index); 00251 00252 void _setContainerItemInfo(size_t _index, bool _set, bool _accept); 00253 00254 // сбрасываем старую подсветку 00255 void resetCurrentActiveItem(); 00256 // ищет и устанавливает подсвеченный айтем 00257 void findCurrentActiveItem(); 00258 00259 // запрашиваем у конейтера айтем по позиции мыши 00260 virtual size_t _getContainerIndex(const IntPoint& _point); 00261 00262 virtual void setPropertyOverride(const std::string& _key, const std::string& _value); 00263 00264 private: 00265 size_t calcIndexByWidget(Widget* _widget); 00266 00267 void requestItemSize(); 00268 00269 virtual IntSize getContentSize(); 00270 virtual IntPoint getContentPosition(); 00271 virtual IntSize getViewSize(); 00272 virtual void eraseContent(); 00273 virtual size_t getHScrollPage(); 00274 virtual size_t getVScrollPage(); 00275 virtual Align getContentAlign(); 00276 virtual void setContentPosition(const IntPoint& _point); 00277 00278 IntRect _getClientAbsoluteRect(); 00279 Widget* _getClientWidget(); 00280 00281 private: 00282 // наши дети в строках 00283 VectorWidgetPtr mVectorItems; 00284 00285 // размер одного айтема 00286 IntSize mSizeItem; 00287 00288 // размерность скролла в пикселях 00289 IntSize mContentSize; 00290 // позиция скролла п пикселях 00291 IntPoint mContentPosition; 00292 00293 // колличество айтемов в одной строке 00294 int mCountItemInLine; 00295 // колличество линий 00296 int mCountLines; 00297 00298 // самая верхняя строка 00299 int mFirstVisibleIndex; 00300 // текущее смещение верхнего элемента в пикселях 00301 // сколько его пикселей не видно сверху 00302 int mFirstOffsetIndex; 00303 00304 // текущий выделенный элемент или ITEM_NONE 00305 size_t mIndexSelect; 00306 // подсвеченный элемент или ITEM_NONE 00307 size_t mIndexActive; 00308 // индекс со свойством приема или ITEM_NONE 00309 size_t mIndexAccept; 00310 // индекс со свойством отказа или ITEM_NONE 00311 size_t mIndexRefuse; 00312 00313 // имеем ли мы фокус ввода 00314 bool mIsFocus; 00315 00316 // структура данных об айтеме 00317 VectorItemInfo mItemsInfo; 00318 00319 Widget* mItemDrag; 00320 IntPoint mPointDragOffset; 00321 00322 bool mAlignVert; 00323 00324 std::string mDragLayer; 00325 }; 00326 00327 } // namespace MyGUI 00328 00329 #endif // __MYGUI_ITEM_BOX_H__