23 mWidgetEmpty(nullptr),
36 Base::initialiseOverride();
38 std::string skinButtonEmpty;
50 mWidthSeparator = utility::parseValue<int>(
getUserString(
"WidthSeparator"));
54 mHeightButton = utility::parseValue<int>(
getUserString(
"HeightButton"));
55 if (mHeightButton < 0)
64 if (mWidgetEmpty ==
nullptr)
69 if (!skinButtonEmpty.empty())
73 if (getUpdateByResize())
79 Base::shutdownOverride();
84 MYGUI_ASSERT_RANGE(_column, mVectorColumnInfo.size(),
"MultiListBox::setColumnNameAt");
85 mVectorColumnInfo[_column].name = _name;
93 MYGUI_ASSERT_RANGE(_column, mVectorColumnInfo.size(),
"MultiListBox::setColumnWidthAt");
94 mVectorColumnInfo[_column].width = _width;
100 MYGUI_ASSERT_RANGE(_column, mVectorColumnInfo.size(),
"MultiListBox::getColumnNameAt");
101 return mVectorColumnInfo[_column].name;
106 MYGUI_ASSERT_RANGE(_column, mVectorColumnInfo.size(),
"MultiListBox::getColumnWidthAt");
107 return mVectorColumnInfo[_column].width;
112 while (!mVectorColumnInfo.empty())
118 mSortColumnIndex = _column;
139 if (mVectorColumnInfo.empty())
141 return mVectorColumnInfo.front().list->getItemCount();
147 for (VectorColumnInfo::iterator iter = mVectorColumnInfo.begin(); iter != mVectorColumnInfo.end(); ++iter)
149 (*iter).list->removeAllItems();
155 void MultiListBox::updateBackSelected(
size_t _index)
159 for (VectorColumnInfo::iterator iter = mVectorColumnInfo.begin(); iter != mVectorColumnInfo.end(); ++iter)
161 (*iter).list->clearIndexSelected();
166 for (VectorColumnInfo::iterator iter = mVectorColumnInfo.begin(); iter != mVectorColumnInfo.end(); ++iter)
168 (*iter).list->setIndexSelected(_index);
175 if (_index == mItemSelected)
178 MYGUI_ASSERT(!mVectorColumnInfo.empty(),
"MultiListBox::setIndexSelected");
181 mItemSelected = _index;
187 MYGUI_ASSERT_RANGE(_index, mVectorColumnInfo.begin()->list->getItemCount(),
"MultiListBox::setSubItemAt");
193 if (_column == mSortColumnIndex)
199 MYGUI_ASSERT_RANGE(_index, mVectorColumnInfo.begin()->list->getItemCount(),
"MultiListBox::getSubItemNameAt");
211 int MultiListBox::getButtonHeight()
const
213 if (mHeaderPlace !=
nullptr)
215 return mHeightButton;
218 void MultiListBox::updateOnlyEmpty()
220 if (
nullptr == mWidgetEmpty)
233 void MultiListBox::notifyListChangePosition(ListBox* _sender,
size_t _position)
235 for (VectorColumnInfo::iterator iter = mVectorColumnInfo.begin(); iter != mVectorColumnInfo.end(); ++iter)
237 if (_sender != (*iter).list)
238 (*iter).list->setIndexSelected(_position);
241 updateBackSelected(_position);
249 void MultiListBox::notifyListSelectAccept(ListBox* _sender,
size_t _position)
257 IBNotifyItemData infoConvertedIndex(_info);
262 void MultiListBox::notifyListChangeFocus(ListBox* _sender,
size_t _position)
264 for (VectorColumnInfo::iterator iter = mVectorColumnInfo.begin(); iter != mVectorColumnInfo.end(); ++iter)
266 if (_sender != (*iter).list)
269 (*iter).list->_setItemFocus(mLastMouseFocusIndex,
false);
271 (*iter).list->_setItemFocus(_position,
true);
274 mLastMouseFocusIndex = _position;
277 void MultiListBox::notifyListChangeScrollPosition(ListBox* _sender,
size_t _position)
279 for (VectorColumnInfo::iterator iter = mVectorColumnInfo.begin(); iter != mVectorColumnInfo.end(); ++iter)
281 if (_sender != (*iter).list)
282 (*iter).list->setScrollPosition(_position);
292 void MultiListBox::redrawButtons()
295 for (VectorColumnInfo::iterator iter = mVectorColumnInfo.begin(); iter != mVectorColumnInfo.end(); ++iter)
297 if (pos == mSortColumnIndex)
300 (*iter).button->setImageName(
"Up");
302 (*iter).button->setImageName(
"Down");
305 (*iter).button->setImageName(
"None");
307 (*iter).button->setCaption((*iter).name);
312 void MultiListBox::frameEntered(
float _frame)
317 void MultiListBox::frameAdvise(
bool _advise)
332 mFrameAdvise =
false;
337 Widget* MultiListBox::getOrCreateSeparator(
size_t _index)
339 if (!mWidthSeparator || mSkinSeparator.empty())
342 if (_index == mVectorColumnInfo.size() - 1)
345 while (_index >= mSeparators.size())
348 mSeparators.push_back(separator);
351 return mSeparators[_index];
354 void MultiListBox::flipList()
359 size_t last = mVectorColumnInfo.front().list->getItemCount();
368 for (VectorColumnInfo::iterator iter = mVectorColumnInfo.begin(); iter != mVectorColumnInfo.end(); ++iter)
370 (*iter).list->swapItemsAt(first, last);
380 bool MultiListBox::compare(ListBox* _list,
size_t _left,
size_t _right)
384 std::swap(_left, _right);
387 result = _list->getItemNameAt(_left) < _list->getItemNameAt(_right);
391 requestOperatorLess.m_eventObsolete(
this, mSortColumnIndex, _list->getItemNameAt(_left), _list->getItemNameAt(_right), result);
397 void MultiListBox::sortList()
402 ListBox* list = mVectorColumnInfo[mSortColumnIndex].list;
404 size_t count = list->getItemCount();
411 for (
size_t step = count >> 1; step > 0 ; step >>= 1)
413 for (
size_t i = 0; i < (count - step); i++)
419 if (compare(list, first, last))
422 for (VectorColumnInfo::iterator iter = mVectorColumnInfo.begin(); iter != mVectorColumnInfo.end(); ++iter)
424 (*iter).list->swapItemsAt(first, last);
439 MYGUI_ASSERT(!mVectorColumnInfo.empty(),
"MultiListBox::insertItemAt");
442 _index = mVectorColumnInfo.front().list->getItemCount();
446 if ((mItemSelected !=
ITEM_NONE) && (_index <= mItemSelected))
452 for (VectorColumnInfo::iterator iter = mVectorColumnInfo.begin(); iter != mVectorColumnInfo.end(); ++iter)
454 (*iter).list->insertItemAt(index,
"");
456 mVectorColumnInfo.front().list->setItemNameAt(index, _name);
457 mVectorColumnInfo.front().list->setItemDataAt(index, _data);
464 MYGUI_ASSERT(!mVectorColumnInfo.empty(),
"MultiListBox::removeItemAt");
465 MYGUI_ASSERT_RANGE(_index, mVectorColumnInfo.begin()->list->getItemCount(),
"MultiListBox::removeItemAt");
469 for (VectorColumnInfo::iterator iter = mVectorColumnInfo.begin(); iter != mVectorColumnInfo.end(); ++iter)
471 (*iter).list->removeItemAt(index);
475 size_t count = mVectorColumnInfo.begin()->list->getItemCount();
480 if (_index < mItemSelected)
482 else if ((_index == mItemSelected) && (mItemSelected == count))
490 MYGUI_ASSERT(!mVectorColumnInfo.empty(),
"MultiListBox::removeItemAt");
491 MYGUI_ASSERT_RANGE(_index1, mVectorColumnInfo.begin()->list->getItemCount(),
"MultiListBox::swapItemsAt");
492 MYGUI_ASSERT_RANGE(_index2, mVectorColumnInfo.begin()->list->getItemCount(),
"MultiListBox::swapItemsAt");
503 MYGUI_ASSERT_RANGE(_index, mVectorColumnInfo.size(),
"MultiListBox::setColumnDataAt");
504 mVectorColumnInfo[_index].data = _data;
509 MYGUI_ASSERT_RANGE(_index, mVectorColumnInfo.begin()->list->getItemCount(),
"MultiListBox::setSubItemDataAt");
517 return mVectorColumnInfo.size();
547 return mItemSelected;
570 ListBox* MultiListBox::getSubItemAt(
size_t _column)
const
573 return mVectorColumnInfo[_column].list;
606 _column = mVectorColumnInfo.size();
610 mVectorColumnInfo.back().width = _width;
612 mVectorColumnInfo.back().name = _name;
613 mVectorColumnInfo.back().data = _data;
614 mVectorColumnInfo.back().button->setCaption(_name);
616 if (_column == (mVectorColumnInfo.size() - 1))
620 mVectorColumnInfo.back().list->setScrollVisible(
true);
624 _swapColumnsAt(_column, mVectorColumnInfo.size() - 1);
630 MYGUI_ASSERT_RANGE(_column, mVectorColumnInfo.size(),
"MultiListBox::removeColumnAt");
632 ColumnInfo& info = mVectorColumnInfo[_column];
642 _swapColumnsAt(_index1, _index2);
645 void MultiListBox::_swapColumnsAt(
size_t _index1,
size_t _index2)
647 if (_index1 == _index2)
650 mVectorColumnInfo[_index1].list->setScrollVisible(
false);
651 mVectorColumnInfo[_index2].list->setScrollVisible(
false);
653 std::swap(mVectorColumnInfo[_index1], mVectorColumnInfo[_index2]);
657 mVectorColumnInfo.back().list->setScrollVisible(
true);
662 Base::onWidgetCreated(_widget);
665 if (child !=
nullptr)
673 Base::onWidgetDestroy(_widget);
676 if (child !=
nullptr)
682 for (VectorColumnInfo::iterator item = mVectorColumnInfo.begin(); item != mVectorColumnInfo.end(); ++item)
684 if ((*item).button == _widget)
685 (*item).button =
nullptr;
693 if (!mVectorColumnInfo.empty())
694 mVectorColumnInfo.back().list->setScrollVisible(
false);
700 column.realWidth = 0;
706 column.list->eventListMouseItemFocus +=
newDelegate(
this, &MultiListBox::notifyListChangeFocus);
707 column.list->eventListChangeScroll +=
newDelegate(
this, &MultiListBox::notifyListChangeScrollPosition);
708 column.list->eventListSelectAccept +=
newDelegate(
this, &MultiListBox::notifyListSelectAccept);
709 column.list->eventNotifyItem +=
newDelegate(
this, &MultiListBox::notifyListNotifyItem);
711 if (mHeaderPlace !=
nullptr)
719 if (!mVectorColumnInfo.empty())
721 size_t count = mVectorColumnInfo.front().list->getItemCount();
722 for (
size_t pos = 0; pos < count; ++pos)
723 column.list->addItem(
"");
726 mVectorColumnInfo.push_back(column);
731 mVectorColumnInfo.back().list->setScrollVisible(
true);
734 void MultiListBox::_unwrapItem(MultiListItem* _item)
736 for (VectorColumnInfo::iterator item = mVectorColumnInfo.begin(); item != mVectorColumnInfo.end(); ++item)
738 if ((*item).item == _item)
740 if ((*item).button !=
nullptr)
743 mVectorColumnInfo.erase(item);
748 if (mVectorColumnInfo.empty())
762 if (!mVectorColumnInfo.empty())
763 mVectorColumnInfo.back().list->setScrollVisible(
true);
769 return mVectorColumnInfo[_index].item;
784 for (
size_t index = 0; index < mVectorColumnInfo.size(); ++ index)
786 if (mVectorColumnInfo[index].item == _item)
800 MYGUI_ASSERT_RANGE(_index, mVectorColumnInfo.size(),
"MultiListBox::setColumnWidthAt");
801 mVectorColumnInfo[_index].sizeType = _value;
812 Base::setPosition(_point);
817 Base::setSize(_size);
819 if (getUpdateByResize())
825 Base::setCoord(_coord);
827 if (getUpdateByResize())
831 bool MultiListBox::getUpdateByResize()
const
833 if (mWidgetEmpty !=
nullptr)
836 for (
const auto& info : mVectorColumnInfo)
844 int MultiListBox::getColumnWidth(
size_t _index,
int _freeSpace,
size_t _countStars,
size_t _lastIndexStar,
int _starWidth)
const
846 const ColumnInfo& info = mVectorColumnInfo[_index];
850 return info.realWidth;
854 return info.realWidth;
858 if (_lastIndexStar == _index)
860 return _starWidth + _freeSpace - (_starWidth * _countStars);
870 int MultiListBox::updateWidthColumns(
size_t& _countStars,
size_t& _lastIndexStar)
877 for (
size_t index = 0; index < mVectorColumnInfo.size(); ++ index)
879 ColumnInfo& info = mVectorColumnInfo[index];
883 info.realWidth = info.button->getWidth() - info.button->getTextRegion().width + info.button->getTextSize().width;
887 info.realWidth = info.width < 0 ? 0 : info.width;
893 _lastIndexStar = index;
900 width += info.realWidth;
906 void MultiListBox::updateColumns()
908 size_t countStars = 0;
911 int allColumnsWidth = updateWidthColumns(countStars, lastIndexStar);
913 int separatorsWidth = mVectorColumnInfo.empty() ? 0 : (mVectorColumnInfo.size() - 1) * mWidthSeparator;
914 int freeSpace = clientWidth - separatorsWidth - allColumnsWidth;
915 int starWidth = (countStars != 0 && freeSpace > 0) ? (freeSpace / countStars) : 0;
918 for (
size_t index = 0; index < mVectorColumnInfo.size(); ++ index)
920 ColumnInfo& info = mVectorColumnInfo[index];
922 int columnWidth = getColumnWidth(index, freeSpace, countStars, lastIndexStar, starWidth);
924 if (mHeaderPlace !=
nullptr)
933 info.button->setCoord(mWidthBar, 0, columnWidth, getButtonHeight());
934 info.button->_setInternalData(index);
936 mWidthBar += columnWidth;
939 Widget* separator = getOrCreateSeparator(index);
945 mWidthBar += mWidthSeparator;
#define MYGUI_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 swapItemsBackAt(size_t _index1, size_t _index2)
size_t removeItemAt(size_t _index)
size_t insertItemAt(size_t _index)
size_t convertToBack(size_t _index) const
size_t convertToFace(size_t _index) const
void swapItemsFaceAt(size_t _index1, size_t _index2)
static Gui & getInstance()
EventHandle_FrameEventDelegate eventFrameStart
Type * castType(bool _throw=true)
widget description should be here.
const UString & getItemNameAt(size_t _index) const
Get item name from specified position.
EventPair< EventHandle_WidgetSizeT, EventHandle_ListPtrSizeT > eventListChangePosition
size_t findItemIndexWith(const UString &_name)
Search item, returns the position of the first occurrence in array or ITEM_NONE if item not found.
void setItemDataAt(size_t _index, Any _data)
Replace an item data at a specified position.
void setItemNameAt(size_t _index, const UString &_name)
Replace an item name at a specified position.
size_t _getItemCount() const override
void setColumnWidthAt(size_t _column, int _width)
void addItem(const UString &_name, Any _data=Any::Null)
void onWidgetDestroy(Widget *_widget) override
void _removeItemAt(size_t _index) override
void insertItemAt(size_t _index, const UString &_name, Any _data=Any::Null)
void setColumnResizingPolicyAt(size_t _index, ResizingPolicy _value)
void setColumnWidth(MultiListItem *_item, int _width)
void _setItemNameAt(size_t _index, const UString &_name) override
void removeItemAt(size_t _index)
Remove item at a specified position.
const UString & getItemNameAt(size_t _index) const
Get item name from specified position.
void setColumnDataAt(size_t _index, Any _data)
Replace an item data at a specified position.
EventPair< EventHandle_WidgetSizeT, EventHandle_MultiListPtrSizeT > eventListChangePosition
void sortByColumn(size_t _column, bool _backward=false)
const UString & _getItemNameAt(size_t _index) const override
void insertColumnAt(size_t _column, const UString &_name, int _width=0, Any _data=Any::Null)
void setItemNameAt(size_t _index, const UString &_name)
Replace an item name.
int getColumnWidthAt(size_t _column) const
EventPair< EventHandle_WidgetSizeT, EventHandle_MultiListPtrSizeT > eventListSelectAccept
void setCoord(const IntCoord &_value) override
size_t getColumnCount() const
Get number of columns.
void setSubItemDataAt(size_t _column, size_t _index, Any _data)
Replace an item data at a specified position.
void swapItemsAt(size_t _index1, size_t _index2)
Swap items at a specified positions.
void setSubItemNameAt(size_t _column, size_t _index, const UString &_name)
void onWidgetCreated(Widget *_widget) override
void removeColumnAt(size_t _column)
Widget * _getItemAt(size_t _index) const override
void clearItemDataAt(size_t _index)
Clear an item data at a specified position.
size_t findSubItemWith(size_t _column, const UString &_name)
void _addItem(const MyGUI::UString &_name) override
void clearColumnDataAt(size_t _index)
Clear an item data at a specified position.
void setItemDataAt(size_t _index, Any _data)
Replace an item data at a specified position.
void shutdownOverride() override
void setSize(const IntSize &_value) override
EventPair< EventHandle_MultiListPtrSizeTCUTFStringRefCUTFStringRefBoolRef, EventHandle_MultiListPtrSizeTSizeTSizeTBoolRef > requestOperatorLess
EventHandle_MultiListPtrCIBNotifyCellDataRef eventNotifyItem
void initialiseOverride() override
size_t getColumnIndex(const MultiListItem *_item) const
Get column index.
void setColumnNameAt(size_t _column, const UString &_name)
void setPosition(const IntPoint &_value) override
void addColumn(const UString &_name, int _width=0, Any _data=Any::Null)
const UString & getSubItemNameAt(size_t _column, size_t _index) const
size_t getIndexSelected() const
void setColumnName(MultiListItem *_item, const UString &_name)
void setColumnResizingPolicy(MultiListItem *_item, ResizingPolicy _value)
void clearSubItemDataAt(size_t _column, size_t _index)
Clear an item data at a specified position.
void clearIndexSelected()
void setIndexSelected(size_t _index)
size_t getItemCount() const
const UString & getColumnNameAt(size_t _column) const
void swapColumnsAt(size_t _index1, size_t _index2)
Swap columns at a specified positions.
const UString & getColumnName(const MultiListItem *_item) const
widget description should be here.
A UTF-16 string with implicit conversion to/from std::string and std::wstring.
bool isUserString(const std::string &_key) const
const std::string & getUserString(const std::string &_key) const
ValueType * _getInternalData(bool _throw=true) const
types::TCoord< int > IntCoord
delegates::DelegateFunction< Args... > * newDelegate(void(*_func)(Args... args))