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::setIndexSelected(size_t _index) { MYGUI_ASSERT_RANGE_AND_NONE(_index, mItemsInfo.size(), "ItemBox::setIndexSelected"); if (_index == mIndexSelect) return; size_t start = (size_t)(mFirstVisibleIndex * mCountItemInLine); // сбрасываем старое выделение if (mIndexSelect != ITEM_NONE) { size_t index = mIndexSelect; mIndexSelect = ITEM_NONE; if ((index >= start) && (index < (start + mVectorItems.size()))) { IBDrawItemInfo data(index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse, false, false); requestDrawItem(this, mVectorItems[index - start], data); } } mIndexSelect = _index; if (mIndexSelect != ITEM_NONE) { if ((_index >= start) && (_index < (start + mVectorItems.size()))) { IBDrawItemInfo data(_index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse, false, false); requestDrawItem(this, mVectorItems[_index - start], 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; } } }
void ItemBox::redrawItemAt(size_t _index) { MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "ItemBox::redrawItemAt"); size_t start = (size_t)(mFirstVisibleIndex * mCountItemInLine); if ((_index >= start) && (_index < (start + mVectorItems.size()))) { IBDrawItemInfo data(_index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse, true, false); requestDrawItem(this, mVectorItems[_index - start], data); } }
void ItemBox::_updateAllVisible(bool _redraw) { int count_visible = 0; if (mAlignVert) { count_visible = (_getClientWidget()->getHeight() / mSizeItem.height) + 2; } else { count_visible = (_getClientWidget()->getWidth() / mSizeItem.width) + 2; } size_t start = (mFirstVisibleIndex * mCountItemInLine); size_t count = (count_visible * mCountItemInLine) + start; size_t index = 0; for (size_t pos = start; pos < count; ++pos, ++index) { // дальше нет айтемов if (pos >= mItemsInfo.size()) break; Widget* item = getItemWidget(index); if (mAlignVert) { item->setPosition(((int)index % mCountItemInLine) * mSizeItem.width - mContentPosition.left, (((int)index / mCountItemInLine) * mSizeItem.height) - mFirstOffsetIndex); } else { item->setPosition((((int)index / mCountItemInLine) * mSizeItem.width) - mFirstOffsetIndex, ((int)index % mCountItemInLine) * mSizeItem.height - mContentPosition.top); } item->setSize(mSizeItem); item->setVisible(true); if (_redraw) { IBDrawItemInfo data(pos, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse, true, false); requestDrawItem(this, item, data); } } // все виджеты еще есть, то их надо бы скрыть while (index < mVectorItems.size()) { mVectorItems[index]->setVisible(false); index ++; } }
void ItemBox::setItemDataAt(size_t _index, Any _data) { MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "ItemBox::setItemData"); mItemsInfo[_index].data = _data; size_t start = (size_t)(mFirstVisibleIndex * mCountItemInLine); if ((_index >= start) && (_index < (start + mVectorItems.size()))) { IBDrawItemInfo data(_index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse, true, false); requestDrawItem(this, mVectorItems[_index - start], data); } _resetContainer(true); }
void ItemBox::updateDropItemsState(const DDWidgetState& _state) { IBDrawItemInfo data; data.drop_accept = _state.accept; data.drop_refuse = _state.refuse; data.select = false; data.active = false; data.index = mDropSenderIndex; data.update = _state.update; data.drag = true; requestDrawItem(this, mItemDrag, data); }
void ItemBox::_setContainerItemInfo(size_t _index, bool _set, bool _accept) { if (_index == ITEM_NONE) return; MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "ItemBox::_setContainerItemInfo"); mIndexAccept = (_set && _accept ) ? _index : ITEM_NONE; mIndexRefuse = (_set && !_accept) ? _index : ITEM_NONE; size_t start = (size_t)(mFirstVisibleIndex * mCountItemInLine); if ((_index >= start) && (_index < (start + mVectorItems.size()))) { IBDrawItemInfo data(_index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse, false, false); requestDrawItem(this, mVectorItems[_index - start], data); } }
void ItemBox::resetCurrentActiveItem() { // сбрасываем старую подсветку if (mIndexActive != ITEM_NONE) { size_t start = (size_t)(mFirstVisibleIndex * mCountItemInLine); size_t index = mIndexActive; mIndexActive = ITEM_NONE; // если видим, то обновляем if ((mIndexActive >= start) && (mIndexActive < (start + mVectorItems.size()))) { IBDrawItemInfo data(index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse, false, false); requestDrawItem(this, mVectorItems[mIndexActive - start], data); } } }
void ListCtrl::_updateAllVisible(size_t _index, bool _needUpdateContetntSize, bool _update) { bool change = false; int top = 0; size_t widget_index = 0; for (size_t index = 0; index < mItemsInfo.size(); ++index) { ItemDataInfo& info = mItemsInfo[index]; // айтем сверху не виден if ((top + info.size.height) < (mContentPosition.top)) { } // айтем снизу и не виден else if (top > ((mContentPosition.top) + _getClientWidget()->getHeight())) { } // айтем встрял в видимость else { Widget* item = getItemWidget(widget_index); widget_index++; if (index == _index || ITEM_NONE == _index) { item->_setInternalData((size_t)index); item->setPosition(-mContentPosition.left, top - (mContentPosition.top)); item->setVisible(true); IBDrawItemInfo data(index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse, _update, false); IntCoord coord(IntPoint(), info.size); requestDrawItem(this, item, data, coord); if (info.size != coord.size()) change = true; info.size = coord.size(); item->setSize(mClient->getWidth()/*mContentSize.width*/, info.size.height); } } top += info.size.height; } // если виджеты еще есть, то их надо скрыть while (widget_index < mVectorItems.size()) { Widget* item = mVectorItems[widget_index]; widget_index ++; item->setVisible(false); item->_setInternalData((size_t)ITEM_NONE); } if (change && _needUpdateContetntSize) { updateMetrics(); updateScrollSize(); updateScrollPosition(); } }