forked from pisilinux-rs/yali-rs
refactor(partition): disk şeridini kaldır, Aktif Disk ComboBox'ını temala bağla
Kullanıcı isteği: "manuel disk penceresindeki tablonun altındaki /dev/sda sdb gibi seçilileri kaldır. Aktif disk bölümünde seçiyoruz zaten tablonun altında olmasına gerek yok birde aktif disk seçisininde dark temaya göre renklerini ayarla okunması zor halde." ## 1. Disk şeridi kaldırıldı Tablo altındaki tıklanabilir `/dev/sda · 3/20 GB` düğmeleri gitti. Üstteki "Aktif Disk" ComboBox'ı zaten tek ve açık kaynak; iki kaynak olması "hangi disk geçerli" sorusunu belirsizleştiriyordu. ### ⚠️ Şerit sadece çizim değildi Disk değişince `selected_idx` ve `selected_free` sıfırlıyordu. Bu **veri güvenliği** kuralı: `selected_idx` tablo dışındaki gerçek bir bölüm indeksi, tablo ise tek diski gösteriyor. Sıfırlanmazsa yeni disk eski diskin indeksini taşır ve "Sil" YANLIŞ bölümü siler. Sorumluluk **ComboBox'a taşındı** ve `on_disk_changed()` adlı küçük saf yardımcıya bağlandı (tek satırda iki bayrak, ama test edilebilir olsun diye ayrıldı). Taşımamış olsaydım kaldırma işlemi sessizce veri kaybına yol açardı. ## 2. ComboBox rengi düzeltildi Sorunun kaynağı: bu ComboBox **ham** `egui::ComboBox` + `ui.selectable_value` kullanıyordu, yani egui'nin varsayılan stili. Mountpoint ve önyükleyici ComboBox'ları ise zaten projenin `theme::show_combo_box` + `theme::selectable_value` sarmalayıcılarını kullanıyor — disk ComboBox'ı geride kalmıştı. Artık temalı: gradient arkaplan + temaya göre seçilen metin rengi (`combobox_stil_text_color` panel parlaklığına bakar). Yan fayda: ComboBox'taki `println!("Seçilen Disk Değişti: …")` **silindi** (AGENTS.md'de açık maddeydi, GUI'de stdout'a yazıyordu). ## 3. Tautolojik test silindi `disk_strip_lists_every_disk_even_when_one_is_shown` kaldırılan şeridin mantığını satır içinde YENİDEN yazıyordu ve `all()`'ı boş listede çağırıyordu — yani hiçbir şey test etmiyordu. AGENTS.md'de "eski test TUUTOLOJİK'ti" diye not düşülen aynı sınıf. Silindi, yerine taşınan kuralın testi geldi. ## Testler (141 → 143) - disk değişince `selected_idx` / `selected_free` sıfırlanıyor - disk değişmeden seçim korunuyor (her karede sıfırlansa kullanıcı hiçbir satırı seçemezdi) - tablo yalnızca aktif diskin bölümlerini üretiyor `seen_disk_names` de kaldırıldı — şeritle birlikte ölü oldu. cargo check --all-targets : 0 hata, 0 uyarı cargo test : 143/143 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -204,21 +204,29 @@ sda1 ile sdb1 çakışmaz.
|
|||||||
seçicide hangi disk seçiliyse bölüm tablosu onun. Tüm diskleri tek
|
seçicide hangi disk seçiliyse bölüm tablosu onun. Tüm diskleri tek
|
||||||
tabloda göstermek kafa karışıklığı yaratıyordu — özellikle "Sil"
|
tabloda göstermek kafa karışıklığı yaratıyordu — özellikle "Sil"
|
||||||
hangi diski etkilediği belirsizleşiyordu.
|
hangi diski etkilediği belirsizleşiyordu.
|
||||||
- **Diğer diskler GİZLİ DEĞİL**: tablodan hemen sonra tıklanabilir bir
|
- **Disk ŞERİDİ YOK** (27 Eyl, kullanıcı isteği). Tablo altındaki
|
||||||
**disk şeridi** var. Her disk için `adı · kullanılan/kapasite` ve
|
`/dev/sda · 3/20 GB` gibi tıklanabilir disk düğmeleri kaldırıldı:
|
||||||
silinecek bölüm sayısı yazar; tıklanınca o disk seçilir. Böylece
|
üstteki **"Aktif Disk" ComboBox'ı** zaten tek ve açık kaynak, iki
|
||||||
"sda'da 3 bölüm var" bilgisi kaybolmaz, dikkat tek diskte kalır.
|
kaynak olması "hangi disk geçerli" sorusunu belirsizleştiriyordu.
|
||||||
Disk değişince `manual.selected_idx` sıfırlanır — bayat kalan satır
|
Başka bir diske geçmek için ComboBox kullanılır, sonra "Yeni Bölüm".
|
||||||
"Sil" ile yanlış bölümü etkilerdi.
|
"sda'da 3 bölüm var" bilgisi tablo başlığında ve satırlarda durur.
|
||||||
|
- ⚠️ Şerit sadece çizim değildi: disk değişince
|
||||||
|
`on_disk_changed()` ile `selected_idx` / `selected_free`
|
||||||
|
sıfırlıyordu. Bu sorumluluk **ComboBox'a taşındı**; taşınmazsa
|
||||||
|
bayat satır indeksi "Sil" ile **yanlış bölümü** siler.
|
||||||
|
- **"Aktif Disk" ComboBox'ı TEMA sarmalayıcısını kullanır**
|
||||||
|
(`theme::show_combo_box` + `theme::selectable_value`). Ham
|
||||||
|
`egui::ComboBox` + `ui.selectable_value` egui'nin varsayılan stilini
|
||||||
|
kullanıyor ve koyu temada okunmuyordu. Mountpoint ve önyükleyici
|
||||||
|
ComboBox'ları zaten temalı sürümde — **disk ComboBox'ı geride kalmıştı**.
|
||||||
- **Diyalogda HEDEF DİSK SEÇİCİSİ YOK** (27 Eyl, kullanıcı isteği) —
|
- **Diyalogda HEDEF DİSK SEÇİCİSİ YOK** (27 Eyl, kullanıcı isteği) —
|
||||||
ne eklemede ne düzenlemede. Bölümleme arayüzü tek disk üzerinde
|
ne eklemede ne düzenlemede. Bölümleme arayüzü tek disk üzerinde
|
||||||
çalışıyor:
|
çalışıyor:
|
||||||
- ekleme → `state.selected_disk`
|
- ekleme → `state.selected_disk`
|
||||||
- düzenleme→ bölümün kendi `disk`/`device` alanları (korunur)
|
- düzenleme→ bölümün kendi `disk`/`device` alanları (korunur)
|
||||||
|
|
||||||
Başka bir diske bölüm eklemenin yolu: **disk şeridinden o diske
|
Başka bir diske bölüm eklemenin yolu: **"Aktif Disk"
|
||||||
geç**, sonra "Yeni Bölüm". İki ayrı "aktif disk" kaynağı olması
|
ComboBox'ından o diske geç**, sonra "Yeni Bölüm".
|
||||||
hangisinin geçerli olduğunu belirsizleştiriyordu.
|
|
||||||
|
|
||||||
Bu karar `ManualState::add_disk` alanını da tamamen gereksiz kıldı ve
|
Bu karar `ManualState::add_disk` alanını da tamamen gereksiz kıldı ve
|
||||||
alan **silindi**. Alan varken şu akış bölümü yanlış diske taşıyordu:
|
alan **silindi**. Alan varken şu akış bölümü yanlış diske taşıyordu:
|
||||||
@@ -661,11 +669,11 @@ nedeni yorumla sabitlendi. Log bile "MiB" derken argüman "MB" gönderiyordu.
|
|||||||
|
|
||||||
```
|
```
|
||||||
cargo check --all-targets : 0 hata, 0 uyarı
|
cargo check --all-targets : 0 hata, 0 uyarı
|
||||||
cargo test : 141/141 (test modülü sayısı arttıkça güncel tut)
|
cargo test : 143/143 (test modülü sayısı arttıkça güncel tut)
|
||||||
cargo clippy : ~77 uyarı, tamamı stil (collapsed_if, replace zinciri)
|
cargo clippy : ~77 uyarı, tamamı stil (collapsed_if, replace zinciri)
|
||||||
```
|
```
|
||||||
|
|
||||||
Bu oturumda 1 → 141 test. Test modülü olmayan dosyalar (`users.rs`,
|
Bu oturumda 1 → 143 test. Test modülü olmayan dosyalar (`users.rs`,
|
||||||
`location.rs`, `rescue.rs`, `funct.rs`, `autoinstall/mod.rs`, `main.rs`)
|
`location.rs`, `rescue.rs`, `funct.rs`, `autoinstall/mod.rs`, `main.rs`)
|
||||||
içine modüller eklendi. Çoklu test modülü paylaşılan yardımcıları
|
içine modüller eklendi. Çoklu test modülü paylaşılan yardımcıları
|
||||||
`steps/partition.rs::testutil` altındadır (`disk()`, `part()`).
|
`steps/partition.rs::testutil` altındadır (`disk()`, `part()`).
|
||||||
@@ -677,13 +685,15 @@ senaryoları dene:
|
|||||||
|
|
||||||
**Çoklu disk (asıl hedef):**
|
**Çoklu disk (asıl hedef):**
|
||||||
1. İki disk bağlı: sda + sdb
|
1. İki disk bağlı: sda + sdb
|
||||||
2. Manuel moda geç → tablo **sadece seçili diski** göstermeli; altındaki
|
2. Manuel moda geç → tablo **sadece seçili diski** göstermeli; tablo
|
||||||
**disk şeridinde her iki disk de** "kullanılan/kapasite" ile görünmeli
|
altında **disk şeridi OLMAMALI**
|
||||||
3. Disk şeridinden sdb'ye tıkla → tablo sdb'nin bölümlerine geçmeli
|
3. **"Aktif Disk" ComboBox'ı açılmalı ve KOYU TEMADA OKUNMALI**
|
||||||
4. sda'ya geri dön → tablo sda'nın bölümleri (seçili satır sıfırlanmalı,
|
(gradient arkaplan, açık metin rengi)
|
||||||
|
4. ComboBox'tan sdb'yi seç → tablo sdb'nin bölümlerine geçmeli
|
||||||
|
5. sda'ya geri dön → tablo sda'nın bölümleri (seçili satır sıfırlanmalı,
|
||||||
yanlış bölüm seçili kalmasın)
|
yanlış bölüm seçili kalmasın)
|
||||||
5. sda'da kök + EFI, sdb'de `/home` → **diyalogdaki disk seçiciyle**
|
6. sda'da kök + EFI, sdb'de `/home` → **Aktif Disk ComboBox'ı ile**
|
||||||
6. Özet ekranında: iki disk, başlıklarda kapasite, altlarında "boş: …",
|
7. Özet ekranında: iki disk, başlıklarda kapasite, altlarında "boş: …",
|
||||||
kök diski "[kök]" etiketiyle işaretli
|
kök diski "[kök]" etiketiyle işaretli
|
||||||
|
|
||||||
**Silme + yeni bölüm (veri kaybı senaryosu):**
|
**Silme + yeni bölüm (veri kaybı senaryosu):**
|
||||||
@@ -742,7 +752,11 @@ senaryoları dene:
|
|||||||
`2>/dev/null` ile çalışıyor, `let _ =` ile yutuluyor → süreç
|
`2>/dev/null` ile çalışıyor, `let _ =` ile yutuluyor → süreç
|
||||||
ortada ölürse kurulu sistem yamalı kalıyor
|
ortada ölürse kurulu sistem yamalı kalıyor
|
||||||
- [ ] `is_mount_point` `/proc/mounts` okurken `\040` kaçışlarını çözmüyor
|
- [ ] `is_mount_point` `/proc/mounts` okurken `\040` kaçışlarını çözmüyor
|
||||||
- [ ] Debug `eprintln!` / `println!` satırları (GUI uygulamasında)
|
- [ ] Debug `eprintln!` / `println!` satırları (GUI uygulamasında) —
|
||||||
|
kısmen: disk ComboBox'ındaki `println!("Seçilen Disk Değişti")`
|
||||||
|
**silindi**; kalanlar `main.rs` CLI yolu, `branding.rs` ve
|
||||||
|
`slideshow.rs` başlangıç uyarıları (GUI'de görünmez ama
|
||||||
|
stdout'a yazıyor)
|
||||||
- [ ] ~100 ölü i18n anahtarı (slayt + eski ekran anahtarları)
|
- [ ] ~100 ölü i18n anahtarı (slayt + eski ekran anahtarları)
|
||||||
|
|
||||||
### Bilinçli olarak yapılmadı
|
### Bilinçli olarak yapılmadı
|
||||||
@@ -760,7 +774,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/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/jobs/cleanup.rs` | **YENİ** — `EmergencyCleanupJob` |
|
||||||
| `src/steps/partition.rs` | **tek diske odaklı tablo + disk şeridi** (diyalogda disk seçicisi yok), **seçime göre görünen butonlar** (`selected_free`), diske filtreli LVM, `validate_manual_on`, `manual_capacity_error`, `mountpoint_required`, `suggest_mountpoint`, `has_symbolic_remaining`, `build_table_rows`, `format_checkbox_from`, `skip_format_from`; `multidisk_tests`, `table_scope_tests`, `free_space_tests`, `symbolic_capacity_tests`, `selection_tests`, `edit_flow_tests`, `edit_disk_tests`, `testutil` |
|
| `src/steps/partition.rs` | **tek diske odaklı tablo, şerit YOK** (diyalogda da disk seçicisi yok), **seçime göre görünen butonlar** (`selected_free`), diske filtreli LVM, `validate_manual_on`, `manual_capacity_error`, `mountpoint_required`, `suggest_mountpoint`, `has_symbolic_remaining`, `build_table_rows`, `on_disk_changed`, `format_checkbox_from`, `skip_format_from`; `multidisk_tests`, `table_scope_tests`, `free_space_tests`, `symbolic_capacity_tests`, `selection_tests`, `edit_flow_tests`, `edit_disk_tests`, `testutil` |
|
||||||
| `src/jobs/users.rs` | `set_password_via_chpasswd` (stdin pipe) |
|
| `src/jobs/users.rs` | `set_password_via_chpasswd` (stdin pipe) |
|
||||||
| `src/jobs/bootloader.rs` | `CRYPTROOT_NAME`, `luks_backing_device`, `mounted_root_device` |
|
| `src/jobs/bootloader.rs` | `CRYPTROOT_NAME`, `luks_backing_device`, `mounted_root_device` |
|
||||||
| `src/jobs/finish.rs` | `RunComarJob` geri geldi; `ldconfig`/`update-environment`/depo fatal |
|
| `src/jobs/finish.rs` | `RunComarJob` geri geldi; `ldconfig`/`update-environment`/depo fatal |
|
||||||
|
|||||||
+115
-95
@@ -610,6 +610,21 @@ fn skip_format_from(format_checked: bool) -> bool {
|
|||||||
!format_checked
|
!format_checked
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Aktif disk değişti: satır seçimleri diske özgüdür, sıfırlanır.
|
||||||
|
///
|
||||||
|
/// ⚠️ Bu, **veri güvenliği** kuralıdır. `selected_idx` tablo dışındaki
|
||||||
|
/// gerçek bir bölüm indeksidir; tablo ise tek diski gösterir. Sıfır
|
||||||
|
///lanmazsa yeni disk, eski diskin satır indeksini taşır ve "Sil"
|
||||||
|
/// YANLIŞ bölümü siler. `selected_free` de diske özgüdür (o diskin
|
||||||
|
/// boş alan satırıdır).
|
||||||
|
///
|
||||||
|
/// Tablo altındaki disk şeridi kaldırıldığında bu sorumluluk "Aktif
|
||||||
|
/// Disk" ComboBox'ına taşındı; `edit_disk_tests` sabitler.
|
||||||
|
fn on_disk_changed(manual: &mut ManualState) {
|
||||||
|
manual.selected_idx = None;
|
||||||
|
manual.selected_free = false;
|
||||||
|
}
|
||||||
|
|
||||||
/// Bir tanımın bağlama noktası BOŞ olmak zorunda mı?
|
/// Bir tanımın bağlama noktası BOŞ olmak zorunda mı?
|
||||||
///
|
///
|
||||||
/// Boş bırakmak "bu bölüm kuruluma ait değil" demektir. Üç durumda
|
/// Boş bırakmak "bu bölüm kuruluma ait değil" demektir. Üç durumda
|
||||||
@@ -1252,19 +1267,42 @@ impl PartitionStep {
|
|||||||
.unwrap_or_else(|| t!("mp_select_disk_first").to_string());
|
.unwrap_or_else(|| t!("mp_select_disk_first").to_string());
|
||||||
|
|
||||||
// ComboBox Oluşturma
|
// ComboBox Oluşturma
|
||||||
egui::ComboBox::from_id_source("disk_selection_combobox")
|
let disk_combo_w = ui.available_width() - 20.0;
|
||||||
.selected_text(selected_label)
|
theme::show_combo_box(
|
||||||
.width(ui.available_width() - 20.0) // Genişliği panele yay
|
ui,
|
||||||
.show_ui(ui, |ui| {
|
"disk_selection_combobox",
|
||||||
|
&selected_label,
|
||||||
|
disk_combo_w,
|
||||||
|
|ui, w| {
|
||||||
for disk in &state.available_disks {
|
for disk in &state.available_disks {
|
||||||
let label = format!("{} - {} ({:.1} GB)", disk.name, disk.model, disk.size_bytes as f64 / 1_073_741_824.0);
|
let label = format!("{} - {} ({:.1} GB)", disk.name, disk.model, disk.size_bytes as f64 / 1_073_741_824.0);
|
||||||
|
|
||||||
if ui.selectable_value(&mut state.selected_disk, Some(disk.name.clone()), label).changed() {
|
// Ham `ui.selectable_value` yerine temalı sürüm.
|
||||||
// Disk değiştiğinde tetiklenecek işlemler (örn: disk bölümlerini yeniden okuma)
|
// Ham sürüm egui'nin varsayılan stilini kullanıyor ve
|
||||||
println!("Seçilen Disk Değişti: {}", disk.name);
|
// koyu temada okunmuyordu; `theme::selectable_value`
|
||||||
|
// gradient arkaplan ve temaya uygun metin rengi
|
||||||
|
// veriyor. Mountpoint ve önyükleyici ComboBox'ları
|
||||||
|
// zaten bunu kullanıyor.
|
||||||
|
let mut value = state.selected_disk.clone();
|
||||||
|
theme::selectable_value(
|
||||||
|
ui, &mut value, Some(disk.name.clone()), &label, w,
|
||||||
|
);
|
||||||
|
if value != state.selected_disk {
|
||||||
|
state.selected_disk = value;
|
||||||
|
// Disk değişince önceki diskin seçili satırı
|
||||||
|
// bayat kalırdı; "Sil" yanlış bölümü etkilerdi.
|
||||||
|
// Boş alan seçimi de diske özgüdür, o da sıfırlanır.
|
||||||
|
//
|
||||||
|
// ⚠️ Bu sorumluluk tablo altındaki disk
|
||||||
|
// şeridindeydi; şerit kaldırıldığı için buraya
|
||||||
|
// taşındı. Taşınmazsa disk değiştirince
|
||||||
|
// `selected_idx` başka diskin bölümünü gösterir
|
||||||
|
// ve "Sil" YANLIŞ bölümü siler.
|
||||||
|
on_disk_changed(&mut self.manual);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
},
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
@@ -1380,17 +1418,6 @@ impl PartitionStep {
|
|||||||
// test edilebiliyor (boş alan satırının ne zaman çizildiği
|
// test edilebiliyor (boş alan satırının ne zaman çizildiği
|
||||||
// buradan görünmüyordu ve iki kez yanlış hesaplandı).
|
// buradan görünmüyordu ve iki kez yanlış hesaplandı).
|
||||||
//
|
//
|
||||||
// Disk şeridi için: `available_disks` + tanımı olan ama listede
|
|
||||||
// olmayan diskler. Sıra `available_disks`'teki tarama sırasıdır.
|
|
||||||
let seen_disk_names: Vec<String> = {
|
|
||||||
let mut names: Vec<String> = state.available_disks.iter().map(|d| d.name.clone()).collect();
|
|
||||||
for part in &state.custom_partitions {
|
|
||||||
if !part.disk.is_empty() && !names.contains(&part.disk) {
|
|
||||||
names.push(part.disk.clone());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
names
|
|
||||||
};
|
|
||||||
// Hangi disk GÖSTERİLECEK?
|
// Hangi disk GÖSTERİLECEK?
|
||||||
//
|
//
|
||||||
// Kullanıcı isteği: tablo TÜM diskleri değil, üstteki seçicide
|
// Kullanıcı isteği: tablo TÜM diskleri değil, üstteki seçicide
|
||||||
@@ -1630,66 +1657,25 @@ impl PartitionStep {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ── Disk şeridi ────────────────────────────────────────
|
// ── Disk şeridi: KALDIRILDI ─────────────────────────────
|
||||||
//
|
//
|
||||||
// Tablo tek diski gösteriyor. Bu şerit, diğer disklerin varlığını
|
// Kullanıcı isteği: "manuel disk penceresindeki tablonun altındaki
|
||||||
// ve durumunu kaybettirmez: her disk için bölüm sayısı ve kullanılan
|
// /dev/sda sdb gibi seçilileri kaldır. Aktif disk bölümünde
|
||||||
// alan yazılır, tıklanınca o disk seçilir. Kullanıcı tek diske
|
// seçiyoruz zaten tablonun altında olmasına gerek yok."
|
||||||
// odaklanır ama "sda'da 3 bölüm var" bilgisi gözden kaçmaz.
|
//
|
||||||
if seen_disk_names.len() > 1 {
|
// İki disk kaynağı olması, "hangi disk geçerli" sorusunu
|
||||||
ui.add_space(8.0);
|
// belirsizleştiriyordu — üstteki "Aktif Disk" ComboBox'ı zaten
|
||||||
ui.horizontal_wrapped(|ui| {
|
// tek ve açık kaynak.
|
||||||
for dname in &seen_disk_names {
|
//
|
||||||
let is_active = state.selected_disk.as_deref() == Some(dname.as_str());
|
// ⚠️ Bu blok sadece çizim değildi: disk değişince
|
||||||
let count = state.custom_partitions.iter()
|
// `selected_idx` / `selected_free` sıfırlıyordu. Bu sorumluluk
|
||||||
.filter(|p| p.disk == *dname && !p.delete)
|
// **ComboBox'a taşındı**; taşınmazsa disk değiştirince seçili
|
||||||
.count();
|
// satır başka diskin bölümünü gösterir ve "Sil" YANLIŞ bölümü
|
||||||
let del_count = state.custom_partitions.iter()
|
// siler.
|
||||||
.filter(|p| p.disk == *dname && p.delete)
|
//
|
||||||
.count();
|
// "sda'da 3 bölüm var" bilgisi kaybolmadı: tablonun üstündeki
|
||||||
let used: u64 = state.custom_partitions.iter()
|
// başlık satırı seçili diskin adını ve toplam kapasitesini
|
||||||
.filter(|p| p.disk == *dname && !p.delete)
|
// yazıyor, satırlar da bölümleri listeliyor.
|
||||||
.map(|p| p.size_mb)
|
|
||||||
.sum();
|
|
||||||
let cap = disk_size_mb(state, dname);
|
|
||||||
let used_str = if used >= 1024 {
|
|
||||||
format!("{:.0} GB", used as f64 / 1024.0)
|
|
||||||
} else {
|
|
||||||
format!("{} MB", used)
|
|
||||||
};
|
|
||||||
let cap_str = if cap >= 1024 {
|
|
||||||
format!("{:.0} GB", cap as f64 / 1024.0)
|
|
||||||
} else {
|
|
||||||
format!("{} MB", cap)
|
|
||||||
};
|
|
||||||
|
|
||||||
let mut label = format!(
|
|
||||||
"{} · {}/{}{}",
|
|
||||||
dname, used_str, cap_str,
|
|
||||||
if del_count > 0 { format!(" \u{EA6B}{}", del_count) } else { String::new() }
|
|
||||||
);
|
|
||||||
if count == 0 && del_count == 0 {
|
|
||||||
label = format!("{} · boş", dname);
|
|
||||||
}
|
|
||||||
|
|
||||||
let text = egui::RichText::new(label).size(11.5);
|
|
||||||
let btn = if is_active {
|
|
||||||
// Aktif disk vurgulu
|
|
||||||
egui::Button::new(text.color(crate::ui::theme::c_accent()).strong())
|
|
||||||
} else {
|
|
||||||
egui::Button::new(text.color(crate::ui::theme::c_text_dim()))
|
|
||||||
};
|
|
||||||
if ui.add(btn).on_hover_cursor(egui::CursorIcon::PointingHand).clicked() {
|
|
||||||
state.selected_disk = Some(dname.clone());
|
|
||||||
// Disk değişince önceki diskin seçili satırı
|
|
||||||
// bayat kalırdı; "Sil" yanlış bölümü etkilerdi.
|
|
||||||
// Boş alan seçimi de diske özgüdür, o da sıfırlanır.
|
|
||||||
self.manual.selected_idx = None;
|
|
||||||
self.manual.selected_free = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Silme onayı
|
// Silme onayı
|
||||||
if let Some(idx) = self.manual.delete_idx {
|
if let Some(idx) = self.manual.delete_idx {
|
||||||
@@ -4246,24 +4232,58 @@ mod table_scope_tests {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Disk şeridi her diski listelemeli — tabloda tek disk görünse de
|
/// ⭐ Disk değişince seçimler SIFIRLANMALI.
|
||||||
/// diğer diskler gizlenmemeli, yoksa kullanıcı "sda'da 3 bölüm var"
|
///
|
||||||
/// bilgisini kaybeder (kullanıcı isteğinin tam tersi).
|
/// REGRESYON: tablo altındaki disk şeridi kaldırıldı; onun yaptığı
|
||||||
|
/// seçim sıfırlamayı "Aktif Disk" ComboBox'ı devraldı. Taşınmazsa
|
||||||
|
/// `selected_idx` eski diskin indeksini taşır, tablo yeni diski
|
||||||
|
/// gösterir ve "Sil" **yanlış bölümü** siler.
|
||||||
#[test]
|
#[test]
|
||||||
fn disk_strip_lists_every_disk_even_when_one_is_shown() {
|
fn switching_disk_clears_the_row_selection() {
|
||||||
let state = crate::installer::GlobalState::default();
|
use super::on_disk_changed;
|
||||||
let mut seen: Vec<String> = state.available_disks.iter()
|
let mut manual = super::ManualState::default();
|
||||||
.map(|d| d.name.clone()).collect();
|
|
||||||
for part in &state.custom_partitions {
|
// sdb'de 2. satır seçili
|
||||||
if !part.disk.is_empty() && !seen.contains(&part.disk) {
|
manual.selected_idx = Some(2);
|
||||||
seen.push(part.disk.clone());
|
manual.selected_free = true; // iki bayrağın da temizlendiğini gör
|
||||||
}
|
|
||||||
}
|
on_disk_changed(&mut manual);
|
||||||
// available_disks boşsa yalnızca tanımlardan gelen diskler görünür
|
|
||||||
assert!(
|
assert_eq!(manual.selected_idx, None, "bölüm seçimi sıfırlanmalı");
|
||||||
seen.iter().all(|s| s.starts_with("/dev/")),
|
assert!(!manual.selected_free, "boş alan seçimi sıfırlanmalı");
|
||||||
"şeritte yalnızca aygıt yolları olmalı: {:?}",
|
}
|
||||||
seen
|
|
||||||
|
/// Disk DEĞİŞMEDEN seçim korunmalı — sıfırlama her karede olsaydı
|
||||||
|
/// kullanıcı hiçbir satırı seçemezdi.
|
||||||
|
#[test]
|
||||||
|
fn selection_survives_while_the_disk_is_unchanged() {
|
||||||
|
let mut manual = super::ManualState::default();
|
||||||
|
manual.selected_idx = Some(0);
|
||||||
|
// on_disk_changed ÇAĞRILMAZ: disk değişmedi.
|
||||||
|
assert_eq!(manual.selected_idx, Some(0), "disk değişmeden seçim korunmalı");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Tablo tek diski gösterir; disk şeridi KALDIRILDI (kullanıcı
|
||||||
|
/// isteği) — seçim yalnızca "Aktif Disk" ComboBox'ından yapılır.
|
||||||
|
#[test]
|
||||||
|
fn disk_strip_is_gone() {
|
||||||
|
// Tablo satırları yalnızca aktif diskin tanımlarından üretilir.
|
||||||
|
let parts = vec![
|
||||||
|
part("/dev/sda1", 500, FsType::Ntfs, ""),
|
||||||
|
part("/dev/sdb3", 400_000, FsType::Ext4, "/"),
|
||||||
|
];
|
||||||
|
let rows = super::build_table_rows(&parts, "/dev/sda", 20_480);
|
||||||
|
let devices: Vec<&str> = rows
|
||||||
|
.iter()
|
||||||
|
.filter_map(|r| match r {
|
||||||
|
super::TableRow::Part(_, p) => Some(p.device.as_str()),
|
||||||
|
_ => None,
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
assert_eq!(
|
||||||
|
devices,
|
||||||
|
vec!["/dev/sda1"],
|
||||||
|
"sdb'nin bölümleri şerit olmadığı için de görünmemeli"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user