43 mOffsetButtonSeparator(2),
52 Base::_initialise(_style, _coord, _align, _info, _parent, _croppedParent, _creator, _name);
54 initialiseWidgetSkin(_info);
67 initialiseWidgetSkin(_info);
70 void MultiList::initialiseWidgetSkin(
ResourceSkin* _info)
74 if (!properties.empty())
76 MapString::const_iterator iter = properties.find(
"SkinButton");
77 if (iter != properties.end()) mSkinButton = iter->second;
78 iter = properties.find(
"HeightButton");
80 if (mHeightButton < 0) mHeightButton = 0;
82 iter = properties.find(
"SkinList");
83 if (iter != properties.end()) mSkinList = iter->second;
85 iter = properties.find(
"SkinButtonEmpty");
86 if (iter != properties.end())
92 iter = properties.find(
"WidthSeparator");
94 iter = properties.find(
"SkinSeparator");
95 if (iter != properties.end()) mSkinSeparator = iter->second;
100 if (*(*iter)->_getInternalData<std::string>() ==
"Client")
108 if (
nullptr == mClient) mClient =
this;
111 void MultiList::shutdownWidgetSkin()
122 if (_column ==
ITEM_NONE) _column = mVectorColumnInfo.size();
125 if (!mVectorColumnInfo.empty())
126 mVectorColumnInfo.back().list->setScrollVisible(
false);
127 else mSortColumnIndex = 0;
130 column.width = _width < 0 ? 0 : _width;
144 if (!mVectorColumnInfo.empty())
146 size_t count = mVectorColumnInfo.front().list->getItemCount();
147 for (
size_t pos=0; pos<count; ++pos)
148 column.list->addItem(
"");
151 mVectorColumnInfo.insert(mVectorColumnInfo.begin() + _column, column);
156 mVectorColumnInfo.back().list->setScrollVisible(
true);
162 mVectorColumnInfo[_column].name = _name;
169 mVectorColumnInfo[_column].width = _width < 0 ? 0 : _width;
176 return mVectorColumnInfo[_column].name;
182 return mVectorColumnInfo[_column].width;
189 ColumnInfo& info = mVectorColumnInfo[_column];
195 mVectorColumnInfo.erase(mVectorColumnInfo.begin() + _column);
197 if (mVectorColumnInfo.empty())
204 mSortColumnIndex = 0;
215 for (VectorColumnInfo::iterator iter=mVectorColumnInfo.begin(); iter!=mVectorColumnInfo.end(); ++iter)
220 mVectorColumnInfo.clear();
230 mSortColumnIndex = _column;
250 if (mVectorColumnInfo.empty())
return 0;
251 return mVectorColumnInfo.front().list->getItemCount();
257 for (VectorColumnInfo::iterator iter=mVectorColumnInfo.begin(); iter!=mVectorColumnInfo.end(); ++iter)
259 (*iter).list->removeAllItems();
276 for (VectorColumnInfo::iterator iter=mVectorColumnInfo.begin(); iter!=mVectorColumnInfo.end(); ++iter)
278 (*iter).list->clearIndexSelected();
284 for (VectorColumnInfo::iterator iter=mVectorColumnInfo.begin(); iter!=mVectorColumnInfo.end(); ++iter)
286 (*iter).list->setIndexSelected(_index);
293 if (_index == mItemSelected)
return;
298 mItemSelected = _index;
305 MYGUI_ASSERT_RANGE(_index, mVectorColumnInfo.begin()->list->getItemCount(),
"MultiList::setSubItemAt");
308 mVectorColumnInfo[_column].list->setItemNameAt(index, _name);
311 if (_column == mSortColumnIndex) frameAdvise(
true);
317 MYGUI_ASSERT_RANGE(_index, mVectorColumnInfo.begin()->list->getItemCount(),
"MultiList::getSubItemNameAt");
320 return mVectorColumnInfo[_column].list->getItemNameAt(index);
327 size_t index = mVectorColumnInfo[_column].list->findItemIndexWith(_name);
334 if (
nullptr == mButtonMain)
return;
339 mButtonMain->
setCoord(mWidthBar, 0, mClient->
getWidth()-mWidthBar, mHeightButton);
346 for (VectorColumnInfo::iterator iter=mVectorColumnInfo.begin(); iter!=mVectorColumnInfo.end(); ++iter)
348 if (_sender != (*iter).list) (*iter).list->setIndexSelected(_position);
367 for (VectorColumnInfo::iterator iter=mVectorColumnInfo.begin(); iter!=mVectorColumnInfo.end(); ++iter)
369 if (_sender != (*iter).list)
371 if (
ITEM_NONE != mLastMouseFocusIndex) (*iter).list->_setItemFocus(mLastMouseFocusIndex,
false);
372 if (
ITEM_NONE != _position) (*iter).list->_setItemFocus(_position,
true);
375 mLastMouseFocusIndex = _position;
380 for (VectorColumnInfo::iterator iter=mVectorColumnInfo.begin(); iter!=mVectorColumnInfo.end(); ++iter)
382 if (_sender != (*iter).list)
383 (*iter).list->setScrollPosition(_position);
396 for (VectorColumnInfo::iterator iter=mVectorColumnInfo.begin(); iter!=mVectorColumnInfo.end(); ++iter)
398 if (pos == mSortColumnIndex)
404 (*iter).button->setCaption((*iter).name);
412 if (
nullptr == image )
return;
415 static const size_t CountIcons = 3;
416 static const char * IconNames[CountIcons + 1] = {
"None",
"Up",
"Down",
"" };
417 if (_index >= CountIcons) _index = CountIcons;
426 void MultiList::frameEntered(
float _frame)
431 void MultiList::frameAdvise(
bool _advise)
435 if ( ! mFrameAdvise )
446 mFrameAdvise =
false;
453 if (!mWidthSeparator || mSkinSeparator.empty())
return nullptr;
455 if (_index == mVectorColumnInfo.size()-1)
return nullptr;
457 while (_index >= mSeparators.size())
460 mSeparators.push_back(separator);
463 return mSeparators[_index];
470 for (VectorColumnInfo::iterator iter=mVectorColumnInfo.begin(); iter!=mVectorColumnInfo.end(); ++iter)
472 (*iter).list->setCoord(mWidthBar, mHeightButton, (*iter).width, mClient->
getHeight() - mHeightButton);
473 (*iter).button->setCoord(mWidthBar, 0, (*iter).width, mHeightButton);
474 (*iter).button->_setInternalData(index);
476 mWidthBar += (*iter).width;
485 mWidthBar += mWidthSeparator;
495 if (
ITEM_NONE == mSortColumnIndex)
return;
497 size_t last = mVectorColumnInfo.front().list->getItemCount();
498 if (0 == last)
return;
505 for (VectorColumnInfo::iterator iter=mVectorColumnInfo.begin(); iter!=mVectorColumnInfo.end(); ++iter)
507 (*iter).list->swapItemsAt(first, last);
520 if (mSortUp) std::swap(_left, _right);
528 if (
ITEM_NONE == mSortColumnIndex)
return;
530 List* list = mVectorColumnInfo[mSortColumnIndex].list;
533 if (0 == count)
return;
537 for (
size_t step = count>>1; step>0 ; step >>= 1)
539 for (
size_t i=0;i<(count-step);i++)
545 if (
compare(list, first, last))
548 for (VectorColumnInfo::iterator iter=mVectorColumnInfo.begin(); iter!=mVectorColumnInfo.end(); ++iter)
550 (*iter).list->swapItemsAt(first, last);
567 if (
ITEM_NONE == _index) _index = mVectorColumnInfo.front().list->getItemCount();
571 if ((mItemSelected !=
ITEM_NONE) && (_index <= mItemSelected)) mItemSelected ++;
576 for (VectorColumnInfo::iterator iter=mVectorColumnInfo.begin(); iter!=mVectorColumnInfo.end(); ++iter)
578 (*iter).list->insertItemAt(index,
"");
580 mVectorColumnInfo.front().list->setItemNameAt(index, _name);
581 mVectorColumnInfo.front().list->setItemDataAt(index, _data);
589 MYGUI_ASSERT_RANGE(_index, mVectorColumnInfo.begin()->list->getItemCount(),
"MultiList::removeItemAt");
593 for (VectorColumnInfo::iterator iter=mVectorColumnInfo.begin(); iter!=mVectorColumnInfo.end(); ++iter)
595 (*iter).list->removeItemAt(index);
599 size_t count = mVectorColumnInfo.begin()->list->getItemCount();
600 if (count == 0) mItemSelected =
ITEM_NONE;
603 if (_index < mItemSelected) mItemSelected --;
604 else if ((_index == mItemSelected) && (mItemSelected == count)) mItemSelected --;
612 MYGUI_ASSERT_RANGE(_index1, mVectorColumnInfo.begin()->list->getItemCount(),
"MultiList::swapItemsAt");
613 MYGUI_ASSERT_RANGE(_index2, mVectorColumnInfo.begin()->list->getItemCount(),
"MultiList::swapItemsAt");
625 mVectorColumnInfo[_index].data = _data;
631 MYGUI_ASSERT_RANGE(_index, mVectorColumnInfo.begin()->list->getItemCount(),
"MultiList::setSubItemDataAt");
634 mVectorColumnInfo[_column].list->setItemDataAt(index, _data);