void DropDownList::GetBatches(ea::vector<UIBatch>& batches, ea::vector<float>& vertexData, const IntRect& currentScissor) { Menu::GetBatches(batches, vertexData, currentScissor); if (!placeholder_->IsVisible()) return; UIElement* selectedItem = GetSelectedItem(); if (selectedItem) { // Can not easily copy the selected item. However, it can be re-rendered on the placeholder's position const IntVector2& targetPos = placeholder_->GetScreenPosition(); const IntVector2& originalPos = selectedItem->GetScreenPosition(); IntVector2 offset = targetPos - originalPos; // GetBatches() usually resets the hover flag. Therefore get its value and then reset it for the real rendering // Render the selected item without its selection color, so temporarily reset the item's selected attribute bool hover = selectedItem->IsHovering(); selectedItem->SetSelected(false); selectedItem->SetHovering(false); selectedItem->GetBatchesWithOffset(offset, batches, vertexData, currentScissor); selectedItem->SetSelected(true); selectedItem->SetHovering(hover); } }
void ListView::UpdateSelectionEffect() { unsigned numItems = GetNumItems(); bool highlighted = highlightMode_ == HM_ALWAYS || HasFocus(); for (unsigned i = 0; i < numItems; ++i) { UIElement* item = GetItem(i); if (highlightMode_ != HM_NEVER && selections_.Contains(i)) item->SetSelected(highlighted); else item->SetSelected(false); } }
void ListView::RemoveItem(UIElement* item, unsigned index) { if (!item) return; unsigned numItems = GetNumItems(); for (unsigned i = index; i < numItems; ++i) { if (GetItem(i) == item) { item->SetSelected(false); selections_.Remove(i); unsigned removed = 1; if (hierarchyMode_) { // Remove any child items in hierarchy mode if (GetItemHierarchyParent(item)) { int baseIndent = item->GetIndent(); for (unsigned j = i + 1; ; ++j) { UIElement* childItem = GetItem(i + 1); if (!childItem) break; if (childItem->GetIndent() > baseIndent) { childItem->SetSelected(false); selections_.Erase(j); contentElement_->RemoveChildAtIndex(i + 1); overlayContainer_->RemoveChildAtIndex(i + 1); ++removed; } else break; } } // Check if the parent of removed item still has other children if (i > 0) { int baseIndent = item->GetIndent(); UIElement* prevKin = GetItem(i - 1); // Could be parent or sibling if (prevKin->GetIndent() < baseIndent) { UIElement* nextKin = GetItem(i + 1); // Could be sibling or parent-sibling or 0 if index out of bound if (!nextKin || nextKin->GetIndent() < baseIndent) { // If we reach here then the parent has no other children SetItemHierarchyParent(prevKin, false); } } } // Remove the overlay at the same index overlayContainer_->RemoveChildAtIndex(i); } // If necessary, shift the following selections if (!selections_.Empty()) { for (unsigned j = 0; j < selections_.Size(); ++j) { if (selections_[j] > i) selections_[j] -= removed; } UpdateSelectionEffect(); } contentElement_->RemoveChildAtIndex(i); break; } } }