From 618bcbc02321daaaef646189fa20c2c225825e78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erkan=20I=C5=9EIK?= Date: Sun, 27 Sep 2026 14:20:13 +0300 Subject: [PATCH] =?UTF-8?q?fix(partition):=20D=C3=BCzenle=20butonu=20g?= =?UTF-8?q?=C3=B6r=C3=BCnm=C3=BCyordu,=20butonlar=C4=B1=20tablonun=20alt?= =?UTF-8?q?=C4=B1na=20ta=C5=9F=C4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Kullanıcı iki şey bildirdi: disk seçiliyken "Yeni Oluştur" ve "Sil" var ama "Düzenle" nerede, ve butonlar tablonun altında olmalı. ## 1. Butonlar tabloyu terk etmişti Sıra şöyleydi: tablo → disk şeridi → Bölümleme Planı (kapasite çubuğu) → BUTONLAR "Bölümleme Planı" araya girince butonlar aşağı itildi ve kullanıcı onları bulamadı. Plan bloğu butonların ARkasına taşındı: tablo → disk şeridi → BUTONLAR → Bölümleme Planı Plan bloğu salt görsel bir özet; eylem butonlarının hemen ardında olması doğru olan yer orası. ## 2. `add_enabled_ui` gradient butonlarda ÇALIŞMIYOR `Düzenle` ve `Sil`, `ui.add_enabled_ui(...)` sarmalayıcısı içinde `theme::secondary_button()` / `danger_button()` ile çiziliyordu. Ancak bu fonksiyonlar kendi `enabled` parametresine **sabit `true`** geçiyor: pub fn secondary_button(ui, text) -> Response { secondary_button_enabled(ui, text, true) // ← daima true } `add_enabled_ui` yalnızca çocuk widget'ın `Response`'unu etkiler, butonun `enabled` parametresine ulaşamaz. Sonuç: seçim yokken de buton TAM RENKLİ ve tıklanabilir görünüyor, tıklayınca da `if`'in içi çalışmıyor (çünkü tıklama `Response`'a hiç yansımıyor) — yani kullanıcı ne görüyor ne de bir şey olmadığını anlıyordu. Artık `theme::secondary_button_enabled(ui, label, can_edit)` ve `theme::danger_button_enabled(ui, label, has_selection)` kullanılıyor. `gradient_button` `enabled: false` iken zaten gri gradyan + `Sense::hover()` uyguladığı için doğru davranış bu. Düzenleme `can_edit = has_selection && !is_marked_delete` koşuluna bağlı: silinmek işaretli satırda düzenleme anlamsız, buton gri görünüyor. Bu tuzak AGENTS.md'ye kalıcı kural olarak eklendi. ## Doğrulama cargo check --all-targets : 0 hata, 0 uyarı cargo test : 79/79 geçti Co-Authored-By: Claude Opus 4.8 (1M context) --- AGENTS.md | 14 +++++++- src/steps/partition.rs | 78 +++++++++++++++++++++++++++--------------- 2 files changed, 63 insertions(+), 29 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index aacc5dd..b2c9856 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -341,6 +341,17 @@ nedeni yorumla sabitlendi. Log bile "MiB" derken argüman "MB" gönderiyordu. - **Kare başına alt süreç çalıştırma.** egui `show()` her karede çağrılır (~60 Hz). `blkid`, `nmcli` gibi ağır komutlar `on_enter`'a taşındı, sonuç alanlarda saklanıyor, `refresh_*()` ile tazeleniyor. +- ⚠️ **Gradient butonlarda `add_enabled_ui` ÇALIŞMAZ.** `theme::*_button()` + çağrıları `enabled: true` sabit geçirir; `add_enabled_ui` sarmalayıcısı + yalnızca çocuk widget'ın `Response`'unu etkiler, butonun kendi + `enabled` parametresine ulaşamaz. Sonuç: buton seçim yokken de tam + renkli ve tıklanabilir görünür ama tıklayınca hiçbir şey olmaz. + **Doğrusu:** `theme::secondary_button_enabled(ui, label, can)` + / `danger_button_enabled(...)` kullan. `ui.checkbox` gibi sıradan + widget'larda `add_enabled_ui` normal çalışır. +- **Eylem butonları tablonun hemen altında** olmalı; aralarına görsel + özet bloğu (kapasite çubuğu gibi) girdiğinde kullanıcı butonları + bulamıyor. Özet blokları butonlardan SONRA çizilir. - Locale: `locales/` altında yalnızca `tr.toml` ve `en.toml` **var**. `set_locale("de")` hata vermez, sessizce kabul edilir ve `t!()` karşılığı olmayan her anahtar için **anahtarın kendisini** döndürür — @@ -459,7 +470,7 @@ senaryoları dene: |---|---| | `src/jobs/partition.rs` | `plan_disk_layout`, `PhysicalExtent`, `PlannedCreate`, `disk_total_mb`, `read_physical_extents`, `device_map`; `disk_free_regions_mb` silindi | | `src/jobs/cleanup.rs` | **YENİ** — `EmergencyCleanupJob` | -| `src/steps/partition.rs` | `add_disk` + disk seçici, **tek diske odaklı tablo + disk şeridi**, diske filtreli LVM, `validate_manual_on`, `multidisk_tests`, `table_scope_tests`, `testutil` | +| `src/steps/partition.rs` | `add_disk` + disk seçici, **tek diske odaklı tablo + disk şeridi**, butonlar tablonun altında, diske filtreli LVM, `validate_manual_on`, `multidisk_tests`, `table_scope_tests`, `testutil` | | `src/jobs/users.rs` | `set_password_via_chpasswd` (stdin pipe) | | `src/jobs/bootloader.rs` | `CRYPTROOT_NAME`, `luks_backing_device`, `mounted_root_device` | | `src/jobs/finish.rs` | `RunComarJob` geri geldi; `ldconfig`/`update-environment`/depo fatal | @@ -467,5 +478,6 @@ senaryoları dene: | `src/installer.rs` | `StepRole`, `license_accepted`, `rescue_available` | | `src/autoinstall/mod.rs` | `[system]` bölümü, `SystemConfig` (elle `Default`!) | | `src/funct.rs` | `AVAILABLE_LANGUAGES`, `sanitize_locale` | +| `src/ui/buttons.rs` | `gradient_button` — `enabled: false` iken gri + `Sense::hover()` (tıklanamaz). Gradient butonlarda `add_enabled_ui` ÇALIŞMAZ, `*_button_enabled` gerekir. | | `src/lib.rs` | **SİLİNDİ** — çift crate root, `locales/` iki kez gömülüyordu | | `src/steps/display_manager.rs`, `netinstall.rs`, `license.rs` | dormant (derleniyor, sihirbaza bağlı değil) | diff --git a/src/steps/partition.rs b/src/steps/partition.rs index 1ecc002..9b6f1a8 100644 --- a/src/steps/partition.rs +++ b/src/steps/partition.rs @@ -1334,23 +1334,6 @@ impl PartitionStep { }); } - // ── Bölümleme Planı (manuel) — disk başına ESKİ/YENİ karşılaştırma ── - if !state.custom_partitions.is_empty() { - ui.add_space(12.0); - ui.separator(); - ui.add_space(8.0); - ui.label(egui::RichText::new(t!("partition_plan_title")).strong().color(crate::ui::theme::c_text())); - ui.add_space(6.0); - - // Yalnızca seçili diskin ESKİ/YENİ şeridi gösterilir - let active_disk = state.selected_disk.clone().unwrap_or_default(); - if !active_disk.is_empty() - && state.custom_partitions.iter().any(|p| p.disk == active_disk) - { - manual_dual_bars(ui, state, &active_disk); - } - } - // Silme onayı if let Some(idx) = self.manual.delete_idx { let dev = state.custom_partitions.get(idx) @@ -1397,9 +1380,12 @@ impl PartitionStep { }); } - ui.add_space(8.0); - // ── Butonlar: Yeni Bölüm / Düzenle / Sil ─────────── + // + // Tablonun (ve disk şeridinin) HEMEN altında. Önceden aralarına + // "Bölümleme Planı" bloğu giriyordu; kullanıcı butonları + // göremiyor, "Düzenle nerde?" diye soruyordu. + ui.add_space(8.0); ui.horizontal(|ui| { let has_selection = self.manual.selected_idx.is_some(); let selected = self.manual.selected_idx @@ -1412,6 +1398,9 @@ impl PartitionStep { .unwrap_or(false); // Kurulumda silinmek üzere işaretlenmiş bölüm let is_marked_delete = selected.map(|p| p.delete).unwrap_or(false); + // Düzenleme için seçim şart. Silinmek işaretli satırda + // düzenleme anlamsızdır (zaten silinecek). + let can_edit = has_selection && !is_marked_delete; // Yeni Bölüm if theme::primary_button(ui, &format!("\u{EA13} {}", t!("mp_new_partition"))).clicked() { @@ -1470,15 +1459,24 @@ impl PartitionStep { self.manual.add_skip_format = false; } - // Düzenle / (silinmiş satırda) Oluştur — silinmek işaretli - // satırlarda düzenleme anlamsızdır, buton kilitlenir. - ui.add_enabled_ui(has_selection && !is_marked_delete, |ui| { + // Düzenle / (silinmiş satırda) Oluştur + // + // `add_enabled_ui` KULLANILMADI: o sarmalayıcı yalnızca çocuk + // widget'ları etkisizleştirir ve buton kendi `enabled` bayrağı + // `true` sabit olduğu için (theme::secondary_button) yine tam + // renkli çizilir — yani seçim yokken bile tıklanabilir görünür + // ama bir şey olmazdı. Bunun yerine `secondary_button_enabled` + // ile AÇIKÇA gri gösterilip tıklanabilirliği gerçekten + // kapatılıyor. + { let edit_btn_label = if is_unassigned { format!("\u{EA13} {}", t!("mp_create_here")) } else { format!("\u{EFE0} {}", t!("mp_edit_partition")) }; - if theme::secondary_button(ui, &edit_btn_label).clicked() { + if theme::secondary_button_enabled(ui, &edit_btn_label, can_edit).clicked() + && can_edit + { if let Some(part) = selected { if is_unassigned { // Oluşturma akışı; ancak kaydedilince MEVCUT @@ -1512,16 +1510,19 @@ impl PartitionStep { } } } - }); + } - // Sil / Geri Al - ui.add_enabled_ui(has_selection, |ui| { + // Sil / Geri Al — `add_enabled_ui` yerine `danger_button_enabled` + // (bkz. Düzenle butonundaki açıklama). + { let del_btn_label = if is_marked_delete { format!("\u{EB7B} {}", t!("mp_restore")) } else { format!("\u{EC28} {}", t!("mp_delete")) }; - if theme::danger_button(ui, &del_btn_label).clicked() { + if theme::danger_button_enabled(ui, &del_btn_label, has_selection).clicked() + && has_selection + { if is_marked_delete { // İşareti anında geri al (onay gerekmez). // Boş-alan satırı seçiliyken basıldıysa diskteki @@ -1546,9 +1547,30 @@ impl PartitionStep { self.manual.delete_idx = self.manual.selected_idx; } } - }); + } }); + // ── Bölümleme Planı (manuel) — disk başına ESKİ/YENİ karşılaştırma ── + // + // Butonlardan SONRA çizilir: butonlar tablonun hemen altında, + // kullanıcının gözünden uzaklaşmasın. Bu blok salt görsel bir + // özet olduğu için aksiyondan sonra gelmesi doğru. + if !state.custom_partitions.is_empty() { + ui.add_space(12.0); + ui.separator(); + ui.add_space(8.0); + ui.label(egui::RichText::new(t!("partition_plan_title")).strong().color(crate::ui::theme::c_text())); + ui.add_space(6.0); + + // Yalnızca seçili diskin ESKİ/YENİ şeridi gösterilir + let active_disk = state.selected_disk.clone().unwrap_or_default(); + if !active_disk.is_empty() + && state.custom_partitions.iter().any(|p| p.disk == active_disk) + { + manual_dual_bars(ui, state, &active_disk); + } + } + // ── Bölüm Ekle / Düzenle diyaloğu ───────────────── let dialog_open = self.manual.adding || self.manual.editing; if dialog_open {