Files
hcie-rust-v3.05/.kilo/plans/1783475485339-dock-float-regression-guard-system.md
T
2026-07-09 02:59:53 +03:00

12 KiB
Raw Blame History

Dock Panel Sorunları Düzeltme Planı

Durum Özeti

Önceki oturumda kod değişiklikleri yapıldı (cargo check geçti) ama cargo build hiç çalıştırılmadı — eski binary hâlâ çalışıyor olabilir. Değişikliklerin görünür olması için önce build gerekli.

Ayrıca, bazı değişiklikler sorunları doğru adreslemiyor olabilir:

  • ScrollArea sadece floating panellere eklendi — screenshot'taki #1/#2 sorunu floating panel içerik taşması, bu doğru
  • persist_when_empty: false ghost panel için doğru ama collapsed strip 32px yer kaplamaya devam ediyor
  • Docked panel border'ları grimdock header.rs:95-100'de zaten çiziliyor — renk uyumsuzluğu olabilir

Tespit Edilen 5 Sorun (panel-problems.png)

#1/#2: Floating panel içerik taşması

Root cause: Color Palette ve Layers panellerinin içeriği (renk tekerleği, katman kontrolleri) panel sınırlarının dışına taşıyor. render_pane_content() çağrısı panel sınırlarını zorlamıyor.

Mevcut durum: ScrollArea::vertical() eklendi ama bu egui::Window'un kendi content area'sına eklendi — floating panelin ui referansı zaten clip'li olmalı.

Şüpheli: render_pane_content içindeki widget'lar sabit genişlik/hızlık kullanıyor olabilir (örn: renk tekerleği sabit 200px). ScrollArea eklentisi içerik taşmasını engellemez — clip() veya max_rect sınırlaması gerekir.

Çözüm: Floating panel show callback'inde ui.set_clip_rect() ile panel sınırlarını zorla, VEYA ui.vertical(|ui| { ui.set_max_width(...); ... }) ile içerik genişliğini sınırla.

#3: Docked panel arası border/resize grip yok

Root cause: Alt taraftaki docked paneller (Properties, History area) ile canvas arasında görünür border veya resize grip yok.

Mevcut durum: grimdock layout.rs:99-119 resize handle çiziyor (ui.painter().rect_filled(handle_rect, 0.0, color)). Handle rengi style.handle.color — default dark theme'de Color32::from_rgb(45, 45, 55) çok koyu, arka planla karışıyor.

Çözüm: Handle genişliğini artır (5→6px) ve rengi daha belirgin yap (panel border rengiyle aynı veya daha açık).

#4: Docked panel border yok, arka plan ile karışıyor

Root cause: Sağ taraftaki docked paneller (Properties, History, Layers area) ile canvas arasında net çizgi yok.

Mevcut durum: grimdock header.rs:95-100 content_rect'e 1px stroke çiziyor: Stroke::new(1.0, pane_border). pane_border default olarak widgets.noninteractive.bg_stroke.color — bu çok ince ve koyu olabilir.

Çözüm: style.content.border_color'yi daha belirgin renge ayarla (theme'deki border_high rengi).

#5: Ghost panel — boşalan yerler hayalet gibi kalıyor

Root cause: Kapatılan panellerin leaf node'u tree'de kalıyor. persist_when_empty: false yapıldı ama post-render collapse loop'u sadece set_collapsed(true) çağrısı yapıyor — strip hâlâ 32px yer kaplıyor.

Mevcut durum: effective_collapsed_thickness() layout.rs:42-58'de vanished leaf'lere 0 thickness veriyor. Bu doğru çalışmalı — ghost paneller kaybolmalı. Eğer hâlâ görünüyorsa, ya persist_when_empty change'i compile edilmedi ya da is_node_vanished farklı bir condition döndürüyor.

Kontrol: persist_when_empty: false sadece utility_options'a uygulandı. Tools (persist_when_empty: true) ve Document (persist_when_empty: true) etkilenmedi — doğru. Ama grimdock ensure_pane_at_anchor (tree.rs:1113) non-center anchor'lara otomatik persist_when_empty: true atıyor — bu override edebilir!

Ek Sorunlar (kullanıcı raporu)

#6: Floating panel pin ile kayboluyor

Root cause: render_floating_panels içindeki re-dock mantığı float_source_leaf map'inden hedef leaf'i bulmaya çalışıyor. Bulamazsa default_leaf_for_pane fallback'i kullanıyor. Ama leaf_alive kontrolü eklenen kodda — leaf tab_count=0 ve persist_when_empty=false ise, fallback default leaf'e gidiyor. Bu default leaf'de de tab yoksa, tab ekleniyor ama ghost loop'unu tetikleyebilir.

Asıl sorun: float_source_leaf map'i PaneId key kullanıyor. render_floating_panels'te PaneId::from_raw(pane_id_for_pane(&pane)) ile hardcoded ID'den PaneId oluşturuyor. Ama float_source_leaf'e insert ederken grimdock tree'den gelen actual PaneId kullanılıyor. Bunlar aynı mı?

Kontrol: PANE_LAYERS = 4, pane_id_for_pane(Layers) = 4. Tree'de Layers leaf'i PaneId::from_raw(4). Eşleşmeli.

Beyin fırtınası: Asıl sorun şu olabilir: render_floating_panels fonksiyonu mod.rs'den grim_dock_host.render(ui, self) çağrısından SONRA çağrılıyor. Yani re-dock tree'yi bir sonraki frame'de etkiler. Bu doğru — bir frame gecikme normal. Ama pinned_panels.insert() aynı frame'de çalışıyor — menü hemen güncel görünmeli.

Kesin sorun: re_dock processing'de app.state.pinned_panels.insert() çağrısı var ama CLOSE handler'ı da aynı frame'de çalışabilir. Close handler'ı pinned_panels.remove() çağırıyor — re-dock'tan önce çalışırsa pin ekranı kaybolur!

#7: X ile kapatınca geri getirememek

Root cause: X ile kapatıldığında tab tree'den siliniyor + pinned_panels.remove(). View menu'den geri açmak istediğinde panels_to_focus handler'ı çalışmalı. Bu handler'da else branch'i (pane ne floating ne tree'de) default_leaf_for_pane fallback'i ile tab ekliyor. Bu doğru görünüyor.

Ama: persist_when_empty: false yüzünden default leaf collapsed ve vanished olabilir. pane_options() Some döner ama leaf layout'ta 0px. Tab eklenince ghost loop'u collapsed'ı true yapar → strip kaybolmaz → ama tab visible olmayabilir (collapsed strip'in içinde).

Uygulama Planı

Adım 0: Build + Doğrulama

cargo build -p hcie-gui-egui --release
# veya
cargo run -p hcie-gui-egui

Önce mevcut değişikliklerin çalışıp çalışmadığını kontrol et. Eski binary hâlâ çalışıyorsa, tüm düzeltmeler görünmez.

Adım 1: Floating Panel İçerik Taşması (#1/#2)

Dosya: grim_dock.rs:789-877 (render_floating_panels show callback)

Değişiklik: Floating panel content area'sında clip rect sınırlaması ekle. render_pane_content çağrısından ÖNCE panel inner rect'i ile ui.set_clip_rect() yap. Alternatif olarak, her widget'ın max_width'ini panel genişliğine sınırla.

Test: Uygulamayı başlat → Color Palette'i float et → renk tekerleği panel sınırları içinde scroll edebilmeli.

Adım 2: Docked Panel Border (#3/#4)

Dosya: grim_dock.rs:406-438 (style override section)

Değişiklik:

style.content.border_color = colors.border_high; // zaten var
style.handle.color = colors.border_high; // ekle — resize grip belirginliği
style.handle.hover_color = colors.accent; // ekle

Ayrıca: grimdock style.handle_width default 5.0px — artırılabilir mi kontrol et.

Test: Properties ve History panelleri ile canvas arasında belirgin çizgi görünmeli.

Adım 3: Ghost Panel (#5)

Dosya: grim_dock.rs:563-575 (post-render collapse loop) + layout.rs:42-58

Kontrol: ensure_pane_at_anchor (tree.rs:1113) non-center anchor'lara persist_when_empty: true atıyor. Bu utility_options.persist_when_empty = false override'ını geri alıyor olabilir!

Değişiklik: İki seçenek: a) ensure_pane_at_anchor'daki otomatik persist'i kaldır (ama bu grimdock crate'inde — locked olabilir) b) Post-render collapse loop'da ek kontrol: leaf tab_count=0 ise VE persist_when_empty=true olmasına rağmenfloating/close yoluyla boşaldıysa, yine de collapse et (ama bu tree modifikasyonu gerektirir)

En basit çözüm: ensure_pane_at_anchor'ın persist_when_empty = true satırını sil veya condition'ı değiştir. grimdock patches/ altında olduğu için değiştirilebilir.

Adım 4: Pin Re-dock (#6)

Dosya: grim_dock.rs:913-962 (re-dock after pin click)

Değişiklik: Re-dock processing'inin panels_to_close processing'den SONRA çalıştığından emin ol (ki close re-dock'u iptal etmesin). Mevcut sıralama zaten doğru: render_floating_panels → re_dock, grim_dock.render → panels_to_close. Ama ikisi farklı fonksiyonlar — mod.rs'de sıralamayı kontrol et.

Ek: Re-dock'ta pinned_panels.insert() çağrısı var mı? Evet, var (satır 956-958). Bu doğru.

Beyin fırtınası asıl sorun: render_floating_panels host: &mut GrimDockHost alıyor. Ama GrimDockHost::render() zaten &mut self ile tree'yi modified etmiş. render_floating_panels ayrı bir çağrıhost'u tekrar mutable olarak alıyor. Bu Rust borrow checker'dan geçiyorsa sorun yok. Ama app (HcieApp) referansı her iki yerde de paylaşılıyor — grim_floating_panels hem GrimDockHost::render() hem render_floating_panels() tarafından değiştiriliyor.

ASIL SORUN BULUNMUŞ OLABİLİR: grim_dock_host.render(ui, app) çağrısı app'i &mut olarak alıyor. Sonra render_floating_panels(ctx, app, host, dock_area) tekrar app'i &mut olarak alıyor. Bu iki çağrı arasında app.panels_to_float, app.panels_to_close, app.grim_floating_panels gibi field'lar değiştiriliyor. İlk çağrıda panels_to_float drain ediliyor, ikinci çağrıda grim_floating_panels'e push ediliyor. Bu doğru bir sıralama.

Ama re-dock: render_floating_panels içinde re_dock set ediliyor ve loop SONRASINDA işleniyor. Bu sırada host.tree modifiye ediliyor. Tree bir sonraki frame'de render edilecek. Bu normal.

Kesin test: Log'ları kontrol et — "grimdock: docked tab ... back to leaf ..." log'u çıkıyor mu?

Adım 5: Menu/Statusbar Sync (#7)

Dosya: grim_dock.rs (close handler: 248-274, focus handler: 322-402), menus.rs:534-553

Mevcut durum: Close handler pinned_panels.remove(), focus handler pinned_panels.insert() çağrısı var. View menu de pinned_panels.contains() ile checked durumunu belirliyor.

Senkronizasyon sorunu: grimdock header'daki X butonu output.closed_tabs ile döndürüyor (grim_dock.rs:577-588). Burada pinned_panels.remove() çağrılıyor. Bu doğru.

Ama: grimdock'un KENDİ header'ındaki collapse butonu (toggle_collapsed) pinned_panels'i değiştirmiyor! Kullanıcı collapse ederse, panel dar strip'e dönüşüyor ama pinned_panels hâlâ panel'i "açık" olarak gösteriyor → menüde checkmark kalıyor.

Çözüm: grimdock collapse/expand handler'ında da pinned_panels güncelle. Veya daha iyisi: menüdeki is_open kontrolünü pinned_panels yerine grimdock tree'den sorgula (find_leaf_containing + !is_collapsed).

Öncelik Sıralaması

# Sorun Dosya Zorluk
0 Build çalıştır - Kolay
1 Floating panel taşma grim_dock.rs Orta
2 Docked panel border grim_dock.rs Kolay
3 Ghost panel grimdock/tree.rs Orta
4 Pin re-dock kaybolma grim_dock.rs Orta
5 Menu sync grim_dock.rs + menus.rs Kolay

Test Senaryosu

  1. Uygulamayı başlat
  2. View → Panels → "Color Palette" tıkla → panel collapse olmalı (32px strip, dikey yazı)
  3. Tekrar tıkla → panel expand olmalı
  4. Color Palette'i sağ tıkla → "Float Panel" → floating window açılmalı
  5. Floating window'da pin tıkla → panel eski yerine dönmeli + menüde checkmark görünmeli
  6. Floating window'da X tıkla → panel kaybolmalı + menüde checkmark kalkmalı
  7. Tekrar View → Panels → "Color Palette" → panel geri gelmeli
  8. Tüm panelleri kapat → ghost strip kalmamalı
  9. Resize grip'leri görünür olmalı (paneller arası çizgiler)