void Window::GetBatches(PODVector<UIBatch>& batches, PODVector<float>& vertexData, const IntRect& currentScissor) { if (modal_) { // Modal shade if (modalShadeColor_ != Color::TRANSPARENT) { UIElement* rootElement = GetRoot(); const IntVector2& rootSize = rootElement->GetSize(); UIBatch batch(rootElement, BLEND_ALPHA, IntRect(0, 0, rootSize.x_, rootSize.y_), 0, &vertexData); batch.AddQuad(0, 0, rootSize.x_, rootSize.y_, 0, 0, 0, 0, modalShadeColor_); UIBatch::AddOrMerge(batch, batches); } // Modal frame if (modalFrameColor_ != Color::TRANSPARENT && modalFrameSize_ != IntVector2::ZERO) { UIBatch batch(this, BLEND_ALPHA, currentScissor, 0, &vertexData); int x = GetIndentWidth(); IntVector2 size = GetSize(); size.x_ -= x; batch.AddQuad(x - modalFrameSize_.x_, -modalFrameSize_.y_, size.x_ + 2 * modalFrameSize_.x_, size.y_ + 2 * modalFrameSize_.y_, 0, 0, 0, 0, modalFrameColor_); UIBatch::AddOrMerge(batch, batches); } } BorderImage::GetBatches(batches, vertexData, currentScissor); }
void DropDownList::HandleItemClicked(StringHash eventType, VariantMap& eventData) { // Resize the selection placeholder to match the selected item UIElement* selectedItem = GetSelectedItem(); if (selectedItem) placeholder_->SetSize(selectedItem->GetSize()); // Close and defocus the popup. This will actually send the selection forward if (listView_->HasFocus()) GetSubsystem<UI>()->SetFocusElement(focusMode_ < FM_FOCUSABLE ? nullptr : this); ShowPopup(false); }
void DropDownList::HandleItemSelected(StringHash eventType, VariantMap& eventData) { // Resize the selection placeholder to match the selected item UIElement* selectedItem = GetSelectedItem(); if (selectedItem) placeholder_->SetSize(selectedItem->GetSize()); // Close the popup as the selection was made if (GetShowPopup()) ShowPopup(false); // Send the event forward using namespace ItemSelected; VariantMap newEventData; newEventData[P_ELEMENT] = (void*)this; newEventData[P_SELECTION] = GetSelection(); SendEvent(E_ITEMSELECTED, newEventData); }
void DropDownList::OnShowPopup() { // Resize the popup to match the size of the list content, and optionally match the button width UIElement* content = listView_->GetContentElement(); content->UpdateLayout(); const IntVector2& contentSize = content->GetSize(); const IntRect& border = popup_->GetLayoutBorder(); popup_->SetSize(resizePopup_ ? GetWidth() : contentSize.x_ + border.left_ + border.right_, contentSize.y_ + border.top_ + border.bottom_); // Check if popup fits below the button. If not, show above instead bool showAbove = false; UIElement* root = GetRoot(); if (root) { const IntVector2& screenPos = GetScreenPosition(); if (screenPos.y_ + GetHeight() + popup_->GetHeight() > root->GetHeight() && screenPos.y_ - popup_->GetHeight() >= 0) showAbove = true; } SetPopupOffset(0, showAbove ? -popup_->GetHeight() : GetHeight()); }