void ListView::ChangeSelection(int delta, bool additive) { if (selections_.Empty()) return; if (!multiselect_) additive = false; // If going downwards, use the last selection as a base. Otherwise use first unsigned selection = delta > 0 ? selections_.Back() : selections_.Front(); int direction = delta > 0 ? 1 : -1; unsigned numItems = GetNumItems(); unsigned newSelection = selection; unsigned okSelection = selection; PODVector<unsigned> indices = selections_; while (delta != 0) { newSelection += direction; if (newSelection >= numItems) break; UIElement* item = GetItem(newSelection); if (item->IsVisible()) { indices.Push(okSelection = newSelection); delta -= direction; } } if (!additive) SetSelection(okSelection); else SetSelections(indices); }
void UIDrag::HandleUpdate(StringHash eventType, VariantMap& eventData) { auto* ui = GetSubsystem<UI>(); UIElement* root = ui->GetRoot(); auto* input = GetSubsystem<Input>(); unsigned n = input->GetNumTouches(); for (unsigned i = 0; i < n; i++) { Text* t = (Text*)root->GetChild("Touch " + String(i)); TouchState* ts = input->GetTouch(i); t->SetText("Touch " + String(ts->touchID_)); IntVector2 pos = ts->position_; pos.y_ -= 30; t->SetPosition(pos); t->SetVisible(true); } for (unsigned i = n; i < 10; i++) { Text* t = (Text*)root->GetChild("Touch " + String(i)); t->SetVisible(false); } if (input->GetKeyPress(KEY_SPACE)) { PODVector<UIElement*> elements; root->GetChildrenWithTag(elements, "SomeTag"); for (PODVector<UIElement*>::ConstIterator i = elements.Begin(); i != elements.End(); ++i) { UIElement* element = *i; element->SetVisible(!element->IsVisible()); } } }
void ListView::OnKey(int key, int buttons, int qualifiers) { // If no selection, can not move with keys unsigned numItems = GetNumItems(); unsigned selection = GetSelection(); // If either shift or ctrl held down, add to selection if multiselect enabled bool additive = multiselect_ && qualifiers & (QUAL_SHIFT | QUAL_CTRL); int delta = M_MAX_INT; int pageDirection = 1; if (numItems) { if (selection != M_MAX_UNSIGNED && qualifiers & QUAL_CTRL && key == KEY_C) { CopySelectedItemsToClipboard(); return; } switch (key) { case KEY_LEFT: case KEY_RIGHT: if (selection != M_MAX_UNSIGNED && hierarchyMode_) { Expand(selection, key == KEY_RIGHT); return; } break; case KEY_RETURN: case KEY_RETURN2: case KEY_KP_ENTER: if (selection != M_MAX_UNSIGNED && hierarchyMode_) { ToggleExpand(selection); return; } break; case KEY_UP: delta = -1; break; case KEY_DOWN: delta = 1; break; case KEY_PAGEUP: pageDirection = -1; // Fallthru case KEY_PAGEDOWN: { // Convert page step to pixels and see how many items have to be skipped to reach that many pixels if (selection == M_MAX_UNSIGNED) selection = 0; // Assume as if first item is selected int stepPixels = ((int)(pageStep_ * scrollPanel_->GetHeight())) - contentElement_->GetChild(selection)->GetHeight(); unsigned newSelection = selection; unsigned okSelection = selection; unsigned invisible = 0; while (newSelection < numItems) { UIElement* item = GetItem(newSelection); int height = 0; if (item->IsVisible()) { height = item->GetHeight(); okSelection = newSelection; } else ++invisible; if (stepPixels < height) break; stepPixels -= height; newSelection += pageDirection; } delta = okSelection - selection - pageDirection * invisible; } break; case KEY_HOME: delta = -(int)GetNumItems(); break; case KEY_END: delta = GetNumItems(); break; default: break; } } if (delta != M_MAX_INT) { ChangeSelection(delta, additive); return; } using namespace UnhandledKey; VariantMap& eventData = GetEventDataMap(); eventData[P_ELEMENT] = this; eventData[P_KEY] = key; eventData[P_BUTTONS] = buttons; eventData[P_QUALIFIERS] = qualifiers; SendEvent(E_UNHANDLEDKEY, eventData); }