Beispiel #1
0
	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);
			}
		}
	}
Beispiel #2
0
	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);
			}
		}

	}
Beispiel #3
0
	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;
			}
		}
	}
Beispiel #4
0
	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);
		}
	}
Beispiel #5
0
	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 ++;
		}
	}
Beispiel #6
0
	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);
	}
Beispiel #7
0
	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);
	}
Beispiel #8
0
	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);
		}
	}
Beispiel #9
0
	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);
			}
		}
	}
Beispiel #10
0
	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();
		}
	}