# MDI (Çoklu Döküman) Mimari Planı — CATIA V5 Mantığı

Hedef: Profesyonel MDI — ana pencerede yalnız genel menüler; her **belge** kendi
alt penceresinde (istenirse ayrı OS penceresinde) kendi 3D görünümü, toolbar'ları,
komutları, workbench'i ve sistemleriyle **tam scope** yaşar. Birden fazla belge
aynı anda açık; aktif belge kavramı tüm bağlamı yönlendirir.

## 1. Scope Kararı (keşif haritasına dayalı — bkz. main.cpp 262-296, 511-523)

### UYGULAMA-GLOBAL (tek örnek)
| Bileşen | Gerekçe |
|---------|---------|
| `Pencere` (ana OS penceresi) | ImGui multi-viewport alt pencereleri zaten üretebiliyor |
| `VulkanBaglam` | tek cihaz/kuyruk; tüm belgeler paylaşır |
| `ImGuiKatman` + tema + simge kitaplığı | tek UI backend |
| `EklentiYonetici` DLL yükleme | DLL bir kez yüklenir; eklenti API'sine "aktif belge" geçilir |
| Ayarlar (AyarSistemi) | kullanıcı tercihleri belgeler-üstü |
| Ana menü çubuğu (Dosya/Pencere/Yardım) | MDI çerçevesi |

### BELGE-BAŞINA (`Belge` sınıfı — N örnek)
| Bileşen | Gerekçe |
|---------|---------|
| `Cekirdek` (ECS Dunya + olaylar + görevler + undo/redo + kayıtlar) | undo, olay günlüğü, ağaç sağlayıcıları, workbench/komut kayıtları belge nesnelerini/sistemlerini yakalar — belgeyle yaşamalı |
| `Sahne` | belgenin geometri ağacı (kalbi) |
| `OrbitKamera` | belge penceresinin bağımsız görüşü |
| `SecimGpu` + `SecimSistemi` + `AlanSecim` + `SahneRefSecim` | Sahne&'ye bağlı |
| Sistemler: `OlcumSistemi, CamSistemi, PartDesignSistemi, GsdSistemi, AnalizSistemi, DokumSistemi` | hepsi Cekirdek&/Sahne& alır |
| `MakroMotor` (Lua state) | sandbox belge-başına; `fiko.sahne` o belgeye bağlanır |
| **Aktif workbench** | CATIA'da workbench belge-başınadır (Part belgesi Part Design'da, Product belgesi Assembly'de açılır) |
| Toolbar durumu (`g_araclar` benzeri) | workbench'e bağlı → belge-başına |
| Panel durumları (ürün ağacı/özellik/sketch UI) | belge scope'u |
| `ViewportHedef` (offscreen renk+derinlik) | belge penceresinin 3D görüntüsü |
| Dosya yolu + kirli bayrağı + belge tipi (Part/Product) | döküman kimliği |

**Neden Cekirdek belge-başına (bölmek yerine)?** Workbench giriş callback'leri
(`camSis.acik = true`) belge sistemlerini yakalar; olay enum'ları/undo yığını
belge verisine işaret eder. Registry'yi global tutmak = her callback'e "hangi
belge?" enjeksiyonu (kirli). Kayıt işlemi ucuz (lambda listesi) → her belge
kurulumda kendi kayıtlarını yapar (bugünkü calistir() kurulum bölümü `Belge`
ctor'una taşınır). Tek istisna: eklenti DLL'leri bir kez yüklenir, her belgeye
`eklentiBaslat(belge)` çağrılır.

## 2. Render Mimarisi

Bugün: TEK offscreen hedef (`vpRenk_/vpDerinlik_/vpKareTampon_`, vulkan_baglam.hpp:133-142)
→ "3D Görünüm" penceresi `ImGui::Image(vpDoku)` (main.cpp:1708). Pencere-içi 3D
ZATEN kanıtlı; eksik olan ÇOĞALTMA.

**Dalga 1a — `ViewportHedef` sınıfı (motor/render/viewport_hedef.hpp/cpp):**
VulkanBaglam'daki tekil vp* üyeleri kapsüllenir:
```cpp
class ViewportHedef {           // N örnek; belge penceresi başına 1
  bool boyutla(u32 g, u32 y);   // yeniden oluştur (idle bekle + eski hedefi emekli et)
  void basla(VkCommandBuffer, f32 r, f32 g, f32 b);  // render pass aç + temizle
  void bitir(VkCommandBuffer);  // kapat → SHADER_READ_ONLY
  bool pngKaydet(const char* yol);
  VkImageView renkGorunum(); VkSampler ornekleyici(); VkExtent2D boyut();
};
```
Paylaşılan `vpGecis_` (render pass) VulkanBaglam'da kalır (format aynı).
VulkanBaglam'ın mevcut tekil `viewportBasla/Bitir/Boyut/PngKaydet` API'si, içte
bir `varsayilanVp_` ViewportHedef örneğine delege eder → main.cpp DEĞİŞMEDEN
çalışır (adım adım geçiş).

**Kare akışı (MDI, Dalga 2+):**
```
for (belge : gorunurBelgeler)      // yalnız görünür pencereler (perf)
  pick geçişi (belge.secimGpu, imleç o penceredeyse)
  belge.viewport.basla(kb) → belge.sahne mesh/kenar çizimi (belge.kamera VP) → bitir
ana geçiş: ImGui (her belge penceresi kendi ImGui::Image'ı)
```
Mega-parti/pipeline'lar (modelHat/kenarHat) uygulama-global (shader aynı);
vertex tamponları Sahne'de → belge-başına doğal.

## 3. UI Yapısı

- **Ana menü çubuğu** (`ImGui::BeginMainMenuBar`): Dosya (Yeni Parça / Aç / Kaydet /
  Kapat), Pencere (belge listesi, Döşe/Basamakla, "Yeni Görünüm" = aynı belgeye
  2. viewport), Araçlar (Galeri/Ayarlar/Makro), Yardım.
- **Belge penceresi** (`###belge_<id>`): içinde workbench seçici + toolbar şeridi
  (arac_cubugu belge örneği) + 3D Image + durum çubuğu. ImGuiWindowFlags_MenuBar
  ile pencere-içi menü (workbench komutları). Dockable; ana pencereden dışarı
  sürüklenince ImGui multi-viewport ayrı OS penceresi yapar (altyapı hazır —
  ölçüm pencereleri kanıtı).
- **Aktif belge** = odaklı belge penceresi (ImGui::IsWindowFocused). Ürün ağacı /
  özellik panelleri aktif belgenin Cekirdek'ine bağlanır (UygulamaBaglam →
  BelgeBaglam'a evrilir; panel fonksiyonları zaten Baglam& alıyor → değişim az).
- Girdi yönlendirme: fare/klavye kısayolları AKTİF belge penceresi hover/focus
  ise o belgenin sistemlerine gider (bugünkü io.WantCaptureMouse mantığı
  pencere-yerel Image rect'ine göre).

## 4. Dalga Planı

- **Dalga 1a (render temeli)**: ViewportHedef sınıfı; VulkanBaglam tekil API'si
  delege; davranış birebir (senaryo PNG'leri aynı). ✅ risk düşük, her şeyi açar.
- **Dalga 1b (belge çekirdeği)**: `Belge` sınıfı (uygulama/fikocad/belge.hpp/cpp):
  bugünkü calistir() kurulum bölümü (262-564: sistemler+kayıtlar+olay abonelikleri)
  Belge ctor'una taşınır. main.cpp önce TEK Belge örneğiyle çalışır (davranış
  birebir) — dev refactor'un güvenli ilk yarısı.
- **Dalga 2 (çoğullama)**: BelgeYonetici (aç/kapat/aktif); render döngüsü
  belge-döngüsü olur; girdi yönlendirme pencere-yerel; ana menü + belge
  pencereleri; ürün ağacı/paneller aktif belgeye bağlanır; ikinci belge SMOKE
  (senaryo: 2 belge aç, ikisine kutu koy, 2 PNG).
- **Dalga 3 (cila)**: Pencere menüsü (döşe/listele/yeni görünüm), belge kaydet/aç
  (fiko dosya formatı [[3d-sistem kalıcılık]] kalıbı), başlıkta kirli işareti,
  kapatırken "kaydedilsin mi?", aynı belgeye çoklu görünüm (paylaşılan Sahne,
  ayrı kamera+viewport), eklenti API'sine aktif belge erişimi.

## 5. Riskler / Kararlar

- **main.cpp 4083 satır**: render/girdi gövdesi belge-parametrize edilirken dev
  diff — Dalga 1b'de yalnız kurulum taşınır (gövde dokunulmaz), Dalga 2'de gövde
  `belgeKareCiz(Belge&)` fonksiyonlarına bölünür (final-faz dosya bölme hedefiyle
  uyumlu).
- **ImGui dock kimlikleri**: belge pencereleri `###belge_<kimlik>` sabit ID —
  yeniden açılışta yerleşim korunur.
- **Performans**: görünmeyen belge render edilmez; hedef boyutu pencere boyutunu
  takip eder (mevcut viewportBoyut mantığı hedef-başına).
- **Senaryo/oto-test**: `--senaryo-dokum` tek-belge akışı Dalga 1'de aynen
  çalışmalı (regresyon bekçisi).
