12 KiB
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:
ScrollAreasadece floating panellere eklendi — screenshot'taki #1/#2 sorunu floating panel içerik taşması, bu doğrupersist_when_empty: falseghost 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
- Uygulamayı başlat
- View → Panels → "Color Palette" tıkla → panel collapse olmalı (32px strip, dikey yazı)
- Tekrar tıkla → panel expand olmalı
- Color Palette'i sağ tıkla → "Float Panel" → floating window açılmalı
- Floating window'da pin tıkla → panel eski yerine dönmeli + menüde checkmark görünmeli
- Floating window'da X tıkla → panel kaybolmalı + menüde checkmark kalkmalı
- Tekrar View → Panels → "Color Palette" → panel geri gelmeli
- Tüm panelleri kapat → ghost strip kalmamalı
- Resize grip'leri görünür olmalı (paneller arası çizgiler)