Skip to content

Multi-object group selection (iD-style)#17

Open
tordans wants to merge 2 commits into
masterfrom
feature/multi-object-group-selection
Open

Multi-object group selection (iD-style)#17
tordans wants to merge 2 commits into
masterfrom
feature/multi-object-group-selection

Conversation

@tordans

@tordans tordans commented May 31, 2026

Copy link
Copy Markdown
Owner

Problem

Als GoMap-Nutzer/in, möchte ich mehrere Kartenobjekte zu einer temporären Gruppe zusammenfassen und gemeinsam bearbeiten können, damit ich mehrere POIs oder Wege effizient verschieben und deren Attribute in einem Durchgang anpassen kann — ähnlich wie im iD-Editor.

Aktuelles Verhalten: Beim Anklicken eines Objekts erscheint ein Tooltipp (Pushpin) mit Verschiebe-Symbol; es ist immer nur ein Objekt ausgewählt. Attribute bearbeiten betrifft nur dieses eine Objekt. Es gibt keine Möglichkeit, mehrere Objekte zu gruppieren, gemeinsam zu verschieben oder Tags mit Konfliktbehandlung („mehrfache Werte") zu pflegen.

Gewünschtes Verhalten:

  1. Gruppe anlegen: Objekt anklicken → Tooltipp erscheint. Langer Druck auf den Tooltipp erzeugt eine Gruppe; die Gruppe bleibt als ausgewähltes Element sichtbar.
  2. Gruppenleiste: Sobald eine Gruppe existiert, erscheint oben am Bildschirm eine Leiste mit Icons der Gruppenmitglieder — in der Reihenfolge der Auswahl.
  3. Attribute: Bei Gruppe und „Attribute" werden alle Objekte bearbeitet. Felder mit unterschiedlichen Werten zeigen „Mehrfache Werte"; Tipp darauf öffnet eine Liste der Werte je Objekt (iD-Stil).
  4. Mitglied hinzufügen: +-Button in der Gruppenleiste → gedrückter Zustand bis ein Kartenobjekt angetippt wird → Objekt wird der Gruppe hinzugefügt, + deaktiviert sich wieder.
  5. Batch-Hinzufügen: Langer Druck auf + → haptisches Feedback → fortlaufend Objekte auf der Karte antippen; alle werden nacheinander der Gruppe hinzugefügt.
  6. Gruppe verschieben: Solange die Gruppe aktiv ist, bleiben alle Mitglieder selektiert. Der Tooltipp zeigt „Gruppe" (statt Name) mit Verschiebe-Symbol; Verschieben bewegt alle Mitglieder gemeinsam.

Implementation notes (by Cursor)

Branch: feature/multi-object-group-selection
Plan doc: docs/plans/multi-object-group-selection.md

This PR adds the feature plan; implementation follows in subsequent commits on this branch.

Architecture

  • Extend selection from single selectedNode/Way/Relation to an ordered SelectionGroup: [OsmBaseObject] on EditorMapLayer / MapView. Keep selectedPrimary as anchor (first member / pushpin target).
  • Group creation: long-press on pushpin callout while one object is selected.
  • Group bar: new GroupSelectionBar at top of map — member chips (preset/geometry icons) in selection order, + for add modes.
  • Add modes: tap + → pressed state → next map tap appends member and resets +; long-press + → haptic + batch-add mode (each tap adds until + toggled off).

Map & pushpin

  • Highlight all group members in editor render pass.
  • Pushpin text: single → friendlyDescription(); group → localized “Group” + existing move handle.
  • Extend dragMove / dragFinish to translate all member geometries together (with undo grouping).

Attributes (POI)

  • POITabBarController takes multiple selections; merge tag dict per key.
  • Equal values → show value; differing → “Multiple values” placeholder; tap → sheet listing (object → value) (iD-style).
  • commitChanges() applies changes to every group member.
  • Gate edit-toolbar actions that are undefined for multi-select (split, join, turn restrictions, …).

Suggested phases

  1. Selection group model + member highlighting + read-only group bar
  2. Long-press pushpin → group; group pushpin label & group move
  3. Add / batch-add modes on group bar +
  4. Multi-tag merge UI + batch commit
  5. Toolbar gating, edge cases, xliff strings

Key files

  • EditorMapLayer.swift, EditorMapLayer+Edit.swift, MapView.swift, PushPinView.swift, MainViewController.swift
  • POITabBarController.swift, POICommonTagsViewController.swift, POIAllTagsViewController.swift
  • New: GroupSelectionBar.swift, multi-value tag presenter

Testing notes (by @tordans)

Gruppe anlegen & Leiste

  • Ein Objekt auswählen → Pushpin mit Name und Verschiebe-Symbol erscheint.
  • Langer Druck auf Pushpin → Gruppe wird erstellt; alle bisherigen Mitglieder bleiben hervorgehoben.
  • Gruppenleiste oben erscheint mit Icons in Auswahlreihenfolge.
  • Gruppe aufheben (Tap ins Leere / explizites Deselektieren) → Leiste verschwindet, Einzelauswahl wie bisher.

Mitglieder hinzufügen

  • + tippen → Button im gedrückten Zustand; Kartenobjekt antippen → wird Gruppe hinzugefügt, + wieder normal.
  • + lange drücken → Vibration/Haptik; mehrere Objekte nacheinander antippen → alle werden hinzugefügt; Modus beenden (erneut + oder Abbruch).
  • Bereits gruppiertes Objekt erneut hinzufügen → kein Duplikat.
  • Add-Modus abbrechen ohne Tap auf Karte → Gruppe unverändert.

Verschieben

  • Pushpin zeigt „Gruppe" (nicht Einzelname); Verschieben bewegt alle Mitglieder synchron.
  • Undo nach Gruppenverschieben stellt alle Positionen wieder her.
  • Einzelobjekt außerhalb Gruppe: bisheriges Verschiebeverhalten unverändert.

Attribute (Mehrfachbearbeitung)

  • Gruppe mit gleichen Tags → Felder zeigen gemeinsamen Wert; Änderung gilt für alle.
  • Gruppe mit unterschiedlichen Werten für dieselbe Key → „Mehrfache Werte"; Tipp → Liste je Objekt.
  • Neuen gemeinsamen Wert setzen → alle Objekte aktualisiert nach Done/Speichern.
  • Key entfernen / leer setzen → bei allen Mitgliedern entfernt.
  • Nur ein Objekt in Gruppe → Verhalten wie bisherige Einzelbearbeitung.

Regression

  • Long-Press auf Karte bei überlappenden Objekten → bisheriges Auswahl-Sheet (wenn nicht im Add-Modus).
  • Haupt-+ (Geometrie anlegen) und Gruppen-+ kollidieren nicht.
  • Bearbeiten-Werkzeugleiste: nicht unterstützte Aktionen bei Gruppe ausgeblendet/deaktiviert.
  • iPad / Mac Catalyst: Gruppenleiste und Sheets layouten korrekt.

Made with Cursor


Note

Low Risk
Documentation-only change with no production code, data paths, or user-facing behavior.

Overview
Adds docs/plans/multi-object-group-selection.md, a code-review-backed implementation plan for iD-style multi-object editing. No app or map code changes in this diff—only the spec for follow-on work.

The plan keeps existing single-selection (selectedPrimary, Selections) and layers an ephemeral groupMembers list, a top GroupSelectionBar, long-press on the pushpin to start a group, dedicated GroupAddMode (separate from geometry plusButtonTimestamp), a group-only drag path that skips single-object dragFinish semantics, and diff-based tag commits with mixedKeys / userEditedKeys (no sentinel strings in stored tags). It also defines tap behavior while grouped, edit-toolbar gating, member highlighting, and a five-phase rollout with called-out files (EditorMapLayer, MapView, PushPinView, POI controllers, new GroupSelectionBar / GroupTagMerge).

Reviewed by Cursor Bugbot for commit b0819d4. Bugbot is set up for automated code reviews on this repo. Configure here.

Co-authored-by: Cursor <cursoragent@cursor.com>
@bryceco

bryceco commented Jun 6, 2026

Copy link
Copy Markdown

Wow, very ambitious! I've always felt this would be too much work to justify, but it will be interesting to see what you come up with.

@tordans

tordans commented Jun 6, 2026

Copy link
Copy Markdown
Owner Author

I agree, this can get super complex fast. Already writing the plan showed how much stuff iD has to do to handle this and the edge cases are many.

I would consider this a pure exploration PR once something works.

Will close this for now because creating this PR was more of an accident TBH; I did not even translate the input 🤦 .

@tordans tordans closed this Jun 6, 2026
@tordans tordans reopened this Jun 6, 2026
Add binding design constraints from review of the existing implementation:
additive selection model, mixed-key/diff-based tag commit, plain-tap rules,
long-press creation, dedicated add-mode state, dedicated group-drag path,
toolbar gating, and member highlighting.
@bryceco

bryceco commented Jun 9, 2026

Copy link
Copy Markdown

I'm interested in seeing how this exploration goes. It still seems really complicated. iD seems like it punts on many of the complicated parts, but maybe that's correct and acceptable.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants