31 mDragLayer =
"DragAndDrop";
93 void ItemBox::requestItemSize()
100 mSizeItem = coord.size();
103 "(mSizeItem.width > 0 && mSizeItem.height > 0) at requestCoordWidgetItem");
119 int count_visible = 0;
129 size_t start = (mFirstVisibleIndex * mCountItemInLine);
130 size_t count = (count_visible * mCountItemInLine) + start;
133 for (
size_t pos = start; pos < count; ++pos, ++index)
136 if (pos >= mItemsInfo.size())
143 ((
int)index % mCountItemInLine) * mSizeItem.
width - mContentPosition.
left,
144 (((
int)index / mCountItemInLine) * mSizeItem.
height) - mFirstOffsetIndex);
149 (((
int)index / mCountItemInLine) * mSizeItem.
width) - mFirstOffsetIndex,
150 ((
int)index % mCountItemInLine) * mSizeItem.
height - mContentPosition.
top);
158 IBDrawItemInfo data(pos, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse,
true,
false);
164 while (index < mVectorItems.size())
166 mVectorItems[index]->setVisible(
false);
174 if (_index == mVectorItems.size())
198 mVectorItems.push_back(item);
204 return mVectorItems[_index];
233 size_t start = (size_t)(mFirstVisibleIndex * mCountItemInLine);
234 size_t index = mIndexActive;
238 if ((mIndexActive >= start) && (mIndexActive < (start + mVectorItems.size())))
240 IBDrawItemInfo data(index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse,
false,
false);
261 for (
const auto& item : mVectorItems)
263 const IntRect& abs_rect = item->getAbsoluteRect();
267 size_t index = calcIndexByWidget(item);
269 if (index < mItemsInfo.size())
271 mIndexActive = index;
272 IBDrawItemInfo data(index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse,
false,
false);
286 size_t index = calcIndexByWidget(_item);
287 if (index < mItemsInfo.size())
298 mIndexAccept = (_set && _accept) ? _index :
ITEM_NONE;
299 mIndexRefuse = (_set && !_accept) ? _index :
ITEM_NONE;
301 size_t start = (size_t)(mFirstVisibleIndex * mCountItemInLine);
302 if ((_index >= start) && (_index < (start + mVectorItems.size())))
304 IBDrawItemInfo data(_index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse,
false,
false);
312 mItemsInfo[_index].data = std::move(_data);
314 size_t start = (size_t)(mFirstVisibleIndex * mCountItemInLine);
315 if ((_index >= start) && (_index < (start + mVectorItems.size())))
317 IBDrawItemInfo data(_index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse,
true,
false);
328 _index = mItemsInfo.size();
333 mItemsInfo.insert(mItemsInfo.begin() + _index,
ItemDataInfo(_data));
338 if (mIndexSelect >= _index)
362 mItemsInfo.erase(mItemsInfo.begin() + _index);
367 if (mItemsInfo.empty())
371 else if ((mIndexSelect > _index) || (mIndexSelect == mItemsInfo.size()))
390 if (mItemsInfo.empty())
409 size_t start = (size_t)(mFirstVisibleIndex * mCountItemInLine);
410 if ((_index >= start) && (_index < (start + mVectorItems.size())))
412 IBDrawItemInfo data(_index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse,
true,
false);
420 if (_index == mIndexSelect)
423 size_t start = (size_t)(mFirstVisibleIndex * mCountItemInLine);
428 size_t index = mIndexSelect;
431 if ((index >= start) && (index < (start + mVectorItems.size())))
433 IBDrawItemInfo data(index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse,
false,
false);
438 mIndexSelect = _index;
441 if ((_index >= start) && (_index < (start + mVectorItems.size())))
443 IBDrawItemInfo data(_index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse,
false,
false);
458 if (mAlignVert == _vert)
462 mCountItemInLine = -1;
478 MYGUI_ASSERT(_widget,
"ItemBox::getIndexByWidget : Widget == nullptr");
483 size_t index = calcIndexByWidget(_widget);
491 for (
const auto& item : mVectorItems)
493 if (item->getVisible())
495 if (item->getAbsoluteRect().inside(_point))
512 for (
auto& vectorItem : mVectorItems)
521 for (
const auto& vectorItem : mVectorItems)
523 if (vectorItem->getVisible())
557 if (
nullptr == mItemDrag)
564 mPointDragOffset = coord.
point();
610 size_t old = mIndexSelect;
633 if (old != mIndexSelect)
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);
699 if (1 > mCountItemInLine)
700 mCountItemInLine = 1;
703 mCountLines = int(mItemsInfo.size() / mCountItemInLine);
704 if (0 != (mItemsInfo.size() % mCountItemInLine))
709 mContentSize.
width = (mSizeItem.
width * mCountItemInLine);
714 mContentSize.
width = (mSizeItem.
width * mCountLines);
715 mContentSize.
height = (mSizeItem.
height * mCountItemInLine);
723 mContentPosition.
top = (int)_index;
727 mContentPosition.
left = (int)_index;
730 setContentPosition(mContentPosition);
737 if (mContentSize.
height <= 0)
740 int offset = mContentPosition.
top;
742 offset += mSizeItem.
height;
744 offset -= mSizeItem.
height;
753 if (mContentPosition.
top == offset)
760 mContentPosition.
top = offset;
764 if (mContentSize.
width <= 0)
767 int offset = mContentPosition.
left;
769 offset += mSizeItem.
width;
771 offset -= mSizeItem.
width;
780 if (mContentPosition.
left == offset)
787 mContentPosition.
left = offset;
790 setContentPosition(mContentPosition);
802 void ItemBox::setContentPosition(
const IntPoint& _point)
804 mContentPosition = _point;
806 int old = mFirstVisibleIndex;
810 mFirstVisibleIndex = mContentPosition.
top / mSizeItem.
height;
811 mFirstOffsetIndex = mContentPosition.
top % mSizeItem.
height;
815 mFirstVisibleIndex = mContentPosition.
left / mSizeItem.
width;
816 mFirstOffsetIndex = mContentPosition.
left % mSizeItem.
width;
833 size_t ItemBox::calcIndexByWidget(
Widget* _widget)
const
835 return *_widget->
_getInternalData<
size_t>() + (mFirstVisibleIndex * mCountItemInLine);
838 IntSize ItemBox::getContentSize()
const
843 IntPoint ItemBox::getContentPosition()
const
845 return mContentPosition;
853 void ItemBox::eraseContent()
858 size_t ItemBox::getHScrollPage()
const
860 return mSizeItem.
width;
863 size_t ItemBox::getVScrollPage()
const
868 Align ItemBox::getContentAlign()
const
875 return mItemsInfo.size();
933 if (_key ==
"VerticalAlignment")
937 else if (_key ==
"VisibleVScroll")
941 else if (_key ==
"VisibleHScroll")
957 if (mContentSize.
height <= 0)
960 int offset = _value.
top;
969 if (mContentPosition.
top == offset)
976 mContentPosition.
top = offset;
980 if (mContentSize.
width <= 0)
983 int offset = _value.
left;
992 if (mContentPosition.
left == offset)
999 mContentPosition.
left = offset;
1002 setContentPosition(mContentPosition);
1016 return getContentPosition();
#define MYGUI_ASSERT(exp, dest)
#define MYGUI_DEBUG_ASSERT(exp, dest)
#define MYGUI_ASSERT_RANGE_INSERT(index, size, owner)
#define MYGUI_ASSERT_RANGE(index, size, owner)
#define MYGUI_ASSERT_RANGE_AND_NONE(index, size, owner)
void mouseButtonPressed(MouseButton _id)
void mouseButtonReleased(MouseButton _id)
void mouseDrag(MouseButton _id)
void endDrop(bool _reset)
T * createWidget(std::string_view _skin, const IntCoord &_coord, Align _align, std::string_view _layer, std::string_view _name={})
static Gui & getInstance()
const IntPoint & getAbsolutePosition() const
IntRect getAbsoluteRect() const
void onMouseButtonPressed(int _left, int _top, MouseButton _id) override
void onKeyButtonPressed(KeyCode _key, Char _char) override
void clearItemDataAt(size_t _index)
Clear an item data at a specified position.
void notifyMouseDrag(Widget *_sender, int _left, int _top, MouseButton _id)
void setVisibleHScroll(bool _value)
size_t getIndexByWidget(Widget *_widget) const
void notifyMouseButtonReleased(Widget *_sender, int _left, int _top, MouseButton _id)
size_t getItemCount() const
Get number of items.
EventHandle_ItemBoxPtrWidgetPtrCIBCellDrawInfoRef requestDrawItem
IntPoint getViewOffset() const
void notifyMouseWheel(Widget *_sender, int _rel)
void shutdownOverride() override
void setVisibleVScroll(bool _value)
void removeItemAt(size_t _index, bool update=true)
Remove item at a specified position.
void notifyMouseButtonDoubleClick(Widget *_sender)
bool getVerticalAlignment() const
bool isVisibleHScroll() const
void onKeySetFocus(Widget *_old) override
void redrawItemAt(size_t _index)
Redraw at a specified position.
void setCoord(const IntCoord &_coord) override
void onMouseWheel(int _rel) override
void onKeyButtonReleased(KeyCode _key) override
Widget * getWidgetDrag() const
void notifyScrollChangePosition(ScrollBar *_sender, size_t _index)
void setViewOffset(const IntPoint &_value)
Widget * getItemWidget(size_t _index)
void setIndexSelected(size_t _index)
Select specified _index.
void setVerticalAlignment(bool _vert)
void redrawAllItems()
Redraw all items.
void initialiseOverride() override
void resetCurrentActiveItem()
void onMouseDrag(int _left, int _top, MouseButton _id) override
void onKeyLostFocus(Widget *_new) override
void insertItemAt(size_t _index, Any _data=Any::Null, bool update=true)
Insert an item into a array at a specified position.
size_t _getContainerIndex(const IntPoint &_point) const override
IntSize getViewSize() const override
void notifyMouseButtonPressed(Widget *_sender, int _left, int _top, MouseButton _id)
void setPropertyOverride(std::string_view _key, std::string_view _value) override
EventHandle_ItemBoxPtrSizeT eventMouseItemActivate
EventHandle_ItemBoxPtrWidgetPtr requestCreateWidgetItem
EventHandle_ItemBoxPtrSizeT eventSelectItemAccept
void notifyKeyButtonReleased(Widget *_sender, KeyCode _key)
void setItemDataAt(size_t _index, Any _data)
Replace an item data at a specified position.
Widget * getWidgetByIndex(size_t _index)
void updateDropItems() override
size_t _getItemIndex(Widget *_item) const override
void _updateAllVisible(bool _redraw)
void updateDropItemsState(const DDWidgetState &_state) override
size_t getIndexSelected() const
Get index of selected item (ITEM_NONE if none selected)
void _resetContainer(bool _update) override
void notifyRootMouseChangeFocus(Widget *_sender, bool _focus)
void findCurrentActiveItem()
void setSize(const IntSize &_size) override
void onMouseButtonReleased(int _left, int _top, MouseButton _id) override
void removeAllItems()
Remove all items.
void notifyKeyButtonPressed(Widget *_sender, KeyCode _key, Char _char)
void removeDropItems() override
void _setContainerItemInfo(size_t _index, bool _set, bool _accept) override
void setPosition(const IntPoint &_point) override
bool isVisibleVScroll() const
void clearIndexSelected()
Clear item selection.
void addItem(Any _data=Any::Null, bool update=true)
Add an item to the end of a array.
EventHandle_ItemBoxPtrIntCoordRefBool requestCoordItem
EventHandle_ItemBoxPtrCIBNotifyCellDataRef eventNotifyItem
EventHandle_ItemBoxPtrSizeT eventChangeItemPosition
bool isUserString(std::string_view _key) const
std::string_view getUserString(std::string_view _key) const
void _setInternalData(Any _data)
ValueType * _getInternalData(bool _throw=true) const
T parseValue(std::string_view _value)
types::TPoint< int > IntPoint
constexpr size_t ITEM_NONE
types::TCoord< int > IntCoord
types::TSize< int > IntSize
delegates::DelegateFunction< Args... > * newDelegate(void(*_func)(Args... args))
TPoint< T > point() const