40 mFirstVisibleIndex(0),
55 Base::_initialise(_style, _coord, _align, _info, _parent, _croppedParent, _creator, _name);
57 initialiseWidgetSkin(_info);
69 initialiseWidgetSkin(_info);
76 mDragLayer =
"DragAndDrop";
79 if (!properties.empty())
81 MapString::const_iterator iter = properties.find(
"AlignVert");
83 iter = properties.find(
"DragLayer");
84 if (iter != properties.end()) mDragLayer = iter->second;
89 if (*(*iter)->_getInternalData<std::string>() ==
"VScroll")
95 if (*(*iter)->_getInternalData<std::string>() ==
"HScroll")
101 else if (*(*iter)->_getInternalData<std::string>() ==
"Client")
123 void ItemBox::shutdownWidgetSkin()
148 void ItemBox::requestItemSize()
155 mSizeItem = coord.size();
156 MYGUI_ASSERT((mSizeItem.
width > 0 && mSizeItem.
height > 0),
"(mSizeItem.width > 0 && mSizeItem.height > 0) at requestCoordWidgetItem");
172 int count_visible = 0;
175 count_visible = (_getClientWidget()->
getHeight() / mSizeItem.
height) + 2;
179 count_visible = (_getClientWidget()->
getWidth() / mSizeItem.
width) + 2;
182 size_t start = (mFirstVisibleIndex * mCountItemInLine);
183 size_t count = (count_visible * mCountItemInLine) + start;
186 for (
size_t pos = start; pos<count; ++pos, ++index)
189 if (pos >= mItemsInfo.size())
break;
195 (((
int)index / mCountItemInLine) * mSizeItem.
height) - mFirstOffsetIndex);
199 item->
setPosition((((
int)index / mCountItemInLine) * mSizeItem.
width) - mFirstOffsetIndex,
200 ((
int)index % mCountItemInLine) * mSizeItem.
height - mContentPosition.
top);
208 IBDrawItemInfo data(pos, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse,
true,
false);
215 while (index < mVectorItems.size())
217 mVectorItems[index]->setVisible(
false);
226 if (_index == mVectorItems.size())
248 mVectorItems.push_back(item);
254 return mVectorItems[_index];
285 size_t start = (size_t)(mFirstVisibleIndex * mCountItemInLine);
286 size_t index = mIndexActive;
290 if ((mIndexActive >= start) && (mIndexActive < (start + mVectorItems.size())))
292 IBDrawItemInfo data(index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse,
false,
false);
306 const IntRect& rect = _getClientAbsoluteRect();
312 for (
size_t pos=0; pos<mVectorItems.size(); ++pos)
314 Widget* item = mVectorItems[pos];
319 size_t index = calcIndexByWidget(item);
321 if (index < mItemsInfo.size())
324 mIndexActive = index;
325 IBDrawItemInfo data(index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse,
false,
false);
337 if (_sender == _getClientWidget())
344 size_t index = calcIndexByWidget(_sender);
345 if (index < mItemsInfo.size())
358 mIndexAccept = (_set && _accept ) ? _index :
ITEM_NONE;
359 mIndexRefuse = (_set && !_accept) ? _index :
ITEM_NONE;
361 size_t start = (size_t)(mFirstVisibleIndex * mCountItemInLine);
362 if ((_index >= start) && (_index < (start + mVectorItems.size())))
364 IBDrawItemInfo data(_index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse,
false,
false);
372 mItemsInfo[_index].data = _data;
374 size_t start = (size_t)(mFirstVisibleIndex * mCountItemInLine);
375 if ((_index >= start) && (_index < (start + mVectorItems.size())))
377 IBDrawItemInfo data(_index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse,
true,
false);
387 if (_index ==
ITEM_NONE) _index = mItemsInfo.size();
393 mItemsInfo.insert(mItemsInfo.begin() + _index,
ItemDataInfo(_data));
398 if (mIndexSelect >= _index)
419 mItemsInfo.erase(mItemsInfo.begin() + _index);
424 if (mItemsInfo.empty())
428 else if ((mIndexSelect > _index) || (mIndexSelect == mItemsInfo.size()))
444 if (0 == mItemsInfo.size())
return;
462 size_t start = (size_t)(mFirstVisibleIndex * mCountItemInLine);
463 if ((_index >= start) && (_index < (start + mVectorItems.size())))
465 IBDrawItemInfo data(_index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse,
true,
false);
473 if (_index == mIndexSelect)
return;
475 size_t start = (size_t)(mFirstVisibleIndex * mCountItemInLine);
480 size_t index = mIndexSelect;
483 if ((index >= start) && (index < (start + mVectorItems.size())))
485 IBDrawItemInfo data(index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse,
false,
false);
490 mIndexSelect = _index;
493 if ((_index >= start) && (_index < (start + mVectorItems.size())))
495 IBDrawItemInfo data(_index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse,
false,
false);
511 if (mAlignVert == _vert)
return;
514 mCountItemInLine = -1;
530 MYGUI_ASSERT(_widget,
"ItemBox::getIndexByWidget : Widget == nullptr");
531 if (_widget == _getClientWidget())
return ITEM_NONE;
532 MYGUI_ASSERT(_widget->
getParent() == _getClientWidget(),
"ItemBox::getIndexByWidget : Widget is not child");
534 size_t index = calcIndexByWidget(_widget);
542 for (VectorWidgetPtr::iterator iter=mVectorItems.begin(); iter!=mVectorItems.end(); ++iter)
544 if ((*iter)->isVisible())
546 if ((*iter)->getAbsoluteRect().inside(_point))
563 for (VectorWidgetPtr::iterator iter=mVectorItems.begin(); iter!=mVectorItems.end(); ++iter)
572 for (VectorWidgetPtr::iterator iter=mVectorItems.begin(); iter!=mVectorItems.end(); ++iter)
574 if ((*iter)->isVisible())
578 if (index == _index)
return (*iter);
606 if (
nullptr == mItemDrag)
613 mPointDragOffset = coord.
point();
653 size_t old = mIndexSelect;
655 if (_sender == _getClientWidget())
684 size_t index = calcIndexByWidget(_sender);
692 size_t index = calcIndexByWidget(_sender);
700 size_t old_index = mIndexActive;
702 IBDrawItemInfo data(old_index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse,
false,
false);
703 requestDrawItem(
this, mVectorItems[old_index - (mFirstVisibleIndex * mCountItemInLine)], data);
706 mIndexActive = index;
707 IBDrawItemInfo data(index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse,
false,
false);
714 if (index < mItemsInfo.size() && mIndexActive == index)
717 IBDrawItemInfo data(index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse,
false,
false);
728 mCountItemInLine = _getClientWidget()->
getWidth() / mSizeItem.
width;
736 if (1 > mCountItemInLine) mCountItemInLine = 1;
739 mCountLines = mItemsInfo.size() / mCountItemInLine;
740 if (0 != (mItemsInfo.size() % mCountItemInLine)) mCountLines ++;
744 mContentSize.
width = (mSizeItem.
width * mCountItemInLine);
749 mContentSize.
width = (mSizeItem.
width * mCountLines);
750 mContentSize.
height = (mSizeItem.
height * mCountItemInLine);
758 mContentPosition.
top = (int)_index;
762 mContentPosition.
left = (int)_index;
765 setContentPosition(mContentPosition);
772 if (mContentSize.
height <= 0)
return;
774 int offset = mContentPosition.
top;
775 if (_rel < 0) offset += mSizeItem.
height;
776 else offset -= mSizeItem.
height;
779 else if (offset < 0) offset = 0;
781 if (mContentPosition.
top == offset)
return;
787 mContentPosition.
top = offset;
791 if (mContentSize.
width <= 0)
return;
793 int offset = mContentPosition.
left;
794 if (_rel < 0) offset += mSizeItem.
width;
795 else offset -= mSizeItem.
width;
797 if (offset >= mContentSize.
width - _getClientWidget()->
getWidth()) offset = mContentSize.
width - _getClientWidget()->
getWidth();
798 else if (offset < 0) offset = 0;
800 if (mContentPosition.
left == offset)
return;
806 mContentPosition.
left = offset;
809 setContentPosition(mContentPosition);
819 void ItemBox::setContentPosition(
const IntPoint& _point)
821 mContentPosition = _point;
823 int old = mFirstVisibleIndex;
827 mFirstVisibleIndex = mContentPosition.
top / mSizeItem.
height;
828 mFirstOffsetIndex = mContentPosition.
top % mSizeItem.
height;
832 mFirstVisibleIndex = mContentPosition.
left / mSizeItem.
width;
833 mFirstOffsetIndex = mContentPosition.
left % mSizeItem.
width;
850 size_t ItemBox::calcIndexByWidget(
Widget* _widget)
852 return *_widget->
_getInternalData<
size_t>() + (mFirstVisibleIndex * mCountItemInLine);
855 IntSize ItemBox::getContentSize()
860 IntPoint ItemBox::getContentPosition()
862 return mContentPosition;
865 IntSize ItemBox::getViewSize()
const
867 return _getClientWidget()->
getSize();
870 void ItemBox::eraseContent()
875 size_t ItemBox::getHScrollPage()
877 return mSizeItem.
width;
880 size_t ItemBox::getVScrollPage()
885 Align ItemBox::getContentAlign()
890 IntRect ItemBox::_getClientAbsoluteRect()
895 Widget* ItemBox::_getClientWidget()
900 const Widget* ItemBox::_getClientWidget()
const