fix(partition): Düzenle butonu görünmüyordu, butonları tablonun altına taşı

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) <noreply@anthropic.com>
This commit is contained in:
Erkan IŞIK
2026-09-27 14:20:13 +03:00
parent bee04fb554
commit 618bcbc023
2 changed files with 63 additions and 29 deletions
+13 -1
View File
@@ -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) |
+50 -28
View File
@@ -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 {