forked from pisilinux-rs/yali-rs
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:
@@ -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
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user