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 {