feat(partition): çoklu disk kurulumunda belirsizliği gider, özeti zenginleştir

Önceki commit bölümleme iş mantığını düzeltmişti. Burada `selected_disk`
değişkeninin taşıdığı belirsizlik gideriliyor ve kullanıcı kurulumdan
önce dağılımı tek ekranda görebiliyor.

## 1. selected_disk birden fazla şey ifade ediyordu

Dört ayrı yerde kullanılıyordu: yeni bölümlerin hedefi, çift şeridin
çizildiği disk, GRUB/InstallGrubJob hedefi ve bootloader_device'ın
varsayılanı. Kullanıcı tabloyu gezmek için ComboBox'u sdb'ye çevirince
GRUB da oraya yönlendiriyordu.

  - Dış ComboBox'un etiketi "Kurulum Yapılacak Diski Seçin" idi ve bu
    yanlış anlam çağrışımı yapıyordu. Artık "Aktif disk" + ne olduğunu
    açıklayan bir ipucu metni. (Ayrıca hardcoded Türkçe etiket,
    "Disk Seçin" de çeviriye alındı.)
  - Yeni bölümlerin hedefi artık diyalogdaki disk seçiciden geliyor
    (önceki commit), dolayısıyla dış ComboBox yalnızca vurgulamayı ve
    varsayılan öneriyi etkiliyor.
  - bootloader_device varsayılanı artık `selected_disk` değil, KÖKün
    olduğu disk. partitioned_plan'a, yoksa selected_disk'a düşüyor.

## 2. Özet ekranı

Çoklu disk kurulumunda kullanıcı son durumu görmeli:
  - Disk başlıkları kapasiteyi gösteriyor ("/dev/sdb (500 GB)")
  - Her diskin altında "— boş: 120.0 GB" satırı
  - Disk satırında kök diski "[kök]" etiketiyle işaretleniyor; GRUB
    varsayılanı oraya kurulduğu için hangi diske önyükleme yazılacağı
    belli olmalı.
Ekranda ⭐ emoji yerine düz metin etiket kullanıldı: setup_fonts
sistem + remixicon yüklüyor, renkli emoji fontu yorum satırında —
emoji kutu (tofu) olarak çıkardı.

## Locale dosyaları
Bu commit sırasında tr.toml/en.toml bozuldu (satır sonuna yapışan
düzenleme) ve rust-i18n proc macro derlemeyi durdurdu. Ayrıştırıcıyla
doğrulandı, `summary_manual_mode` değeri özgün haline döndürüldü.

cargo check --all-targets : 0 hata, 0 uyarı
cargo test              : 76/76 geçti

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Erkan IŞIK
2026-09-25 23:59:52 +03:00
parent 4c68c5018e
commit b6f9af3b40
5 changed files with 90 additions and 7 deletions
+3
View File
@@ -81,6 +81,7 @@ summary_username = "Username"
summary_hostname = "Computer name"
summary_erase_mode = "Entire disk will be erased"
summary_manual_mode = "Manual partitioning"
summary_root_disk_tag = "root"
summary_not_selected = "Not selected"
summary_warning = "⚠ Warning: Clicking Next will permanently erase all data on the selected disk!"
@@ -148,6 +149,8 @@ display_manager_note = "Note: The display manager will be enabled by default on
mp_size_remaining = "Remaining Space"
mp_size_available = "Available"
mp_target_disk = "Target disk"
mp_active_disk = "Active disk"
mp_active_disk_hint = "The disk highlighted in the table and the default target for the New Partition dialog. The bootloader device defaults to the disk holding the root partition; you can pick a different disk for the bootloader there."
mp_target_disk_hint = "The disk this partition will be created on. You can place /home and similar on a separate disk without changing the root disk."
mp_create_here = "Create Here"
mp_will_delete = "will be deleted"
+3
View File
@@ -81,6 +81,7 @@ summary_username = "Kullanıcı adı"
summary_hostname = "Bilgisayar adı"
summary_erase_mode = "Tüm disk silinecek"
summary_manual_mode = "Manuel bölümleme"
summary_root_disk_tag = "kök"
summary_not_selected = "Seçilmedi"
summary_warning = " Dikkat: İleri'ye basıldığında seçilen diskteki tüm veriler kalıcı olarak silinecektir!"
@@ -120,6 +121,8 @@ summary_custom_partitions = "Manuel Bölümler"
mp_size_remaining = "Kalan Alan"
mp_size_available = "Kullanılabilir"
mp_target_disk = "Hedef disk"
mp_active_disk = "Aktif disk"
mp_active_disk_hint = "Tabloda vurgulanan disk ve Yeni Bölüm diyaloğunun varsayılan hedefi. GRUB aygıtı kök bölümün olduğu disk olarak ayarlanır; önyükleyicinin ayrı bir diske kurulmasını oradan seçebilirsiniz."
mp_target_disk_hint = "Bu bölümün yerleşeceği disk. Kök diski değiştirmeden /home gibi bölümleri ayrı bir diske koyabilirsiniz."
mp_create_here = "Buraya Oluştur"
mp_will_delete = "silinecek"
+16 -2
View File
@@ -19,9 +19,23 @@ impl InstallerStep for BootloaderStep {
if self.timeout_str.is_empty() {
self.timeout_str = state.bootloader_timeout.to_string();
}
// Varsayılan GRUB aygıtı, KÖKün olduğu disk olmalı.
//
// Önceden `state.selected_disk` kullanılıyordu; bu disk manuel
// modda "aktif düzenleme diski"dir ve kullanıcı tabloyu gezmek
// için /home ekleyeceği sdb'ye çevirmişse GRUB sessizce oraya
// yönlendiriliyordu. Doğru varsayılan kökün diski; kullanıcı
// ComboBox'tan değiştirebilir.
if state.bootloader_device.is_empty() {
if let Some(ref disk) = state.selected_disk {
state.bootloader_device = disk.clone();
let root_disk = state
.custom_partitions
.iter()
.find(|p| p.mountpoint == "/" && !p.delete)
.map(|p| p.disk.clone())
.or_else(|| state.partition_plan.as_ref().map(|p| p.disk.clone()))
.or_else(|| state.selected_disk.clone());
if let Some(d) = root_disk {
state.bootloader_device = d;
}
}
}
+12 -2
View File
@@ -834,14 +834,24 @@ impl PartitionStep {
// let kart_yukseklik = 160.0;
ui.group(|ui| {
ui.label(egui::RichText::new("Kurulum Yapılacak Diski Seçin:").strong());
// Etiket önemli: `selected_disk` birden fazla şey ifade eder
// (aktif düzenleme diski + varsayılan GRUB hedefi). "Kurulum
// Yapılacak Diski Seçin" demek, yalnızca tabloyu gezmek için
// ComboBox'u değiştirmenin GRUB hedefini de değiştirdiğini
// gizliyordu. Artık bu ayrım açıkça yazılı.
ui.label(egui::RichText::new(t!("mp_active_disk")).strong());
ui.label(
egui::RichText::new(t!("mp_active_disk_hint"))
.size(11.0)
.color(crate::ui::theme::c_text_dim()),
);
ui.add_space(6.0);
// Seçili disk için etiket
let selected_label = state.selected_disk.as_ref()
.and_then(|disk_name| state.available_disks.iter().find(|d| d.name == *disk_name))
.map(|disk| format!("{} - {} ({:.1} GB)", disk.name, disk.model, disk.size_bytes as f64 / 1_073_741_824.0))
.unwrap_or_else(|| "Disk Seçin".to_string());
.unwrap_or_else(|| t!("mp_select_disk_first").to_string());
// ComboBox Oluşturma
egui::ComboBox::from_id_source("disk_selection_combobox")
+56 -3
View File
@@ -49,14 +49,40 @@ impl InstallerStep for SummaryStep {
None => t!("summary_not_selected").to_string(),
}
} else if !state.custom_partitions.is_empty() {
// Manuel modda tanım yapılan TÜM diskleri listele
// Manuel modda tanım yapılan TÜM diskleri listele.
// KÖKün olduğu disk işaretlenir: GRUB varsayılanı
// ona kurulur ve kullanıcı hangi diske önyükleyici
// yazılacağını buradan görebilmeli.
let mut disks: Vec<&str> = Vec::new();
for part in &state.custom_partitions {
if !disks.contains(&part.disk.as_str()) {
disks.push(&part.disk);
}
}
format!("{} \u{EA6B} {}", disks.join(", "), t!("summary_manual_mode"))
let root_disk = state
.custom_partitions
.iter()
.find(|p| p.mountpoint == "/" && !p.delete)
.map(|p| p.disk.as_str());
let listed: Vec<String> = disks
.iter()
.copied()
.map(|d| {
if Some(d) == root_disk {
// ⭐ gibi bir emoji kullanılmıyor:
// setup_fonts yalnızca sistem +
// remixicon yüklüyor, renkli emoji
// fontu yorum satırında — kutu (tofu)
// çıkar. Düz metin işaret hem her
// fontta var hem de çeviriyle uyumlu.
format!("{} [{}]", d, t!("summary_root_disk_tag"))
} else {
d.to_string()
}
})
.collect();
format!("{} \u{EA6B} {}",
listed.join(", "), t!("summary_manual_mode"))
} else {
match &state.selected_disk {
Some(d) => format!("{} \u{EA6B} {}", d, t!("summary_manual_mode")),
@@ -91,7 +117,25 @@ impl InstallerStep for SummaryStep {
}
}
for d in seen_disks {
plan_lines.push(format!("\u{EDFB} {}", d));
// Disk başlığı + kapasite. Çoklu disk
// kurulumunda kullanıcının hangi bölümün
// hangi diskte olduğunu tek ekranda görmesi
// gerekiyor; yalnızca "/dev/sdb" yazması
// yetersiz.
let cap_mb = state.available_disks.iter()
.find(|dk| dk.name == d)
.map(|dk| dk.size_bytes / 1_048_576)
.unwrap_or(0);
let used_mb: u64 = state.custom_partitions.iter()
.filter(|p| p.disk == d && !p.delete)
.map(|p| p.size_mb)
.sum();
let hdr = if cap_mb >= 1024 {
format!("\u{EDFB} {} ({:.0} GB)", d, cap_mb as f64 / 1024.0)
} else {
format!("\u{EDFB} {} ({} MB)", d, cap_mb)
};
plan_lines.push(hdr);
for part in state.custom_partitions.iter().filter(|p| p.disk == d) {
let size_str = if part.size_mb == 0 {
// Sembolik boyut: kalan kapasiteyi göster
@@ -122,6 +166,15 @@ impl InstallerStep for SummaryStep {
part.device, part.mountpoint, part.fstype, size_str));
}
}
// Diskin kullanılmayan boş alanı
let free_mb = cap_mb.saturating_sub(used_mb);
if free_mb > 0 {
if free_mb >= 1024 {
plan_lines.push(format!(" — boş: {:.1} GB", free_mb as f64 / 1024.0));
} else {
plan_lines.push(format!(" — boş: {} MB", free_mb));
}
}
}
summary_row(ui, t!("summary_custom_partitions"), &plan_lines.join("\n"));
}