void MultiList::notifyListChangePosition(MyGUI::WidgetPtr _widget, size_t _position) { for (VectorColumnInfo::iterator iter=mVectorColumnInfo.begin(); iter!=mVectorColumnInfo.end(); ++iter) if (_widget != (*iter).list) (*iter).list->setItemSelect(_position); // наш евент eventListChangePosition(this, _position); }
void ListBox::notifyMousePressed(Widget* _sender, int _left, int _top, MouseButton _id) { if (MouseButton::Left != _id) return; if (_sender == mWidgetScroll) return; // если выделен клиент, то сбрасываем if (_sender == _getClientWidget()) { if (mIndexSelect != ITEM_NONE) { _selectIndex(mIndexSelect, false); mIndexSelect = ITEM_NONE; eventListChangePosition(this, mIndexSelect); } eventListMouseItemActivate(this, mIndexSelect); // если не клиент, то просчитывам } // ячейка может быть скрыта else if (_sender->getVisible()) { #if MYGUI_DEBUG_MODE == 1 _checkMapping("ListBox::notifyMousePressed"); MYGUI_ASSERT_RANGE(*_sender->_getInternalData<size_t>(), mWidgetLines.size(), "ListBox::notifyMousePressed"); MYGUI_ASSERT_RANGE(*_sender->_getInternalData<size_t>() + mTopIndex, mItemsInfo.size(), "ListBox::notifyMousePressed"); #endif size_t index = *_sender->_getInternalData<size_t>() + mTopIndex; if (mIndexSelect != index) { _selectIndex(mIndexSelect, false); _selectIndex(index, true); mIndexSelect = index; eventListChangePosition(this, mIndexSelect); } eventListMouseItemActivate(this, mIndexSelect); } _resetContainer(true); }
void MultiListBox::notifyListChangePosition(ListBox* _sender, size_t _position) { for (VectorColumnInfo::iterator iter = mVectorColumnInfo.begin(); iter != mVectorColumnInfo.end(); ++iter) { if (_sender != (*iter).list) (*iter).list->setIndexSelected(_position); } updateBackSelected(_position); mItemSelected = BiIndexBase::convertToFace(_position); // наш евент eventListChangePosition(this, mItemSelected); }
void ListBox::onKeyButtonPressed(KeyCode _key, Char _char) { if (getItemCount() == 0) { Base::onKeyButtonPressed(_key, _char); return; } // очень секретный метод, запатентованный механизм движения курсора size_t sel = mIndexSelect; if (_key == KeyCode::ArrowUp) { if (sel != 0) { if (sel == ITEM_NONE) sel = 0; else sel --; } } else if (_key == KeyCode::ArrowDown) { if (sel == ITEM_NONE) sel = 0; else sel ++; if (sel >= getItemCount()) { // старое значение sel = mIndexSelect; } } else if (_key == KeyCode::Home) { if (sel != 0) sel = 0; } else if (_key == KeyCode::End) { if (sel != (getItemCount() - 1)) { sel = getItemCount() - 1; } } else if (_key == KeyCode::PageUp) { if (sel != 0) { if (sel == ITEM_NONE) { sel = 0; } else { size_t page = _getClientWidget()->getHeight() / mHeightLine; if (sel <= page) sel = 0; else sel -= page; } } } else if (_key == KeyCode::PageDown) { if (sel != (getItemCount() - 1)) { if (sel == ITEM_NONE) { sel = 0; } else { sel += _getClientWidget()->getHeight() / mHeightLine; if (sel >= getItemCount()) sel = getItemCount() - 1; } } } else if ((_key == KeyCode::Return) || (_key == KeyCode::NumpadEnter)) { if (sel != ITEM_NONE) { //FIXME нас могут удалить eventListSelectAccept(this, sel); Base::onKeyButtonPressed(_key, _char); // выходим, так как изменили колличество строк return; } } if (sel != mIndexSelect) { _resetContainer(true); if (!isItemVisibleAt(sel)) { beginToItemAt(sel); if (mWidgetScroll != nullptr) _sendEventChangeScroll(mWidgetScroll->getScrollPosition()); } setIndexSelected(sel); // изменилась позиция // FIXME нас могут удалить eventListChangePosition(this, mIndexSelect); } Base::onKeyButtonPressed(_key, _char); }