MyGUI
3.2.1
|
00001 /* 00002 * This source file is part of MyGUI. For the latest info, see http://mygui.info/ 00003 * Distributed under the MIT License 00004 * (See accompanying file COPYING.MIT or copy at http://opensource.org/licenses/MIT) 00005 */ 00006 00007 #ifndef __MYGUI_ITEM_BOX_H__ 00008 #define __MYGUI_ITEM_BOX_H__ 00009 00010 #include "MyGUI_Prerequest.h" 00011 #include "MyGUI_DDContainer.h" 00012 #include "MyGUI_IBItemInfo.h" 00013 #include "MyGUI_Any.h" 00014 #include "MyGUI_EventPair.h" 00015 #include "MyGUI_ScrollViewBase.h" 00016 00017 namespace MyGUI 00018 { 00019 00020 typedef delegates::CDelegate2<ItemBox*, Widget*> EventHandle_ItemBoxPtrWidgetPtr; 00021 typedef delegates::CDelegate3<ItemBox*, IntCoord&, bool> EventHandle_ItemBoxPtrIntCoordRefBool; 00022 typedef delegates::CDelegate3<ItemBox*, Widget*, const IBDrawItemInfo&> EventHandle_ItemBoxPtrWidgetPtrCIBCellDrawInfoRef; 00023 typedef delegates::CMultiDelegate2<ItemBox*, size_t> EventHandle_ItemBoxPtrSizeT; 00024 typedef delegates::CMultiDelegate2<ItemBox*, const IBNotifyItemData&> EventHandle_ItemBoxPtrCIBNotifyCellDataRef; 00025 00029 class MYGUI_EXPORT ItemBox : 00030 public DDContainer, 00031 protected ScrollViewBase, 00032 public MemberObsolete<ItemBox> 00033 { 00034 MYGUI_RTTI_DERIVED( ItemBox ) 00035 00036 public: 00037 ItemBox(); 00038 00039 //------------------------------------------------------------------------------// 00040 // манипуляции айтемами 00041 00043 size_t getItemCount() const; 00044 00046 void insertItemAt(size_t _index, Any _data = Any::Null); 00047 00049 void addItem(Any _data = Any::Null); 00050 00052 void removeItemAt(size_t _index); 00053 00055 void removeAllItems(); 00056 00058 void redrawItemAt(size_t _index); 00059 00061 void redrawAllItems(); 00062 00063 00064 //------------------------------------------------------------------------------// 00065 // манипуляции выделениями 00066 00068 size_t getIndexSelected() const; 00069 00071 void setIndexSelected(size_t _index); 00072 00074 void clearIndexSelected(); 00075 00076 00077 //------------------------------------------------------------------------------// 00078 // манипуляции данными 00079 00081 void setItemDataAt(size_t _index, Any _data); 00082 00084 void clearItemDataAt(size_t _index); 00085 00087 template <typename ValueType> 00088 ValueType* getItemDataAt(size_t _index, bool _throw = true) 00089 { 00090 MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "ItemBox::getItemDataAt"); 00091 return mItemsInfo[_index].data.castType<ValueType>(_throw); 00092 } 00093 00094 00096 void setVerticalAlignment(bool _value); 00098 bool getVerticalAlignment() const; 00099 00101 size_t getIndexByWidget(Widget* _widget); 00102 00104 Widget* getWidgetDrag(); 00105 00111 Widget* getWidgetByIndex(size_t _index); 00112 00114 void resetDrag(); 00115 00117 virtual void setPosition(const IntPoint& _value); 00119 virtual void setSize(const IntSize& _value); 00121 virtual void setCoord(const IntCoord& _value); 00122 00124 void setPosition(int _left, int _top); 00126 void setSize(int _width, int _height); 00128 void setCoord(int _left, int _top, int _width, int _height); 00129 00131 void setViewOffset(const IntPoint& _value); 00133 IntPoint getViewOffset(); 00134 00135 virtual IntSize getViewSize(); 00136 00137 /*events:*/ 00143 EventHandle_ItemBoxPtrWidgetPtr requestCreateWidgetItem; 00144 00151 EventHandle_ItemBoxPtrIntCoordRefBool requestCoordItem; 00152 00159 EventHandle_ItemBoxPtrWidgetPtrCIBCellDrawInfoRef requestDrawItem; 00160 00166 EventHandle_ItemBoxPtrSizeT eventSelectItemAccept; 00167 00173 EventHandle_ItemBoxPtrSizeT eventChangeItemPosition; 00174 00180 EventHandle_ItemBoxPtrSizeT eventMouseItemActivate; 00181 00187 EventHandle_ItemBoxPtrCIBNotifyCellDataRef eventNotifyItem; 00188 00189 /*internal:*/ 00190 virtual void _resetContainer(bool _update); 00191 00192 protected: 00193 virtual void initialiseOverride(); 00194 virtual void shutdownOverride(); 00195 00196 struct ItemDataInfo 00197 { 00198 ItemDataInfo(Any _data) : 00199 data(_data) { } 00200 Any data; 00201 }; 00202 typedef std::vector<ItemDataInfo> VectorItemInfo; 00203 00204 virtual void onMouseButtonPressed(int _left, int _top, MouseButton _id); 00205 virtual void onMouseButtonReleased(int _left, int _top, MouseButton _id); 00206 virtual void onKeyButtonPressed(KeyCode _key, Char _char); 00207 virtual void onKeyButtonReleased(KeyCode _key); 00208 virtual void onMouseDrag(int _left, int _top, MouseButton _id); 00209 00210 virtual void onMouseWheel(int _rel); 00211 virtual void onKeyLostFocus(Widget* _new); 00212 virtual void onKeySetFocus(Widget* _old); 00213 00214 void notifyKeyButtonPressed(Widget* _sender, KeyCode _key, Char _char); 00215 void notifyKeyButtonReleased(Widget* _sender, KeyCode _key); 00216 void notifyScrollChangePosition(ScrollBar* _sender, size_t _index); 00217 void notifyMouseWheel(Widget* _sender, int _rel); 00218 void notifyRootMouseChangeFocus(Widget* _sender, bool _focus); 00219 void notifyMouseButtonDoubleClick(Widget* _sender); 00220 virtual size_t _getItemIndex(Widget* _item); 00221 void notifyMouseDrag(Widget* _sender, int _left, int _top, MouseButton _id); 00222 void notifyMouseButtonPressed(Widget* _sender, int _left, int _top, MouseButton _id); 00223 void notifyMouseButtonReleased(Widget* _sender, int _left, int _top, MouseButton _id); 00224 00225 00226 virtual void removeDropItems(); 00227 virtual void updateDropItems(); 00228 virtual void updateDropItemsState(const DDWidgetState& _state); 00229 00230 // Обновляет данные о айтемах, при изменении размеров 00231 void updateMetrics(); 00232 00233 // просто обновляет все виджеты что видны 00234 void _updateAllVisible(bool _redraw); 00235 00236 void updateFromResize(); 00237 00238 // возвращает следующий айтем, если нет его, то создается 00239 // запросы только последовательно 00240 Widget* getItemWidget(size_t _index); 00241 00242 void _setContainerItemInfo(size_t _index, bool _set, bool _accept); 00243 00244 // сбрасываем старую подсветку 00245 void resetCurrentActiveItem(); 00246 // ищет и устанавливает подсвеченный айтем 00247 void findCurrentActiveItem(); 00248 00249 // запрашиваем у конейтера айтем по позиции мыши 00250 virtual size_t _getContainerIndex(const IntPoint& _point); 00251 00252 virtual void setPropertyOverride(const std::string& _key, const std::string& _value); 00253 00254 private: 00255 size_t calcIndexByWidget(Widget* _widget); 00256 00257 void requestItemSize(); 00258 00259 virtual IntSize getContentSize(); 00260 virtual IntPoint getContentPosition(); 00261 virtual void eraseContent(); 00262 virtual size_t getHScrollPage(); 00263 virtual size_t getVScrollPage(); 00264 virtual Align getContentAlign(); 00265 virtual void setContentPosition(const IntPoint& _point); 00266 00267 IntRect _getClientAbsoluteRect(); 00268 Widget* _getClientWidget(); 00269 00270 private: 00271 // наши дети в строках 00272 VectorWidgetPtr mVectorItems; 00273 00274 // размер одного айтема 00275 IntSize mSizeItem; 00276 00277 // размерность скролла в пикселях 00278 IntSize mContentSize; 00279 // позиция скролла п пикселях 00280 IntPoint mContentPosition; 00281 00282 // колличество айтемов в одной строке 00283 int mCountItemInLine; 00284 // колличество линий 00285 int mCountLines; 00286 00287 // самая верхняя строка 00288 int mFirstVisibleIndex; 00289 // текущее смещение верхнего элемента в пикселях 00290 // сколько его пикселей не видно сверху 00291 int mFirstOffsetIndex; 00292 00293 // текущий выделенный элемент или ITEM_NONE 00294 size_t mIndexSelect; 00295 // подсвеченный элемент или ITEM_NONE 00296 size_t mIndexActive; 00297 // индекс со свойством приема или ITEM_NONE 00298 size_t mIndexAccept; 00299 // индекс со свойством отказа или ITEM_NONE 00300 size_t mIndexRefuse; 00301 00302 // имеем ли мы фокус ввода 00303 bool mIsFocus; 00304 00305 // структура данных об айтеме 00306 VectorItemInfo mItemsInfo; 00307 00308 Widget* mItemDrag; 00309 IntPoint mPointDragOffset; 00310 00311 bool mAlignVert; 00312 00313 std::string mDragLayer; 00314 }; 00315 00316 } // namespace MyGUI 00317 00318 #endif // __MYGUI_ITEM_BOX_H__