# Ürün Ağacı — DÜNYA-ÇAPINDA ZENGİN ITEM & ETKİLEŞİM TASARIMI

> **Amaç:** fikatia-local Ürün Ağacı'nı (treeview) "vay be" dedirtecek zenginliğe taşımak: her düğüm tipine ÖZEL satır anatomisi, iç içe alt-öğeler, **ağaç içinde düzenlenebilir parametreler** (parametrik → canlı recompute), modele/workbench'e özgü satırlar, kusursuz kaydırma/virtual, ve dünya-çapında etkileşim (DnD, çoklu-seçim, inline rename, breadcrumb, klavye, pin/favori...).
>
> **Kapsam ayrımı (KRİTİK):** Bu doküman **NASIL çizilir + NASIL etkileşilir + hangi bileşenlerle** sorusunu cevaplar (satır anatomisi, item-tipi mimarisi, inline parametre widget'ları, etkileşim seti, performans). Kardeş doküman [`urun_agaci_pro_spec.md`](urun_agaci_pro_spec.md) **HANGİ sistemler ağaçta olmalı** sorusunu cevaplar (Işıklar/Konumlar/Ölçümler/Etiketler/Kaynakça envanteri). İkisi çakışmaz, tamamlar.
>
> **⚠️ RETARGET:** `urun_agaci_pro_spec.md` `main.cpp cizDugum (~2521–2634)` ImGui-TreeNode yolunu referans alır — **bu yol ARTIK YOK.** Ağaç bu oturumda `motor/ui/…/agac_gorunum.{hpp,cpp}` (`ui::AgacGorunum`, DrawList + `ImGuiListClipper` virtual, hızlı-eylem, filtre, saydam overlay) + `uygulama/fikocad/urun_agaci_paneli.cpp` (sağlayıcı besleme + olay işleme) mimarisine taşındı. Bu tasarım O mimariyi genişletir.
>
> **Mimari anayasa:** Ağaçta temsil edilen HER şey `DokumanNesnesi` (+ görünürse `GorunumSaglayici`) türevidir; zenginlik **polimorfizmle** `GorunumSaglayici`'dan pull edilir (dev switch YOK). Merkezî `Cekirdek` registry'ye eklenen sistem doğduğu an makro + plugin + olay erişilebilir olur ([[fikatia-mimari-ilke-makro-plugin-olay]]). Yeni olay struct'ı **enum SONUNA** (`OlayTuru::SAYAC` öncesi). Fog YOK.

---

## 0 — MEVCUT MİMARİ (kilitlenecek dosyalar, gerçek satırlar)

### 0.1 İki katmanlı düğüm modeli (bugün)

| Katman | Tip | Dosya:satır | Alanlar (bugün) |
|---|---|---|---|
| **Kaynak** (domain) | `fiko::AgacDugum` | `motor/cekirdek/include/fiko/cekirdek/kayit.hpp:72–78` | `etiket / varlik / camKimlik / camTip / cocuklar` |
| **Görünüm** (sunum) | `fiko::ui::AgacDugum` | `motor/ui/include/fiko/ui/agac_gorunum.hpp:23–32` | `id / etiket / simge / renk / gorunur / secili / hizliMaske / cocuklar` |
| **Sunum otoritesi** | `GorunumSaglayici` | `motor/cekirdek/include/fiko/cekirdek/nesne.hpp:112–131` | `gorunur() / agacSimgesi() / agacRengiVar() / agacRengi()` |
| **Veri otoritesi** | `DokumanNesnesi` | `nesne.hpp:85–107` | `turAdi() / ad() / adAyarla() / ozellikler(Dunya&) / hesapla() / bagimliliklar()` |

**Akış (kare başına):**
1. `urun_agaci_paneli.cpp:118` — `cekirdek.agac().topla(cekirdek, agacKok)` → tüm sağlayıcılar (geometri/CAM/analiz) kaynak `AgacDugum` ağacını doldurur.
2. `urun_agaci_paneli.cpp:125–149` — `donustur()` lambda: kaynak → `ui::AgacDugum`; etiket=`nesne->ad()`, simge=`gorunum->agacSimgesi()`, filtre budaması. **Renk çipi bilinçli KAPALI** (satır 123 yorumu).
3. `urun_agaci_paneli.cpp:152–168` — seçim senkronu (domain→ağaç), kaydırma.
4. `urun_agaci_paneli.cpp:175` — `agacUi.ciz()` → `AgacGorunum::ciz` (agac_gorunum.cpp:82).
5. `agac_gorunum.cpp:102–104` — `duzlestir()`: açık dallar düz listeye; `:128–350` — `ImGuiListClipper` ile yalnız görünür satırlar DrawList'e çizilir.
6. `urun_agaci_paneli.cpp:180–305` — olaylar işlenir (seçim/görünürlük/çift-tık/hızlı-eylem/rename/bağlam menü).

### 0.2 Bugün VAR olan zenginlik
- Virtual scroll (`ImGuiListClipper`, agac_gorunum.cpp:128).
- Animasyonlu genişlet üçgeni (`animf`, :204), hover/seçim geçiş animasyonu (:154–155).
- Neon gradient seçim şeridi + sol vurgu çubuğu (:168–174), tema token (`tema()`).
- Tip ikonu (glif/doku, `simgeCiz`), renk çipi altyapısı (:220–224 — panelde kapalı).
- Görünürlük göz-ikonu (:263–280), bağlantı/girinti çizgileri (:180–193).
- Hover'da beliren içerik-bitişik hızlı-eylem şeridi (:284–319), tooltip.
- Inline rename `InputText` (:233–260), filtre (`urun_agaci_paneli.cpp:104`).
- CATIA saydam overlay tık-geçişi (`fareSatirUstunde`, :144).

### 0.3 EKSİK zenginlik (bu tasarımın getirdiği)
1. **Tip-özel satır anatomisi yok** — her satır aynı: [ok][çip][ikon][etiket]. Durum rozeti / mini-bilgi / badge YOK.
2. **Alt-öğe / nested detay yok** — Feature altında parametreler, Sketch altında geometri/kısıt sayısı, gövde altında yüz/kenar istatistiği gösterilmiyor.
3. **Inline parametre düzenleme yok** — ağaçta slider/drag/dropdown/toggle ile değer değiştirip recompute tetikleme yok.
4. **Durum rozeti yok** — hata/güncel/hesaplanıyor/bastırılmış görsel dili yok.
5. **DnD reorder/reparent, shift-aralık, kutu-seçim, klavye nav, breadcrumb, pin/favori, sıralama/gruplama modu yok.**
6. **Renk çipi tık→seçici, hover-önizleme (thumbnail), tip-filtre açılırı yok.**

---

## 1 — ITEM TİPLERİ KATALOĞU (satır anatomisi)

### 1.1 Satır arketipleri
Her satır bir **arketipe** göre çizilir. Arketip `GorunumSaglayici::satirArketip()` (yeni) veya `DokumanNesnesi::turAdi()`'ndan türetilir. AgacGorunum bunu `ui::AgacDugum.arketip` alanından okur.

| Arketip | Kullanım | Satır grameri (sol→sağ) |
|---|---|---|
| `Govde` | Geometri gövdesi, primitif | 👁 · ok · **renk çipi** · ikon · ad · [durum] · `mini: 12 yüz · 30 kenar` |
| `Sketch` | Eskiz | 👁 · ok · ikon(☐) · ad · [rozet: ✓çözüldü / ⚠DOF n] · `mini: 4 çizgi · 6 kısıt` |
| `Feature` | Pad/Pocket/Fillet/Shaft... | 👁 · ok · ikon · ad · [durum: ✓/⚠hata/⟳bayat/⊘bastık] · `mini: 25 mm` |
| `Datum` | Düzlem/Eksen/Origin | 👁 · ok · **renk çipi** · ikon(◱/⊥) · ad *(soluk — referans)* |
| `Tel` / `Yuzey` (GSD) | Wireframe / açık yüzey | 👁 · ok · **renk çipi**(sarı/cyan) · ikon(〜/▱) · ad · [durum] |
| `CamOp` | Kaba/finiş/kontur op | ok · **durum çipi**(⏳/⟳/✓) · ikon(▣) · ad · `mini: 340 hamle · 2.4 dk` |
| `CamTakim` | T1..Tn | · ikon(🔧) · ad · `mini: Ø10 · düz freze` |
| `Analiz` | Draft/undercut/kalınlık | 👁 · ok · **gradient çip** · ikon(🔬) · ad · [rozet: bayat] |
| `Isik` | Ortam/Yönsel/Nokta | 👁 · ok · **renk çipi**(ışık rengi) · ikon(☀/💡) · ad · [inline: şiddet ▬] |
| `Konum` | Named view | · ikon(📷) · ad *(çift-tık: eased git)* |
| `Olcum` | Kalıcı ölçüm | 👁 · **altın çip** · ikon(📏) · ad · `mini: 123.45 mm` |
| `Malzeme` | Malzeme preset | · **renk çipi** · ikon(⬤) · ad · `mini: Alüminyum` |
| `Grup` / `GeoSet` | Part Body / Geometrical Set / Kaynakça | 👁 · ok · ikon(▤/📦) · **kalın** ad · [aktif-gövde altı-çizgi] · `mini: 8 öğe` · [＋sağ-buton] |
| `Parametre` | ƒ(x) satırı — bkz §3 | · ikon(ƒ) · ad · **inline editör** · birim |
| `AltDetay` | Nested istatistik satırı — bkz §2 | *(ok yok, girintili, soluk)* · etiket · değer |

### 1.2 Görsel dil (badge / rozet / çip / mini-bilgi)
`ui::AgacDugum` şu yeni alanlarla zenginleşir (POD, sunum-yalın):

```cpp
// motor/ui/include/fiko/ui/agac_gorunum.hpp — AgacDugum genişlemesi
enum class Arketip : u8 { Genel, Govde, Sketch, Feature, Datum, Tel, Yuzey,
                          CamOp, CamTakim, Analiz, Isik, Konum, Olcum,
                          Malzeme, Grup, Parametre, AltDetay };
enum class Durum : u8 { Normal, Hesaplaniyor, Bayat, Hata, Bastik };  // rozet + renk

struct AgacRozet {            // satır sağında küçük etiketli/ikonlu çip
  const char* metin = nullptr;   // "DOF 2", "M8", "Ø10"  (nullptr → yalnız ikon)
  Simge simge;                   // opsiyonel glif
  ImVec4 renk{0,0,0,0};          // a<=0 → tema.vurgu
  bool nabiz = false;            // animasyonlu (hesaplanıyor → yanıp söner)
};

struct AgacDugum {
  // ... mevcut alanlar (id/etiket/simge/renk/gorunur/secili/hizliMaske/cocuklar) ...
  Arketip arketip = Arketip::Genel;
  Durum   durum   = Durum::Normal;
  std::string miniBilgi;                  // "12 yüz · 30 kenar" (sağ-hizalı soluk)
  std::vector<AgacRozet> rozetler;        // 0..N badge (sağdan sola dizilir)
  std::vector<AgacParam> parametreler;    // inline düzenlenebilir (bkz §3)
  bool kalin = false;                     // grup/aktif-gövde
  bool altiCizili = false;                // "In Work Object" (aktif gövde)
  bool soluk = false;                     // datum/referans → düşük vurgu
  bool pinli = false;                     // favori/pin (üstte sabit)
};
```

**Çizim (agac_gorunum.cpp `ciz` döngüsü içine, etiketten SONRA):**
- **Durum rozeti:** `Durum::Hata` → kırmızı ⚠ + ad kırmızımsı; `Bayat` → turuncu ⟳ (nabız); `Hesaplaniyor` → cyan ⏳ nabız; `Bastik` → üstü-çizili gri + ⊘. Renk `tema()`'dan (koyu/neon/açık uyumlu).
- **Rozetler:** etiketin sağında, mini-bilgiden önce; her biri yuvarlak kapsül (`AddRectFilled` + `t.yuvarlak`), `simgeCiz` + `AddText`. `nabiz` → `animf` ile alpha osilasyonu.
- **Mini-bilgi:** satırın SAĞ ucunda soluk (`t.metinSoluk`), `CalcTextSize` ile sağ-hizalı; hızlı-eylem şeridi belirince (hover) gizlenir (çakışma yok).
- **Altı-çizili (aktif gövde):** ad altına 2px `t.vurgu2` çizgi; **kalın** → ImGui'de gerçek bold font yoksa 1px offset ikinci `AddText` ile sahte-bold.

> **İlke:** Tüm bu alanlar **veri-odaklı** çizilir; AgacGorunum tek gövde döngüsünde okur. Tip-özel DAVRANIŞ registry'de (§6.3), tip-özel GÖRÜNÜM verisi `AgacDugum` alanlarında. Böylece 100 tip için 100 çizim fonksiyonu yazılmaz.

### 1.3 Zenginliğin kaynağı — `GorunumSaglayici` genişlemesi (OOP, switch yok)
Her tip kendi satır zenginliğini polimorfik verir. `nesne.hpp:112` genişler:

```cpp
class GorunumSaglayici {
  // ... mevcut: gorunur/agacSimgesi/agacRengiVar/agacRengi ...
  virtual ui::Arketip agacArketip() const { return ui::Arketip::Genel; }
  virtual ui::Durum   agacDurum()   const { return ui::Durum::Normal; }
  virtual std::string agacMiniBilgi(Dunya&) const { return {}; }     // "12 yüz · 30 kenar"
  virtual void agacRozetleri(Dunya&, std::vector<ui::AgacRozet>&) const {}
  virtual void agacParametreleri(Dunya&, std::vector<ui::AgacParam>&) const {}  // §3
  virtual void agacAltOgeleri(Dunya&, std::vector<ui::AgacDugum>&) const {}      // §2 (lazy)
  virtual void agacBaglamMenu(std::vector<ui::MenuGirdi>&) const {}              // §5 (tür-özel)
};
```

`ui` başlığına `cekirdek` bağımlılığı yaratmamak için: `ui::Arketip/Durum/AgacRozet/AgacParam/MenuGirdi` küçük POD'lar `motor/ui`'de; `motor/cekirdek` bunları `#include "fiko/ui/agac_ogeler.hpp"` ile alır (ui zaten cekirdek'e bağlı değil → tek-yön OK). Alternatif: bu POD'ları `fiko::` çekirdeğinde tanımlayıp ui'nin görmesi. **Karar:** POD'lar `motor/ui/include/fiko/ui/agac_ogeler.hpp`'de (Simge zaten orada); çekirdek onu görür.

**Dönüşüm (`urun_agaci_paneli.cpp donustur`, satır 137 civarı):**
```cpp
out.arketip = gv ? gv->agacArketip() : camArketip(d.camTip);
out.durum   = gv ? gv->agacDurum()   : Durum::Normal;
if (gv) { out.miniBilgi = gv->agacMiniBilgi(dunya);
          gv->agacRozetleri(dunya, out.rozetler);
          if (agacUi.acikMi(out.id)) {          // LAZY: yalnız açık düğüm için
            gv->agacParametreleri(dunya, out.parametreler);
            gv->agacAltOgeleri(dunya, out.altOgeler); } }
```

### 1.4 Somut tip → satır eşlemesi (mevcut sağlayıcılar)
| Tür (`turAdi`) | Sağlayıcı | İkon (bugün) | Arketip | Mini-bilgi | Rozet | Parametre |
|---|---|---|---|---|---|---|
| Geometri | `GeometriGorunum` (geometri_nesne.hpp:34) | `agacSimgesi()` | Govde | `N yüz · M kenar` | — | — |
| Sketch | `SketchGorunum` (sketch_nesne.hpp:48) `☐` | Sketch | `K çizgi · L kısıt` | DOF/✓çözüldü | — |
| Feature (Pad…) | `FeatureGorunum` (feature.hpp:69) | Feature | ana ölçü (`25 mm`) | Bastık/Hata | **Pad→Uzunluk/Yön/2.Limit** (§3) |
| GSD Tel/Yüzey | `GsdGorunum` (gsd_feature.hpp:62) sarı/cyan | Tel/Yuzey | — | Hata | tip-özel |
| Düzlem/Eksen | `ReferansGorunum` (referans_nesne.hpp:34) | Datum | — | — | — |
| Grup | `GrupGorunum` (grup_nesne.hpp:33) `▤` | Grup | `N öğe` | — | — |
| CAM Op | `camArketip(CAM_OP)` `▣` | CamOp | `hamle · süre` | durum çipi | strateji/derinlik |
| CAM Takım | `CAM_TAKIM` `🔧` | CamTakim | `Ø · tip` | — | — |
| Analiz | `analiz` sağlayıcı `🔬` | Analiz | — | bayat | eşik slider |

> Örnek `agacMiniBilgi`: `GeometriGorunum` → gövdenin BRep'inden `numFaces/numEdges` (zaten sahne/BRepGovde'de var). Feature → ana parametreden (`Feature::p("uzunluk")` → `"25 mm"`). Sketch → sketch entity/kısıt sayısı.

---

## 2 — ALT-ÖĞE / NESTED ITEMLER (lazy-expand)

### 2.1 Model
Alt-öğeler **normal `ui::AgacDugum` çocuklarıdır** ama `arketip = AltDetay | Parametre`; böylece mevcut `duzlestir()` + clipper onları bedavaya işler (ayrı liste, ayrı çizim yolu YOK — mükerrer değil). Fark yalnız çizimde: `AltDetay` satırı **ok çizmez**, girintili + soluk, sol renk çubuğu yok.

**Örnek genişlemeler:**
```
▣ Pad.1                       [✓]      25 mm
   ├─ ƒ Uzunluk      [═══●════] 25.0 mm    ← Parametre (inline, §3)
   ├─ ƒ Yön          [Normal ▾]           ← Parametre (dropdown)
   ├─ ⚑ 2. Limit     [Kapalı ○]           ← Parametre (toggle)
   ├─ ↳ Sketch.1                          ← gerçek DAG bağı (çocuk düğüm, tıklanır)
   └─ ⓘ 1 kontur · 340 mm²                ← AltDetay (salt bilgi)
✎ Sketch.1                    [DOF 2]    4 çizgi · 6 kısıt
   ├─ ⓘ 4 çizgi · 2 yay · 1 çember        ← AltDetay
   └─ ⓘ 6 kısıt (2 boyut · 4 geometrik)   ← AltDetay
🧊 Gövde.1                              12 yüz · 30 kenar
   └─ ⓘ hacim 12.4 cm³ · alan 84 mm²      ← AltDetay
```

### 2.2 Lazy üretim (performans)
`agacAltOgeleri()` / `agacParametreleri()` **yalnız düğüm AÇIK ise** çağrılır (donustur §1.3'te `agacUi.acikMi(id)` guard'ı). Kapalı düğümlerde ağır BRep istatistiği/param haritası hesaplanmaz. `AgacGorunum`'a yeni public: `bool acikMi(u64 id) const;` (mevcut `acikDurum_` haritasını okur, varsayılan açık).

> **Not:** Alt-öğeleri olan ama gerçek çocuğu olmayan düğüm için "ok" görünmeli → `ui::AgacDugum`'a `bool acilabilirZorla=false` (cocuklar boş olsa da ok çiz; açılınca lazy doldurulur). Alternatif: donustur açık düğümde alt-öğeleri gerçekten `cocuklar`'a ekler → ok doğal belirir. **Karar:** ikincisi (daha basit, mevcut `cocukVar` mantığı değişmez); kapalıyken "acilabilir" ipucu için tek hafif sorgu `agacAltOgesiVarMi()` (bool, ucuz).

### 2.3 Nested seviye kuralları
- Parametre satırları **her zaman** feature/ışık düğümünün ilk çocukları (üstte), sonra gerçek DAG çocukları (Sketch bağı), sonra `AltDetay` bilgi satırları.
- Çok-seviye: Geometrical Set → Yüzey → (parametreleri). Derinlik sınırı yok; girinti `agac_gorunum.cpp:109` `girinti=16px`.

---

## 3 — PARAMETRE ITEMLERİ (ağaç-içi inline etkileşim)

En "vay be" kısım: **ağacın İÇİNDE** değeri değiştir → model anında recompute.

### 3.1 Veri modeli (`agac_ogeler.hpp`)
```cpp
struct AgacParam {
  std::string etiket;          // "Uzunluk"
  enum class Tip : u8 { Cubuk, Sayi, Tamsayi, Bayrak, Acilir, Renk, Ifade } tip = Tip::Sayi;
  f64 min = 0, maks = 0, adim = 0.1;          // maks<=min → sınırsız (drag)
  std::string birim;                          // "mm", "°"
  std::vector<std::string> secenekler;        // Acilir
  std::function<f64()> oku;                    // canlı değer (Renk: paketli / ayrı 3 param)
  std::function<void(f64)> yaz;               // değişince — recompute'u O tetikler
  std::function<std::string()> ifadeOku;      // Ifade tipi: "genislik/2"
  std::function<void(const std::string&)> ifadeYaz;
  bool saltOkunur = false;
};
```

### 3.2 Çizim (AgacGorunum, `Arketip::Parametre` satırı)
Rename `InputText`'in (agac_gorunum.cpp:233–260) yaptığı gibi, clipper döngüsü içinde gerçek ImGui widget'ı `SetCursorScreenPos` ile konumlanır (satır yüksekliği sabit → clipper bozulmaz):

| Tip | Widget | Etkileşim |
|---|---|---|
| `Cubuk` | `ImGui::SliderFloat` (etiketsiz, `##p`) | sürükle → canlı `yaz(v)` |
| `Sayi` | `ImGui::DragFloat` (`adim` hız, min/maks clamp) | **sürükle-ayarla** + çift-tık yaz |
| `Tamsayi` | `ImGui::DragInt` | — |
| `Bayrak` | özel toggle (kaydırmalı, neon — `satirToggle()`) | tık → `yaz(0/1)` |
| `Acilir` | `ImGui::Combo` (dar) | seç → `yaz(indeks)` |
| `Renk` | `ImGui::ColorEdit4` (NoInputs, kare) | tık → popup seçici |
| `Ifade` | `InputText` + `ƒ` badge; hata varsa kırmızı kenar | Enter → `ifadeYaz`; ParametreDeposu.cozumle |

**Yerleşim:** `etiket` sol (girintili), widget sağ-blok (`SetNextItemWidth(satMax.x - x - birimGen)`), birim en sağda soluk. Değer değişince satır kısa **flash** (animf, yeşil→normal) → görsel geri-bildirim.

### 3.3 Recompute bağlantısı (parametrik omurga)
`yaz(v)` closure'ı domain'e yazıp DAG'ı kirletir — üç yol, tipe göre:

1. **Feature parametresi** (Pad uzunluk): `feature.pAyarla("uzunluk", v)` → `cekirdek.recompute().kirlet(cekirdek, feature.kimlik())` → `hesapla()` sırada → `olaylar.yayinla(ParametreDegisti{v})`. (recompute.hpp:20, olay.hpp:172)
2. **Adlı parametre** (ParametreDeposu): `depo.ayarla(ad, ifade)` → `depo.cozumle()` → bağlı feature'lar kirlenir. (depo.hpp:25,34)
3. **Görünüm parametresi** (ışık şiddeti, kamera hızı): doğrudan `IsikBilesen.siddet=v` / kamera; recompute gerekmez, yalnız render.

> **Zero-alloc sıcak yol:** `oku`/`yaz` closure'ları `donustur`'da bir kez kurulur (kare başına, açık düğüm için). Sürükleme sırasında yalnız closure çağrısı + kirlet — tahsis yok. Ağır BRep recompute `hesapla()` içinde (kirli set kare sonunda tek sefer işlenir, sürükleme her frame değil — **debounce:** aynı feature ardışık kirletilirse tek hesap).

### 3.4 FeatureTanim → AgacParam köprüsü (mükerrer değil)
`parca/feature_tanim.hpp:23` `FeatureParam` şeması (Pad'in Uzunluk/Yön/Tersyön... tanımı) ZATEN pencere üretiyor. **Aynı şema ağaç parametrelerini de üretir:** `agacParametreleri()` `FeatureTanim.parametreler`'i gezip her `FeatureParam`'ı bir `AgacParam`'a map eder (`ParamTip::Mesafe→Cubuk/Sayi`, `Secim→Acilir`, `Bayrak→Bayrak`). `gorunurMu` yordamı (feature_tanim.hpp:20) koşullu param'ları ağaçta da gizler. → **Tek şema, iki yüzey (pencere + ağaç).** Pencere ve ağaç senkron kalır.

---

## 4 — MODELE / WORKBENCH'E ÖZEL ITEMLER

Aktif workbench (`WorkbenchKaydi::aktif()`, workbench.hpp:25) ağacın hangi satır-eylemlerinin/kolonların göründüğünü ayarlar.

| Aktif WB | Ağaçta özelleşme |
|---|---|
| `part` (Part Design) | Feature satırlarında **Bastır / Aktif Gövde Yap / Reorder** aktif; "In Work Object" altı-çizgi görünür |
| `sketcher` | Aktif sketch **kalın+vurgulu**; içindeki geometri/kısıt AltDetay olarak açılır; diğer gövdeler soluk |
| `gsd` | Tel/Yüzey renk çipleri belirgin; Geometrical Set grup ＋butonları (Nokta/Çizgi/Yüzey ekle) |
| `cam` | Manufacturing Program dalı öncelikli; op durum çipleri (⏳/⟳/✓); takım/strateji rozetleri |
| `analiz` | Analiz satırlarında gradient çip + eşik slider; bayat rozet |

**Ortak satır-eylemleri (tüm modeller, göz-ikonu sütunu genişler):**
- 👁 Görünürlük (var) · 🔒 Kilit (seçilemez/taşınamaz) · ◎ İzole (yalnız bunu göster) · 🎨 Renk-boya (çip tık→seçici) · ▶ Aktifleştir (workbench-özel).

Bunlar hızlı-eylem maskesiyle (`AgacDugum.hizliMaske`, agac_gorunum.hpp:30) satır-başına açılır; workbench değişince `donustur` maskeyi günceller. **Kilit/İzole** yeni domain durumu gerektirir (`GorunumSaglayici::kilitli()/izole`) — Dalga 3.

---

## 5 — DÜNYA-ÇAPINDA ETKİLEŞİM SETİ ("vay be")

| # | Etkileşim | Mevcut? | Plan (dosya) |
|---|---|---|---|
| 1 | **DnD reorder / reparent** | ✗ | `AgacGorunum::ciz` satır InvisibleButton'a `BeginDragDropSource(u64 id)` + boşluk/satıra `DragDropTarget`. Drop → `AgacOlaylari.tasindi{kaynak,hedef,konum}`. Panel: reparent=`HiyerarsiBilesen.ust`, reorder=feature sıra. **DAG korumalı** (§5.1). Olay `AgacTasindi`. Undo=`Islem` |
| 2 | **Çoklu seçim: Ctrl-toggle** | ✔ (agac_gorunum.cpp:324) | — |
| 3 | **Shift-aralık** | kısmen (`sonSecim_` çapası var, :109) | Flat liste sırasında çapa→tık arası tüm görünür düğümleri seç |
| 4 | **Kutu-seçim (rubber band)** | ✗ | Boş alanda sol-sürükle → dikdörtgen; kesişen satırlar seçilir (flat liste y-aralığı testi) |
| 5 | **Inline rename (F2 + çift-tık)** | ✔ (:233) | F2 kısayolu → `renameBaslat(sonSecim_)` |
| 6 | **Zengin sağ-tık menü** | ✔ hook (:334, panel:279) | `GorunumSaglayici::agacBaglamMenu()` → tür-özel girdiler + ortak (rename/gizle/izole/renk/sil/odakla). `MenuGirdi{etiket,simge,eylemId,ayrac}` |
| 7 | **Hover önizleme / tooltip** | kısmen (hızlı-eylem ipucu) | Gecikmeli tooltip: tür + mini-bilgi + (opsiyonel) BRep thumbnail (render-to-texture, Dalga 4) |
| 8 | **Type-to-search + akıllı filtre** | ✔ substring (panel:104) | Fuzzy skor + **tip filtresi açılırı** (Geometri/Sketch/Feature/Ölçüm/Işık…); eşleşen vurgu, eşleşmeyen soluk |
| 9 | **Satır-içi hızlı eylem** | ✔ (:284) | Genişlet: izole/renk/sil ikonları; maske workbench-özel |
| 10 | **Badge/rozet animasyonu** | altyapı (`animf`) | `nabiz` rozet (hesaplanıyor yanıp söner); durum geçişi cross-fade |
| 11 | **Expand/collapse animasyon** | ✔ ok döner (:204) | Alt satırların yükseklik-açılış animasyonu (opsiyonel, clipper ile dikkat) |
| 12 | **Seçim 3B senkron (çift yön)** | ✔ (panel:152,182) | Ekle: seçilince auto-scroll (`agacKaydirGerek` var, panel:165); **ata-yolu breadcrumb** vurgusu (§5.2) |
| 13 | **Klavye navigasyon** | ✗ | ↑/↓ satır, ←/→ daralt/genişlet, Enter=çift-tık eylemi, F2=rename, Del=sil, Space=görünürlük. `AgacGorunum` odaklıyken `ImGui::IsKeyPressed` |
| 14 | **Breadcrumb** | ✗ | Ağaç üstünde seçili düğümün ata-yolu: `Ürün ▸ Gövde ▸ Pad.1` (tık→o düğüme scroll) |
| 15 | **Pin / favori** | ✗ | Sağ-menü "Sabitle"; `pinli` düğümler ağacın en üstünde ayrı "📌 Sabitlenenler" bölümünde |
| 16 | **Son kullanılan** | ✗ | Seçim geçmişi (ring); "�途 Son" bölümü (opsiyonel) |
| 17 | **Sıralama / gruplama modu** | ✗ | Üst şeritte açılır: Ağaç(varsayılan)/Ada göre/Türe göre/Oluşturma sırası. `donustur` sonrası flat sıralama |
| 18 | **Undo-uyumlu ağaç işlemleri** | ✗ | rename/reorder/reparent/sil → `Islem` (undo yığını); mevcut `sahne_islem.hpp` kalıbı |

### 5.1 DnD + DAG koruması (KRİTİK)
Feature reorder parametrik sırayı bozabilir ([[sistem-modelleme-brep-link]] Faz 3):
- Drop yalnız **topolojik geçerli** ise: taşınan feature'ın tüm `bagimliliklar()` (nesne.hpp:103) yeni konumdan ÖNCE olmalı.
- Geçersizse drop reddedilir + kırmızı "geçersiz sıra" ipucu (DragDropTarget'ta `AcceptDragDropPayload` döndürmeden görsel red).
- Geçerliyse sıra güncellenir → `ParametreDegisti` → RecomputeMotor. Olay `AgacTasindi{varlik}` (enum sonuna).

### 5.2 Ata-yolu (breadcrumb) vurgu
Seçili düğümün flat-liste atalarını `duzlestir` sırasında işaretle (`DuzSatir`'e `bool ataYolu`); çizimde soluk `t.vurgu2` sol-çizgi. Üst breadcrumb şeridi `duzlestir` kök→seçim zincirinden metin üretir.

---

## 6 — MİMARİ

### 6.1 Üç katman (netleştirilmiş)
```
[Kaynak]  fiko::AgacDugum (kayit.hpp)  ── thin domain; sağlayıcılar doldurur
   │  camKimlik/camTip → GENELLEŞTİR: ekstraKimlik/ekstraTip (Olcum/Isik/Konum sanal düğüm)
   ▼  donustur() (urun_agaci_paneli.cpp) — filtre + LAZY zenginlik pull
[Sunum otoritesi]  GorunumSaglayici (nesne.hpp) ── polimorfik zenginlik (arketip/durum/mini/rozet/param/altöğe/menü)
   │
   ▼
[Görünüm]  fiko::ui::AgacDugum (agac_gorunum.hpp) ── zengin POD
   ▼  AgacGorunum::ciz — clipper + veri-odaklı satır çizimi + registry
[Çizim]  ui::AgacGorunum + satır-widget yardımcıları (agac_ogeler)
```

### 6.2 Kaynak düğüm genelleştirmesi (mükerrer sanal-tip önleme)
`kayit.hpp:72` `AgacDugum`: `camKimlik/camTip` → `u32 ekstraKimlik; u16 ekstraTip;` (CAM_* + OLCUM/ISIK/KONUM/ETIKET enum'u tek yerde `agac_ekstra.hpp`). Böylece ölçüm/ışık/konum sanal düğümleri yeni alan eklemeden gelir (pro_spec §6.2 kararıyla uyumlu). Geometri düğümleri `varlik` kullanmaya devam.

### 6.3 Satır çizici: veri-odaklı + registry hibrit
- **Varsayılan:** tek veri-odaklı çizici (AgacGorunum içi) TÜM arketipleri `AgacDugum` alanlarından çizer (100 tip = 0 ekstra fonksiyon).
- **Özel çizici registry (uzatma):** nadir tam-özel satır için (ör. döküm sıcaklık gradyan barı, kinematik zaman şeridi mini-widget):
```cpp
// agac_gorunum.hpp
using SatirCizici = std::function<bool(ImDrawList*, const AgacDugum&, const SatirBaglam&)>;
void satirCiziciKaydet(Arketip a, SatirCizici c);   // plugin/makro da kaydeder
```
`ciz` döngüsü: arketip için kayıtlı çizici varsa onu, yoksa varsayılanı çağırır. → **plugin bedava** (anayasa): eklenti kendi item tipini + çizicisini kaydeder.

### 6.4 Yeniden kullanılabilir FikoUi satır widget'ları
Yeni `motor/ui/include/fiko/ui/agac_ogeler.hpp` (+ `.cpp`) — küçük, DrawList-tabanlı, tema-uyumlu, hem ağaç hem başka paneller kullanır:
| Yardımcı | İş |
|---|---|
| `rozetCiz(dl, AgacRozet, pos)` | kapsül badge (metin+simge+renk+nabız) |
| `cipCiz(dl, renk, pos)` | renk çipi (tık→seçici opsiyonel) |
| `durumSimge(dl, Durum, pos)` | ✓/⚠/⟳/⏳/⊘ + tema rengi |
| `toggleCiz(dl, bool, pos)` → bool | neon kaydırmalı on/off |
| `paramCiz(AgacParam, rect)` → değişti | slider/drag/combo/renk/ifade dispatch |
| `miniBilgiCiz(dl, str, sagX)` | soluk sağ-hizalı metin |
Mevcut `simge.hpp` `simgeCiz` + `tema.hpp` `u32/karisim/animf` üstüne oturur; mükerrer stil yok.

### 6.5 Olaylar (enum SONUNA — olay.hpp:79 `SAYAC` öncesi)
`AgacTasindi{u32 varlik}`, `AgacParamDegisti{u32 varlik}` *(veya mevcut `ParametreDegisti` yeniden kullan)*, `AgacPinDegisti{u32 varlik}`. Yüksek-frekans olanlar (param sürükleme) diske yazılmaz (`kaliciAyarla(false)`, olay.hpp:531). Makro erişimi: `fiko.agac.sec/pinle/paramYaz/genislet` (Lua, mevcut `fiko.sahne` kalıbı).

---

## 7 — PERFORMANS (büyük ağaç)

| Konu | Bugün | Plan |
|---|---|---|
| Virtual scroll | ✔ `ImGuiListClipper` (agac_gorunum.cpp:128) | Korunur. Param/alt satırlar da flat listede → clipper otomatik kapsar |
| Sabit satır yüksekliği | ✔ (`satirY`, :106) | Param satırları TEK satır yüksekliğine sığar (clipper uniform şart) |
| Tüm ağacı her kare kurma | ⚠ `donustur` her kare tam ağaç (panel:145) | **Olay-güdümlü cache:** `VarlikEklendi/Silindi/Feature*/GorunurlukDegisti/WorkbenchDegisti` dinle → `agacKirli` işaretle; kirli değilse önceki `ui` ağacı yeniden kullanılır (10k+ düğümde büyük kazanç). Seçim/hover cache'i bozmaz |
| Lazy zenginlik | — | `agacAltOgeleri/agacParametreleri` yalnız AÇIK düğümde (§2.2) → kapalı 10k düğümde sıfır ekstra iş |
| Seçim kümesi | vector linear (agac_gorunum.cpp:60) | Büyük çoklu-seçimde `unordered_set` (küçükte vector kalır) |
| Filtre/sıralama | her kare tam gez (panel:135) | Cache ile birlikte; filtre değişince yeniden-buda, sabitken cache |
| Yatay taşma | — | Uzun ad + rozet + mini-bilgi → `overflow` yerine mini-bilgi hover'da gizlenir; gerekiyorsa yatay scroll (child `HorizontalScrollbar`) |
| Kaydırma göstergesi | — | (opsiyonel) sağ kenarda seçim/hata konumlarını gösteren mini-şerit (Dalga 4) |

---

## 8 — DALGALI UYGULAMA PLANI

### Dalga 0 — Altyapı (davranış değişmez, derleme yeşil)
1. `agac_ogeler.hpp` oluştur: `Arketip/Durum/AgacRozet/AgacParam/MenuGirdi` POD'ları + widget yardımcı imzaları.
2. `agac_gorunum.hpp` `AgacDugum`'a zengin alanlar (arketip/durum/miniBilgi/rozetler/parametreler/kalin/altiCizili/soluk/pinli); `acikMi()` public.
3. `nesne.hpp` `GorunumSaglayici`'a yeni virtüeller (varsayılan boş → mevcut davranış korunur).
4. `kayit.hpp` `AgacDugum`: `camKimlik/camTip` → `ekstraKimlik/ekstraTip` (CAM çağrı yerleri güncellenir).
> **Çıktı:** boş genişleme, hiçbir satır görsel değişmez.

### Dalga 1 — Tip-özel zengin satırlar (item kataloğu)
5. `agac_ogeler.cpp`: `rozetCiz/cipCiz/durumSimge/miniBilgiCiz` uygula.
6. `AgacGorunum::ciz`: durum rozeti + rozetler + mini-bilgi + kalın/altı-çizili/soluk çizimi (etiketten sonra, hızlı-eylem çakışma guard'ı).
7. Sağlayıcıları override et: `GeometriGorunum/SketchGorunum/FeatureGorunum/GsdGorunum/ReferansGorunum/GrupGorunum` → arketip/durum/miniBilgi/rozet. CAM sanal → `camArketip` (panel:37 `camGlif` yanına).
8. `donustur` (panel:137): zenginliği pull et; **renk çipini AÇ** (arketip Govde/Datum/Tel/Yuzey/Isik/Olcum için).
> **Çıktı:** ağaç CATIA-üstü görünür (durum ikonları, sayaçlar, badge'ler).

### Dalga 2 — Nested alt-öğe + inline parametre (parametrik omurga)
9. `agac_ogeler.cpp`: `toggleCiz/paramCiz` (slider/drag/combo/renk/ifade).
10. `AgacGorunum::ciz`: `Arketip::Parametre/AltDetay` satır yolu (widget SetCursorScreenPos; değişince flash).
11. `FeatureGorunum::agacParametreleri` — `FeatureTanim.parametreler` (feature_tanim.hpp) → `AgacParam` köprüsü; `yaz`→`pAyarla`+`recompute.kirlet` (§3.3/§3.4). `agacAltOgeleri` — Sketch/BRep istatistiği. Lazy guard.
12. `SketchGorunum/GsdGorunum` alt-öğeleri; ışık şiddeti inline (Kaynakça iş dalgasıyla kesişir).
> **Çıktı:** ağaçta slider çek → parça anında yeniden şekillenir. "Vay be."

### Dalga 3 — Gelişmiş etkileşim
13. DnD reorder/reparent (§5.1, DAG korumalı) + `AgacTasindi` olay + undo `Islem`.
14. Shift-aralık + kutu-seçim + klavye nav (↑↓←→ Enter F2 Del Space).
15. Breadcrumb + ata-yolu vurgu; zengin sağ-tık menü (`agacBaglamMenu`); pin/favori bölümü.
16. Tip-filtre açılırı + sıralama/gruplama modu; kilit/izole domain durumu + satır eylemleri.

### Dalga 4 — Cila + performans
17. Olay-güdümlü ağaç cache (§7) + `unordered_set` seçim.
18. Hover thumbnail (render-to-texture), nabız/cross-fade rozet animasyonu, kaydırma-göstergesi mini-şerit.
19. Özel `SatirCizici` registry (§6.3) + plugin/makro örneği (döküm gradyan barı vb.).

---

## 9 — DOKUNULACAK DOSYALAR (özet)
| Dosya | Değişim |
|---|---|
| `motor/ui/include/fiko/ui/agac_ogeler.hpp` *(YENİ)* | Arketip/Durum/AgacRozet/AgacParam/MenuGirdi + widget imzaları |
| `motor/ui/src/agac_ogeler.cpp` *(YENİ)* | rozet/çip/durum/toggle/param/mini-bilgi çizicileri |
| `motor/ui/include/fiko/ui/agac_gorunum.hpp` | `AgacDugum` zengin alanlar; `acikMi()`; `SatirCizici` registry; `AgacOlaylari.tasindi` |
| `motor/ui/src/agac_gorunum.cpp` | zengin satır çizimi; parametre/alt-satır yolu; DnD; klavye; shift/kutu-seçim; breadcrumb |
| `motor/cekirdek/include/fiko/cekirdek/nesne.hpp` | `GorunumSaglayici` yeni virtüeller (arketip/durum/mini/rozet/param/altöğe/menü) |
| `motor/cekirdek/include/fiko/cekirdek/kayit.hpp` | `AgacDugum` `ekstraKimlik/ekstraTip` genelleştirme |
| `motor/cekirdek/include/fiko/cekirdek/olay.hpp` | **enum SONUNA** `AgacTasindi/AgacPinDegisti` |
| `motor/sahne/…/{geometri,sketch,referans,grup}_nesne.*` | `Gorunum` override'ları (arketip/durum/mini/rozet/param/altöğe) |
| `motor/parca/…/feature.*`, `motor/gsd/…/gsd_feature.*` | Feature/GSD `Gorunum` override + `agacParametreleri` (FeatureTanim köprüsü) |
| `uygulama/fikocad/urun_agaci_paneli.cpp` | `donustur` lazy zenginlik pull; renk çipi aç; DnD/param/menü olay işleme; cache |
| `uygulama/fikocad/cam_urun_agaci.*` | `camArketip()` (durum çipi/mini-bilgi CAM op için) |

## 10 — ÖZET KARARLAR
1. **Zenginlik OOP'la pull** — `GorunumSaglayici` polimorfik verir; AgacGorunum veri-odaklı tek gövdede çizer (dev switch yok, 100 tip = 0 çizim fn). Nadir özel satır için `SatirCizici` registry (plugin bedava).
2. **Alt-öğe/parametre = normal çocuk düğüm** (`Arketip::AltDetay/Parametre`) → mevcut clipper/flatten bedavaya kapsar; lazy (yalnız açık düğüm).
3. **Inline parametre tek şemadan** — `FeatureTanim.parametreler` hem pencereyi hem ağaç satırını üretir; `yaz`→`recompute.kirlet`→canlı model.
4. **Kaynak düğüm genelleştir** — `camKimlik/camTip` → `ekstraKimlik/ekstraTip` (ölçüm/ışık/konum sanal düğüm, yeni alan yok).
5. **Performans:** clipper korunur, lazy zenginlik, olay-güdümlü cache (10k+ düğüm), sabit satır yüksekliği.
6. **Dalgalar:** 0 altyapı → 1 zengin satır → 2 nested+inline param → 3 gelişmiş etkileşim → 4 cila+perf.
7. Kapsam kardeşi `urun_agaci_pro_spec.md` (hangi sistemler) + retarget: eski `main.cpp cizDugum` yok, tüm plan `ui::AgacGorunum` + `urun_agaci_paneli.cpp` üstünde.
```
