Ejemplo n.º 1
0
	void ItemBox::removeItemAt(size_t _index)
	{
		MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "ItemBox::removeItemAt");

		_resetContainer(false);
		resetCurrentActiveItem();

		mItemsInfo.erase(mItemsInfo.begin() + _index);

		// расчитываем новый индекс выделения
		if (mIndexSelect != ITEM_NONE)
		{
			if (mItemsInfo.empty())
			{
				mIndexSelect = ITEM_NONE;
			}
			else if ((mIndexSelect > _index) || (mIndexSelect == mItemsInfo.size()))
			{
				mIndexSelect --;
			}
		}

		updateScrollSize();
		updateScrollPosition();

		findCurrentActiveItem();

		_updateAllVisible(true);
	}
Ejemplo n.º 2
0
	void ItemBox::insertItemAt(size_t _index, Any _data)
	{
		MYGUI_ASSERT_RANGE_INSERT(_index, mItemsInfo.size(), "ItemBox::insertItemAt");
		if (_index == ITEM_NONE) _index = mItemsInfo.size();

		_resetContainer(false);

		resetCurrentActiveItem();

		mItemsInfo.insert(mItemsInfo.begin() + _index, ItemDataInfo(_data));

		// расчитываем новый индекс выделения
		if (mIndexSelect != ITEM_NONE)
		{
			if (mIndexSelect >= _index)
			{
				mIndexSelect ++;
			}
		}

		updateScrollSize();
		updateScrollPosition();

		findCurrentActiveItem();

		_updateAllVisible(true);
	}
Ejemplo n.º 3
0
    void ListBox::notifyMouseWheel(Widget* _sender, int _rel)
    {
        if (mRangeIndex <= 0)
            return;

        if (mWidgetScroll == nullptr)
            return;

        int offset = (int)mWidgetScroll->getScrollPosition();
        if (_rel < 0)
            offset += mHeightLine;
        else
            offset -= mHeightLine;

        if (offset >= mRangeIndex)
            offset = mRangeIndex;
        else if (offset < 0)
            offset = 0;

        if ((int)mWidgetScroll->getScrollPosition() == offset)
            return;

        mWidgetScroll->setScrollPosition(offset);
        _setScrollView(offset);
        _sendEventChangeScroll(offset);

        _resetContainer(true);
    }
Ejemplo n.º 4
0
	void ListCtrl::setContentPosition(const IntPoint& _point)
	{
		mContentPosition = _point;

		_updateAllVisible(ITEM_NONE, true, true);
		_resetContainer(true);
	}
Ejemplo n.º 5
0
	void ComboBox::notifyListChangePosition(ListBox* _widget, size_t _position)
	{
		mItemIndex = _position;

		_resetContainer(false);

		eventComboChangePosition(this, _position);
	}
Ejemplo n.º 6
0
	void ComboBox::notifyMouseWheel(Widget* _sender, int _rel)
	{
		if (mList->getItemCount() == 0)
			return;
		if (InputManager::getInstance().getKeyFocusWidget() != this)
			return;
		if (InputManager::getInstance().isCaptureMouse())
			return;

		if (_rel > 0)
		{
			if (mItemIndex != 0)
			{
				if (mItemIndex == ITEM_NONE)
					mItemIndex = 0;
				else
					mItemIndex --;
				Base::setCaption(mList->getItemNameAt(mItemIndex));
				mList->setIndexSelected(mItemIndex);
				mList->beginToItemAt(mItemIndex);

				_resetContainer(false);

				eventComboChangePosition(this, mItemIndex);
			}
		}
		else if (_rel < 0)
		{
			if ((mItemIndex + 1) < mList->getItemCount())
			{
				if (mItemIndex == ITEM_NONE)
					mItemIndex = 0;
				else
					mItemIndex ++;
				Base::setCaption(mList->getItemNameAt(mItemIndex));
				mList->setIndexSelected(mItemIndex);
				mList->beginToItemAt(mItemIndex);

				_resetContainer(false);

				eventComboChangePosition(this, mItemIndex);
			}
		}
	}
Ejemplo n.º 7
0
	void ItemBox::updateFromResize()
	{
		requestItemSize();

		updateScrollSize();
		updateScrollPosition();

		_updateAllVisible(true);
		_resetContainer(true);
	}
Ejemplo n.º 8
0
	void ListCtrl::updateFromResize()
	{
		updateMetrics();

		updateScrollSize();
		updateScrollPosition();

		_updateAllVisible(ITEM_NONE, true, true);
		_resetContainer(true);
	}
Ejemplo n.º 9
0
	void ComboBox::notifyEditTextChange(EditBox* _sender)
	{
		// сбрасываем выделенный элемент
		if (ITEM_NONE != mItemIndex)
		{
			mItemIndex = ITEM_NONE;
			mList->setIndexSelected(mItemIndex);
			mList->beginToItemFirst();

			_resetContainer(false);

			eventComboChangePosition(this, mItemIndex);
		}
	}
Ejemplo n.º 10
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);
	}
Ejemplo n.º 11
0
	void ComboBox::notifyListMouseItemActivate(ListBox* _widget, size_t _position)
	{
		mItemIndex = _position;
		Base::setCaption(mItemIndex != ITEM_NONE ? mList->getItemNameAt(mItemIndex) : "");

		InputManager::getInstance().setKeyFocusWidget(this);

		if (mModeDrop)
		{
			_resetContainer(false);

			eventComboAccept.m_eventObsolete(this);
			eventComboAccept.m_event(this, mItemIndex);
		}
	}
Ejemplo n.º 12
0
	void ListCtrl::removeAllItems()
	{
		if (0 == mItemsInfo.size()) return;
		_resetContainer(false);

		mItemsInfo.clear();

		mIndexSelect = ITEM_NONE;
		mIndexActive = ITEM_NONE;

		updateScrollSize();
		updateScrollPosition();

		_updateAllVisible(ITEM_NONE, true, true);
	}
Ejemplo n.º 13
0
	void ItemBox::removeAllItems()
	{
		if (mItemsInfo.empty())
			return;
		_resetContainer(false);

		mItemsInfo.clear();

		mIndexSelect = ITEM_NONE;
		mIndexActive = ITEM_NONE;

		updateScrollSize();
		updateScrollPosition();

		_updateAllVisible(true);
	}
Ejemplo n.º 14
0
    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);
    }
Ejemplo n.º 15
0
	void ListCtrl::setItemDataAt(size_t _index, Any _data)
	{
		MYGUI_ASSERT_RANGE(_index, mItemsInfo.size(), "ListCtrl::setItemData");
		mItemsInfo[_index].data = _data;

		//FIXME потом только один попробовать обновить
		_updateAllVisible(_index, true, true);

		/*size_t start = (size_t)mFirstVisibleIndex;
		if ((_index >= start) && (_index < (start + mVectorItems.size())))
		{
			IBDrawItemInfo data(_index, mIndexSelect, mIndexActive, mIndexAccept, mIndexRefuse, true, false);
			IntCoord coord(IntPoint(), mItemsInfo[_index].size);
			requestDrawItem(this, mVectorItems[_index - start], data, coord);
			mItemsInfo[_index].size = coord.size();
		}*/

		_resetContainer(true);
	}
Ejemplo n.º 16
0
	void ItemBox::setContentPosition(const IntPoint& _point)
	{
		mContentPosition = _point;

		int old = mFirstVisibleIndex;

		if (mAlignVert)
		{
			mFirstVisibleIndex = mContentPosition.top / mSizeItem.height;
			mFirstOffsetIndex = mContentPosition.top % mSizeItem.height;
		}
		else
		{
			mFirstVisibleIndex = mContentPosition.left / mSizeItem.width;
			mFirstOffsetIndex = mContentPosition.left % mSizeItem.width;
		}

		_updateAllVisible(old != mFirstVisibleIndex);
		_resetContainer(true);
	}
Ejemplo n.º 17
0
	void ComboBox::onKeyButtonPressed(KeyCode _key, Char _char)
	{
		Base::onKeyButtonPressed(_key, _char);

		// при нажатии вниз, показываем лист
		if (_key == KeyCode::ArrowDown)
		{
			// выкидываем список только если мыша свободна
			if (!InputManager::getInstance().isCaptureMouse())
			{
				showList();
			}
		}
		// нажат ввод в окне редиктирования
		else if ((_key == KeyCode::Return) || (_key == KeyCode::NumpadEnter))
		{
			_resetContainer(false);

			eventComboAccept.m_eventObsolete(this);
			eventComboAccept.m_event(this, mItemIndex);
		}
	}
Ejemplo n.º 18
0
    void ListBox::updateLine(bool _reset)
    {
        // сбрасываем
        if (_reset)
        {
            mOldSize.clear();
            mLastRedrawLine = 0;
            _resetContainer(false);
        }

        // позиция скролла
        int position = mTopIndex * mHeightLine + mOffsetTop;

        // если высота увеличивалась то добавляем виджеты
        if (mOldSize.height < mCoord.height)
        {
            int height = (int)mWidgetLines.size() * mHeightLine - mOffsetTop;

            // до тех пор, пока не достигнем максимального колличества, и всегда на одну больше
            while ( (height <= (_getClientWidget()->getHeight() + mHeightLine)) && (mWidgetLines.size() < mItemsInfo.size()) )
            {
                // создаем линию
                Widget* widget = _getClientWidget()->createWidgetT("Button", mSkinLine, 0, height, _getClientWidget()->getWidth(), mHeightLine, Align::Top | Align::HStretch);
                Button* line = widget->castType<Button>();
                // подписываемся на всякие там события
                line->eventMouseButtonPressed += newDelegate(this, &ListBox::notifyMousePressed);
                line->eventMouseButtonDoubleClick += newDelegate(this, &ListBox::notifyMouseDoubleClick);
                line->eventMouseWheel += newDelegate(this, &ListBox::notifyMouseWheel);
                line->eventMouseSetFocus += newDelegate(this, &ListBox::notifyMouseSetFocus);
                line->eventMouseLostFocus += newDelegate(this, &ListBox::notifyMouseLostFocus);
                line->_setContainer(this);
                // присваиваем порядковый номер, для простоты просчета
                line->_setInternalData((size_t)mWidgetLines.size());
                // и сохраняем
                mWidgetLines.push_back(line);
                height += mHeightLine;
            }

            // проверяем на возможность не менять положение списка
            if (position >= mRangeIndex)
            {
                // размер всех помещается в клиент
                if (mRangeIndex <= 0)
                {
                    // обнуляем, если надо
                    if (position || mOffsetTop || mTopIndex)
                    {
                        position = 0;
                        mTopIndex = 0;
                        mOffsetTop = 0;
                        mLastRedrawLine = 0; // чтобы все перерисовалось

                        // выравниваем
                        int offset = 0;
                        for (size_t pos = 0; pos < mWidgetLines.size(); pos++)
                        {
                            mWidgetLines[pos]->setPosition(0, offset);
                            offset += mHeightLine;
                        }
                    }
                }
                else
                {
                    // прижимаем список к нижней границе
                    int count = _getClientWidget()->getHeight() / mHeightLine;
                    mOffsetTop = mHeightLine - (_getClientWidget()->getHeight() % mHeightLine);

                    if (mOffsetTop == mHeightLine)
                    {
                        mOffsetTop = 0;
                        count --;
                    }

                    int top = (int)mItemsInfo.size() - count - 1;

                    // выравниваем
                    int offset = 0 - mOffsetTop;
                    for (size_t pos = 0; pos < mWidgetLines.size(); pos++)
                    {
                        mWidgetLines[pos]->setPosition(0, offset);
                        offset += mHeightLine;
                    }

                    // высчитываем положение, должно быть максимальным
                    position = top * mHeightLine + mOffsetTop;

                    // если индех изменился, то перерисовываем линии
                    if (top != mTopIndex)
                    {
                        mTopIndex = top;
                        _redrawItemRange();
                    }
                }
            }

            // увеличился размер, но прокрутки вниз небыло, обновляем линии снизу
            _redrawItemRange(mLastRedrawLine);

        } // if (old_cy < mCoord.height)

        // просчитываем положение скролла
        if (mWidgetScroll != nullptr)
            mWidgetScroll->setScrollPosition(position);

        mOldSize.width = mCoord.width;
        mOldSize.height = mCoord.height;

#if MYGUI_DEBUG_MODE == 1
        _checkMapping("ListBox::updateLine");
#endif
    }
Ejemplo n.º 19
0
	void DDContainer::resetDrag()
	{
		_resetContainer(false);
	}
Ejemplo n.º 20
0
    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);
    }