feat: slide images moved to slides/img/, direct path in TOML, slides_test binary

- Moved 16 slide PNGs from assets/ to slides/img/
- Replaced [icons] mapping section with direct paths in icon field
- Added slides_test standalone binary for testing slideshows
- Added default-run = "yali-rs" in Cargo.toml to fix cargo run ambiguity
- Fixed edit dialog auto-resize and text field wrapping in partition.rs
- Updated branding.rs to load external slides from slides/ directory
- Removed [slides] section from branding.toml files
- Revamped CopyFilesJob with find-based progress tracking (rsync --out-format)
- Fixed install progress bar visibility logic
- Tweaked auto-install CLI output with sub-progress and current file
- Switched language-icon.svg to white fills for dark theme
- Minor locale fixes
This commit is contained in:
Erkan IŞIK
2026-07-10 01:59:59 +03:00
parent 3194c4d8a3
commit 62000b7c87
33 changed files with 979 additions and 1241 deletions
+9
View File
@@ -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
+6 -6
View File
@@ -2,14 +2,14 @@
<!-- Generator: Adobe Illustrator 27.7.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Optimized" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 841.8897705 595.2755737" style="enable-background:new 0 0 841.8897705 595.2755737;" xml:space="preserve">
<polygon style="fill:#020203;" points="512.5472412,488.2385864 542.3688354,537.3009033 558.0941772,491.724762 "/>
<path style="fill:#020203;" d="M277.7966003,213.2223663c-1.1176147-1.0975342,1.4554749,8.9684143,5.0365906,12.5897064
<polygon style="fill:#FFFFFF;" points="512.5472412,488.2385864 542.3688354,537.3009033 558.0941772,491.724762 "/>
<path style="fill:#FFFFFF;" d="M277.7966003,213.2223663c-1.1176147-1.0975342,1.4554749,8.9684143,5.0365906,12.5897064
c6.3496399,6.4062805,11.3096008,7.23172,13.9502563,7.3376465c5.8437805,0.2337646,13.0553894-1.4554596,17.3377991-3.2506104
c4.1435852-1.767746,11.404541-5.4748993,14.1529236-10.8822479c0.5825195-1.1559601,2.1731262-3.0972137,1.1742859-7.8927765
c-0.7579041-3.6888733-3.1064148-4.980011-5.9698181-4.7754517c-2.8634644,0.1935883-11.5323792,2.5055237-15.7253113,3.7948151
c-4.1947021,1.2728424-12.8344116,3.9025269-16.6000366,4.7188416
C287.3968811,215.6767426,279.1151123,214.4842987,277.7966003,213.2223663z"/>
<path style="fill:#020203;" d="M383.9637451,333.5533752c-1.6582031-0.6026001-35.9649353-14.8140564-40.828064-17.1424255
<path style="fill:#FFFFFF;" d="M383.9637451,333.5533752c-1.6582031-0.6026001-35.9649353-14.8140564-40.828064-17.1424255
c-3.979248-1.9137573-13.7365417-6.0391541-18.3276062-7.9127808c12.9312439-19.9383545,21.0942688-34.984314,22.1808472-37.276123
c2.0106506-4.1929321,15.697876-30.9757843,16.0174561-32.6248322c0.3104858-1.6709595,0.6994324-7.8434601,0.3981323-9.3098907
c-0.3013-1.495636-5.3196411,1.3787689-12.1331482,3.6889343c-6.8244629,2.3009491-19.7940674,10.7361145-24.8032837,11.7934723
@@ -26,7 +26,7 @@
c2.0288696,0.8454895,18.4335022,14.2113342,22.7140503,17.1734619c4.2806396,2.9602051,21.172821,12.3851318,24.832489,13.9483643
c3.6596985,1.5832825,17.7249756,8.0681152,18.3166809,5.8730469
C388.7592468,347.1237793,385.6236877,334.1834412,383.9637451,333.5533752z"/>
<path style="fill-rule:evenodd;clip-rule:evenodd;fill:#020203;" d="M304.6889954,512.2145996
<path style="fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;" d="M304.6889954,512.2145996
c3.2871399,2.0087891,6.3916626,3.6523438,9.8614197,5.2958984c6.9394836,3.4697876,14.7920837,7.1221313,22.2794495,9.8614502
c10.2266541,3.8349609,20.4532776,6.9395142,30.6799316,9.3135376c5.6611633,1.2783203,11.8701782,2.3740234,17.8966064,3.2871094
c0.5478516,0,16.8009033,2.0087891,20.0880432,2.0087891h16.4356689c6.3916321-0.5478516,12.4180603-0.9130859,18.8096924-1.8261719
@@ -43,7 +43,7 @@
c-12.6006775-4.7481079-25.7492065-10.9571533-38.1672668-19.1749878c-2.1914062-1.4609375-2.3740234-2.921875-2.3740234-4.5654297
c0-2.7392883,2.0087891-5.2959595,5.295929-5.2959595C297.7495117,507.4664917,303.5932922,511.6667175,304.6889954,512.2145996z"/>
<g>
<path style="fill:#020203;" d="M639.8383789,180.4025879l-40.7682495-12.975708V48.3634644
<path style="fill:#FFFFFF;" d="M639.8383789,180.4025879l-40.7682495-12.975708V48.3634644
c0-3.4697266-2.5567017-5.843811-5.843811-5.843811c-2.5567017,0-84.9176636,28.3059082-91.4918823,30.6799316
c-22.3344727,7.4448242-86.798645,29.7334595-86.798645,29.7334595l-0.000061,0.0002441
c-1.0336304,0.2964478-2.6376953,0.7871704-4.7411499,1.4482422L252.854248,48.8499756
@@ -57,6 +57,6 @@
V182.0402222l199.0542603-66.2905273V409.4003296z M587.9303589,55.6682129v108.2130737l-164.4921875-52.3546143
L587.9303589,55.6682129z M567.6870728,385.267334l-10.5206299-38.4284668l-60.5161133-18.3422241l-13.0134277,31.3044434
l-29.2919922-8.8861084l62.1779785-152.5870361l28.5085449,8.6360474l51.9385376,187.1876831L567.6870728,385.267334z"/>
<polygon style="fill:#020203;" points="507.8375244,300.3788452 547.7670288,312.4828491 529.5562744,247.8833618 "/>
<polygon style="fill:#FFFFFF;" points="507.8375244,300.3788452 547.7670288,312.4828491 529.5562744,247.8833618 "/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 6.3 KiB

-309
View File
@@ -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 <paket>` 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)
# ──────────────────────────────────────────────────────────────────
-298
View File
@@ -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 <package>`."
[[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
# ──────────────────────────────────────────────────────────────────
-303
View File
@@ -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 <paket>` 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)
# ──────────────────────────────────────────────────────────────────
+1 -1
View File
@@ -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 →"
+1 -1
View File
@@ -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ı →"

Before

Width:  |  Height:  |  Size: 9.9 KiB

After

Width:  |  Height:  |  Size: 9.9 KiB

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Before

Width:  |  Height:  |  Size: 9.8 KiB

After

Width:  |  Height:  |  Size: 9.8 KiB

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

Before

Width:  |  Height:  |  Size: 73 KiB

After

Width:  |  Height:  |  Size: 73 KiB

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 42 KiB

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 23 KiB

+243
View File
@@ -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 <package>`."
[[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."
+240
View File
@@ -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 <paket>` 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."
+83
View File
@@ -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<String> = 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<String, String> = 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(); }
});
});
});
});
}
}
+63 -10
View File
@@ -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::<SlidesConfig>(&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<SlidesConfig> {
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.
+53 -86
View File
@@ -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<String> = 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::<u64>().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::<u64>().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()
));
}
+9
View File
@@ -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");
+8 -2
View File
@@ -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;
+37 -34
View File
@@ -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
+217 -189
View File
@@ -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() {
+9 -2
View File
@@ -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())