void ItemBox::notifyRootMouseChangeFocus(Widget* _sender, bool _focus) { size_t index = calcIndexByWidget(_sender); if (_focus) { MYGUI_ASSERT_RANGE(index, mItemsInfo.size(), "ItemBox::notifyRootMouseChangeFocus"); // сбрасываем старый if (mIndexActive != ITEM_NONE) { size_t old_index = mIndexActive; mIndexActive = ITEM_NONE; IBDrawItemInfo data(old_index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse, false, false); requestDrawItem(this, mVectorItems[old_index - (mFirstVisibleIndex * mCountItemInLine)], data); } mIndexActive = index; IBDrawItemInfo data(index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse, false, false); requestDrawItem(this, mVectorItems[*_sender->_getInternalData<size_t>()], data); } else { // при сбросе виджет может быть уже скрыт, и соответсвенно отсутсвовать индекс // сбрасываем индекс, только если мы и есть актив if (index < mItemsInfo.size() && mIndexActive == index) { mIndexActive = ITEM_NONE; IBDrawItemInfo data(index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse, false, false); requestDrawItem(this, mVectorItems[*_sender->_getInternalData<size_t>()], data); } } }
void ItemBox::findCurrentActiveItem() { MYGUI_DEBUG_ASSERT(mIndexActive == ITEM_NONE, "use : resetCurrentActiveItem() before findCurrentActiveItem()"); const IntPoint& point = InputManager::getInstance().getMousePositionByLayer(); // сначала проверяем клиентскую зону const IntRect& rect = _getClientAbsoluteRect(); if ((point.left < rect.left) || (point.left > rect.right) || (point.top < rect.top) || (point.top > rect.bottom)) { return; } for (size_t pos = 0; pos < mVectorItems.size(); ++pos) { Widget* item = mVectorItems[pos]; const IntRect& abs_rect = item->getAbsoluteRect(); if ((point.left >= abs_rect.left) && (point.left <= abs_rect.right) && (point.top >= abs_rect.top) && (point.top <= abs_rect.bottom)) { size_t index = calcIndexByWidget(item); // при переборе индекс может быть больше, так как может создасться сколько угодно if (index < mItemsInfo.size()) { mIndexActive = index; IBDrawItemInfo data(index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse, false, false); requestDrawItem(this, item, data); } break; } } }
size_t ItemBox::_getItemIndex(Widget* _item) { if (_item == _getClientWidget()) return ITEM_NONE; size_t index = calcIndexByWidget(_item); if (index < mItemsInfo.size()) return index; return ITEM_NONE; }
size_t ItemBox::getIndexByWidget(Widget* _widget) { MYGUI_ASSERT(_widget, "ItemBox::getIndexByWidget : Widget == nullptr"); if (_widget == _getClientWidget()) return ITEM_NONE; MYGUI_ASSERT(_widget->getParent() == _getClientWidget(), "ItemBox::getIndexByWidget : Widget is not child"); size_t index = calcIndexByWidget(_widget); MYGUI_ASSERT_RANGE(index, mItemsInfo.size(), "ItemBox::getIndexByWidget"); return index; }
void ListCtrl::notifyRootMouseChangeFocus(Widget* _sender, bool _focus) { size_t index = calcIndexByWidget(_sender); if (_focus) { MYGUI_ASSERT_RANGE(index, mItemsInfo.size(), "ListCtrl::notifyRootMouseChangeFocus"); // сбрасываем старый if (mIndexActive != ITEM_NONE) { size_t old_index = mIndexActive; mIndexActive = ITEM_NONE; //FIXME потом только один попробовать обновить _updateAllVisible(old_index, true, false); /*IBDrawItemInfo data(old_index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse, false, false); IntCoord coord(IntPoint(), mItemsInfo[old_index].size); requestDrawItem(this, mVectorItems[old_index - mFirstVisibleIndex], data, coord); mItemsInfo[old_index].size = coord.size();*/ } mIndexActive = index; //FIXME потом только один попробовать обновить _updateAllVisible(index, true, false); /*IBDrawItemInfo data(index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse, false, false); IntCoord coord(IntPoint(), mItemsInfo[index].size); requestDrawItem(this, mVectorItems[*_sender->_getInternalData<size_t>()], data, coord); mItemsInfo[index].size = coord.size();*/ } else { // при сбросе виджет может быть уже скрыт, и соответсвенно отсутсвовать индекс // сбрасываем индекс, только если мы и есть актив if (index < mItemsInfo.size() && mIndexActive == index) { mIndexActive = ITEM_NONE; //FIXME потом только один попробовать обновить _updateAllVisible(index, true, false); /*IBDrawItemInfo data(index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse, false, false); IntCoord coord(IntPoint(), mItemsInfo[index].size); requestDrawItem(this, mVectorItems[*_sender->_getInternalData<size_t>()], data, coord); mItemsInfo[index].size = coord.size();*/ } } }