diff --git a/PENDENZEN.md b/PENDENZEN.md index d8ee2d6..43e605d 100644 --- a/PENDENZEN.md +++ b/PENDENZEN.md @@ -39,6 +39,8 @@ ## ⏭️ Als Nächstes +- [ ] **Ribbon-UI + modulare Bars** (Nutzer-Vision 2026-07-05, bestätigt: Tab-Schema **2D·3D·BIM·Ansichten**). Voller Plan + datengetriebene Architektur: **[docs/design/ribbon-ui-plan.md](docs/design/ribbon-ui-plan.md)**. Ribbon-Oberleiste mit Tabs ersetzt die Werkzeug-Sidebar; datengetriebene Registry (RibbonItem = tool|command|action) ermöglicht auch eine **modulare Custom-Bar** (gleiche Items, vom Nutzer gewählt). Attribute bekommen volle Höhe, Objektinfo darunter gemergt; XYZ-Box oben rechts bleibt. **Phasen:** (1) Gerüst + 2D-Tab (additiv, Sidebar bleibt), (2) 3D/BIM/Ansichten-Tabs, (3) Sidebar raus + Panel-Merge, (4) modulare Custom-Bar. ✅ Vorarbeit erledigt: Eigenschaften-Grid im OCS-Stil (`00733d8`), Kreis+Bogen-Werkzeuge (`e454eab`/`bd2b12b`). **Empfehlung: fokussierte Session mit visueller Iteration im Tauri.** + - [ ] **SPIKE — Bild-Texturen in `render3d` (`RenderStyle::Textured` real machen).** Kleinster ehrlicher Durchstich: beweisen, dass der wgpu-3D-Renderer echte Bild-Texturen auf Wandflächen zeigt, sichtbar im `spike3d`-Fenster. **Voller Auftrag/Übergabe: [SPIKE_TEXTUR_render3d.md](SPIKE_TEXTUR_render3d.md)** (Ausgangslage verifiziert, Symbol-Karte, exakter Umfang, harte Randbedingungen, Akzeptanz, Abschlussbericht). Kurz: UVs auf Wandflächen (planar in Metern, Alt-Pfad `[pos,normal,color]` bitgleich unangetastet) · prozedurales 256×256-Schachbrett (kein Asset, kein `image`-Crate) · Textur-Bind-Group group 1 (Globals bleibt group 0) · `MESH_TEXTURED_WGSL` (gleiche Beleuchtung, Albedo aus `textureSample`) · Verdrahtung bei `RenderStyle::Textured` · `spike3d` umschaltbar (`T`). **Nur `render3d`-Crate, keine neuen Deps, Default-Build unverändert.** Akzeptanz: `cargo test` grün (Mesh-Regression + naga-Test für `MESH_TEXTURED_WGSL`), `spike3d` zeigt weltmassstäbliche Textur. Ist der **erste Durchstich der Textur-/PBR-Pipeline** (§3D-REST unten) → am Ende ehrliche Lückenliste + Aufwandsschätzung für „richtig gutes" Texturing. ## 📋 Backlog (Priorität grob absteigend) @@ -105,6 +107,10 @@ _Nur jüngste Session; ältere Historie siehe `git log` und HANDOVER-Narrative._ +- [x] 2026-07-05 **Eigenschaften-Grid OCS-Stil** (`00733d8`) — `.attr-*` als klares Grid: Sektion-Balken, Zeilentrenner, füllende linksbündige Wertfelder (Texte/Zahlen/Dropdowns einheitlich). Erste Stufe der Ribbon-UI-Vision. +- [x] 2026-07-05 **Zoom-Scroll-Fix** (`077e774`) — Dokument-Overscroll/Rubberband gesperrt (`html,body,#root { overflow:hidden; overscroll-behavior:none }`); Viewport-Zoom zieht die UI nicht mehr mit (macOS). **Nutzer-Report.** +- [x] 2026-07-05 **Kreis- + Bogen-Werkzeug** (`e454eab`, `bd2b12b`) — Kreis-Toolbar (circleCommand gekoppelt) + neues `arcCommand` (3-Klick CCW), beide mit Toolbar-Icon/i18n; rendern glatt via `drawingCircle`/`drawingArc`. + - [x] 2026-07-05 **DXF-Import: Platzierungsoption** (`dd76ec8`) — ImportDialog fragt „relativ zum Nullpunkt" ODER „in die Mitte der aktuellen Ansicht"; `PlanViewHandle.viewCenterModel()` neu; `runImport` verschiebt den Gesamt-Umriss (bbox-Mitte → Ansichtsmitte). tsc + Suite 331 grün. - [x] 2026-07-05 **Zeichnungen Copy/Paste über Geschosse** (`376aa67`) — Ctrl/Cmd+C kopiert gewählte Drawing2D tief; Ctrl/Cmd+V fügt Klone (neue IDs) auf dem AKTIVEN Geschoss ein und wählt sie. Für z. B. importiertes Mobiliar. Textfeld-Fokus bleibt natives Copy/Paste. - [x] 2026-07-05 **Tauri Drag&Drop + Import-Dialog-Fix** (`c5b5ca6`, `45e19b7`) — `import`-Befehl als `autoRun` (Datei-Dialog öffnet synchron in der Geste, HMR-Falle via Config-Relaunch behoben); `dragDropEnabled:false` (Tauris natives Drag-Drop fing HTML-Drops ab). **Nutzer-bestätigt: Dialog + Text gehen.** diff --git a/docs/design/ribbon-ui-plan.md b/docs/design/ribbon-ui-plan.md new file mode 100644 index 0000000..11318c3 --- /dev/null +++ b/docs/design/ribbon-ui-plan.md @@ -0,0 +1,61 @@ +# Ribbon-UI + modulare Bars — Plan + +Nutzer-Vision (2026-07-05, mit OCS/AutoCAD-Ribbon als Referenz). Ziel: klare, +einheitliche Werkzeug-/Eigenschaften-Darstellung; Werkzeug-Sidebar entfällt. + +## Zielbild + +- **Ribbon-Oberleiste mit Tabs: 2D · 3D · BIM · Ansichten.** Jeder Tab zeigt + gruppierte Werkzeug-/Aktions-Icons (wie OCS Draw/Model/Insert/Annotate/View). + - **2D**: Zeichnen (Select/Linie/Polylinie/Rechteck/Kreis/Bogen/Text) · Ändern + (Move/Copy/Mirror/Offset/Trim/Join/Boolean). + - **3D**: Volumen/Boolean (vorhandene 3D-Aktionen), Kamera-Presets. + - **BIM**: Wand/Fenster/Tür/Treppe/Decke/Raum (die Bauteile). + - **Ansichten**: Geschoss/Schnitt/Ansicht-Wechsel, Zoom/Einpassen, Render-Modi. +- **Werkzeug-Sidebar entfällt** → rechtes Panel (Attribute) bekommt volle Höhe. +- **Objektinfo unter die Attribute** mergen (Wandstil-Definition etc. zusammen). +- **XYZ-Referenzpunkt-Box oben rechts bleibt** (vom Nutzer ausdrücklich gewünscht). +- **Eigenschaften-Grid im OCS-Stil** — ✅ bereits erledigt (`00733d8`): Sektion- + Balken, Zeilentrenner, füllende linksbündige Wertfelder (`.attr-*`). + +## Architektur — DATENGETRIEBEN (ermöglicht modulare Custom-Bar) + +Kern: EINE Registry beschreibt alle Ribbon-Elemente; Ribbon-Tabs UND eine +benutzerdefinierte Custom-Bar sind bloß zwei Ansichten über dieselbe Registry. + +``` +RibbonItem = + | { kind: "tool"; id: ToolId } // aktiviert ein Werkzeug (onSelectTool) + | { kind: "command"; name: string } // startet einen Engine-Befehl (engine.start) + | { kind: "action"; id: string; run: () => void } // freie App-Aktion (Zoom, Render-Modus …) + +RibbonGroup = { titleKey: string; items: RibbonItem[] } +RibbonTab = { id: "2d"|"3d"|"bim"|"views"; labelKey: string; groups: RibbonGroup[] } +RIBBON: RibbonTab[] +``` + +- Icons: `ToolIcon` (vorhanden) für `tool`-Items; für `command`/`action` eine + kleine Icon-Map (SVG) analog `ToolsPanel`. +- Aktivierung: `tool` → `onSelectTool(id)` · `command` → `engine.start(name)` · + `action` → `run()`. Aktiv-Highlight über `activeTool` bzw. laufenden Befehl. +- **Custom-Bar (modular)**: der Nutzer wählt beliebige `RibbonItem`s in eine + persistierte Liste (`viewSlice`/Projekt); eine `CustomBar`-Komponente rendert + genau diese. Gleiche Item-Typen, gleiche Aktivierung — kein Sonderweg. + +## Phasen + +1. **Gerüst + 2D-Tab.** `RibbonBar`-Komponente unter der TopBar (additiv, Sidebar + bleibt). Datengetriebene Registry, 2D-Tab gefüllt (Zeichnen+Ändern), Tab-State + lokal. Icons für die Modify-Befehle ergänzen. tsc + Suite grün. +2. **Restliche Tabs** 3D/BIM/Ansichten mit den vorhandenen Aktionen/Befehlen. +3. **Sidebar raus** (ToolsPanel aus Default-Layout) + rechtes Panel volle Höhe; + Objektinfo unter Attribute mergen. +4. **Modulare Custom-Bar**: Item-Picker + persistierte Custom-Bar-Ansicht. + +## Hinweise / Randbedingungen + +- Additiv bauen: bestehende Kommandozeile + Nummern-Shortcuts + `ToolsPanel` + bleiben funktionsfähig, bis Phase 3 die Sidebar bewusst entfernt. +- Werkzeug-Kopplung Tool↔Befehl existiert bereits (`TOOL_COMMAND`) — Ribbon nutzt + denselben `onSelectTool`/`engine.start`-Pfad (EIN Pfad, keine Duplikate). +- Empfehlung: Phase 1+ in fokussierter Session mit visueller Iteration im Tauri.