diff --git a/Cargo.toml b/Cargo.toml
index caa4aa7..d033ef0 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -2,6 +2,7 @@
name = "yali-rs"
version = "4.0.0"
edition = "2024"
+default-run = "yali-rs"
[dependencies]
eframe = { version = "0.27", features = ["default", "wgpu"] }
@@ -18,5 +19,13 @@ async-trait = "0.1"
chrono = "0.4"
xkbcommon = "0.9"
+[[bin]]
+name = "yali-rs"
+path = "src/main.rs"
+
+[[bin]]
+name = "slides_test"
+path = "src/bin/slides_test.rs"
+
[patch.crates-io]
# Yerel mudur veya comar-api kütüphaneleri buraya eklenebilir
diff --git a/assets/icons/language-icon.svg b/assets/icons/language-icon.svg
index 2fae488..0b0e12e 100644
--- a/assets/icons/language-icon.svg
+++ b/assets/icons/language-icon.svg
@@ -2,14 +2,14 @@
diff --git a/branding.toml b/branding.toml
index 8181834..75533c6 100644
--- a/branding.toml
+++ b/branding.toml
@@ -22,315 +22,6 @@ pisi_logo_light = "assets/pisi-logo-light.png"
# Kurulum penceresinin başlığı (pencere çubuğu)
title = "PiSi Linux Kurulumu"
-# ──────────────────────────────────────────────────────────────────
-# [slides] – Kurulum sırasında gösterilen slaytlar
-# ──────────────────────────────────────────────────────────────────
-[slides]
-
-# Slayt geçiş süresi (saniye)
-interval_secs = 6
-
-
-# ── Slayt ikonları → görsel dosya yolu eşlemesi ──────────────────
-# Geliştirici notu: Yeni ikon eklemek için sadece buraya satır ekle.
-[slides.icons]
-pisilogo_dark = "assets/pisi-logo-dark.png"
-pisilogo_light = "assets/pisi-logo-light.png"
-pisi = "assets/pisi-software-center.png"
-community = "assets/community.png"
-pisi_speed = "assets/pisi_speed.png"
-securety = "assets/securety.png"
-customization = "assets/customization.png"
-
-budgie = "assets/budgie.png"
-budgie_applets = "assets/budgie_applets.png"
-budgie_raven = "assets/budgie_raven.png"
-budgie_gtk_theme = "assets/budgie_gtk_theme.png"
-
-cinnamon = "assets/cinnamon.png"
-cinnamon_panel = "assets/cinnamon_panel.png"
-cinnamon_settings = "assets/cinnamon_settings.png"
-cinnamon_desklets = "assets/cinnamon_desklets.png"
-
-gnome = "assets/gnome.png"
-gnome_search = "assets/gnome_search.png"
-gnome_extensions = "assets/gnome_extensions.png"
-
-kde = "assets/kde.png"
-kde_connect = "assets/kde_connect.png"
-discover = "assets/discover.png"
-file_manager = "assets/file_manager.png"
-
-lxde = "assets/lxde.png"
-lxqt = "assets/lxqt.png"
-lumina = "assets/lumina.png"
-
-mate = "assets/mate.png"
-mate_settings = "assets/mate_settings.png"
-
-xfce = "assets/xfce.png"
-xfce_settings = "assets/xfce_settings.png"
-xfce_panel = "assets/xfce_panel.png"
-
-
-# ══════════════════════════════════════════════════════════════════
-# [[slides.items]] – Slayt içerikleri
-# ══════════════════════════════════════════════════════════════════
-#
-# Her [[slides.items]] bloğu bir slaytı tanımlar.
-#
-# Alanlar:
-# icon = Görsel için yukarıdaki [slides.icons] anahtarı
-# title = Slayt başlığı
-# description = Slayt açıklama metni
-# desktop = (isteğe bağlı) Yalnızca belirli masaüstünde göster.
-# Boş bırakılırsa tüm masaüstlerinde gösterilir.
-# Değerler: "xfce", "kde", "gnome", "mate", "budgie",
-# "cinnamon", "lxde", "lxqt", "lumina"
-#
-# Geliştirici notu:
-# Yeni bir slayt eklemek veya metni değiştirmek için yalnızca
-# buraya [[slides.items]] bloğu ekleyin / düzenleyin.
-# Rust koduna dokunmanıza gerek yoktur.
-# ──────────────────────────────────────────────────────────────────
-
-# ── Tüm masaüstlerinde gösterilen ortak slaytlar ──────────────────
-
-[[slides.items]]
-icon = "pisilogo"
-title = "Pisi GNU/Linux'a Hoş Geldiniz"
-description = "Pisi; hız, kararlılık ve kullanım kolaylığını bir araya getiren Türkçe destekli bir GNU/Linux dağıtımıdır."
-
-[[slides.items]]
-icon = "pisi"
-title = "PISI Paket Yöneticisi"
-description = "Binlerce pakete tek komutla erişin. `pisi install ` ile ihtiyacınız olan her şeyi kolayca kurabilirsiniz."
-
-[[slides.items]]
-icon = "community"
-title = "Topluluk Desteği"
-description = "forum.pisilinux.org adresindeki aktif topluluğumuz sorularınızı yanıtlamak için hazır. Wiki sayfalarımız da her an erişilebilir."
-
-[[slides.items]]
-icon = "pisi_speed"
-title = "Hız ve Performans"
-description = "Optimize edilmiş çekirdek ve başlangıç servisleri sayesinde PisiLinux saniyeler içinde açılır ve minimum kaynak kullanır."
-
-[[slides.items]]
-icon = "securety"
-title = "Güvenlik Önce Gelir"
-description = "Düzenli güvenlik güncellemeleri, AppArmor profilleri ve güvenli varsayılan ayarlarla sisteminizi koruyun."
-
-[[slides.items]]
-icon = "customization"
-title = "Özelleştirme"
-description = "Masaüstü ortamından tema renklerine, panel düzeninden klavye kısayollarına kadar her şeyi zevkinize göre ayarlayın."
-
-# ── XFCE ──────────────────────────────────────────────────────────
-
-[[slides.items]]
-desktop = "xfce"
-icon = "xfce"
-title = "PisiLinux XFCE"
-description = "Hafif, hızlı ve kullanıcı dostu XFCE masaüstü ortamı. Kaynak tüketimi düşük, performansı yüksektir."
-
-[[slides.items]]
-desktop = "xfce"
-icon = "xfce_panel"
-title = "XFCE Panel"
-description = "Geleneksel panel düzeni ile görev çubuğu, uygulama menüsü ve sistem tepsisi her zaman elinizin altında."
-
-[[slides.items]]
-desktop = "xfce"
-icon = "file_manager"
-title = "Thunar Dosya Yöneticisi"
-description = "Hızlı ve hafif Thunar ile dosya işlemlerinizi kolayca yapın. Ağaç görünümü, sekmeli gezinme ve özelleştirilebilir özellikler sunar."
-
-[[slides.items]]
-desktop = "xfce"
-icon = "xfce_settings"
-title = "Ayarlar Merkezi"
-description = "Klasik uygulama menüsüne modern bir alternatif. Whisker Menu ile uygulamaları kolayca bulun, favorilerinizi düzenleyin."
-
-# ── KDE Plasma ────────────────────────────────────────────────────
-
-[[slides.items]]
-desktop = "kde"
-icon = "kde"
-title = "PisiLinux KDE Plasma"
-description = "Modern, özelleştirilebilir ve güçlü KDE Plasma masaüstü ortamıyla tanışın. Her şey elinizin altında."
-
-[[slides.items]]
-desktop = "kde"
-icon = "file_manager"
-title = "Dolphin Dosya Yöneticisi"
-description = "Sekmeli gezinme, ikili panel ve güçlü arama özelliğiyle Dolphin dosyalarınızı yönetmeyi kolaylaştırır."
-
-[[slides.items]]
-desktop = "kde"
-icon = "kde_connect"
-title = "KDE Bağlan"
-description = "Telefonunuzu bilgisayarınıza bağlayın. Bildirimler, dosya aktarımı ve klipboard paylaşımı KDE Connect ile mümkün."
-
-[[slides.items]]
-desktop = "kde"
-icon = "discover"
-title = "Discover Yazılım Merkezi"
-description = "Discover ile uygulamaları görsel arayüzden kolayca bulun, kurun ve güncelleyin."
-
-# ── GNOME ─────────────────────────────────────────────────────────
-
-[[slides.items]]
-desktop = "gnome"
-icon = "gnome"
-title = "PisiLinux GNOME"
-description = "Sade ve odaklı GNOME masaüstü ortamı ile dikkat dağıtıcı unsurları azaltın, işinize konsantre olun."
-
-[[slides.items]]
-desktop = "gnome"
-icon = "gnome_search"
-title = "GNOME Arama"
-description = "Super tuşuna basıp yazmaya başlayın. Uygulama, dosya ve ayarlara anında ulaşın."
-
-[[slides.items]]
-desktop = "gnome"
-icon = "gnome_extensions"
-title = "GNOME Eklentileri"
-description = "extensions.gnome.org adresinden yüzlerce eklentiyle masaüstünüzü ihtiyaçlarınıza göre şekillendirin."
-
-# ── MATE ──────────────────────────────────────────────────────────
-
-[[slides.items]]
-desktop = "mate"
-icon = "mate"
-title = "PisiLinux MATE"
-description = "Geleneksel masaüstü düzenini sevenler için MATE. GTK+ 3 ile geliştirilmiş, modern ve akıcı bir deneyim sunar."
-
-[[slides.items]]
-desktop = "mate"
-icon = "file_manager"
-title = "Caja Dosya Yöneticisi"
-description = "MATE'in güçlü dosya yöneticisi Caja ile dosya işlemlerinizi kolayca yapın. Çift panel, sekmeli gezinme ve geniş özellikler sunar."
-
-[[slides.items]]
-desktop = "mate"
-icon = "mate_settings"
-title = "MATE Ayarları"
-description = "Görünüm, ekran, klavye ve daha fazlası için kapsamlı ayarlarla MATE masaüstünüzü özelleştirin."
-
-[[slides.items]]
-desktop = "mate"
-icon = "customization"
-title = "Zengin Uygulama Paketi"
-description = "MATE; metin editöründen görüntü görüntüleme yazılımına kadar geniş, iyi entegre edilmiş klasik uygulamalar sunar."
-
-# ── Budgie ────────────────────────────────────────────────────────
-
-[[slides.items]]
-desktop = "budgie"
-icon = "budgie"
-title = "PisiLinux Budgie"
-description = "Modern, sade ve şık Budgie masaüstü. GNOME altyapısı üzerine inşa edilmiş, kullanıcı dostudur."
-
-[[slides.items]]
-desktop = "budgie"
-icon = "budgie_applets"
-title = "Budgie Desktop Applets"
-description = "Budgie'nin panel appletleri sayesinde hava durumu, sistem izleyici, takvim gibi araçları kolayca ekleyin."
-
-[[slides.items]]
-desktop = "budgie"
-icon = "budgie_raven"
-title = "Raven Bildirim Merkezi"
-description = "Raven panelinden ses seviyesi, medya kontrolleri, bildirimler ve hızlı ayarlara erişin."
-
-[[slides.items]]
-desktop = "budgie"
-icon = "budgie_gtk_theme"
-title = "GTK Tema Desteği"
-description = "Budgie, GTK temalarını ve GNOME uygulamalarını sorunsuz çalıştırır, görsel bütünlük sağlar."
-
-# ── Cinnamon ──────────────────────────────────────────────────────
-
-[[slides.items]]
-desktop = "cinnamon"
-icon = "cinnamon"
-title = "PisiLinux Cinnamon"
-description = "Geleneksel masaüstü deneyimini modern özelliklerle birleştiren Cinnamon, güçlü ve esnek bir ortam sunar."
-
-[[slides.items]]
-desktop = "cinnamon"
-icon = "cinnamon_panel"
-title = "Cinnamon Paneli"
-description = "Panelinizi applet'ler, başlatıcılar ve sistem göstergeleriyle özelleştirin; klasik ama güçlü bir masaüstü deneyimi yaşayın."
-
-[[slides.items]]
-desktop = "cinnamon"
-icon = "cinnamon_settings"
-title = "Ayarlar Yöneticisi"
-description = "Cinnamon'un kapsamlı Ayarlar Yöneticisi aracılığıyla masaüstünüzün her yönünü özelleştirin."
-
-[[slides.items]]
-desktop = "cinnamon"
-icon = "cinnamon_desklets"
-title = "Cinnamon Desklets"
-description = "Masaüstü widget'ları ile notlar, saatler ve sistem bilgileri her zaman görünür kalsın."
-
-# ── LXQt ──────────────────────────────────────────────────────────
-
-[[slides.items]]
-desktop = "lxqt"
-icon = "lxqt"
-title = "PisiLinux LXQt"
-description = "Hafif, hızlı ve modern LXQt masaüstü ortamı. Kaynak tüketimi düşük, performansı yüksektir."
-
-[[slides.items]]
-desktop = "lxqt"
-icon = "file_manager"
-title = "LXQt Panel"
-description = "Geleneksel panel düzeni ile görev çubuğu, uygulama başlatıcı ve sistem tepsisi her zaman elinizin altında."
-
-[[slides.items]]
-desktop = "lxqt"
-icon = "file_manager"
-title = "PCManFM-Qt Dosya Yöneticisi"
-description = "Hafif ve hızlı PCManFM-Qt ile dosya işlemlerini kolayca yönetin. Sekmeli gezinme ve özelleştirilebilir arayüz sunar."
-
-# ── LXDE ──────────────────────────────────────────────────────────
-
-[[slides.items]]
-desktop = "lxde"
-icon = "lxde"
-title = "PisiLinux LXDE"
-description = "Efsanevi hafif masaüstü LXDE. Çok düşük kaynak tüketimi ve güvenilir yapısıyla tanınır."
-
-[[slides.items]]
-desktop = "lxde"
-icon = "lxde"
-title = "Openbox Tabanlı"
-description = "LXDE, Openbox pencere yöneticisini kullanır. İnce ayarlar ile akıcı bir deneyim sunar."
-
-[[slides.items]]
-desktop = "lxde"
-icon = "file_manager"
-title = "PCManFM Dosya Yöneticisi"
-description = "PCManFM, hızlı ve hafif yapısıyla dosya işlemlerinizi kolaylaştırır, ağaç görünümü ve sekme destekler."
-
-# ── Lumina ────────────────────────────────────────────────────────
-
-[[slides.items]]
-desktop = "lumina"
-icon = "lumina"
-title = "PisiLinux Lumina"
-description = "Hafif ve bağımsız Lumina masa üstü. Qt tabanlı, BSD ve Linux sistemlerde düzgün çalışan minimal bir ortam."
-
-[[slides.items]]
-desktop = "lumina"
-icon = "customization"
-title = "Tema Özelleştirme"
-description = "Lumina'nın tema sistemiyle renk şemaları ve arayüz stilini kolayca özelleştirin."
-
-
# ──────────────────────────────────────────────────────────────────
# [theme] – Arayüz renk şeması (Hex)
# ──────────────────────────────────────────────────────────────────
diff --git a/branding_en.toml b/branding_en.toml
index 8e3be1b..e7b5ba5 100644
--- a/branding_en.toml
+++ b/branding_en.toml
@@ -20,304 +20,6 @@ title = "YALI Installation Wizard"
# Subtitle displayed in the left sidebar
subtitle = "YALI"
-# ──────────────────────────────────────────────────────────────────
-# [slides] – Slides shown during installation
-# ──────────────────────────────────────────────────────────────────
-[slides]
-
-# Slide transition duration (seconds)
-interval_secs = 6
-
-
-# ── Slide Icons → File Path Mappings ─────────────────────────────
-[slides.icons]
-pisilogo = "assets/pisilinux-logo.png"
-pisi = "assets/pisi-software-center.png"
-community = "assets/community.png"
-pisi_speed = "assets/pisi_speed.png"
-securety = "assets/securety.png"
-customization = "assets/customization.png"
-
-# Masaüstü İkonları
-budgie = "assets/budgie.png"
-budgie_applets = "assets/budgie_applets.png"
-budgie_raven = "assets/budgie_raven.png"
-budgie_gtk_theme = "assets/budgie_gtk_theme.png"
-
-cinnamon = "assets/cinnamon.png"
-cinnamon_panel = "assets/cinnamon_panel.png"
-cinnamon_settings = "assets/cinnamon_settings.png"
-cinnamon_desklets = "assets/cinnamon_desklets.png"
-
-gnome = "assets/gnome.png"
-gnome_search = "assets/gnome_search.png"
-gnome_extensions = "assets/gnome_extensions.png"
-
-kde = "assets/kde.png"
-file_manager = "assets/file_manager.png"
-kde_connect = "assets/kde_connect.png"
-discover = "assets/discover.png"
-
-lxde = "assets/lxde.png"
-lxde_openbox = "assets/lxde_openbox.png"
-lxde_lxpanel = "assets/lxde_lxpanel.png"
-
-lxqt = "assets/lxqt.png"
-lxqt_panel = "assets/lxqt_panel.png"
-
-lumina = "assets/lumina.png"
-lumina_applications = "assets/lumina_applications.png"
-lumina_theme = "assets/lumina_theme.png"
-lumina_panel = "assets/lumina_panel.png"
-
-mate = "assets/mate.png"
-mate_settings = "assets/mate_settings.png"
-mate_applications = "assets/mate_applications.png"
-
-xfce = "assets/xfce.png"
-xfce_panel = "assets/xfce_panel.png"
-xfce_settings = "assets/xfce_settings.png"
-
-
-# ── Common Slides ────────────────────────────────────────────────
-[[slides.items]]
-icon = "pisilogo"
-title = "Welcome to Pisi GNU/Linux"
-description = "Pisi is a Turkish-supported GNU/Linux distribution that combines speed, stability, and ease of use."
-
-[[slides.items]]
-icon = "pisi"
-title = "PISI Package Manager"
-description = "Access thousands of packages with a single command. Install anything you need easily with `pisi install `."
-
-[[slides.items]]
-icon = "community"
-title = "Community Support"
-description = "Our active community at forum.pisilinux.org is ready to answer your questions. Our wiki pages are always accessible."
-
-[[slides.items]]
-icon = "pisi_speed"
-title = "Speed & Performance"
-description = "Thanks to an optimized kernel and startup services, PisiLinux boots in seconds and uses minimal resources."
-
-[[slides.items]]
-icon = "securety"
-title = "Security First"
-description = "Keep your system secure with regular security updates, AppArmor profiles, and secure default settings."
-
-[[slides.items]]
-icon = "customization"
-title = "Customization"
-description = "Tailor everything to your taste — from the desktop environment and theme colors to panel layout and keyboard shortcuts."
-
-# ── Budgie ────────────────────────────────────────────────────────
-[[slides.items]]
-desktop = "budgie"
-icon = "budgie"
-title = "PisiLinux Budgie"
-description = "A modern, clean, and elegant Budgie desktop. Built on the GNOME stack and user-friendly."
-
-[[slides.items]]
-desktop = "budgie"
-icon = "budgie_applets"
-title = "Budgie Desktop Applets"
-description = "Easily add tools like weather, system monitor, and calendar via Budgie's panel applets."
-
-[[slides.items]]
-desktop = "budgie"
-icon = "budgie_raven"
-title = "Raven Notification Center"
-description = "Access volume, media controls, notifications, and quick settings from the Raven panel."
-
-[[slides.items]]
-desktop = "budgie"
-icon = "budgie_gtk_theme"
-title = "GTK Theme Support"
-description = "Budgie runs GTK themes and GNOME applications seamlessly, ensuring visual consistency."
-
-# ── Cinnamon ──────────────────────────────────────────────────────
-[[slides.items]]
-desktop = "cinnamon"
-icon = "cinnamon"
-title = "PisiLinux Cinnamon"
-description = "Cinnamon combines the traditional desktop experience with modern features, offering a powerful and flexible environment."
-
-[[slides.items]]
-desktop = "cinnamon"
-icon = "cinnamon_panel"
-title = "Cinnamon Panel"
-description = "Customize your panel with applets, launchers, and system indicators for a classic yet powerful desktop."
-
-[[slides.items]]
-desktop = "cinnamon"
-icon = "cinnamon_settings"
-title = "Settings Manager"
-description = "Fine-tune every aspect of your Cinnamon desktop through the comprehensive Settings Manager."
-
-[[slides.items]]
-desktop = "cinnamon"
-icon = "cinnamon_desklets"
-title = "Cinnamon Desklets"
-description = "Keep notes, clocks, and system info always visible on your desktop with Cinnamon Desklets."
-
-# ── GNOME ─────────────────────────────────────────────────────────
-[[slides.items]]
-desktop = "gnome"
-icon = "gnome"
-title = "PisiLinux GNOME"
-description = "Reduce distractions and focus on your work with the clean and focused GNOME desktop environment."
-
-[[slides.items]]
-desktop = "gnome"
-icon = "gnome_search"
-title = "GNOME Search"
-description = "Press the Super key and start typing. Instantly reach applications, files, and settings."
-
-[[slides.items]]
-desktop = "gnome"
-icon = "gnome_extensions"
-title = "GNOME Extensions"
-description = "Shape your desktop to your needs with hundreds of extensions from extensions.gnome.org."
-
-# ── KDE ───────────────────────────────────────────────────────────
-[[slides.items]]
-desktop = "kde"
-icon = "kde"
-title = "PisiLinux KDE Plasma"
-description = "Meet the modern, customizable, and powerful KDE Plasma desktop. Everything is at your fingertips."
-
-[[slides.items]]
-desktop = "kde"
-icon = "file_manager"
-title = "Dolphin File Manager"
-description = "Dolphin makes managing your files easy with tabbed browsing, dual-panel view, and powerful search."
-
-[[slides.items]]
-desktop = "kde"
-icon = "kde_connect"
-title = "KDE Connect"
-description = "Connect your phone to your computer. Notifications, file transfer, and clipboard sharing — all with KDE Connect."
-
-[[slides.items]]
-desktop = "kde"
-icon = "discover"
-title = "Discover Software Center"
-description = "Easily find, install, and update applications from the visual interface with Discover."
-
-# ── LXQt ──────────────────────────────────────────────────────────
-[[slides.items]]
-desktop = "lxqt"
-icon = "lxqt"
-title = "PisiLinux LXQt"
-description = "A lightweight, fast, and modern LXQt desktop environment. Low resource consumption, high performance."
-
-[[slides.items]]
-desktop = "lxqt"
-icon = "lxqt_panel"
-title = "LXQt Panel"
-description = "The traditional panel layout puts the taskbar, application launcher, and system tray always within reach."
-
-[[slides.items]]
-desktop = "lxqt"
-icon = "file_manager"
-title = "PCManFM-Qt File Manager"
-description = "Manage files effortlessly with the lightweight and fast PCManFM-Qt. Tabbed navigation and a customizable interface."
-
-# ── LXDE ──────────────────────────────────────────────────────────
-[[slides.items]]
-desktop = "lxde"
-icon = "lxde"
-title = "PisiLinux LXDE"
-description = "The legendary lightweight LXDE desktop. Known for extremely low resource usage and a reliable build."
-
-[[slides.items]]
-desktop = "lxde"
-icon = "lxde_openbox"
-title = "Openbox-Based"
-description = "LXDE uses the Openbox window manager. Fine-tune it for a smooth and responsive experience."
-
-[[slides.items]]
-desktop = "lxde"
-icon = "file_manager"
-title = "PCManFM File Manager"
-description = "PCManFM speeds up your file operations with its fast and lightweight build, supporting tree view and tabs."
-
-# ── Lumina ────────────────────────────────────────────────────────
-[[slides.items]]
-desktop = "lumina"
-icon = "lumina"
-title = "PisiLinux Lumina"
-description = "A lightweight and independent Lumina desktop. Qt-based, designed to run cleanly on BSD and Linux systems."
-
-[[slides.items]]
-desktop = "lumina"
-icon = "lumina_applications"
-title = "Application Support"
-description = "Lumina works well with core utilities and many popular Qt apps, providing a practical everyday experience."
-
-[[slides.items]]
-desktop = "lumina"
-icon = "lumina_theme"
-title = "Theme Customization"
-description = "Easily customize color schemes and interface styles with Lumina's flexible theme system."
-
-[[slides.items]]
-desktop = "lumina"
-icon = "lumina_panel"
-title = "Lumina Panel"
-description = "A clean panel with a taskbar, application launcher, and system tray keeps your desktop organized."
-
-# ── MATE ──────────────────────────────────────────────────────────
-[[slides.items]]
-desktop = "mate"
-icon = "mate"
-title = "PisiLinux MATE"
-description = "MATE for those who love the traditional desktop layout. Developed with GTK+ 3 for a modern and smooth experience."
-
-[[slides.items]]
-desktop = "mate"
-icon = "file_manager"
-title = "Caja File Manager"
-description = "Manage your files easily with MATE's powerful Caja. Dual panel, tabbed navigation, and rich features."
-
-[[slides.items]]
-desktop = "mate"
-icon = "mate_settings"
-title = "MATE Settings"
-description = "Customize your MATE desktop with comprehensive settings for appearance, display, keyboard, and more."
-
-[[slides.items]]
-desktop = "mate"
-icon = "mate_applications"
-title = "Rich Application Suite"
-description = "MATE comes with a rich set of classic applications — from text editors to image viewers, all well-integrated."
-
-# ── XFCE ──────────────────────────────────────────────────────────
-[[slides.items]]
-desktop = "xfce"
-icon = "xfce"
-title = "PisiLinux XFCE"
-description = "A lightweight, fast, and user-friendly XFCE desktop environment. Low resource consumption, high performance."
-
-[[slides.items]]
-desktop = "xfce"
-icon = "xfce_panel"
-title = "XFCE Panel"
-description = "The traditional panel layout puts the taskbar, application menu, and system tray always within reach."
-
-[[slides.items]]
-desktop = "xfce"
-icon = "file_manager"
-title = "Thunar File Manager"
-description = "Manage your files easily with the fast and lightweight Thunar. Tree view, tabbed navigation, and customizable features."
-
-[[slides.items]]
-desktop = "xfce"
-icon = "xfce_settings"
-title = "Whisker Menu"
-description = "A modern alternative to the classic application menu. Find apps easily and organize your favorites with Whisker Menu."
-
-
# ──────────────────────────────────────────────────────────────────
# [theme] – UI Style & Color Palette
# ──────────────────────────────────────────────────────────────────
diff --git a/branding_tr.toml b/branding_tr.toml
index 0e2478e..a1d9c3d 100644
--- a/branding_tr.toml
+++ b/branding_tr.toml
@@ -30,309 +30,6 @@ subtitle = "YALI"
# ──────────────────────────────────────────────────────────────────
[slides]
-# Slayt geçiş süresi (saniye)
-interval_secs = 6
-
-
-# ── Slayt ikonları → görsel dosya yolu eşlemesi ──────────────────
-# Geliştirici notu: Yeni ikon eklemek için sadece buraya satır ekle.
-[slides.icons]
-pisilogo = "assets/pisilinux-logo.png"
-pisi = "assets/pisi-software-center.png"
-community = "assets/community.png"
-pisi_speed = "assets/pisi_speed.png"
-securety = "assets/securety.png"
-customization = "assets/customization.png"
-
-budgie = "assets/budgie.png"
-budgie_applets = "assets/budgie_applets.png"
-budgie_raven = "assets/budgie_raven.png"
-budgie_gtk_theme = "assets/budgie_gtk_theme.png"
-
-cinnamon = "assets/cinnamon.png"
-cinnamon_panel = "assets/cinnamon_panel.png"
-cinnamon_settings = "assets/cinnamon_settings.png"
-cinnamon_desklets = "assets/cinnamon_desklets.png"
-
-gnome = "assets/gnome.png"
-gnome_search = "assets/gnome_search.png"
-gnome_extensions = "assets/gnome_extensions.png"
-
-kde = "assets/kde.png"
-kde_connect = "assets/kde_connect.png"
-discover = "assets/discover.png"
-file_manager = "assets/file_manager.png"
-
-lxde = "assets/lxde.png"
-lxqt = "assets/lxqt.png"
-lumina = "assets/lumina.png"
-
-mate = "assets/mate.png"
-mate_settings = "assets/mate_settings.png"
-
-xfce = "assets/xfce.png"
-xfce_settings = "assets/xfce_settings.png"
-xfce_panel = "assets/xfce_panel.png"
-
-
-# ══════════════════════════════════════════════════════════════════
-# [[slides.items]] – Slayt içerikleri
-# ══════════════════════════════════════════════════════════════════
-#
-# Her [[slides.items]] bloğu bir slaytı tanımlar.
-#
-# Alanlar:
-# icon = Görsel için yukarıdaki [slides.icons] anahtarı
-# title = Slayt başlığı
-# description = Slayt açıklama metni
-# desktop = (isteğe bağlı) Yalnızca belirli masaüstünde göster.
-# Boş bırakılırsa tüm masaüstlerinde gösterilir.
-# Değerler: "xfce", "kde", "gnome", "mate", "budgie",
-# "cinnamon", "lxde", "lxqt", "lumina"
-#
-# Geliştirici notu:
-# Yeni bir slayt eklemek veya metni değiştirmek için yalnızca
-# buraya [[slides.items]] bloğu ekleyin / düzenleyin.
-# Rust koduna dokunmanıza gerek yoktur.
-# ──────────────────────────────────────────────────────────────────
-
-# ── Tüm masaüstlerinde gösterilen ortak slaytlar ──────────────────
-
-[[slides.items]]
-icon = "pisilogo"
-title = "Pisi GNU/Linux'a Hoş Geldiniz"
-description = "Pisi; hız, kararlılık ve kullanım kolaylığını bir araya getiren Türkçe destekli bir GNU/Linux dağıtımıdır."
-
-[[slides.items]]
-icon = "pisi"
-title = "PISI Paket Yöneticisi"
-description = "Binlerce pakete tek komutla erişin. `pisi install ` ile ihtiyacınız olan her şeyi kolayca kurabilirsiniz."
-
-[[slides.items]]
-icon = "community"
-title = "Topluluk Desteği"
-description = "forum.pisilinux.org adresindeki aktif topluluğumuz sorularınızı yanıtlamak için hazır. Wiki sayfalarımız da her an erişilebilir."
-
-[[slides.items]]
-icon = "pisi_speed"
-title = "Hız ve Performans"
-description = "Optimize edilmiş çekirdek ve başlangıç servisleri sayesinde PisiLinux saniyeler içinde açılır ve minimum kaynak kullanır."
-
-[[slides.items]]
-icon = "securety"
-title = "Güvenlik Önce Gelir"
-description = "Düzenli güvenlik güncellemeleri, AppArmor profilleri ve güvenli varsayılan ayarlarla sisteminizi koruyun."
-
-[[slides.items]]
-icon = "customization"
-title = "Özelleştirme"
-description = "Masaüstü ortamından tema renklerine, panel düzeninden klavye kısayollarına kadar her şeyi zevkinize göre ayarlayın."
-
-# ── XFCE ──────────────────────────────────────────────────────────
-
-[[slides.items]]
-desktop = "xfce"
-icon = "xfce"
-title = "PisiLinux XFCE"
-description = "Hafif, hızlı ve kullanıcı dostu XFCE masaüstü ortamı. Kaynak tüketimi düşük, performansı yüksektir."
-
-[[slides.items]]
-desktop = "xfce"
-icon = "xfce_panel"
-title = "XFCE Panel"
-description = "Geleneksel panel düzeni ile görev çubuğu, uygulama menüsü ve sistem tepsisi her zaman elinizin altında."
-
-[[slides.items]]
-desktop = "xfce"
-icon = "file_manager"
-title = "Thunar Dosya Yöneticisi"
-description = "Hızlı ve hafif Thunar ile dosya işlemlerinizi kolayca yapın. Ağaç görünümü, sekmeli gezinme ve özelleştirilebilir özellikler sunar."
-
-[[slides.items]]
-desktop = "xfce"
-icon = "xfce_settings"
-title = "Ayarlar Merkezi"
-description = "Klasik uygulama menüsüne modern bir alternatif. Whisker Menu ile uygulamaları kolayca bulun, favorilerinizi düzenleyin."
-
-# ── KDE Plasma ────────────────────────────────────────────────────
-
-[[slides.items]]
-desktop = "kde"
-icon = "kde"
-title = "PisiLinux KDE Plasma"
-description = "Modern, özelleştirilebilir ve güçlü KDE Plasma masaüstü ortamıyla tanışın. Her şey elinizin altında."
-
-[[slides.items]]
-desktop = "kde"
-icon = "file_manager"
-title = "Dolphin Dosya Yöneticisi"
-description = "Sekmeli gezinme, ikili panel ve güçlü arama özelliğiyle Dolphin dosyalarınızı yönetmeyi kolaylaştırır."
-
-[[slides.items]]
-desktop = "kde"
-icon = "kde_connect"
-title = "KDE Bağlan"
-description = "Telefonunuzu bilgisayarınıza bağlayın. Bildirimler, dosya aktarımı ve klipboard paylaşımı KDE Connect ile mümkün."
-
-[[slides.items]]
-desktop = "kde"
-icon = "discover"
-title = "Discover Yazılım Merkezi"
-description = "Discover ile uygulamaları görsel arayüzden kolayca bulun, kurun ve güncelleyin."
-
-# ── GNOME ─────────────────────────────────────────────────────────
-
-[[slides.items]]
-desktop = "gnome"
-icon = "gnome"
-title = "PisiLinux GNOME"
-description = "Sade ve odaklı GNOME masaüstü ortamı ile dikkat dağıtıcı unsurları azaltın, işinize konsantre olun."
-
-[[slides.items]]
-desktop = "gnome"
-icon = "gnome_search"
-title = "GNOME Arama"
-description = "Super tuşuna basıp yazmaya başlayın. Uygulama, dosya ve ayarlara anında ulaşın."
-
-[[slides.items]]
-desktop = "gnome"
-icon = "gnome_extensions"
-title = "GNOME Eklentileri"
-description = "extensions.gnome.org adresinden yüzlerce eklentiyle masaüstünüzü ihtiyaçlarınıza göre şekillendirin."
-
-# ── MATE ──────────────────────────────────────────────────────────
-
-[[slides.items]]
-desktop = "mate"
-icon = "mate"
-title = "PisiLinux MATE"
-description = "Geleneksel masaüstü düzenini sevenler için MATE. GTK+ 3 ile geliştirilmiş, modern ve akıcı bir deneyim sunar."
-
-[[slides.items]]
-desktop = "mate"
-icon = "file_manager"
-title = "Caja Dosya Yöneticisi"
-description = "MATE'in güçlü dosya yöneticisi Caja ile dosya işlemlerinizi kolayca yapın. Çift panel, sekmeli gezinme ve geniş özellikler sunar."
-
-[[slides.items]]
-desktop = "mate"
-icon = "mate_settings"
-title = "MATE Ayarları"
-description = "Görünüm, ekran, klavye ve daha fazlası için kapsamlı ayarlarla MATE masaüstünüzü özelleştirin."
-
-[[slides.items]]
-desktop = "mate"
-icon = "customization"
-title = "Zengin Uygulama Paketi"
-description = "MATE; metin editöründen görüntü görüntüleme yazılımına kadar geniş, iyi entegre edilmiş klasik uygulamalar sunar."
-
-# ── Budgie ────────────────────────────────────────────────────────
-
-[[slides.items]]
-desktop = "budgie"
-icon = "budgie"
-title = "PisiLinux Budgie"
-description = "Modern, sade ve şık Budgie masaüstü. GNOME altyapısı üzerine inşa edilmiş, kullanıcı dostudur."
-
-[[slides.items]]
-desktop = "budgie"
-icon = "budgie_applets"
-title = "Budgie Desktop Applets"
-description = "Budgie'nin panel appletleri sayesinde hava durumu, sistem izleyici, takvim gibi araçları kolayca ekleyin."
-
-[[slides.items]]
-desktop = "budgie"
-icon = "budgie_raven"
-title = "Raven Bildirim Merkezi"
-description = "Raven panelinden ses seviyesi, medya kontrolleri, bildirimler ve hızlı ayarlara erişin."
-
-[[slides.items]]
-desktop = "budgie"
-icon = "budgie_gtk_theme"
-title = "GTK Tema Desteği"
-description = "Budgie, GTK temalarını ve GNOME uygulamalarını sorunsuz çalıştırır, görsel bütünlük sağlar."
-
-# ── Cinnamon ──────────────────────────────────────────────────────
-
-[[slides.items]]
-desktop = "cinnamon"
-icon = "cinnamon"
-title = "PisiLinux Cinnamon"
-description = "Geleneksel masaüstü deneyimini modern özelliklerle birleştiren Cinnamon, güçlü ve esnek bir ortam sunar."
-
-[[slides.items]]
-desktop = "cinnamon"
-icon = "cinnamon_panel"
-title = "Cinnamon Paneli"
-description = "Panelinizi applet'ler, başlatıcılar ve sistem göstergeleriyle özelleştirin; klasik ama güçlü bir masaüstü deneyimi yaşayın."
-
-[[slides.items]]
-desktop = "cinnamon"
-icon = "cinnamon_settings"
-title = "Ayarlar Yöneticisi"
-description = "Cinnamon'un kapsamlı Ayarlar Yöneticisi aracılığıyla masaüstünüzün her yönünü özelleştirin."
-
-[[slides.items]]
-desktop = "cinnamon"
-icon = "cinnamon_desklets"
-title = "Cinnamon Desklets"
-description = "Masaüstü widget'ları ile notlar, saatler ve sistem bilgileri her zaman görünür kalsın."
-
-# ── LXQt ──────────────────────────────────────────────────────────
-
-[[slides.items]]
-desktop = "lxqt"
-icon = "lxqt"
-title = "PisiLinux LXQt"
-description = "Hafif, hızlı ve modern LXQt masaüstü ortamı. Kaynak tüketimi düşük, performansı yüksektir."
-
-[[slides.items]]
-desktop = "lxqt"
-icon = "file_manager"
-title = "LXQt Panel"
-description = "Geleneksel panel düzeni ile görev çubuğu, uygulama başlatıcı ve sistem tepsisi her zaman elinizin altında."
-
-[[slides.items]]
-desktop = "lxqt"
-icon = "file_manager"
-title = "PCManFM-Qt Dosya Yöneticisi"
-description = "Hafif ve hızlı PCManFM-Qt ile dosya işlemlerini kolayca yönetin. Sekmeli gezinme ve özelleştirilebilir arayüz sunar."
-
-# ── LXDE ──────────────────────────────────────────────────────────
-
-[[slides.items]]
-desktop = "lxde"
-icon = "lxde"
-title = "PisiLinux LXDE"
-description = "Efsanevi hafif masaüstü LXDE. Çok düşük kaynak tüketimi ve güvenilir yapısıyla tanınır."
-
-[[slides.items]]
-desktop = "lxde"
-icon = "lxde"
-title = "Openbox Tabanlı"
-description = "LXDE, Openbox pencere yöneticisini kullanır. İnce ayarlar ile akıcı bir deneyim sunar."
-
-[[slides.items]]
-desktop = "lxde"
-icon = "file_manager"
-title = "PCManFM Dosya Yöneticisi"
-description = "PCManFM, hızlı ve hafif yapısıyla dosya işlemlerinizi kolaylaştırır, ağaç görünümü ve sekme destekler."
-
-# ── Lumina ────────────────────────────────────────────────────────
-
-[[slides.items]]
-desktop = "lumina"
-icon = "lumina"
-title = "PisiLinux Lumina"
-description = "Hafif ve bağımsız Lumina masa üstü. Qt tabanlı, BSD ve Linux sistemlerde düzgün çalışan minimal bir ortam."
-
-[[slides.items]]
-desktop = "lumina"
-icon = "customization"
-title = "Tema Özelleştirme"
-description = "Lumina'nın tema sistemiyle renk şemaları ve arayüz stilini kolayca özelleştirin."
-
-
# ──────────────────────────────────────────────────────────────────
# [theme] – Arayüz renk şeması (Hex)
# ──────────────────────────────────────────────────────────────────
diff --git a/locales/en.toml b/locales/en.toml
index bb05cd3..49e88f8 100644
--- a/locales/en.toml
+++ b/locales/en.toml
@@ -98,7 +98,7 @@ finish_title = "Installation Complete"
# ── Execution (extra) ─────────────────────────────────────
install_failed = "Installation failed"
install_done = "Installation complete! Click Next to continue."
-install_current_file = "Current file"
+install_current_file = "Copy file"
retry_install = "Retry"
finish_next = "Finish →"
diff --git a/locales/tr.toml b/locales/tr.toml
index c4e97b3..1a35f20 100644
--- a/locales/tr.toml
+++ b/locales/tr.toml
@@ -97,7 +97,7 @@ finish_title = "Kurulum Tamamlandı"
# ── Execution (ek) ────────────────────────────────────────
install_failed = "Kurulum başarısız"
install_done = "Kurulum tamamlandı! Devam etmek için İleri'ye basın."
-install_current_file = "İşlemdeki dosya"
+install_current_file = "Kopyalanan dosya"
retry_install = "Yeniden Dene"
finish_next = "Tamamlandı →"
diff --git a/assets/budgie.png b/slides/img/budgie.png
similarity index 100%
rename from assets/budgie.png
rename to slides/img/budgie.png
diff --git a/assets/cinnamon.png b/slides/img/cinnamon.png
similarity index 100%
rename from assets/cinnamon.png
rename to slides/img/cinnamon.png
diff --git a/assets/community.png b/slides/img/community.png
similarity index 100%
rename from assets/community.png
rename to slides/img/community.png
diff --git a/assets/file_manager.png b/slides/img/file_manager.png
similarity index 100%
rename from assets/file_manager.png
rename to slides/img/file_manager.png
diff --git a/assets/gnome.png b/slides/img/gnome.png
similarity index 100%
rename from assets/gnome.png
rename to slides/img/gnome.png
diff --git a/assets/kde.png b/slides/img/kde.png
similarity index 100%
rename from assets/kde.png
rename to slides/img/kde.png
diff --git a/assets/lumina.png b/slides/img/lumina.png
similarity index 100%
rename from assets/lumina.png
rename to slides/img/lumina.png
diff --git a/assets/lxde.png b/slides/img/lxde.png
similarity index 100%
rename from assets/lxde.png
rename to slides/img/lxde.png
diff --git a/assets/lxqt.png b/slides/img/lxqt.png
similarity index 100%
rename from assets/lxqt.png
rename to slides/img/lxqt.png
diff --git a/assets/mate.png b/slides/img/mate.png
similarity index 100%
rename from assets/mate.png
rename to slides/img/mate.png
diff --git a/assets/pisi-software-center.png b/slides/img/pisi-software-center.png
similarity index 100%
rename from assets/pisi-software-center.png
rename to slides/img/pisi-software-center.png
diff --git a/assets/pisi_speed.png b/slides/img/pisi_speed.png
similarity index 100%
rename from assets/pisi_speed.png
rename to slides/img/pisi_speed.png
diff --git a/assets/pisilinux-logo.png b/slides/img/pisilinux-logo.png
similarity index 100%
rename from assets/pisilinux-logo.png
rename to slides/img/pisilinux-logo.png
diff --git a/assets/securety.png b/slides/img/securety.png
similarity index 100%
rename from assets/securety.png
rename to slides/img/securety.png
diff --git a/assets/xfce.png b/slides/img/xfce.png
similarity index 100%
rename from assets/xfce.png
rename to slides/img/xfce.png
diff --git a/assets/xfce_settings.png b/slides/img/xfce_settings.png
similarity index 100%
rename from assets/xfce_settings.png
rename to slides/img/xfce_settings.png
diff --git a/slides/slides_en.toml b/slides/slides_en.toml
new file mode 100644
index 0000000..f083747
--- /dev/null
+++ b/slides/slides_en.toml
@@ -0,0 +1,243 @@
+# ╔══════════════════════════════════════════════════════════════════╗
+# ║ Yali-RS — Slide Content (English) ║
+# ╚══════════════════════════════════════════════════════════════════╝
+
+# Slide transition duration (seconds)
+interval_secs = 6
+
+[[items]]
+icon = "slides/img/pisilinux-logo.png"
+title = "Welcome to Pisi GNU/Linux"
+description = "Pisi is a Turkish-supported GNU/Linux distribution that combines speed, stability, and ease of use."
+
+[[items]]
+icon = "slides/img/pisi-software-center.png"
+title = "PISI Package Manager"
+description = "Access thousands of packages with a single command. Install anything you need easily with `pisi install `."
+
+[[items]]
+icon = "slides/img/community.png"
+title = "Community Support"
+description = "Our active community at forum.pisilinux.org is ready to answer your questions. Our wiki pages are always accessible."
+
+[[items]]
+icon = "slides/img/pisi_speed.png"
+title = "Speed & Performance"
+description = "Thanks to an optimized kernel and startup services, PisiLinux boots in seconds and uses minimal resources."
+
+[[items]]
+icon = "slides/img/securety.png"
+title = "Security First"
+description = "Keep your system secure with regular security updates, AppArmor profiles, and secure default settings."
+
+[[items]]
+icon = "slides/img/customization.png"
+title = "Customization"
+description = "Tailor everything to your taste — from the desktop environment and theme colors to panel layout and keyboard shortcuts."
+
+# ── Budgie ────────────────────────────────────────────────────────
+[[items]]
+desktop = "budgie"
+icon = "slides/img/budgie.png"
+title = "PisiLinux Budgie"
+description = "A modern, clean, and elegant Budgie desktop. Built on the GNOME stack and user-friendly."
+
+[[items]]
+desktop = "budgie"
+icon = "slides/img/budgie_applets.png"
+title = "Budgie Desktop Applets"
+description = "Easily add tools like weather, system monitor, and calendar via Budgie's panel applets."
+
+[[items]]
+desktop = "budgie"
+icon = "slides/img/budgie_raven.png"
+title = "Raven Notification Center"
+description = "Access volume, media controls, notifications, and quick settings from the Raven panel."
+
+[[items]]
+desktop = "budgie"
+icon = "slides/img/budgie_gtk_theme.png"
+title = "GTK Theme Support"
+description = "Budgie runs GTK themes and GNOME applications seamlessly, ensuring visual consistency."
+
+# ── Cinnamon ──────────────────────────────────────────────────────
+[[items]]
+desktop = "cinnamon"
+icon = "slides/img/cinnamon.png"
+title = "PisiLinux Cinnamon"
+description = "Cinnamon combines the traditional desktop experience with modern features, offering a powerful and flexible environment."
+
+[[items]]
+desktop = "cinnamon"
+icon = "slides/img/cinnamon_panel.png"
+title = "Cinnamon Panel"
+description = "Customize your panel with applets, launchers, and system indicators for a classic yet powerful desktop."
+
+[[items]]
+desktop = "cinnamon"
+icon = "slides/img/cinnamon_settings.png"
+title = "Settings Manager"
+description = "Fine-tune every aspect of your Cinnamon desktop through the comprehensive Settings Manager."
+
+[[items]]
+desktop = "cinnamon"
+icon = "slides/img/cinnamon_desklets.png"
+title = "Cinnamon Desklets"
+description = "Keep notes, clocks, and system info always visible on your desktop with Cinnamon Desklets."
+
+# ── GNOME ─────────────────────────────────────────────────────────
+[[items]]
+desktop = "gnome"
+icon = "slides/img/gnome.png"
+title = "PisiLinux GNOME"
+description = "Reduce distractions and focus on your work with the clean and focused GNOME desktop environment."
+
+[[items]]
+desktop = "gnome"
+icon = "slides/img/gnome_search.png"
+title = "GNOME Search"
+description = "Press the Super key and start typing. Instantly reach applications, files, and settings."
+
+[[items]]
+desktop = "gnome"
+icon = "slides/img/gnome_extensions.png"
+title = "GNOME Extensions"
+description = "Shape your desktop to your needs with hundreds of extensions from extensions.gnome.org."
+
+# ── KDE ───────────────────────────────────────────────────────────
+[[items]]
+desktop = "kde"
+icon = "slides/img/kde.png"
+title = "PisiLinux KDE Plasma"
+description = "Meet the modern, customizable, and powerful KDE Plasma desktop. Everything is at your fingertips."
+
+[[items]]
+desktop = "kde"
+icon = "slides/img/file_manager.png"
+title = "Dolphin File Manager"
+description = "Dolphin makes managing your files easy with tabbed browsing, dual-panel view, and powerful search."
+
+[[items]]
+desktop = "kde"
+icon = "slides/img/kde_connect.png"
+title = "KDE Connect"
+description = "Connect your phone to your computer. Notifications, file transfer, and clipboard sharing — all with KDE Connect."
+
+[[items]]
+desktop = "kde"
+icon = "slides/img/discover.png"
+title = "Discover Software Center"
+description = "Easily find, install, and update applications from the visual interface with Discover."
+
+# ── LXQt ──────────────────────────────────────────────────────────
+[[items]]
+desktop = "lxqt"
+icon = "slides/img/lxqt.png"
+title = "PisiLinux LXQt"
+description = "A lightweight, fast, and modern LXQt desktop environment. Low resource consumption, high performance."
+
+[[items]]
+desktop = "lxqt"
+icon = "slides/img/lxqt_panel.png"
+title = "LXQt Panel"
+description = "The traditional panel layout puts the taskbar, application launcher, and system tray always within reach."
+
+[[items]]
+desktop = "lxqt"
+icon = "slides/img/file_manager.png"
+title = "PCManFM-Qt File Manager"
+description = "Manage files effortlessly with the lightweight and fast PCManFM-Qt. Tabbed navigation and a customizable interface."
+
+# ── LXDE ──────────────────────────────────────────────────────────
+[[items]]
+desktop = "lxde"
+icon = "slides/img/lxde.png"
+title = "PisiLinux LXDE"
+description = "The legendary lightweight LXDE desktop. Known for extremely low resource usage and a reliable build."
+
+[[items]]
+desktop = "lxde"
+icon = "slides/img/lxde_openbox.png"
+title = "Openbox-Based"
+description = "LXDE uses the Openbox window manager. Fine-tune it for a smooth and responsive experience."
+
+[[items]]
+desktop = "lxde"
+icon = "slides/img/file_manager.png"
+title = "PCManFM File Manager"
+description = "PCManFM speeds up your file operations with its fast and lightweight build, supporting tree view and tabs."
+
+# ── Lumina ────────────────────────────────────────────────────────
+[[items]]
+desktop = "lumina"
+icon = "slides/img/lumina.png"
+title = "PisiLinux Lumina"
+description = "A lightweight and independent Lumina desktop. Qt-based, designed to run cleanly on BSD and Linux systems."
+
+[[items]]
+desktop = "lumina"
+icon = "slides/img/lumina_applications.png"
+title = "Application Support"
+description = "Lumina works well with core utilities and many popular Qt apps, providing a practical everyday experience."
+
+[[items]]
+desktop = "lumina"
+icon = "slides/img/lumina_theme.png"
+title = "Theme Customization"
+description = "Easily customize color schemes and interface styles with Lumina's flexible theme system."
+
+[[items]]
+desktop = "lumina"
+icon = "slides/img/lumina_panel.png"
+title = "Lumina Panel"
+description = "A clean panel with a taskbar, application launcher, and system tray keeps your desktop organized."
+
+# ── MATE ──────────────────────────────────────────────────────────
+[[items]]
+desktop = "mate"
+icon = "slides/img/mate.png"
+title = "PisiLinux MATE"
+description = "MATE for those who love the traditional desktop layout. Developed with GTK+ 3 for a modern and smooth experience."
+
+[[items]]
+desktop = "mate"
+icon = "slides/img/file_manager.png"
+title = "Caja File Manager"
+description = "Manage your files easily with MATE's powerful Caja. Dual panel, tabbed navigation, and rich features."
+
+[[items]]
+desktop = "mate"
+icon = "slides/img/mate_settings.png"
+title = "MATE Settings"
+description = "Customize your MATE desktop with comprehensive settings for appearance, display, keyboard, and more."
+
+[[items]]
+desktop = "mate"
+icon = "slides/img/mate_applications.png"
+title = "Rich Application Suite"
+description = "MATE comes with a rich set of classic applications — from text editors to image viewers, all well-integrated."
+
+# ── XFCE ──────────────────────────────────────────────────────────
+[[items]]
+desktop = "xfce"
+icon = "slides/img/xfce.png"
+title = "PisiLinux XFCE"
+description = "A lightweight, fast, and user-friendly XFCE desktop environment. Low resource consumption, high performance."
+
+[[items]]
+desktop = "xfce"
+icon = "slides/img/xfce_panel.png"
+title = "XFCE Panel"
+description = "The traditional panel layout puts the taskbar, application menu, and system tray always within reach."
+
+[[items]]
+desktop = "xfce"
+icon = "slides/img/file_manager.png"
+title = "Thunar File Manager"
+description = "Manage your files easily with the fast and lightweight Thunar. Tree view, tabbed navigation, and customizable features."
+
+[[items]]
+desktop = "xfce"
+icon = "slides/img/xfce_settings.png"
+title = "Whisker Menu"
+description = "A modern alternative to the classic application menu. Find apps easily and organize your favorites with Whisker Menu."
diff --git a/slides/slides_tr.toml b/slides/slides_tr.toml
new file mode 100644
index 0000000..942629e
--- /dev/null
+++ b/slides/slides_tr.toml
@@ -0,0 +1,240 @@
+# ╔══════════════════════════════════════════════════════════════════╗
+# ║ Yali-RS — Slayt İçerikleri (Türkçe) ║
+# ╚══════════════════════════════════════════════════════════════════╝
+
+# Slayt geçiş süresi (saniye)
+interval_secs = 6
+
+[[items]]
+icon = "slides/img/pisilinux-logo.png"
+title = "Pisi GNU/Linux'a Hoş Geldiniz"
+description = "Pisi; hız, kararlılık ve kullanım kolaylığını bir araya getiren Türkçe destekli bir GNU/Linux dağıtımıdır."
+
+[[items]]
+icon = "slides/img/pisi-software-center.png"
+title = "PISI Paket Yöneticisi"
+description = "Binlerce pakete tek komutla erişin. `pisi install ` ile ihtiyacınız olan her şeyi kolayca kurabilirsiniz."
+
+[[items]]
+icon = "slides/img/community.png"
+title = "Topluluk Desteği"
+description = "forum.pisilinux.org adresindeki aktif topluluğumuz sorularınızı yanıtlamak için hazır. Wiki sayfalarımız da her an erişilebilir."
+
+[[items]]
+icon = "slides/img/pisi_speed.png"
+title = "Hız ve Performans"
+description = "Optimize edilmiş çekirdek ve başlangıç servisleri sayesinde PisiLinux saniyeler içinde açılır ve minimum kaynak kullanır."
+
+[[items]]
+icon = "slides/img/securety.png"
+title = "Güvenlik Önce Gelir"
+description = "Düzenli güvenlik güncellemeleri, AppArmor profilleri ve güvenli varsayılan ayarlarla sisteminizi koruyun."
+
+[[items]]
+icon = "slides/img/customization.png"
+title = "Özelleştirme"
+description = "Masaüstü ortamından tema renklerine, panel düzeninden klavye kısayollarına kadar her şeyi zevkinize göre ayarlayın."
+
+# ── XFCE ──────────────────────────────────────────────────────────
+
+[[items]]
+desktop = "xfce"
+icon = "slides/img/xfce.png"
+title = "PisiLinux XFCE"
+description = "Hafif, hızlı ve kullanıcı dostu XFCE masaüstü ortamı. Kaynak tüketimi düşük, performansı yüksektir."
+
+[[items]]
+desktop = "xfce"
+icon = "slides/img/xfce_panel.png"
+title = "XFCE Panel"
+description = "Geleneksel panel düzeni ile görev çubuğu, uygulama menüsü ve sistem tepsisi her zaman elinizin altında."
+
+[[items]]
+desktop = "xfce"
+icon = "slides/img/file_manager.png"
+title = "Thunar Dosya Yöneticisi"
+description = "Hızlı ve hafif Thunar ile dosya işlemlerinizi kolayca yapın. Ağaç görünümü, sekmeli gezinme ve özelleştirilebilir özellikler sunar."
+
+[[items]]
+desktop = "xfce"
+icon = "slides/img/xfce_settings.png"
+title = "Ayarlar Merkezi"
+description = "Klasik uygulama menüsüne modern bir alternatif. Whisker Menu ile uygulamaları kolayca bulun, favorilerinizi düzenleyin."
+
+# ── KDE Plasma ────────────────────────────────────────────────────
+
+[[items]]
+desktop = "kde"
+icon = "slides/img/kde.png"
+title = "PisiLinux KDE Plasma"
+description = "Modern, özelleştirilebilir ve güçlü KDE Plasma masaüstü ortamıyla tanışın. Her şey elinizin altında."
+
+[[items]]
+desktop = "kde"
+icon = "slides/img/file_manager.png"
+title = "Dolphin Dosya Yöneticisi"
+description = "Sekmeli gezinme, ikili panel ve güçlü arama özelliğiyle Dolphin dosyalarınızı yönetmeyi kolaylaştırır."
+
+[[items]]
+desktop = "kde"
+icon = "slides/img/kde_connect.png"
+title = "KDE Bağlan"
+description = "Telefonunuzu bilgisayarınıza bağlayın. Bildirimler, dosya aktarımı ve klipboard paylaşımı KDE Connect ile mümkün."
+
+[[items]]
+desktop = "kde"
+icon = "slides/img/discover.png"
+title = "Discover Yazılım Merkezi"
+description = "Discover ile uygulamaları görsel arayüzden kolayca bulun, kurun ve güncelleyin."
+
+# ── GNOME ─────────────────────────────────────────────────────────
+
+[[items]]
+desktop = "gnome"
+icon = "slides/img/gnome.png"
+title = "PisiLinux GNOME"
+description = "Sade ve odaklı GNOME masaüstü ortamı ile dikkat dağıtıcı unsurları azaltın, işinize konsantre olun."
+
+[[items]]
+desktop = "gnome"
+icon = "slides/img/gnome_search.png"
+title = "GNOME Arama"
+description = "Super tuşuna basıp yazmaya başlayın. Uygulama, dosya ve ayarlara anında ulaşın."
+
+[[items]]
+desktop = "gnome"
+icon = "slides/img/gnome_extensions.png"
+title = "GNOME Eklentileri"
+description = "extensions.gnome.org adresinden yüzlerce eklentiyle masaüstünüzü ihtiyaçlarınıza göre şekillendirin."
+
+# ── MATE ──────────────────────────────────────────────────────────
+
+[[items]]
+desktop = "mate"
+icon = "slides/img/mate.png"
+title = "PisiLinux MATE"
+description = "Geleneksel masaüstü düzenini sevenler için MATE. GTK+ 3 ile geliştirilmiş, modern ve akıcı bir deneyim sunar."
+
+[[items]]
+desktop = "mate"
+icon = "slides/img/file_manager.png"
+title = "Caja Dosya Yöneticisi"
+description = "MATE'in güçlü dosya yöneticisi Caja ile dosya işlemlerinizi kolayca yapın. Çift panel, sekmeli gezinme ve geniş özellikler sunar."
+
+[[items]]
+desktop = "mate"
+icon = "slides/img/mate_settings.png"
+title = "MATE Ayarları"
+description = "Görünüm, ekran, klavye ve daha fazlası için kapsamlı ayarlarla MATE masaüstünüzü özelleştirin."
+
+[[items]]
+desktop = "mate"
+icon = "slides/img/customization.png"
+title = "Zengin Uygulama Paketi"
+description = "MATE; metin editöründen görüntü görüntüleme yazılımına kadar geniş, iyi entegre edilmiş klasik uygulamalar sunar."
+
+# ── Budgie ────────────────────────────────────────────────────────
+
+[[items]]
+desktop = "budgie"
+icon = "slides/img/budgie.png"
+title = "PisiLinux Budgie"
+description = "Modern, sade ve şık Budgie masaüstü. GNOME altyapısı üzerine inşa edilmiş, kullanıcı dostudur."
+
+[[items]]
+desktop = "budgie"
+icon = "slides/img/budgie_applets.png"
+title = "Budgie Desktop Applets"
+description = "Budgie'nin panel appletleri sayesinde hava durumu, sistem izleyici, takvim gibi araçları kolayca ekleyin."
+
+[[items]]
+desktop = "budgie"
+icon = "slides/img/budgie_raven.png"
+title = "Raven Bildirim Merkezi"
+description = "Raven panelinden ses seviyesi, medya kontrolleri, bildirimler ve hızlı ayarlara erişin."
+
+[[items]]
+desktop = "budgie"
+icon = "slides/img/budgie_gtk_theme.png"
+title = "GTK Tema Desteği"
+description = "Budgie, GTK temalarını ve GNOME uygulamalarını sorunsuz çalıştırır, görsel bütünlük sağlar."
+
+# ── Cinnamon ──────────────────────────────────────────────────────
+
+[[items]]
+desktop = "cinnamon"
+icon = "slides/img/cinnamon.png"
+title = "PisiLinux Cinnamon"
+description = "Geleneksel masaüstü deneyimini modern özelliklerle birleştiren Cinnamon, güçlü ve esnek bir ortam sunar."
+
+[[items]]
+desktop = "cinnamon"
+icon = "slides/img/cinnamon_panel.png"
+title = "Cinnamon Paneli"
+description = "Panelinizi applet'ler, başlatıcılar ve sistem göstergeleriyle özelleştirin; klasik ama güçlü bir masaüstü deneyimi yaşayın."
+
+[[items]]
+desktop = "cinnamon"
+icon = "slides/img/cinnamon_settings.png"
+title = "Ayarlar Yöneticisi"
+description = "Cinnamon'un kapsamlı Ayarlar Yöneticisi aracılığıyla masaüstünüzün her yönünü özelleştirin."
+
+[[items]]
+desktop = "cinnamon"
+icon = "slides/img/cinnamon_desklets.png"
+title = "Cinnamon Desklets"
+description = "Masaüstü widget'ları ile notlar, saatler ve sistem bilgileri her zaman görünür kalsın."
+
+# ── LXQt ──────────────────────────────────────────────────────────
+
+[[items]]
+desktop = "lxqt"
+icon = "slides/img/lxqt.png"
+title = "PisiLinux LXQt"
+description = "Hafif, hızlı ve modern LXQt masaüstü ortamı. Kaynak tüketimi düşük, performansı yüksektir."
+
+[[items]]
+desktop = "lxqt"
+icon = "slides/img/file_manager.png"
+title = "LXQt Panel"
+description = "Geleneksel panel düzeni ile görev çubuğu, uygulama başlatıcı ve sistem tepsisi her zaman elinizin altında."
+
+[[items]]
+desktop = "lxqt"
+icon = "slides/img/file_manager.png"
+title = "PCManFM-Qt Dosya Yöneticisi"
+description = "Hafif ve hızlı PCManFM-Qt ile dosya işlemlerini kolayca yönetin. Sekmeli gezinme ve özelleştirilebilir arayüz sunar."
+
+# ── LXDE ──────────────────────────────────────────────────────────
+
+[[items]]
+desktop = "lxde"
+icon = "slides/img/lxde.png"
+title = "PisiLinux LXDE"
+description = "Efsanevi hafif masaüstü LXDE. Çok düşük kaynak tüketimi ve güvenilir yapısıyla tanınır."
+
+[[items]]
+desktop = "lxde"
+icon = "slides/img/lxde.png"
+title = "Openbox Tabanlı"
+description = "LXDE, Openbox pencere yöneticisini kullanır. İnce ayarlar ile akıcı bir deneyim sunar."
+
+[[items]]
+desktop = "lxde"
+icon = "slides/img/file_manager.png"
+title = "PCManFM Dosya Yöneticisi"
+description = "PCManFM, hızlı ve hafif yapısıyla dosya işlemlerinizi kolaylaştırır, ağaç görünümü ve sekme destekler."
+
+# ── Lumina ────────────────────────────────────────────────────────
+
+[[items]]
+desktop = "lumina"
+icon = "slides/img/lumina.png"
+title = "PisiLinux Lumina"
+description = "Hafif ve bağımsız Lumina masa üstü. Qt tabanlı, BSD ve Linux sistemlerde düzgün çalışan minimal bir ortam."
+
+[[items]]
+desktop = "lumina"
+icon = "slides/img/customization.png"
+title = "Tema Özelleştirme"
+description = "Lumina'nın tema sistemiyle renk şemaları ve arayüz stilini kolayca özelleştirin."
diff --git a/src/bin/slides_test.rs b/src/bin/slides_test.rs
new file mode 100644
index 0000000..8524a8a
--- /dev/null
+++ b/src/bin/slides_test.rs
@@ -0,0 +1,83 @@
+//! Slayt gösterisini test etmek için bağımsız GUI binary'si.
+//!
+//! Gerçek kurulum ekranındaki slideshow boyutlarında ve konumda görüntüler.
+//!
+//! Kullanım:
+//! cargo run --bin slides_test [desktop] [lang]
+//!
+//! desktop: "default" (varsayılan), "kde", "gnome", "xfce", "mate" vb.
+//! lang: "tr", "en" (varsayılan), "de" vb. — branding_{lang}.toml yüklenir
+
+use eframe::egui;
+
+fn main() -> eframe::Result<()> {
+ let args: Vec = std::env::args().collect();
+ let desktop = args.get(1).cloned().unwrap_or_else(|| "default".to_string());
+ let lang = args.get(2).cloned().unwrap_or_else(|| "tr".to_string());
+
+ let options = eframe::NativeOptions {
+ viewport: egui::ViewportBuilder::default()
+ .with_inner_size([1200.0, 900.0])
+ .with_min_inner_size([1080.0, 720.0])
+ .with_title(format!("Slides Test - {} ({})", desktop, lang)),
+ ..Default::default()
+ };
+
+ eframe::run_native(
+ "Slideshow Test",
+ options,
+ Box::new(move |cc| {
+ egui_extras::install_image_loaders(&cc.egui_ctx);
+
+ let branding = yali_rs::branding::BrandingConfig::load_for_lang(&lang);
+ let icons: std::collections::HashMap = branding.slides.icons
+ .iter()
+ .map(|(k, v)| (k.clone(), yali_rs::branding::path_to_file_uri(v)))
+ .collect();
+
+ Box::new(SlidesApp {
+ slideshow: yali_rs::ui::slideshow::Slideshow::new(
+ &desktop,
+ icons,
+ branding.slides.items.clone(),
+ ),
+ })
+ }),
+ )
+}
+
+struct SlidesApp {
+ slideshow: yali_rs::ui::slideshow::Slideshow,
+}
+
+impl eframe::App for SlidesApp {
+ fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
+ egui::CentralPanel::default()
+ .frame(egui::Frame::none().fill(yali_rs::ui::theme::c_bg_dark()))
+ .show(ctx, |ui| {
+ let available_w = ui.available_width();
+ let available_h = ui.available_height();
+ let slide_h = (available_h * 0.45).max(280.0);
+
+ ui.allocate_ui(egui::vec2(available_w, slide_h), |ui| {
+ ui.vertical(|ui| {
+ ui.add_space(8.0);
+ yali_rs::ui::theme::section_heading(ui, "Slideshow Test");
+ ui.label(
+ egui::RichText::new("Gerçek kurulum boyutlarında slayt gösterisi")
+ .color(yali_rs::ui::theme::c_text_dim())
+ .size(13.0),
+ );
+ ui.add_space(16.0);
+
+ self.slideshow.show(ui);
+ ui.add_space(10.0);
+ ui.horizontal(|ui| {
+ if ui.small_button("‹").clicked() { self.slideshow.previous(); }
+ if ui.small_button("›").clicked() { self.slideshow.advance(); }
+ });
+ });
+ });
+ });
+ }
+}
\ No newline at end of file
diff --git a/src/branding.rs b/src/branding.rs
index 98c9be3..981a1ee 100644
--- a/src/branding.rs
+++ b/src/branding.rs
@@ -161,34 +161,87 @@ impl BrandingConfig {
"/usr/share/yali/branding.toml",
"branding.toml",
];
+ let mut config = BrandingConfig::default();
for path in &paths {
if let Ok(content) = std::fs::read_to_string(path) {
match toml::from_str(&content) {
- Ok(cfg) => return cfg,
+ Ok(cfg) => { config = cfg; break; }
Err(e) => eprintln!("[branding] {}: {}", path, e),
}
}
}
- BrandingConfig::default()
+
+ // slides/slides.toml varsa onu da yükle (öncelikli)
+ if let Some(content) = std::fs::read_to_string("slides/slides.toml").ok() {
+ if let Ok(slides) = toml::from_str::(&content) {
+ if !slides.icons.is_empty() {
+ config.slides.icons = slides.icons;
+ }
+ if !slides.items.is_empty() {
+ config.slides.items = slides.items;
+ }
+ if slides.interval_secs > 0 {
+ config.slides.interval_secs = slides.interval_secs;
+ }
+ }
+ }
+
+ config
}
/// Belirtilen dile ait `branding_{lang}.toml` dosyasını arar ve yükler.
/// Bulunamazsa varsayılan `branding.toml` dosyasına geri döner.
+ /// Yükleme sonrası `slides/slides_{lang}.toml` varsa slides verilerini da buradan alır.
pub fn load_for_lang(lang: &str) -> Self {
- let lang_paths = [
- format!("/etc/yali/branding_{}.toml", lang),
- format!("/usr/share/yali/branding_{}.toml", lang),
- format!("branding_{}.toml", lang),
+ let mut config = {
+ let lang_paths = [
+ format!("/etc/yali/branding_{}.toml", lang),
+ format!("/usr/share/yali/branding_{}.toml", lang),
+ format!("branding_{}.toml", lang),
+ ];
+ let mut found = None;
+ for path in &lang_paths {
+ if let Ok(content) = std::fs::read_to_string(path) {
+ match toml::from_str(&content) {
+ Ok(cfg) => { found = Some(cfg); break; }
+ Err(e) => eprintln!("[branding] {}: {}", path, e),
+ }
+ }
+ }
+ found.unwrap_or_else(Self::load)
+ };
+
+ // Harici slides dosyasını dene (slides/slides_{lang}.toml)
+ if let Some(slides) = Self::load_external_slides(lang) {
+ if !slides.icons.is_empty() {
+ config.slides.icons = slides.icons;
+ }
+ if !slides.items.is_empty() {
+ config.slides.items = slides.items;
+ }
+ if slides.interval_secs > 0 {
+ config.slides.interval_secs = slides.interval_secs;
+ }
+ }
+
+ config
+ }
+
+ /// `slides/slides_{lang}.toml` veya `slides/slides.toml` dosyasını yükler.
+ fn load_external_slides(lang: &str) -> Option {
+ let paths = [
+ format!("slides/slides_{}.toml", lang),
+ "slides/slides.toml".to_string(),
];
- for path in &lang_paths {
+ for path in &paths {
if let Ok(content) = std::fs::read_to_string(path) {
match toml::from_str(&content) {
- Ok(cfg) => return cfg,
- Err(e) => eprintln!("[branding] {}: {}", path, e),
+ Ok(cfg) => return Some(cfg),
+ Err(e) => eprintln!("[slides] {}: {}", path, e),
}
}
}
- Self::load()
+ None
}
/// İkon adına göre dosya yolunu döner.
diff --git a/src/jobs/mod.rs b/src/jobs/mod.rs
index 740090b..f3b0d7d 100644
--- a/src/jobs/mod.rs
+++ b/src/jobs/mod.rs
@@ -11,7 +11,6 @@
//! UI'nin hemen güncellenmesi sağlanır.
-use std::path::Path;
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::mpsc;
use tokio::io::{AsyncBufReadExt, BufReader};
@@ -182,9 +181,40 @@ impl Job for CopyFilesJob {
let is_root_source = self.source.trim_end_matches('/') == "";
+ // ── Önce find ile toplam dosya sayısını bul ──────────
+ let find_path = self.source.trim_end_matches('/');
+ let find_path = if find_path.is_empty() { "/" } else { find_path };
+ let total_files = {
+ let mut cmd = Command::new("find");
+ cmd.arg(find_path).arg("-type").arg("f");
+ if is_root_source {
+ cmd.arg("-xdev");
+ }
+ cmd.stdout(std::process::Stdio::piped());
+ cmd.stderr(std::process::Stdio::null());
+ match cmd.spawn() {
+ Ok(mut c) => {
+ let stdout = c.stdout.take()
+ .ok_or_else(|| "find stdout alınamadı".to_string())?;
+ let r = BufReader::new(stdout);
+ let mut lines = r.lines();
+ let mut n: u64 = 0;
+ while let Ok(Some(_)) = lines.next_line().await {
+ n += 1;
+ }
+ let _ = c.wait().await;
+ // if n > 0 {
+ // ui.log(format!("{} dosya bulundu", n));
+ // }
+ n
+ }
+ Err(_) => 0
+ }
+ };
+
let mut args: Vec = vec![
"-aAXH".to_string(),
- "--info=progress2".to_string(),
+ "--out-format=%n".to_string(),
"--exclude=/proc/**".to_string(),
"--exclude=/sys/**".to_string(),
"--exclude=/dev/**".to_string(),
@@ -242,19 +272,8 @@ impl Job for CopyFilesJob {
return Ok(());
}
- // rsync çıktısı pipe'a yönlendirilince tam tamponlu (fully buffered) olur,
- // bu da progress çıktısının gerçek zamanlı gelmemesine yol açar.
- // stdbuf -eL ile stderr'i satır tamponlu (line-buffered) yapıyoruz.
- let (program, final_args) = if Path::new("/usr/bin/stdbuf").exists() {
- let mut a = vec!["-eL".to_string(), "rsync".to_string()];
- a.extend(args);
- ("stdbuf", a)
- } else {
- ("rsync", args)
- };
-
- let mut child = Command::new(program)
- .args(&final_args)
+ let mut child = Command::new("rsync")
+ .args(&args)
.stdout(std::process::Stdio::piped())
.stderr(std::process::Stdio::piped())
.spawn()
@@ -265,90 +284,38 @@ impl Job for CopyFilesJob {
let stderr = child.stderr.take()
.ok_or_else(|| "rsync stderr alınamadı".to_string())?;
- // Stderr'i arka planda okuyarak tamponun dolmasını ve rsync'in kilitlenmesini engelliyoruz.
- let stderr_err_accumulator = std::sync::Arc::new(tokio::sync::Mutex::new(String::new()));
- let stderr_accumulator_clone = stderr_err_accumulator.clone();
+ // Stderr'i arka planda oku (hata birikimi ve tampon taşmasını engelle)
+ let stderr_buf = std::sync::Arc::new(tokio::sync::Mutex::new(String::new()));
+ let stderr_buf_clone = stderr_buf.clone();
tokio::spawn(async move {
- let reader = BufReader::new(stderr);
- let mut lines = reader.lines();
- while let Ok(Some(line)) = lines.next_line().await {
- let mut accum = stderr_accumulator_clone.lock().await;
- accum.push_str(&line);
- accum.push('\n');
+ let r = BufReader::new(stderr);
+ let mut lines = r.lines();
+ while let Ok(Some(l)) = lines.next_line().await {
+ let mut b = stderr_buf_clone.lock().await;
+ b.push_str(&l);
+ b.push('\n');
}
});
+ // Stdout: --out-format=%n ile her satır bir dosya adı
let reader = BufReader::new(stdout);
let mut lines = reader.lines();
+ let mut file_count: u64 = 0;
while let Some(line) = lines.next_line().await
.map_err(|e| format!("rsync çıktısı okunamadı: {}", e))?
{
- // Pipe'a yönlendirilince rsync satırbaşı (\r) içerebilir.
- // Önce \r karakterlerini temizle, sonra trim yap.
- let cleaned: String = line.chars()
- .filter(|&c| c != '\r')
- .collect();
- let trimmed = cleaned.trim().to_string();
-
+ let trimmed = line.trim().to_string();
if trimmed.is_empty() {
continue;
}
- // ── 1) Progress satırı mı? ──────────────────────────
- // rsync --info=progress2 format (pipe yoluyla):
- // " 1,024 100% 512.00kB/s 0:00:00 (xfr#5, to-chk=99/105)"
- // " 3.456M 67% 5.12MB/s 0:00:01 (xfr#17, to-chk=83/105)"
- // (xfr# ve to-chk= varsa progress satırıdır)
- if trimmed.contains("xfr#") && trimmed.contains("to-chk=") {
- // xfr# değerini çıkar
- let xfr = if let Some(pos) = trimmed.find("xfr#") {
- let after = &trimmed[pos + 4..];
- let end = after.find(|c: char| !c.is_ascii_digit()).unwrap_or(after.len());
- after[..end].parse::().unwrap_or(0)
- } else { 0 };
+ file_count += 1;
+ ui.current_file(trimmed);
- // to-chk= içinden total değerini çıkar
- let total = if let Some(pos) = trimmed.find("to-chk=") {
- let after = &trimmed[pos + 7..];
- let slash_pos = after.find('/');
- if let Some(sp) = slash_pos {
- let after_slash = &after[sp + 1..];
- let end = after_slash.find(|c: char| !c.is_ascii_digit()).unwrap_or(after_slash.len());
- after_slash[..end].parse::().unwrap_or(1)
- } else { 1 }
- } else { 1 };
-
- if total > 0 {
- let p = (xfr as f32) / (total as f32);
- ui.sub_progress(p.min(1.0));
- }
- continue;
- }
-
- // ── 2) Progress satırının ilk kısmı mı? (sayı + yüzde ile başlayan) ──
- // rsync pipe çıktısı bazen iki satıra bölünebilir:
- // " 1,024 100% 512.00kB/s 0:00:00"
- // " (xfr#5, to-chk=99/105)"
- // Bu durumda ilk satırda sadece sayı/yüzde/hız bilgisi vardır, atla.
- {
- let first = trimmed.chars().next().unwrap_or(' ');
- if first.is_ascii_digit() || first == ' ' {
- // Sayı veya boşlukla başlayıp xfr içermiyorsa progress'in devamıdır
- continue;
- }
- }
-
- // ── 3) Gerçek dosya adı ──────────────────────────────
- // rsync --out-format kullanılmadığında dosya adları da stderr'e
- // göreceli yol olarak yazılır: "etc/passwd", "usr/share/doc/..."
- // Bunlar genellikle '.' '/' veya harf ile başlar, sayı ile başlamaz.
- // progress satırı olmadığına göre bu bir dosya adıdır.
- if trimmed.len() > 3 && !trimmed.starts_with('[') && !trimmed.contains("sending incremental")
- && !trimmed.contains("building file list") && !trimmed.contains("done")
- && !trimmed.contains("sent ") && !trimmed.contains("total size")
- {
- ui.current_file(trimmed);
+ if total_files > 0 {
+ let p = (file_count as f32) / (total_files as f32);
+ ui.sub_progress(p.min(1.0));
}
}
@@ -356,11 +323,11 @@ impl Job for CopyFilesJob {
.map_err(|e| format!("rsync beklenemedi: {}", e))?;
if !status.success() {
- let stderr_content = stderr_err_accumulator.lock().await.clone();
+ let err = stderr_buf.lock().await.clone();
return Err(format!(
"rsync çıkış kodu: {:?}. Hata: {}",
status.code(),
- stderr_content.trim()
+ err.trim()
));
}
diff --git a/src/lib.rs b/src/lib.rs
new file mode 100644
index 0000000..3d83c3c
--- /dev/null
+++ b/src/lib.rs
@@ -0,0 +1,9 @@
+pub mod installer;
+pub mod steps;
+pub mod jobs;
+pub mod ui;
+pub mod autoinstall;
+pub mod branding;
+pub mod funct;
+
+rust_i18n::i18n!("locales");
\ No newline at end of file
diff --git a/src/main.rs b/src/main.rs
index ef62488..3497e6b 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -188,8 +188,14 @@ fn run_auto_install(path: &str, demo_mode: bool) -> eframe::Result<()> {
print!("\r {}: [{:50}] {:.0}%", t!("progress"), "=".repeat((p * 50.0) as usize), p * 100.0);
let _ = std::io::Write::flush(&mut std::io::stdout());
}
- Ok(InstallMessage::SubProgress(_)) => {}
- Ok(InstallMessage::CurrentFile(_)) => {}
+ Ok(InstallMessage::SubProgress(p)) => {
+ print!("\r {}: [{:50}] {:.0}% ", t!("progress"), "=".repeat((p * 50.0) as usize), p * 100.0);
+ let _ = std::io::Write::flush(&mut std::io::stdout());
+ }
+ Ok(InstallMessage::CurrentFile(f)) => {
+ print!("\r {}: {} ", t!("install_current_file"), f);
+ let _ = std::io::Write::flush(&mut std::io::stdout());
+ }
Ok(InstallMessage::Done) => {
println!("\n\n{}: {}", t!("installation_done"), t!("installation_done_description"));
break;
diff --git a/src/steps/execution.rs b/src/steps/execution.rs
index 6663d4b..0308ea0 100644
--- a/src/steps/execution.rs
+++ b/src/steps/execution.rs
@@ -178,10 +178,6 @@ impl InstallerStep for ExecutionStep {
loop {
match rx.try_recv() {
Ok(InstallMessage::Log(line)) => {
- if line.starts_with('▶') {
- state.install_sub_progress = 0.0;
- state.install_current_file = None;
- }
state.install_log.push(line);
}
Ok(InstallMessage::Progress(p)) => {
@@ -272,7 +268,8 @@ impl InstallerStep for ExecutionStep {
// İlerleme çubuğu
let running = !self.finished
- && self.error_screen.is_none();
+ && self.error_screen.is_none()
+ && state.install_progress > 0.0;
egui::Frame::none()
.fill(theme::c_bg_widget())
@@ -280,25 +277,46 @@ impl InstallerStep for ExecutionStep {
.inner_margin(egui::Margin::same(12.0))
.show(ui, |ui| {
ui.set_width(available_w - 4.0);
-
- // Yüzde + adım etiketi
let step_label = state.install_log.last()
.cloned()
.unwrap_or_default();
- ui.horizontal(|ui| {
- ui.label(
- egui::RichText::new(
- format!("{:.0}%", state.install_progress * 100.0)
- )
- .strong()
- .color(theme::c_accent()),
+ ui.label(
+ egui::RichText::new(&step_label)
+ .size(12.0)
+ .color(theme::c_text_dim()),
+ );
+
+ let pct = format!("{:.0}%", state.install_progress * 100.0);
+ let bar = ui.add(
+ egui::ProgressBar::new(state.install_progress)
+ .animate(running)
+ .desired_height(20.0),
+ );
+ ui.painter().text(
+ bar.rect.center(),
+ egui::Align2::CENTER_CENTER,
+ pct,
+ egui::FontId::proportional(14.0),
+ theme::c_text(),
+ );
+
+ if state.install_sub_progress > 0.0 {
+ let sub_pct = format!("{:.0}%", state.install_sub_progress * 100.0);
+ ui.add_space(4.0);
+ let sub_bar = ui.add(
+ egui::ProgressBar::new(state.install_sub_progress)
+ .animate(running)
+ .desired_height(20.0)
+ .fill(theme::c_accent_dim()),
);
- ui.label(
- egui::RichText::new(&step_label)
- .size(12.0)
- .color(theme::c_text_dim()),
+ ui.painter().text(
+ sub_bar.rect.center(),
+ egui::Align2::CENTER_CENTER,
+ sub_pct,
+ egui::FontId::proportional(12.0),
+ theme::c_text(),
);
- });
+ }
if let Some(ref current_file) = state.install_current_file {
ui.add_space(4.0);
@@ -308,21 +326,6 @@ impl InstallerStep for ExecutionStep {
.color(theme::c_text_dim()),
);
}
-
- ui.add_space(4.0);
- ui.add(
- egui::ProgressBar::new(state.install_progress)
- .animate(running)
- .desired_height(10.0),
- );
-
- ui.add_space(4.0);
- ui.add(
- egui::ProgressBar::new(state.install_sub_progress)
- .animate(running)
- .desired_height(6.0)
- .fill(theme::c_accent_dim()),
- );
});
// Durum etiketi
diff --git a/src/steps/partition.rs b/src/steps/partition.rs
index 4fd7b8d..e595ecd 100644
--- a/src/steps/partition.rs
+++ b/src/steps/partition.rs
@@ -3,7 +3,7 @@
use eframe::egui;
use rust_i18n::t;
use crate::ui::theme;
-use crate::funct::{form_label, form_input_text};
+use crate::funct::form_label;
// sysinfo::Disks mount point başına bir kayıt döndürür (partition'lar),
// ham disk listesi için lsblk kullanıyoruz.
@@ -503,96 +503,96 @@ impl PartitionStep {
partition_bar(ui, plan);
ui.add_space(8.0);
- // Bootstrap 5 tarzı tablo
+ // Bootstrap 5 tarzı çizgili tablo
let col_widths = [0.40, 0.25, 0.35];
- let tam_genislik = ui.available_width();
- let header_color = egui::Color32::from_rgb(33, 37, 41); // dark bg
+ let header_color = egui::Color32::from_rgb(33, 37, 41);
let header_text = egui::Color32::WHITE;
- let _border_stroke = egui::Stroke::new(1.0, crate::ui::theme::c_border());
+ let baslik_yukseklik = 36.0;
+ let satir_yukseklik = 34.0;
+ let headers = [t!("plan_col_part"), t!("plan_col_fs"), t!("plan_col_size")];
- let grid = egui::Grid::new("plan_grid")
- .num_columns(3)
- .spacing([0.0, 0.0])
- .min_col_width(0.0);
-
- grid.show(ui, |ui| {
- // ── Başlık satırı ─────────────────────────────────
- let headers = [t!("plan_col_part"), t!("plan_col_fs"), t!("plan_col_size")];
- for (j, h) in headers.into_iter().enumerate() {
- let (rect, _) = ui.allocate_exact_size(
- egui::vec2(tam_genislik * col_widths[j], 30.0),
- egui::Sense::hover(),
- );
- let child_ui = &mut ui.child_ui(rect, egui::Layout::top_down(egui::Align::LEFT));
- egui::Frame::none()
- .fill(header_color)
- .inner_margin(egui::Margin::symmetric(8.0, 4.0))
- .show(child_ui, |ui| {
- ui.label(egui::RichText::new(h)
- .strong()
- .color(header_text)
- .size(13.0));
- });
- }
- ui.end_row();
-
- // ── Veri satırları ────────────────────────────────
- struct Satir {
- part: String,
- fs: &'static str,
- size: String,
- }
- let mut satirlar = Vec::new();
- if plan.efi_mb > 0 {
- satirlar.push(Satir {
- part: format!("{}1 (EFI)", plan.disk),
- fs: "FAT32",
- size: format!("{} MB", plan.efi_mb),
- });
- }
- let swap_part = if plan.efi_mb > 0 { 2 } else { 1 };
+ struct Satir {
+ part: String,
+ fs: &'static str,
+ size: String,
+ }
+ let mut satirlar = Vec::new();
+ if plan.efi_mb > 0 {
satirlar.push(Satir {
- part: format!("{}{} (swap)", plan.disk, swap_part),
- fs: "swap",
- size: format!("{} MB", plan.swap_mb),
+ part: format!("{}1 (EFI)", plan.disk),
+ fs: "FAT32",
+ size: format!("{} MB", plan.efi_mb),
});
- let root_part = swap_part + 1;
- satirlar.push(Satir {
- part: format!("{}{}{}", plan.disk, root_part, t!("plan_root_suffix")),
- fs: "ext4",
- size: format!("{:.1} GB", plan.root_mb as f64 / 1024.0),
- });
-
- for (row_idx, satir) in satirlar.iter().enumerate() {
- let row_bg = if row_idx % 2 == 0 {
- egui::Color32::from_rgba_unmultiplied(60, 60, 80, 60)
- } else {
- egui::Color32::TRANSPARENT
- };
- let hucreler: [&str; 3] = [&satir.part, satir.fs, &satir.size];
- for (j, deger) in hucreler.iter().enumerate() {
- let (rect, _) = ui.allocate_exact_size(
- egui::vec2(tam_genislik * col_widths[j], 34.0),
- egui::Sense::hover(),
- );
- let child_ui = &mut ui.child_ui(rect, egui::Layout::top_down(egui::Align::Center));
- egui::Frame::none()
- .fill(row_bg)
- .stroke(egui::Stroke::new(0.0, egui::Color32::TRANSPARENT))
- .inner_margin(egui::Margin::symmetric(8.0, 4.0))
- .show(child_ui, |ui| {
- ui.vertical_centered(|ui| {
- ui.label(egui::RichText::new(*deger).size(13.0).color(crate::ui::theme::c_text()));
- });
- });
- }
- // satır alt çizgisi
- if row_idx < satirlar.len() - 1 {
- ui.separator();
- }
- ui.end_row();
- }
+ }
+ let swap_part = if plan.efi_mb > 0 { 2 } else { 1 };
+ satirlar.push(Satir {
+ part: format!("{}{} (swap)", plan.disk, swap_part),
+ fs: "swap",
+ size: format!("{} MB", plan.swap_mb),
});
+ let root_part = swap_part + 1;
+ satirlar.push(Satir {
+ part: format!("{}{}{}", plan.disk, root_part, t!("plan_root_suffix")),
+ fs: "ext4",
+ size: format!("{:.1} GB", plan.root_mb as f64 / 1024.0),
+ });
+
+ egui::Frame::none()
+ .stroke(egui::Stroke::new(1.0, crate::ui::theme::c_border()))
+ .rounding(egui::Rounding::same(6.0))
+ .show(ui, |ui| {
+ let tam = ui.available_width();
+
+ ui.horizontal(|ui| {
+ ui.set_height(baslik_yukseklik);
+ ui.spacing_mut().item_spacing.x = 0.0;
+ for (j, h) in headers.iter().enumerate() {
+ let w = tam * col_widths[j];
+ let (rect, _) = ui.allocate_exact_size(
+ egui::vec2(w, baslik_yukseklik),
+ egui::Sense::hover(),
+ );
+ let mut cell_ui = ui.child_ui(rect, egui::Layout::top_down(egui::Align::Center));
+ egui::Frame::none()
+ .fill(header_color)
+ .inner_margin(egui::Margin::symmetric(10.0, 6.0))
+ .show(&mut cell_ui, |ui| {
+ ui.vertical_centered(|ui| {
+ ui.label(egui::RichText::new(h.as_ref()).strong().color(header_text).size(14.0));
+ });
+ });
+ }
+ });
+
+ for (row_idx, satir) in satirlar.iter().enumerate() {
+ let row_bg = if row_idx % 2 == 0 {
+ egui::Color32::from_rgba_unmultiplied(60, 60, 80, 40)
+ } else {
+ egui::Color32::TRANSPARENT
+ };
+ let hucreler: [&str; 3] = [&satir.part, satir.fs, &satir.size];
+ ui.horizontal(|ui| {
+ ui.set_height(satir_yukseklik);
+ ui.spacing_mut().item_spacing.x = 0.0;
+ for (j, deger) in hucreler.iter().enumerate() {
+ let w = tam * col_widths[j];
+ let (rect, _) = ui.allocate_exact_size(
+ egui::vec2(w, satir_yukseklik),
+ egui::Sense::hover(),
+ );
+ let mut cell_ui = ui.child_ui(rect, egui::Layout::top_down(egui::Align::Center));
+ egui::Frame::none()
+ .fill(row_bg)
+ .inner_margin(egui::Margin::symmetric(10.0, 4.0))
+ .show(&mut cell_ui, |ui| {
+ ui.vertical_centered(|ui| {
+ ui.label(egui::RichText::new(*deger).size(13.0).color(crate::ui::theme::c_text()));
+ });
+ });
+ }
+ });
+ }
+ });
ui.add_space(8.0);
ui.label(format!("{}: {}", t!("partition_table_type"), plan.table_type));
@@ -749,19 +749,16 @@ impl PartitionStep {
let header_text = egui::Color32::WHITE;
let _border_stroke = egui::Stroke::new(1.0, crate::ui::theme::c_border());
- let grid = egui::Grid::new("manual_parts_grid")
- .num_columns(5)
- .spacing([0.0, 0.0])
- .min_col_width(0.0);
-
- grid.show(ui, |ui| {
- // ── Başlık satırı ─────────────────────────────────
- let headers: [String; 4] = [
- t!("mp_device").to_string(),
- t!("mp_size").to_string(),
- t!("mp_fstype").to_string(),
- t!("mp_mountpoint").to_string(),
- ];
+ // ── Başlık satırı ─────────────────────────────────
+ let headers: [String; 4] = [
+ t!("mp_device").to_string(),
+ t!("mp_size").to_string(),
+ t!("mp_fstype").to_string(),
+ t!("mp_mountpoint").to_string(),
+ ];
+ ui.horizontal(|ui| {
+ ui.set_height(30.0);
+ ui.spacing_mut().item_spacing.x = 0.0;
for (j, h) in headers.into_iter().enumerate() {
let (rect, _) = ui.allocate_exact_size(
egui::vec2(tam_genislik * col_widths[j], 30.0),
@@ -776,88 +773,77 @@ impl PartitionStep {
ui.label(egui::RichText::new(h).strong().color(header_text).size(13.0));
});
}
- ui.end_row();
-
- // ── Veri satırları ────────────────────────────────
- for (row_idx, part) in state.custom_partitions.iter().enumerate() {
- let is_selected = self.manual.selected_idx == Some(row_idx);
- let row_bg = if is_selected {
- egui::Color32::from_rgba_unmultiplied(80, 100, 180, 80)
- } else if row_idx % 2 == 0 {
- egui::Color32::from_rgba_unmultiplied(60, 60, 80, 60)
- } else {
- egui::Color32::TRANSPARENT
- };
-
- let size_str = if part.size_mb == 0 {
- t!("mp_size_remaining").to_string()
- } else if part.size_mb >= 1024 {
- format!("{:.1} GB", part.size_mb as f64 / 1024.0)
- } else {
- format!("{} MB", part.size_mb)
- };
-
- let mut fstype_label = part.fstype.label().to_string();
- if part.encrypt {
- fstype_label = format!("🔐 {}", fstype_label);
- }
-
- let hucreler: [(String, bool); 5] = [
- (part.device.clone(), false),
- (size_str, false),
- (fstype_label, false),
- (part.mountpoint.clone(), false),
- (String::new(), true), // action column - button
- ];
-
- for (j, (deger, is_action)) in hucreler.iter().enumerate() {
- let sense = if *is_action {
- egui::Sense::click()
- } else {
- egui::Sense::click()
- };
- let (rect, response) = ui.allocate_exact_size(
- egui::vec2(tam_genislik * col_widths[j], 34.0),
- sense,
- );
-
- if !*is_action {
- if response.clicked() {
- self.manual.selected_idx = Some(row_idx);
- }
- response.on_hover_cursor(egui::CursorIcon::PointingHand);
- }
-
- let child_ui = &mut ui.child_ui(rect, egui::Layout::top_down(egui::Align::Center));
-
- if *is_action {
- egui::Frame::none()
- .fill(egui::Color32::TRANSPARENT)
- .inner_margin(egui::Margin::symmetric(8.0, 4.0))
- .show(child_ui, |ui| {
- ui.vertical_centered(|ui| {
- ui.label(egui::RichText::new(deger).size(13.0).color(crate::ui::theme::c_text()));
- });
- });
- } else {
- egui::Frame::none()
- .fill(row_bg)
- .stroke(egui::Stroke::new(0.0, egui::Color32::TRANSPARENT))
- .inner_margin(egui::Margin::symmetric(8.0, 4.0))
- .show(child_ui, |ui| {
- ui.vertical_centered(|ui| {
- ui.label(egui::RichText::new(deger).size(13.0).color(crate::ui::theme::c_text()));
- });
- });
- }
- }
- if row_idx < state.custom_partitions.len() - 1 {
- ui.separator();
- }
- ui.end_row();
- }
});
+ // ── Veri satırları ────────────────────────────────
+ for (row_idx, part) in state.custom_partitions.iter().enumerate() {
+ let is_selected = self.manual.selected_idx == Some(row_idx);
+ let row_bg = if is_selected {
+ egui::Color32::from_rgba_unmultiplied(80, 100, 180, 80)
+ } else if row_idx % 2 == 0 {
+ egui::Color32::from_rgba_unmultiplied(60, 60, 80, 60)
+ } else {
+ egui::Color32::TRANSPARENT
+ };
+
+ let size_str = if part.size_mb == 0 {
+ t!("mp_size_remaining").to_string()
+ } else if part.size_mb >= 1024 {
+ format!("{:.1} GB", part.size_mb as f64 / 1024.0)
+ } else {
+ format!("{} MB", part.size_mb)
+ };
+
+ let mut fstype_label = part.fstype.label().to_string();
+ if part.encrypt {
+ fstype_label = format!("🔐 {}", fstype_label);
+ }
+
+ // Entire row as a single clickable target (painter-based, no widget nesting)
+ let (row_rect, row_response) = ui.allocate_exact_size(
+ egui::vec2(tam_genislik, 34.0),
+ egui::Sense::click(),
+ );
+
+ if row_response.clicked() {
+ self.manual.selected_idx = Some(row_idx);
+ }
+ row_response.on_hover_cursor(egui::CursorIcon::PointingHand);
+
+ // Paint row background
+ let painter = ui.painter();
+ painter.rect_filled(row_rect, egui::Rounding::ZERO, row_bg);
+
+ // Paint cell texts directly (no child_ui/label widgets that steal clicks)
+ let cell_texts = [
+ part.device.as_str(),
+ size_str.as_str(),
+ fstype_label.as_str(),
+ part.mountpoint.as_str(),
+ "",
+ ];
+ let mut x = row_rect.left();
+ for (j, text) in cell_texts.iter().enumerate() {
+ let cell_w = tam_genislik * col_widths[j];
+ let text_rect = egui::Rect::from_min_size(
+ egui::pos2(x + 8.0, row_rect.top() + 4.0),
+ egui::vec2(cell_w - 16.0, 26.0),
+ );
+ painter.text(
+ text_rect.center(),
+ egui::Align2::CENTER_CENTER,
+ *text,
+ egui::FontId::proportional(13.0),
+ crate::ui::theme::c_text(),
+ );
+ x += cell_w;
+ }
+
+ if row_idx < state.custom_partitions.len() - 1 {
+ ui.separator();
+ }
+ }
+
// ── Bölümleme Planı (manuel) ──────────────────────────
if !state.custom_partitions.is_empty() {
ui.add_space(12.0);
@@ -965,8 +951,12 @@ impl PartitionStep {
egui::Window::new(title)
.collapsible(false)
.resizable(false)
- .anchor(egui::Align2::CENTER_CENTER, [0.0, 0.0])
+ .default_size(egui::vec2(420.0, 300.0))
+ //.anchor(egui::Align2::CENTER_CENTER, [0.0, 0.0])
+ .default_pos(ui.ctx().screen_rect().center() - egui::vec2(210.0, 150.0))
.show(ui.ctx(), |ui| {
+ ui.set_min_width(420.0);
+ ui.set_max_width(420.0);
ui.label(t!("mp_fstype"));
let prev_fs = self.manual.add_fstype;
let fs_label = FS_OPTIONS.get(self.manual.add_fstype).map(|x| x.0).unwrap_or("?");
@@ -988,10 +978,22 @@ impl PartitionStep {
ui.add_space(6.0);
form_label(ui, &t!("mp_size_hint"));
ui.horizontal(|ui| {
- form_input_text(ui, &mut self.manual.add_size_str);
+ ui.add_sized(
+ [160.0, 32.0], // Genişlik 160.0, Yükseklik 40.0 piksel
+ egui::TextEdit::singleline(&mut self.manual.add_size_str)
+ .text_color(egui::Color32::from_rgb(230, 230, 230))
+ .vertical_align(egui::Align::Center)
+ );
+ // ui.add(egui::TextEdit::singleline(&mut self.manual.add_size_str)
+ // .desired_width(120.0)
+ // .text_color(egui::Color32::from_rgb(230, 230, 230)));
let parsed: u64 = self.manual.add_size_str.trim().parse().unwrap_or(0);
if parsed > 0 {
+ let gb = parsed as f64 / 1024.0;
ui.label(format!("{} MB", format_number_thousands(parsed)));
+ ui.label(egui::RichText::new(format!("(≈ {:.1} GB)", gb))
+ .color(crate::ui::theme::c_text_dim())
+ .size(11.0));
} else {
ui.label("MB");
}
@@ -1017,6 +1019,8 @@ impl PartitionStep {
}
ui.add_space(6.0);
+ ui.separator();
+
ui.label(t!("mp_mountpoint"));
ui.horizontal(|ui| {
let current_mp = if self.manual.add_mountpoint.is_empty() {
@@ -1029,15 +1033,30 @@ impl PartitionStep {
theme::selectable_value(ui, &mut self.manual.add_mountpoint, mp.to_string(), *mp, w);
}
});
- form_input_text(ui, &mut self.manual.add_mountpoint);
+ // ui.add(egui::TextEdit::singleline(&mut self.manual.add_mountpoint)
+ // .desired_width(160.0)
+ // .text_color(egui::Color32::from_rgb(230, 230, 230)));
+ ui.add_sized(
+ [160.0, 32.0], // Genişlik 160.0, Yükseklik 40.0 piksel
+ egui::TextEdit::singleline(&mut self.manual.add_mountpoint)
+ .text_color(egui::Color32::from_rgb(230, 230, 230))
+ .vertical_align(egui::Align::Center)
+ );
});
ui.add_space(6.0);
- ui.label(t!("luks_enable_root"));
+ ui.separator();
+
let fstype = FS_OPTIONS.get(self.manual.add_fstype).map(|x| x.1.clone()).unwrap_or(FsType::Ext4);
let can_encrypt = matches!(fstype, FsType::Ext4 | FsType::Ext3 | FsType::Btrfs | FsType::Xfs);
+
+ // ui.label(t!("luks_enable_root"));
+ // ui.add_enabled_ui(can_encrypt, |ui| {
+ // ui.checkbox(&mut self.manual.add_encrypt, "");
+ // });
ui.add_enabled_ui(can_encrypt, |ui| {
- ui.checkbox(&mut self.manual.add_encrypt, "");
+ // Checkbox'ı yazısıyla birlikte tek bir bileşen olarak ekliyoruz:
+ ui.checkbox(&mut self.manual.add_encrypt, t!("luks_enable_root"));
});
if !can_encrypt { self.manual.add_encrypt = false; }
@@ -1047,18 +1066,27 @@ impl PartitionStep {
let pw = &mut self.manual.add_luks_password;
ui.horizontal(|ui| {
if self.show_luks_password {
- ui.text_edit_singleline(pw);
+ ui.add_sized(
+ [200.0, 32.0], // Genişlik 200.0, Yükseklik 32.0 piksel
+ egui::TextEdit::singleline(pw)
+ );
} else {
- ui.add(egui::TextEdit::singleline(pw).password(true));
- }
- let eye = if self.show_luks_password { "🙈" } else { "👁" };
- if ui.small_button(eye).clicked() {
- self.show_luks_password = !self.show_luks_password;
+ ui.add_sized(
+ [200.0, 32.0], // Genişlik 200.0, Yükseklik 32.0 piksel
+ egui::TextEdit::singleline(pw).password(true)
+ .text_color(egui::Color32::from_rgb(230, 230, 230))
+ .vertical_align(egui::Align::Center)
+ );
+ let eye = if self.show_luks_password { "🙈" } else { "👁" };
+ if ui.small_button(eye).clicked() {
+ self.show_luks_password = !self.show_luks_password;
+ }
}
});
}
ui.add_space(8.0);
+ ui.separator();
ui.horizontal(|ui| {
let ok_label = if is_edit { t!("mp_save") } else { t!("mp_add_btn") };
if theme::primary_button(ui, &ok_label).clicked() {
diff --git a/src/ui/slideshow.rs b/src/ui/slideshow.rs
index 9fb0487..147ef47 100644
--- a/src/ui/slideshow.rs
+++ b/src/ui/slideshow.rs
@@ -338,8 +338,15 @@ impl Slideshow {
let slide = &self.slides[self.current];
- // İkona karşılık gelen URI'yi branding haritasından al
- let resolved_uri = self.icons.get(slide.icon).cloned();
+ // İkona karşılık gelen URI: önce branding haritasından, yoksa doğrudan dosya yolu olarak dene
+ let resolved_uri = self.icons.get(slide.icon).cloned()
+ .or_else(|| {
+ if slide.icon.contains('/') || slide.icon.contains('\\') {
+ Some(crate::branding::path_to_file_uri(slide.icon))
+ } else {
+ None
+ }
+ });
egui::Frame::none()
.fill(crate::ui::theme::c_bg_widget())