38 mFirstVisibleIndex(0),
58 mDragLayer =
"DragAndDrop";
120 void ItemBox::requestItemSize()
127 mSizeItem = coord.size();
128 MYGUI_ASSERT((mSizeItem.
width > 0 && mSizeItem.
height > 0),
"(mSizeItem.width > 0 && mSizeItem.height > 0) at requestCoordWidgetItem");
144 int count_visible = 0;
147 count_visible = (_getClientWidget()->
getHeight() / mSizeItem.
height) + 2;
151 count_visible = (_getClientWidget()->
getWidth() / mSizeItem.
width) + 2;
154 size_t start = (mFirstVisibleIndex * mCountItemInLine);
155 size_t count = (count_visible * mCountItemInLine) + start;
158 for (
size_t pos = start; pos < count; ++pos, ++index)
161 if (pos >= mItemsInfo.size())
break;
167 (((
int)index / mCountItemInLine) * mSizeItem.
height) - mFirstOffsetIndex);
171 item->
setPosition((((
int)index / mCountItemInLine) * mSizeItem.
width) - mFirstOffsetIndex,
172 ((
int)index % mCountItemInLine) * mSizeItem.
height - mContentPosition.
top);
180 IBDrawItemInfo data(pos, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse,
true,
false);
187 while (index < mVectorItems.size())
189 mVectorItems[index]->setVisible(
false);
198 if (_index == mVectorItems.size())
219 mVectorItems.push_back(item);
225 return mVectorItems[_index];
254 size_t start = (size_t)(mFirstVisibleIndex * mCountItemInLine);
255 size_t index = mIndexActive;
259 if ((mIndexActive >= start) && (mIndexActive < (start + mVectorItems.size())))
261 IBDrawItemInfo data(index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse,
false,
false);
275 const IntRect& rect = _getClientAbsoluteRect();
281 for (
size_t pos = 0; pos < mVectorItems.size(); ++pos)
283 Widget* item = mVectorItems[pos];
288 size_t index = calcIndexByWidget(item);
290 if (index < mItemsInfo.size())
293 mIndexActive = index;
294 IBDrawItemInfo data(index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse,
false,
false);
306 if (_item == _getClientWidget())
308 size_t index = calcIndexByWidget(_item);
309 if (index < mItemsInfo.size())
319 mIndexAccept = (_set && _accept ) ? _index :
ITEM_NONE;
320 mIndexRefuse = (_set && !_accept) ? _index :
ITEM_NONE;
322 size_t start = (size_t)(mFirstVisibleIndex * mCountItemInLine);
323 if ((_index >= start) && (_index < (start + mVectorItems.size())))
325 IBDrawItemInfo data(_index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse,
false,
false);
333 mItemsInfo[_index].data = _data;
335 size_t start = (size_t)(mFirstVisibleIndex * mCountItemInLine);
336 if ((_index >= start) && (_index < (start + mVectorItems.size())))
338 IBDrawItemInfo data(_index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse,
true,
false);
348 if (_index ==
ITEM_NONE) _index = mItemsInfo.size();
354 mItemsInfo.insert(mItemsInfo.begin() + _index,
ItemDataInfo(_data));
359 if (mIndexSelect >= _index)
380 mItemsInfo.erase(mItemsInfo.begin() + _index);
385 if (mItemsInfo.empty())
389 else if ((mIndexSelect > _index) || (mIndexSelect == mItemsInfo.size()))
405 if (mItemsInfo.empty())
424 size_t start = (size_t)(mFirstVisibleIndex * mCountItemInLine);
425 if ((_index >= start) && (_index < (start + mVectorItems.size())))
427 IBDrawItemInfo data(_index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse,
true,
false);
435 if (_index == mIndexSelect)
return;
437 size_t start = (size_t)(mFirstVisibleIndex * mCountItemInLine);
442 size_t index = mIndexSelect;
445 if ((index >= start) && (index < (start + mVectorItems.size())))
447 IBDrawItemInfo data(index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse,
false,
false);
452 mIndexSelect = _index;
455 if ((_index >= start) && (_index < (start + mVectorItems.size())))
457 IBDrawItemInfo data(_index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse,
false,
false);
473 if (mAlignVert == _vert)
477 mCountItemInLine = -1;
493 MYGUI_ASSERT(_widget,
"ItemBox::getIndexByWidget : Widget == nullptr");
494 if (_widget == _getClientWidget())
return ITEM_NONE;
495 MYGUI_ASSERT(_widget->
getParent() == _getClientWidget(),
"ItemBox::getIndexByWidget : Widget is not child");
497 size_t index = calcIndexByWidget(_widget);
505 for (VectorWidgetPtr::iterator iter = mVectorItems.begin(); iter != mVectorItems.end(); ++iter)
507 if ((*iter)->getVisible())
509 if ((*iter)->getAbsoluteRect().inside(_point))
526 for (VectorWidgetPtr::iterator iter = mVectorItems.begin(); iter != mVectorItems.end(); ++iter)
535 for (VectorWidgetPtr::iterator iter = mVectorItems.begin(); iter != mVectorItems.end(); ++iter)
537 if ((*iter)->getVisible())
541 if (index == _index)
return (*iter);
569 if (
nullptr == mItemDrag)
576 mPointDragOffset = coord.
point();
616 size_t old = mIndexSelect;
618 if (_sender == _getClientWidget())
655 size_t index = calcIndexByWidget(_sender);
663 size_t old_index = mIndexActive;
665 IBDrawItemInfo data(old_index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse,
false,
false);
666 requestDrawItem(
this, mVectorItems[old_index - (mFirstVisibleIndex * mCountItemInLine)], data);
669 mIndexActive = index;
670 IBDrawItemInfo data(index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse,
false,
false);
677 if (index < mItemsInfo.size() && mIndexActive == index)
680 IBDrawItemInfo data(index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse,
false,
false);
691 mCountItemInLine = _getClientWidget()->
getWidth() / mSizeItem.
width;
699 if (1 > mCountItemInLine) mCountItemInLine = 1;
702 mCountLines = mItemsInfo.size() / mCountItemInLine;
703 if (0 != (mItemsInfo.size() % mCountItemInLine)) mCountLines ++;
707 mContentSize.
width = (mSizeItem.
width * mCountItemInLine);
712 mContentSize.
width = (mSizeItem.
width * mCountLines);
713 mContentSize.
height = (mSizeItem.
height * mCountItemInLine);
721 mContentPosition.
top = (int)_index;
725 mContentPosition.
left = (int)_index;
728 setContentPosition(mContentPosition);
735 if (mContentSize.
height <= 0)
return;
737 int offset = mContentPosition.
top;
738 if (_rel < 0) offset += mSizeItem.
height;
739 else offset -= mSizeItem.
height;
743 else if (offset >= mContentSize.
height - _getClientWidget()->
getHeight())
748 if (mContentPosition.
top == offset)
return;
754 mContentPosition.
top = offset;
758 if (mContentSize.
width <= 0)
return;
760 int offset = mContentPosition.
left;
761 if (_rel < 0) offset += mSizeItem.
width;
762 else offset -= mSizeItem.
width;
766 else if (offset >= mContentSize.
width - _getClientWidget()->
getWidth())
767 offset = mContentSize.
width - _getClientWidget()->
getWidth();
771 if (mContentPosition.
left == offset)
return;
777 mContentPosition.
left = offset;
780 setContentPosition(mContentPosition);
790 void ItemBox::setContentPosition(
const IntPoint& _point)
792 mContentPosition = _point;
794 int old = mFirstVisibleIndex;
798 mFirstVisibleIndex = mContentPosition.
top / mSizeItem.
height;
799 mFirstOffsetIndex = mContentPosition.
top % mSizeItem.
height;
803 mFirstVisibleIndex = mContentPosition.
left / mSizeItem.
width;
804 mFirstOffsetIndex = mContentPosition.
left % mSizeItem.
width;
821 size_t ItemBox::calcIndexByWidget(
Widget* _widget)
823 return *_widget->
_getInternalData<
size_t>() + (mFirstVisibleIndex * mCountItemInLine);
826 IntSize ItemBox::getContentSize()
831 IntPoint ItemBox::getContentPosition()
833 return mContentPosition;
838 return _getClientWidget()->
getSize();
841 void ItemBox::eraseContent()
846 size_t ItemBox::getHScrollPage()
848 return mSizeItem.
width;
851 size_t ItemBox::getVScrollPage()
856 Align ItemBox::getContentAlign()
861 IntRect ItemBox::_getClientAbsoluteRect()
866 Widget* ItemBox::_getClientWidget()
873 return mItemsInfo.size();
923 if (_key ==
"VerticalAlignment")
virtual size_t _getItemIndex(Widget *_item)
virtual void setSize(const IntSize &_value)
virtual void initialiseOverride()
void notifyMouseButtonReleased(Widget *_sender, int _left, int _top, MouseButton _id)
types::TRect< int > IntRect
virtual void updateDropItems()
void notifyMouseButtonDoubleClick(Widget *_sender)
Widget * getItemWidget(size_t _index)
void mouseDrag(MouseButton _id)
void notifyScrollChangePosition(ScrollBar *_sender, size_t _index)
void redrawItemAt(size_t _index)
Redraw at a specified position.
void setVerticalAlignment(bool _value)
EventHandle_ItemBoxPtrSizeT eventSelectItemAccept
types::TSize< int > IntSize
size_t getItemCount() const
Get number of items.
virtual void updateDropItemsState(const DDWidgetState &_state)
void notifyKeyButtonReleased(Widget *_sender, KeyCode _key)
delegates::IDelegate0 * newDelegate(void(*_func)())
void mouseButtonReleased(MouseButton _id)
Widget * getWidgetByIndex(size_t _index)
static InputManager & getInstance()
void insertItemAt(size_t _index, Any _data=Any::Null)
Insert an item into a array at a specified position.
EventHandle_ItemBoxPtrWidgetPtrCIBCellDrawInfoRef requestDrawItem
void notifyMouseDrag(Widget *_sender, int _left, int _top, MouseButton _id)
virtual void onMouseButtonPressed(int _left, int _top, MouseButton _id)
void notifyMouseWheel(Widget *_sender, int _rel)
void findCurrentActiveItem()
EventHandle_ItemBoxPtrSizeT eventMouseItemActivate
void redrawAllItems()
Redraw all items.
size_t getIndexSelected() const
Get index of selected item (ITEM_NONE if none selected)
virtual void removeDropItems()
void clearItemDataAt(size_t _index)
Clear an item data at a specified position.
virtual void _resetContainer(bool _update)
void clearIndexSelected()
Clear item selection.
void setIndexSelected(size_t _index)
Select specified _index.
virtual void setPropertyOverride(const std::string &_key, const std::string &_value)
virtual void onKeyLostFocus(Widget *_new)
types::TCoord< int > IntCoord
IntRect getAbsoluteRect() const
void removeAllItems()
Remove all items.
size_t getIndexByWidget(Widget *_widget)
virtual void onMouseButtonReleased(int _left, int _top, MouseButton _id)
EventHandle_ItemBoxPtrWidgetPtr requestCreateWidgetItem
void addItem(Any _data=Any::Null)
Add an item to the end of a array.
virtual void onMouseButtonReleased(int _left, int _top, MouseButton _id)
const IntPoint & getAbsolutePosition() const
void setItemDataAt(size_t _index, Any _data)
Replace an item data at a specified position.
virtual void setPosition(const IntPoint &_value)
virtual void onMouseDrag(int _left, int _top, MouseButton _id)
T * createWidget(const std::string &_skin, const IntCoord &_coord, Align _align, const std::string &_layer, const std::string &_name="")
void _setInternalData(Any _data)
#define MYGUI_ASSERT_RANGE_AND_NONE(index, size, owner)
virtual void onMouseDrag(int _left, int _top, MouseButton _id)
void resetCurrentActiveItem()
void notifyKeyButtonPressed(Widget *_sender, KeyCode _key, Char _char)
void _setContainerItemInfo(size_t _index, bool _set, bool _accept)
void notifyMouseButtonPressed(Widget *_sender, int _left, int _top, MouseButton _id)
#define MYGUI_ASSERT(exp, dest)
void notifyRootMouseChangeFocus(Widget *_sender, bool _focus)
virtual void onKeySetFocus(Widget *_old)
EventHandle_ItemBoxPtrCIBNotifyCellDataRef eventNotifyItem
void mouseButtonPressed(MouseButton _id)
void removeItemAt(size_t _index)
Remove item at a specified position.
void _updateAllVisible(bool _redraw)
virtual void shutdownOverride()
bool isUserString(const std::string &_key) const
#define MYGUI_ASSERT_RANGE(index, size, owner)
virtual void setCoord(const IntCoord &_value)
virtual void setPropertyOverride(const std::string &_key, const std::string &_value)
virtual void onMouseWheel(int _rel)
EventHandle_ItemBoxPtrIntCoordRefBool requestCoordItem
#define MYGUI_DEBUG_ASSERT(exp, dest)
virtual size_t _getContainerIndex(const IntPoint &_point)
EventHandle_ItemBoxPtrSizeT eventChangeItemPosition
bool getVerticalAlignment() const
#define MYGUI_ASSERT_RANGE_INSERT(index, size, owner)
ValueType * _getInternalData(bool _throw=true)
TPoint< T > point() const
const std::string & getUserString(const std::string &_key) const
void endDrop(bool _reset)
virtual void onMouseButtonPressed(int _left, int _top, MouseButton _id)
types::TPoint< int > IntPoint