void WidgetListBox::updateVisible() { if (_visibleItems.empty()) return; GfxMan.lockFrame(); for (size_t i = 0; i < _visibleItems.size(); i++) _visibleItems[i]->hide(); float itemHeight = _items.front()->getHeight(); float itemY = _contentY; for (size_t i = 0; i < _visibleItems.size(); i++) { WidgetListItem *item = _items[_startItem + i]; itemY -= itemHeight; item->setPosition(_contentX, itemY, _contentZ - 5.0f); _visibleItems[i] = item; if (isVisible()) _visibleItems[i]->show(); } GfxMan.unlockFrame(); }
void WidgetGridBox::unlock() { assert(_locked); _locked = false; if (_items.empty()) { GfxMan.unlockFrame(); return; } _itemsByRow = MIN<uint>(_contentWidth / _items.front()->getWidth(), _items.size()); uint vCount = MIN<uint>(_contentHeight / _items.front()->getHeight(), _items.size()) * _itemsByRow; if ((vCount == 0) || (vCount == _visibleItems.size())) { GfxMan.unlockFrame(); return; } assert(_visibleItems.size() < vCount); _visibleItems.reserve(vCount); uint start = _startItem + _visibleItems.size(); float itemHeight = _items.front()->getHeight(); float itemWidth = _items.front()->getWidth(); uint row = 0; uint column = 0; // If we reach the last row, compute the items that remains. if (_items.size() - _startItem <= _visibleItems.size()) vCount -= _items.size() % _itemsByRow; while (_visibleItems.size() < vCount) { WidgetListItem *item = _items[start++]; // WORKAROUND: The x axis is shifted by 2 pixels in order to correctly render in // the charportrait widget. float itemY = _contentY - (row + 1) * (itemHeight + _innerVSpace) + _innerVSpace; float itemX = _contentX + (column * (itemWidth + _innerHSpace)) - 2.0; item->setPosition(itemX, itemY, _contentZ - 5.0); _visibleItems.push_back(item); if (isVisible()) _visibleItems.back()->show(); ++column; if (column == _itemsByRow) { ++row; column = 0; } } updateScrollbarLength(); updateScrollbarPosition(); GfxMan.unlockFrame(); }
void WidgetListEditor::addItem(QWidget *item) { WidgetListItem* widgetListItem = new WidgetListItem(this); widgetListItem->setItem(item); ui->list->addWidget(widgetListItem); connect(widgetListItem, SIGNAL(deleteItem()), this, SLOT(on_deleteItem())); connect(widgetListItem, SIGNAL(moveUp()), this, SLOT(on_moveUp())); connect(widgetListItem, SIGNAL(moveDown()), this, SLOT(on_moveDown())); }
void WidgetGridBox::updateVisible() { if (_visibleItems.empty()) return; GfxMan.lockFrame(); for (uint i = 0; i < _visibleItems.size(); i++) _visibleItems[i]->hide(); if (_visibleItems.size() > _items.size()) _visibleItems.resize(_items.size()); float itemHeight = _items.front()->getHeight() + _innerVSpace; float itemWidth = _items.front()->getWidth() + _innerHSpace; float itemY = _contentY - itemHeight + _innerVSpace; uint column = 0; int count = 0; if (_items.size() - _startItem <= _visibleItems.size()) count = _items.size() % _itemsByRow; for (uint i = 0; i < (_visibleItems.size() - count); i++) { WidgetListItem *item = _items[_startItem + i]; if (column == _itemsByRow) { itemY -= itemHeight; column = 0; } // WORKAROUND: The x axis is shifted by 2 pixels in order to correctly render in // the charportrait widget. item->setPosition(_contentX + column * itemWidth - 2.0, itemY, _contentZ - 5.0); _visibleItems[i] = item; if (isVisible()) _visibleItems[i]->show(); ++column; } GfxMan.unlockFrame(); }
void WidgetGridBox::subActive(Widget &widget) { if (widget.getTag().endsWith("#Up")) { scrollUp(1); return; } if (widget.getTag().endsWith("#Down")) { scrollDown(1); return; } if (widget.getTag().endsWith("#Bar")) { if (_itemsByRow == 0) return; // Round up const size_t rowCount = (_items.size() + (_itemsByRow - 1)) / _itemsByRow; const size_t visibleRow = (_visibleItems.size() + (_itemsByRow - 1)) / _itemsByRow; const ptrdiff_t maxStartRow = rowCount - visibleRow; if (maxStartRow <= 0) return; const size_t startRow = _scrollbar->getState() * maxStartRow; const size_t startItem = startRow * _itemsByRow; if (startItem == _startItem) return; _startItem = startItem; updateVisible(); return; } WidgetListItem *listItem = dynamic_cast<WidgetListItem *>(&widget); if (listItem) { if (_selectedItem != listItem->getItemNumber()) { _selectedItem = listItem->getItemNumber(); setActive(true); playSound("gui_button", Sound::kSoundTypeSFX); } } }
void WidgetListBox::unlock() { assert(_locked); _locked = false; if (_items.empty()) { GfxMan.unlockFrame(); return; } size_t count = MIN<size_t>(_contentHeight / _items.front()->getHeight(), _items.size()); if ((count == 0) || (count == _visibleItems.size())) { GfxMan.unlockFrame(); return; } assert(_visibleItems.size() < count); _visibleItems.reserve(count); size_t start = _startItem + _visibleItems.size(); float itemHeight = _items.front()->getHeight(); while (_visibleItems.size() < count) { WidgetListItem *item = _items[start++]; float itemY = _contentY - (_visibleItems.size() + 1) * itemHeight; item->setPosition(_contentX, itemY, _contentZ - 5.0f); _visibleItems.push_back(item); if (isVisible()) _visibleItems.back()->show(); } updateScrollbarLength(); updateScrollbarPosition(); GfxMan.unlockFrame(); }
void WidgetGridBox::subActive(Widget &widget) { if (widget.getTag().endsWith("#Up")) { scrollUp(1); return; } if (widget.getTag().endsWith("#Down")) { scrollDown(1); return; } if (widget.getTag().endsWith("#Bar")) { if (_items.size() - _visibleItems.size() == 0) return; uint maxIfFilled = _items.size() + _itemsByRow - _items.size() % _itemsByRow; uint maxVisible = floor(_contentHeight / _items.front()->getHeight()) * _itemsByRow; uint startItem = floor(_scrollbar->getState() * (maxIfFilled - maxVisible) / _itemsByRow) * _itemsByRow; if (startItem == _startItem) return; _startItem = startItem; updateVisible(); return; } WidgetListItem *listItem = dynamic_cast<WidgetListItem *>(&widget); if (listItem) { if (_selectedItem != listItem->getItemNumber()) { _selectedItem = listItem->getItemNumber(); setActive(true); playSound("gui_button", Sound::kSoundTypeSFX); } } }
QList<QWidget*> WidgetListEditor::items() { QList<QWidget*> list; for (int i = 0; i < ui->list->count(); i++) { QLayoutItem* layoutItem = ui->list->itemAt(i); if (layoutItem) { WidgetListItem* widgetListItem = dynamic_cast<WidgetListItem*>(layoutItem->widget()); if (widgetListItem) { QWidget* item = widgetListItem->item(); if (item != NULL) { list.append(item); } } } } return list; }