From 1af804265449e3ed17d27b7b444afb432395c2af Mon Sep 17 00:00:00 2001 From: Ward from fusion-voyager-3 Date: Fri, 11 Oct 2024 23:51:38 +0300 Subject: [PATCH] make partition selection more intuitive --- .github/release-nest-v3 | 2 +- debian/changelog | 6 + locales/en_US.json | 7 +- src/automatic_partitioning_page/mod.rs | 42 +- src/build_ui.rs | 32 +- src/drive_mount_row/imp.rs | 120 ++- src/drive_mount_row/mod.rs | 6 +- src/installation_complete_page/mod.rs | 92 +-- src/installation_progress_page/mod.rs | 120 +-- src/installation_summary_page/mod.rs | 84 ++- .../script_gen/auto_basic.rs | 2 +- .../script_gen/auto_btrfs.rs | 12 +- .../script_gen/auto_ext4.rs | 2 +- .../script_gen/auto_xfs.rs | 2 +- .../script_gen/manual_basic.rs | 2 +- .../script_gen/mod.rs | 444 +++++++---- src/keyboard_page/mod.rs | 707 ++++++++---------- src/language_page/mod.rs | 12 +- src/main.rs | 4 +- src/manual_partitioning_page/func.rs | 48 +- src/manual_partitioning_page/mod.rs | 31 +- src/partitioning_page/mod.rs | 4 +- src/timezone_page/mod.rs | 2 +- src/unix_socket_tools/mod.rs | 14 +- 24 files changed, 1023 insertions(+), 774 deletions(-) diff --git a/.github/release-nest-v3 b/.github/release-nest-v3 index 7813681..62f9457 100644 --- a/.github/release-nest-v3 +++ b/.github/release-nest-v3 @@ -1 +1 @@ -5 \ No newline at end of file +6 \ No newline at end of file diff --git a/debian/changelog b/debian/changelog index 796da31..fcbf9c9 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +pika-installer-gtk4 (2.0.0-101pika6) pika; urgency=low + + * Fix partition selection + + -- Ward Nakchbandi Thu, 20 Sep 2022 22:01:00 +0000 + pika-installer-gtk4 (2.0.0-101pika5) pika; urgency=low * First Release of new installer diff --git a/locales/en_US.json b/locales/en_US.json index 6cbe852..803ccf0 100644 --- a/locales/en_US.json +++ b/locales/en_US.json @@ -35,8 +35,9 @@ "eula_page_title": "EULA", "efi_error_header_text_label": "Un-Supported Boot Platform", "efi_error_text_label": "PikaOS Only works on GPT UEFI Systems, This Machine is Booted in CSM/LEGACY mode.", - "exit_button_label": "exit_button_label", - "partition_row_expander_subtitle": "Partition", + "exit_button_label": "Exit", + "partition_button_row_title": "Partition", + "partition_button_row_subtitle_none_selected": "No Partition Selected", "mountpoint_entry_row_title": "Mountpoint\nE.g: /var", "mountopts_entry_row_title": "Additional Mount Options\nE.g: subvol=@home", "automatic_partitioning_page_title": "Automatic Partitioning Installer", @@ -128,5 +129,7 @@ "installation_complete_page_subtitle_success": "The Installation of PikaOS Has Been Completed Sucessfully", "devices_selection_button_row_dialog_auto_title": "Automatic Partition Disk Selection", "devices_selection_button_row_dialog_auto_body": "Please Select A Disk for PikaOS to *Erase* And Install on.", + "devices_selection_button_row_dialog_manual_title": "Manual Partition Disk Selection", + "devices_selection_button_row_dialog_manual_body": "Please Select a Partition for This Filesystem Mount", "devices_selection_button_row_dialog_ok_label": "Done" } diff --git a/src/automatic_partitioning_page/mod.rs b/src/automatic_partitioning_page/mod.rs index 0f51c7e..42e0b0a 100644 --- a/src/automatic_partitioning_page/mod.rs +++ b/src/automatic_partitioning_page/mod.rs @@ -3,8 +3,8 @@ use crate::config::{MINIMUM_BOOT_BYTE_SIZE, MINIMUM_EFI_BYTE_SIZE, MINIMUM_ROOT_ use crate::installer_stack_page; use crate::partitioning_page::get_block_devices; use adw::prelude::*; -use gtk::{glib, gio}; use glib::{clone, closure_local}; +use gtk::{gio, glib}; use std::{cell::RefCell, rc::Rc}; pub fn automatic_partitioning_page( @@ -262,6 +262,7 @@ pub fn automatic_partitioning_page( devices_selection_button_row_listbox.add_css_class("boxed-list"); let devices_selection_button_row = adw::ButtonRow::builder() + .start_icon_name("drive-harddisk-symbolic") .build(); devices_selection_button_row.add_css_class("accent-blink"); @@ -292,11 +293,18 @@ pub fn automatic_partitioning_page( .height_request(400) .build(); - devices_selection_button_row_dialog.add_response("devices_selection_button_row_dialog_ok", "devices_selection_button_row_dialog_ok"); + devices_selection_button_row_dialog.add_response( + "devices_selection_button_row_dialog_ok", + "devices_selection_button_row_dialog_ok", + ); - devices_selection_button_row.connect_activated(clone!(#[weak] devices_selection_button_row_dialog, move |_| { - devices_selection_button_row_dialog.present(Some(&window)); - })); + devices_selection_button_row.connect_activated(clone!( + #[weak] + devices_selection_button_row_dialog, + move |_| { + devices_selection_button_row_dialog.present(Some(&window)); + } + )); //devices_selection_button_row.add_row(&devices_selection_button_row_viewport); @@ -670,13 +678,17 @@ pub fn automatic_partitioning_page( automatic_partitioning_page.set_back_tooltip_label(t!("back")); automatic_partitioning_page.set_next_tooltip_label(t!("next")); // - devices_selection_button_row.set_title(&t!( - "devices_selection_button_row_title_no_drive_selected" - )); + devices_selection_button_row + .set_title(&t!("devices_selection_button_row_title_no_drive_selected")); // - devices_selection_button_row_dialog.set_title(&t!("devices_selection_button_row_dialog_auto_title")); - devices_selection_button_row_dialog.set_body(&t!("devices_selection_button_row_dialog_auto_body")); - devices_selection_button_row_dialog.set_response_label("devices_selection_button_row_dialog_ok", &t!("devices_selection_button_row_dialog_ok_label")); + devices_selection_button_row_dialog + .set_title(&t!("devices_selection_button_row_dialog_auto_title")); + devices_selection_button_row_dialog + .set_body(&t!("devices_selection_button_row_dialog_auto_body")); + devices_selection_button_row_dialog.set_response_label( + "devices_selection_button_row_dialog_ok", + &t!("devices_selection_button_row_dialog_ok_label"), + ); // partition_method_automatic_disk_nodisk_error_label.set_label(&t!( "partition_method_automatic_disk_nodisk_error_label_label" @@ -740,7 +752,13 @@ fn disk_check( device_block_size: f64, ) { if device_button.is_active() { - devices_selection_button_row.set_title(&(device_block_model.to_owned() + ": " + device_block_name + " " + device_block_size_pretty)); + devices_selection_button_row.set_title( + &(device_block_model.to_owned() + + ": " + + device_block_name + + " " + + device_block_size_pretty), + ); devices_selection_button_row.remove_css_class("accent-blink"); if device_block_size >= MINIMUM_ROOT_BYTE_SIZE { partition_method_automatic_disk_size_error_label.set_visible(false); diff --git a/src/build_ui.rs b/src/build_ui.rs index 71de3a5..aa8eac6 100644 --- a/src/build_ui.rs +++ b/src/build_ui.rs @@ -1,7 +1,7 @@ use crate::{ - config::APP_ID, efi_error_page, eula_page, installation_progress_page, - installation_summary_page, keyboard_page, language_page, partitioning_page, timezone_page, installation_complete_page, - welcome_page, + config::APP_ID, efi_error_page, eula_page, installation_complete_page, + installation_progress_page, installation_summary_page, keyboard_page, language_page, + partitioning_page, timezone_page, welcome_page, }; use gtk::{gio, glib, prelude::*}; use std::{cell::RefCell, path::Path, rc::Rc}; @@ -22,11 +22,11 @@ pub struct PikaLocale { pub struct KBDMap { pub console: String, pub layout: String, - pub variant: String + pub variant: String, } #[derive(Default, Clone, Debug)] -pub struct PikaKeymap { +pub struct PikaKeymap { pub kbdmap: KBDMap, pub pretty_name: String, } @@ -78,10 +78,13 @@ pub fn build_ui(app: &adw::Application) { glib::set_application_name(&t!("application_name")); let (installation_log_loop_sender, installation_log_loop_receiver) = async_channel::unbounded(); - let installation_log_loop_sender: async_channel::Sender = installation_log_loop_sender.clone(); + let installation_log_loop_sender: async_channel::Sender = + installation_log_loop_sender.clone(); - let (installation_log_status_loop_sender, installation_log_status_loop_receiver) = async_channel::unbounded(); - let installation_log_status_loop_sender: async_channel::Sender = installation_log_status_loop_sender.clone(); + let (installation_log_status_loop_sender, installation_log_status_loop_receiver) = + async_channel::unbounded(); + let installation_log_status_loop_sender: async_channel::Sender = + installation_log_status_loop_sender.clone(); let carousel = adw::Carousel::builder() .allow_long_swipes(false) @@ -208,9 +211,18 @@ pub fn build_ui(app: &adw::Application) { &partition_method_manual_crypttab_entry_array_refcell, ); - installation_progress_page::installation_progress_page(&carousel, &language_changed_action, installation_log_loop_receiver); + installation_progress_page::installation_progress_page( + &carousel, + &language_changed_action, + installation_log_loop_receiver, + ); - installation_complete_page::installation_complete_page(&carousel, &window, &language_changed_action, installation_log_status_loop_receiver); + installation_complete_page::installation_complete_page( + &carousel, + &window, + &language_changed_action, + installation_log_status_loop_receiver, + ); window.present() } diff --git a/src/drive_mount_row/imp.rs b/src/drive_mount_row/imp.rs index 1501617..fc28cee 100644 --- a/src/drive_mount_row/imp.rs +++ b/src/drive_mount_row/imp.rs @@ -20,6 +20,8 @@ pub struct DriveMountRow { #[property(get, set)] partitionscroll: Rc>, #[property(get, set)] + transient_for: Rc>, + #[property(get, set)] sizegroup: RefCell>, #[property(get, set)] langaction: RefCell>, @@ -51,6 +53,8 @@ impl ObjectImpl for DriveMountRow { // `SYNC_CREATE` ensures that the label will be immediately set let obj = self.obj(); + let is_selected = Rc::new(RefCell::new(false)); + let action_row_content_box = gtk::Box::builder() .orientation(Horizontal) .spacing(0) @@ -58,7 +62,7 @@ impl ObjectImpl for DriveMountRow { .hexpand(true) .build(); - let partition_row_expander_adw_listbox = gtk::ListBox::builder() + let partition_button_row_adw_listbox = gtk::ListBox::builder() .hexpand(true) .vexpand(true) .selection_mode(gtk::SelectionMode::None) @@ -67,7 +71,7 @@ impl ObjectImpl for DriveMountRow { .margin_start(5) .margin_end(5) .build(); - partition_row_expander_adw_listbox.add_css_class("boxed-list"); + partition_button_row_adw_listbox.add_css_class("boxed-list"); let mountpoint_entry_row_adw_listbox = gtk::ListBox::builder() .hexpand(true) @@ -93,9 +97,21 @@ impl ObjectImpl for DriveMountRow { .build(); mountopts_entry_row_adw_listbox.add_css_class("boxed-list"); - let partition_row_expander = adw::ExpanderRow::builder() - .subtitle(t!("partition_row_expander_subtitle")) + let partition_button_row = adw::ActionRow::builder() + .title(t!("partition_button_row_title")) + .subtitle(t!("partition_button_row_subtitle_none_selected")) + .hexpand(true) + .vexpand(true) .build(); + partition_button_row.add_prefix(>k::Image::from_icon_name("drive-harddisk-symbolic")); + + let partition_button = gtk::Button::builder() + .valign(gtk::Align::Center) + .hexpand(true) + .vexpand(true) + .child(&partition_button_row) + .build(); + partition_button.add_css_class("flat"); let mountpoint_entry_row = adw::EntryRow::builder() .title(t!("mountpoint_entry_row_title")) @@ -138,6 +154,24 @@ impl ObjectImpl for DriveMountRow { .bidirectional() .build(); + obj.connect_partition_notify(clone!( + #[strong] + is_selected, + #[strong] + partition_button_row, + move |obj| { + let partition = obj.property::("partition"); + let is_empty = partition.trim().is_empty(); + *is_selected.borrow_mut() = !is_empty; + if is_empty { + partition_button_row + .set_subtitle(&t!("partition_button_row_subtitle_none_selected")); + } else { + partition_button_row.set_subtitle(&partition); + } + } + )); + partition_row_delete_button.connect_clicked(clone!( #[weak] obj, @@ -148,7 +182,7 @@ impl ObjectImpl for DriveMountRow { // - partition_row_expander_adw_listbox.append(&partition_row_expander); + partition_button_row_adw_listbox.append(&partition_button); mountpoint_entry_row_adw_listbox.append(&mountpoint_entry_row); @@ -156,7 +190,7 @@ impl ObjectImpl for DriveMountRow { // - action_row_content_box.append(&partition_row_expander_adw_listbox); + action_row_content_box.append(&partition_button_row_adw_listbox); action_row_content_box.append(&mountpoint_entry_row_adw_listbox); @@ -168,27 +202,54 @@ impl ObjectImpl for DriveMountRow { #[weak] obj, #[weak] - partition_row_expander_adw_listbox, + partition_button_row_adw_listbox, #[weak] mountpoint_entry_row_adw_listbox, #[weak] mountopts_entry_row_adw_listbox, move |_| { if let Some(t) = obj.sizegroup() { - t.add_widget(&partition_row_expander_adw_listbox); + t.add_widget(&partition_button_row_adw_listbox); t.add_widget(&mountpoint_entry_row_adw_listbox); t.add_widget(&mountopts_entry_row_adw_listbox); } } )); + let partition_button_row_dialog_extra_child = adw::Bin::new(); + + let partition_button_row_dialog = adw::AlertDialog::builder() + .extra_child(&partition_button_row_dialog_extra_child) + .width_request(400) + .height_request(400) + .title(t!("devices_selection_button_row_dialog_manual_title")) + .body(t!("devices_selection_button_row_dialog_manual_body")) + .build(); + + partition_button_row_dialog.add_response( + "devices_selection_button_row_dialog_ok", + "devices_selection_button_row_dialog_ok_label", + ); + + partition_button.connect_clicked(clone!( + #[strong] + obj, + #[strong] + partition_button_row_dialog, + move |_| { + partition_button_row_dialog.present(Some( + &obj.property::("transient_for"), + )); + } + )); + // Bind label to number // `SYNC_CREATE` ensures that the label will be immediately set let obj = self.obj(); - obj.bind_property("partition", &partition_row_expander, "title") - .sync_create() - .bidirectional() - .build(); + /*obj.bind_property("partition", &partition_button_row, "subtitle") + .sync_create() + .bidirectional() + .build();*/ obj.bind_property("mountpoint", &mountpoint_entry_row, "text") .sync_create() @@ -204,10 +265,11 @@ impl ObjectImpl for DriveMountRow { #[weak] obj, #[weak] - partition_row_expander, + partition_button_row_dialog_extra_child, move |_| { - partition_row_expander - .add_row(&obj.property::("partitionscroll")); + partition_button_row_dialog_extra_child.set_child(Some( + &obj.property::("partitionscroll"), + )); } )); @@ -215,25 +277,45 @@ impl ObjectImpl for DriveMountRow { #[weak] obj, #[weak] - partition_row_expander, + partition_button_row, #[weak] mountpoint_entry_row, #[weak] mountopts_entry_row, + #[weak] + partition_button_row_dialog, + #[strong] + is_selected, move |_| { if let Some(t) = obj.langaction() { t.connect_activate(clone!( #[weak] - partition_row_expander, + partition_button_row, #[weak] mountpoint_entry_row, #[weak] mountopts_entry_row, + #[weak] + partition_button_row_dialog, + #[strong] + is_selected, move |_, _| { - partition_row_expander - .set_subtitle(&t!("partition_row_expander_subtitle")); + if !*is_selected.borrow() { + partition_button_row.set_subtitle(&t!( + "partition_button_row_subtitle_none_selected" + )); + } mountpoint_entry_row.set_title(&t!("mountpoint_entry_row_title")); mountopts_entry_row.set_title(&t!("mountopts_entry_row_title")); + // + partition_button_row_dialog + .set_title(&t!("devices_selection_button_row_dialog_manual_title")); + partition_button_row_dialog + .set_body(&t!("devices_selection_button_row_dialog_manual_body")); + partition_button_row_dialog.set_response_label( + "devices_selection_button_row_dialog_ok", + &t!("devices_selection_button_row_dialog_ok_label"), + ); } )); } diff --git a/src/drive_mount_row/mod.rs b/src/drive_mount_row/mod.rs index a292e16..57b578f 100644 --- a/src/drive_mount_row/mod.rs +++ b/src/drive_mount_row/mod.rs @@ -15,9 +15,13 @@ impl DriveMountRow { pub fn new() -> Self { Object::builder().build() } - pub fn new_with_scroll(partitions_scroll: >k::ScrolledWindow) -> Self { + pub fn new_with_widgets( + partitions_scroll: >k::ScrolledWindow, + parent_window: &adw::ApplicationWindow, + ) -> Self { Object::builder() .property("partitionscroll", partitions_scroll) + .property("transient-for", parent_window) .build() } pub fn get_fstab_entry(&self) -> FstabEntry { diff --git a/src/installation_complete_page/mod.rs b/src/installation_complete_page/mod.rs index 73f2237..68137ae 100644 --- a/src/installation_complete_page/mod.rs +++ b/src/installation_complete_page/mod.rs @@ -1,7 +1,7 @@ use crate::{config::LOG_FILE_PATH, installer_stack_page}; use adw::prelude::*; -use gtk::{gio, glib}; use glib::clone; +use gtk::{gio, glib}; use std::process::Command; pub fn installation_complete_page( @@ -11,7 +11,7 @@ pub fn installation_complete_page( installation_log_status_loop_receiver: async_channel::Receiver, ) { let installation_complete_page = installer_stack_page::InstallerStackPage::new(); - + let content_box = gtk::Box::builder() .orientation(gtk::Orientation::Horizontal) .homogeneous(true) @@ -52,55 +52,52 @@ pub fn installation_complete_page( let installation_status_context = glib::MainContext::default(); // The main loop executes the asynchronous block - installation_status_context.spawn_local( - clone!( - #[strong] - main_carousel, - #[strong] - installation_complete_page, - #[strong] - installation_log_status_loop_receiver, - async move - { - while let Ok(state) = installation_log_status_loop_receiver.recv().await { - main_carousel.scroll_to(&installation_complete_page, true); - match state { - true => { - installation_complete_page.set_page_icon("emblem-ok-symbolic"); - installation_complete_page.set_back_visible(false); - installation_complete_page.set_next_visible(false); - installation_complete_page.set_back_sensitive(false); - installation_complete_page.set_next_sensitive(false); - installation_complete_page.set_page_title(t!("installation_complete_page_title_success")); - installation_complete_page.set_page_subtitle(t!("installation_complete_page_subtitle_success")); - } - false => { - installation_complete_page.set_page_icon("dialog-error-symbolic"); - installation_complete_page.set_back_visible(false); - installation_complete_page.set_next_visible(false); - installation_complete_page.set_back_sensitive(false); - installation_complete_page.set_next_sensitive(false); - installation_complete_page.set_page_title(t!("installation_complete_page_title_failed")); - installation_complete_page.set_page_subtitle(t!("installation_complete_page_subtitle_failed")); - } - } + installation_status_context.spawn_local(clone!( + #[strong] + main_carousel, + #[strong] + installation_complete_page, + #[strong] + installation_log_status_loop_receiver, + async move { + while let Ok(state) = installation_log_status_loop_receiver.recv().await { + main_carousel.scroll_to(&installation_complete_page, true); + match state { + true => { + installation_complete_page.set_page_icon("emblem-ok-symbolic"); + installation_complete_page.set_back_visible(false); + installation_complete_page.set_next_visible(false); + installation_complete_page.set_back_sensitive(false); + installation_complete_page.set_next_sensitive(false); + installation_complete_page + .set_page_title(t!("installation_complete_page_title_success")); + installation_complete_page + .set_page_subtitle(t!("installation_complete_page_subtitle_success")); } + false => { + installation_complete_page.set_page_icon("dialog-error-symbolic"); + installation_complete_page.set_back_visible(false); + installation_complete_page.set_next_visible(false); + installation_complete_page.set_back_sensitive(false); + installation_complete_page.set_next_sensitive(false); + installation_complete_page + .set_page_title(t!("installation_complete_page_title_failed")); + installation_complete_page + .set_page_subtitle(t!("installation_complete_page_subtitle_failed")); + } + } } - ) - ); + } + )); // installation_complete_exit_button.connect_clicked(clone!( #[strong] window, - move |_| - { - window.close() - } - ) - ); - + move |_| window.close() + )); + installation_complete_reboot_button.connect_clicked(move |_| { Command::new("reboot") .spawn() @@ -127,9 +124,12 @@ pub fn installation_complete_page( #[weak] installation_complete_view_logs_button, move |_, _| { - installation_complete_exit_button.set_label(&t!("installation_complete_exit_button_label")); - installation_complete_reboot_button.set_label(&t!("installation_complete_reboot_button_label")); - installation_complete_view_logs_button.set_label(&t!("installation_complete_view_logs_button_label")); + installation_complete_exit_button + .set_label(&t!("installation_complete_exit_button_label")); + installation_complete_reboot_button + .set_label(&t!("installation_complete_reboot_button_label")); + installation_complete_view_logs_button + .set_label(&t!("installation_complete_view_logs_button_label")); } )); // diff --git a/src/installation_progress_page/mod.rs b/src/installation_progress_page/mod.rs index 5a3bec6..dfc809a 100644 --- a/src/installation_progress_page/mod.rs +++ b/src/installation_progress_page/mod.rs @@ -1,11 +1,10 @@ use crate::unix_socket_tools; use adw::prelude::*; -use gtk::{gio, glib}; use glib::{clone, GString}; +use gtk::{gio, glib}; use std::thread; use tokio::runtime::Runtime; - pub fn installation_progress_page( main_carousel: &adw::Carousel, language_changed_action: &gio::SimpleAction, @@ -15,12 +14,14 @@ pub fn installation_progress_page( let socket_status_sender: async_channel::Sender = socket_status_sender.clone(); thread::spawn(move || { - Runtime::new().unwrap().block_on(unix_socket_tools::start_socket_server( - socket_status_sender, - "/tmp/pikainstall-status.sock", - )); + Runtime::new() + .unwrap() + .block_on(unix_socket_tools::start_socket_server( + socket_status_sender, + "/tmp/pikainstall-status.sock", + )); }); - + let installation_progress_box = gtk::Box::builder() .orientation(gtk::Orientation::Vertical) .build(); @@ -103,53 +104,55 @@ pub fn installation_progress_page( // - progress_log_button.connect_clicked( - clone!( - #[weak] - installation_progress_log_stack, - move |_| + progress_log_button.connect_clicked(clone!( + #[weak] + installation_progress_log_stack, + move |_| { + if installation_progress_log_stack.visible_child_name() + == Some(GString::from_string_unchecked("slideshow_page".into())) { - if installation_progress_log_stack.visible_child_name() == Some(GString::from_string_unchecked("slideshow_page".into())) { - installation_progress_log_stack.set_visible_child_name("terminal_log_page"); - } else { - installation_progress_log_stack.set_visible_child_name("slideshow_page"); - } + installation_progress_log_stack.set_visible_child_name("terminal_log_page"); + } else { + installation_progress_log_stack.set_visible_child_name("slideshow_page"); } - ) - ); + } + )); // installation_progress_log_terminal_buffer.connect_changed(clone!( #[weak] installation_progress_log_scroll, - move |_| + move |_| { + if installation_progress_log_scroll.vadjustment().upper() + - installation_progress_log_scroll.vadjustment().value() + < (installation_progress_log_scroll.size(gtk::Orientation::Vertical) as f64 * 1.48) { - if installation_progress_log_scroll.vadjustment().upper() - installation_progress_log_scroll.vadjustment().value() < (installation_progress_log_scroll.size(gtk::Orientation::Vertical) as f64 * 1.48 ) { - installation_progress_log_scroll.vadjustment().set_value(installation_progress_log_scroll.vadjustment().upper()) - } + installation_progress_log_scroll + .vadjustment() + .set_value(installation_progress_log_scroll.vadjustment().upper()) } - ) - ); + } + )); // let installation_log_loop_context = glib::MainContext::default(); // The main loop executes the asynchronous block - installation_log_loop_context.spawn_local( - clone!( - #[weak] - installation_progress_log_terminal_buffer, - #[strong] - installation_progress_log_terminal_buffer, - async move - { - while let Ok(state) = installation_log_loop_receiver.recv().await { - installation_progress_log_terminal_buffer.insert(&mut installation_progress_log_terminal_buffer.end_iter(), &("\n".to_string() + &state)) - } + installation_log_loop_context.spawn_local(clone!( + #[weak] + installation_progress_log_terminal_buffer, + #[strong] + installation_progress_log_terminal_buffer, + async move { + while let Ok(state) = installation_log_loop_receiver.recv().await { + installation_progress_log_terminal_buffer.insert( + &mut installation_progress_log_terminal_buffer.end_iter(), + &("\n".to_string() + &state), + ) } - ) - ); + } + )); // @@ -165,55 +168,68 @@ pub fn installation_progress_page( match state.trim() { "PARTING" => { installation_progress_bar.set_fraction(0.15); - installation_progress_bar.set_text(Some(&t!("installation_progress_bar_text_parting"))); + installation_progress_bar + .set_text(Some(&t!("installation_progress_bar_text_parting"))); } "IMAGE" => { installation_progress_bar.set_fraction(0.50); - installation_progress_bar.set_text(Some(&t!("installation_progress_bar_text_image"))); + installation_progress_bar + .set_text(Some(&t!("installation_progress_bar_text_image"))); } "FLAG" => { installation_progress_bar.set_fraction(0.55); - installation_progress_bar.set_text(Some(&t!("installation_progress_bar_text_flag"))); + installation_progress_bar + .set_text(Some(&t!("installation_progress_bar_text_flag"))); } "BIND" => { installation_progress_bar.set_fraction(0.60); - installation_progress_bar.set_text(Some(&t!("installation_progress_bar_text_bind"))); + installation_progress_bar + .set_text(Some(&t!("installation_progress_bar_text_bind"))); } "ARCH_COPY" => { installation_progress_bar.set_fraction(0.65); - installation_progress_bar.set_text(Some(&t!("installation_progress_bar_text_arch_copy"))); + installation_progress_bar + .set_text(Some(&t!("installation_progress_bar_text_arch_copy"))); } "ENCRYPTION" => { installation_progress_bar.set_fraction(0.70); - installation_progress_bar.set_text(Some(&t!("installation_progress_bar_text_encryption"))); + installation_progress_bar + .set_text(Some(&t!("installation_progress_bar_text_encryption"))); } "SWAP" => { installation_progress_bar.set_fraction(0.75); - installation_progress_bar.set_text(Some(&t!("installation_progress_bar_text_swap"))); + installation_progress_bar + .set_text(Some(&t!("installation_progress_bar_text_swap"))); } "GEN_FSTAB" => { installation_progress_bar.set_fraction(0.80); - installation_progress_bar.set_text(Some(&t!("installation_progress_bar_text_gen_fstab"))); + installation_progress_bar + .set_text(Some(&t!("installation_progress_bar_text_gen_fstab"))); } "LOCALE" => { installation_progress_bar.set_fraction(0.85); - installation_progress_bar.set_text(Some(&t!("installation_progress_bar_text_locale"))); + installation_progress_bar + .set_text(Some(&t!("installation_progress_bar_text_locale"))); } "BOOTLOADER" => { installation_progress_bar.set_fraction(0.90); - installation_progress_bar.set_text(Some(&t!("installation_progress_bar_text_bootloader"))); + installation_progress_bar + .set_text(Some(&t!("installation_progress_bar_text_bootloader"))); } "LIVE_REMOVE" => { installation_progress_bar.set_fraction(0.95); - installation_progress_bar.set_text(Some(&t!("installation_progress_bar_text_live_remove"))); + installation_progress_bar + .set_text(Some(&t!("installation_progress_bar_text_live_remove"))); } "BASIC_USER" => { installation_progress_bar.set_fraction(0.98); - installation_progress_bar.set_text(Some(&t!("installation_progress_bar_text_basic_user"))); + installation_progress_bar + .set_text(Some(&t!("installation_progress_bar_text_basic_user"))); } "UNBIND" => { installation_progress_bar.set_fraction(0.99); - installation_progress_bar.set_text(Some(&t!("installation_progress_bar_text_unbind"))); + installation_progress_bar + .set_text(Some(&t!("installation_progress_bar_text_unbind"))); } _ => {} } @@ -232,4 +248,4 @@ pub fn installation_progress_page( )); main_carousel.append(&installation_progress_box); -} \ No newline at end of file +} diff --git a/src/installation_summary_page/mod.rs b/src/installation_summary_page/mod.rs index 0532643..3da2bc2 100644 --- a/src/installation_summary_page/mod.rs +++ b/src/installation_summary_page/mod.rs @@ -1,13 +1,21 @@ use crate::{ build_ui::{BlockDevice, CrypttabEntry, FstabEntry, PikaKeymap, PikaLocale}, - config::{MINIMUM_BOOT_BYTE_SIZE, MINIMUM_EFI_BYTE_SIZE, LOG_FILE_PATH}, + config::{LOG_FILE_PATH, MINIMUM_BOOT_BYTE_SIZE, MINIMUM_EFI_BYTE_SIZE}, installer_stack_page, }; use adw::prelude::*; -use gtk::{gio, glib}; -use glib::{clone, closure_local}; -use std::{cell::RefCell, fs, path::Path, rc::Rc, thread, io::{Write, prelude::*, BufReader}, error::Error}; use duct::cmd; +use glib::{clone, closure_local}; +use gtk::{gio, glib}; +use std::{ + cell::RefCell, + error::Error, + fs, + io::{prelude::*, BufReader, Write}, + path::Path, + rc::Rc, + thread, +}; mod script_gen; @@ -36,7 +44,6 @@ fn run_install_process( .send_blocking(line) .expect("Channel needs to be opened."); let mut log_file = fs::OpenOptions::new() - .append(true) .open(log_file_path) .unwrap(); @@ -154,37 +161,42 @@ pub fn installation_summary_page( partition_method_manual_luks_enabled_refcell, #[strong] partition_method_manual_crypttab_entry_array_refcell, - move |_| - { - let cmd = script_gen::create_installation_script( - &language_selection_text_refcell, - &keymap_selection_text_refcell, - &timezone_selection_text_refcell, - &partition_method_type_refcell, - &partition_method_automatic_target_refcell, - &partition_method_automatic_target_fs_refcell, - &partition_method_automatic_luks_enabled_refcell, - &partition_method_automatic_luks_refcell, - &partition_method_automatic_ratio_refcell, - &partition_method_automatic_seperation_refcell, - &partition_method_manual_fstab_entry_array_refcell, - &partition_method_manual_luks_enabled_refcell, - &partition_method_manual_crypttab_entry_array_refcell,); - let installation_log_loop_sender_clone0 = installation_log_loop_sender.clone(); - let installation_log_status_loop_sender_clone0 = installation_log_status_loop_sender.clone(); - thread::spawn(move || { - if Path::new(LOG_FILE_PATH).exists() { - fs::remove_file(LOG_FILE_PATH).expect("bad perms on log file"); - } - match run_install_process(installation_log_loop_sender_clone0, &cmd, LOG_FILE_PATH) { - Ok(_) => installation_log_status_loop_sender_clone0.send_blocking(true).expect("channel needs to be open"), - Err(_) => installation_log_status_loop_sender_clone0.send_blocking(false).expect("channel needs to be open") - } - }); - main_carousel.scroll_to(&main_carousel.nth_page(7), true); - } - ) - ); + move |_| { + let cmd = script_gen::create_installation_script( + &language_selection_text_refcell, + &keymap_selection_text_refcell, + &timezone_selection_text_refcell, + &partition_method_type_refcell, + &partition_method_automatic_target_refcell, + &partition_method_automatic_target_fs_refcell, + &partition_method_automatic_luks_enabled_refcell, + &partition_method_automatic_luks_refcell, + &partition_method_automatic_ratio_refcell, + &partition_method_automatic_seperation_refcell, + &partition_method_manual_fstab_entry_array_refcell, + &partition_method_manual_luks_enabled_refcell, + &partition_method_manual_crypttab_entry_array_refcell, + ); + let installation_log_loop_sender_clone0 = installation_log_loop_sender.clone(); + let installation_log_status_loop_sender_clone0 = + installation_log_status_loop_sender.clone(); + thread::spawn(move || { + if Path::new(LOG_FILE_PATH).exists() { + fs::remove_file(LOG_FILE_PATH).expect("bad perms on log file"); + } + match run_install_process(installation_log_loop_sender_clone0, &cmd, LOG_FILE_PATH) + { + Ok(_) => installation_log_status_loop_sender_clone0 + .send_blocking(true) + .expect("channel needs to be open"), + Err(_) => installation_log_status_loop_sender_clone0 + .send_blocking(false) + .expect("channel needs to be open"), + } + }); + main_carousel.scroll_to(&main_carousel.nth_page(7), true); + } + )); // diff --git a/src/installation_summary_page/script_gen/auto_basic.rs b/src/installation_summary_page/script_gen/auto_basic.rs index 6a40267..89aa41a 100644 --- a/src/installation_summary_page/script_gen/auto_basic.rs +++ b/src/installation_summary_page/script_gen/auto_basic.rs @@ -49,4 +49,4 @@ pikainstall -c "$PIKA_INSTALL_AUTO_LUKS_PASSWORD" -r "$PIKA_INSTALL_CHROOT_PATH" else pikainstall -c "$PIKA_INSTALL_AUTO_LUKS_PASSWORD" -r "$PIKA_INSTALL_CHROOT_PATH" -l "$PIKA_INSTALL_LOCALE" -k "$PIKA_INSTALL_KEYMAP" -kl "$PIKA_INSTALL_XKB_LAYOUT" -t "$PIKA_INSTALL_TIMEZONE" -kv "$PIKA_INSTALL_XKB_VARIANT" fi -"###; \ No newline at end of file +"###; diff --git a/src/installation_summary_page/script_gen/auto_btrfs.rs b/src/installation_summary_page/script_gen/auto_btrfs.rs index 36cf2f3..8561142 100644 --- a/src/installation_summary_page/script_gen/auto_btrfs.rs +++ b/src/installation_summary_page/script_gen/auto_btrfs.rs @@ -58,7 +58,7 @@ fi "###; -pub const AUTOMATIC_HOME_SUBVOL_BTRFS_LOCKED_INSTALLATION_PROG: &str = r###" +pub const AUTOMATIC_HOME_SUBVOL_BTRFS_LOCKED_INSTALLATION_PROG: &str = r###" PIKA_INSTALL_AUTO_LUKS_PASSWORD='{AUTO_LUKS_PASSWORD}' @@ -126,7 +126,7 @@ fi // BTRFS WITH HOME PART -pub const AUTOMATIC_HOME_PART_BTRFS_OPEN_INSTALLATION_PROG: &str = r###" +pub const AUTOMATIC_HOME_PART_BTRFS_OPEN_INSTALLATION_PROG: &str = r###" PIKA_INSTALL_AUTO_ROOT_SIZE={ROOT_PART_SIZE_AS_I64_MIB} @@ -197,7 +197,7 @@ fi "###; -pub const AUTOMATIC_HOME_PART_BTRFS_LOCKED_INSTALLATION_PROG: &str = r###" +pub const AUTOMATIC_HOME_PART_BTRFS_LOCKED_INSTALLATION_PROG: &str = r###" PIKA_INSTALL_AUTO_LUKS_PASSWORD='{AUTO_LUKS_PASSWORD}' PIKA_INSTALL_AUTO_ROOT_SIZE={ROOT_PART_SIZE_AS_I64_MIB} @@ -279,7 +279,7 @@ fi // BTRFS WITH NO HOME -pub const AUTOMATIC_HOME_NONE_BTRFS_OPEN_INSTALLATION_PROG: &str = r###" +pub const AUTOMATIC_HOME_NONE_BTRFS_OPEN_INSTALLATION_PROG: &str = r###" parted -s -a optimal /dev/"$PIKA_INSTALL_AUTO_TARGET_DISK" mklabel gpt \ mkpart "linux-efi" 1MiB 500Mib \ @@ -333,7 +333,7 @@ fi "###; -pub const AUTOMATIC_HOME_NONE_BTRFS_LOCKED_INSTALLATION_PROG: &str = r###" +pub const AUTOMATIC_HOME_NONE_BTRFS_LOCKED_INSTALLATION_PROG: &str = r###" PIKA_INSTALL_AUTO_LUKS_PASSWORD='{AUTO_LUKS_PASSWORD}' @@ -390,4 +390,4 @@ mount /dev/"$PIKA_INSTALL_AUTO_TARGET_DISK"2 $PIKA_INSTALL_CHROOT_PATH/boot mkdir -p $PIKA_INSTALL_CHROOT_PATH/boot/efi mount /dev/"$PIKA_INSTALL_AUTO_TARGET_DISK"1 $PIKA_INSTALL_CHROOT_PATH/boot/efi fi -"###; \ No newline at end of file +"###; diff --git a/src/installation_summary_page/script_gen/auto_ext4.rs b/src/installation_summary_page/script_gen/auto_ext4.rs index 3a93faa..36b0eab 100644 --- a/src/installation_summary_page/script_gen/auto_ext4.rs +++ b/src/installation_summary_page/script_gen/auto_ext4.rs @@ -216,4 +216,4 @@ mkdir -p $PIKA_INSTALL_CHROOT_PATH/boot/efi mount /dev/"$PIKA_INSTALL_AUTO_TARGET_DISK"1 $PIKA_INSTALL_CHROOT_PATH/boot/efi fi -"###; \ No newline at end of file +"###; diff --git a/src/installation_summary_page/script_gen/auto_xfs.rs b/src/installation_summary_page/script_gen/auto_xfs.rs index c9808dc..1902320 100644 --- a/src/installation_summary_page/script_gen/auto_xfs.rs +++ b/src/installation_summary_page/script_gen/auto_xfs.rs @@ -217,4 +217,4 @@ mkdir -p $PIKA_INSTALL_CHROOT_PATH/boot/efi mount /dev/"$PIKA_INSTALL_AUTO_TARGET_DISK"1 $PIKA_INSTALL_CHROOT_PATH/boot/efi fi -"###; \ No newline at end of file +"###; diff --git a/src/installation_summary_page/script_gen/manual_basic.rs b/src/installation_summary_page/script_gen/manual_basic.rs index ccc27b6..0483a35 100644 --- a/src/installation_summary_page/script_gen/manual_basic.rs +++ b/src/installation_summary_page/script_gen/manual_basic.rs @@ -46,4 +46,4 @@ pikainstall --manual 2 -r "$PIKA_INSTALL_CHROOT_PATH" -l "$PIKA_INSTALL_LOCALE" else pikainstall --manual 2 -r "$PIKA_INSTALL_CHROOT_PATH" -l "$PIKA_INSTALL_LOCALE" -k "$PIKA_INSTALL_KEYMAP" -kl "$PIKA_INSTALL_XKB_LAYOUT" -t "$PIKA_INSTALL_TIMEZONE" -kv "$PIKA_INSTALL_XKB_VARIANT" fi -"###; \ No newline at end of file +"###; diff --git a/src/installation_summary_page/script_gen/mod.rs b/src/installation_summary_page/script_gen/mod.rs index 18698bc..9e30968 100644 --- a/src/installation_summary_page/script_gen/mod.rs +++ b/src/installation_summary_page/script_gen/mod.rs @@ -46,23 +46,45 @@ pub fn create_installation_script( ("CHROOT_PATH".to_string(), "/media/pikaos/installation"), ( "LOCALE".to_string(), - language_selection_text_refcell.borrow().name.replace("'", r###"'"'"'"###).as_str(), + language_selection_text_refcell + .borrow() + .name + .replace("'", r###"'"'"'"###) + .as_str(), ), ( "KEYMAP".to_string(), - keymap_selection_text_refcell.borrow().kbdmap.console.replace("'", r###"'"'"'"###).as_str(), + keymap_selection_text_refcell + .borrow() + .kbdmap + .console + .replace("'", r###"'"'"'"###) + .as_str(), ), ( "XKB_LAYOUT".to_string(), - keymap_selection_text_refcell.borrow().kbdmap.layout.replace("'", r###"'"'"'"###).as_str(), + keymap_selection_text_refcell + .borrow() + .kbdmap + .layout + .replace("'", r###"'"'"'"###) + .as_str(), ), ( "XKB_VARIANT".to_string(), - keymap_selection_text_refcell.borrow().kbdmap.variant.replace("'", r###"'"'"'"###).as_str(), + keymap_selection_text_refcell + .borrow() + .kbdmap + .variant + .replace("'", r###"'"'"'"###) + .as_str(), ), ( "TIMEZONE".to_string(), - timezone_selection_text_refcell.borrow().replace("'", r###"'"'"'"###).as_str(), + timezone_selection_text_refcell + .borrow() + .replace("'", r###"'"'"'"###) + .as_str(), ), ]), ) @@ -76,21 +98,30 @@ pub fn create_installation_script( // let automatic_standard_installation_format = strfmt::strfmt( auto_basic::AUTOMATIC_STANDARD_INSTALLATION_PROG, - &std::collections::HashMap::from([ - ( - "AUTO_INSTALL_TARGET_DISK".to_string(), - partition_method_automatic_target_refcell.borrow().block_name.replace("'", r###"'"'"'"###).as_str(), - ), - ]), + &std::collections::HashMap::from([( + "AUTO_INSTALL_TARGET_DISK".to_string(), + partition_method_automatic_target_refcell + .borrow() + .block_name + .replace("'", r###"'"'"'"###) + .as_str(), + )]), ) .unwrap(); final_script.push_str(&automatic_standard_installation_format); // - match &*partition_method_automatic_target_fs_refcell.borrow().as_str().to_lowercase() { + match &*partition_method_automatic_target_fs_refcell + .borrow() + .as_str() + .to_lowercase() + { "btrfs" => { - match partition_method_automatic_seperation_refcell.borrow().as_str() { + match partition_method_automatic_seperation_refcell + .borrow() + .as_str() + { "subvol" => { if is_encrypted { final_script.push_str(&strfmt::strfmt( @@ -168,11 +199,14 @@ pub fn create_installation_script( .unwrap()); } } - _ => panic!() + _ => panic!(), } } "ext4" => { - match partition_method_automatic_seperation_refcell.borrow().as_str() { + match partition_method_automatic_seperation_refcell + .borrow() + .as_str() + { "partition" => { if is_encrypted { final_script.push_str(&strfmt::strfmt( @@ -191,17 +225,29 @@ pub fn create_installation_script( ) .unwrap()); } else { - final_script.push_str(&strfmt::strfmt( - auto_ext4::AUTOMATIC_HOME_PART_EXT4_OPEN_INSTALLATION_PROG, - &std::collections::HashMap::from([ - ("CHROOT_PATH".to_string(), "/media/pikaos/installation"), - ( - "ROOT_PART_SIZE_AS_I64_MIB".to_string(), - (partition_method_automatic_ratio_refcell.borrow().round() as i64 / 1048576).to_string().replace("'", r###"'"'"'"###).as_str(), - ) - ]), - ) - .unwrap()); + final_script.push_str( + &strfmt::strfmt( + auto_ext4::AUTOMATIC_HOME_PART_EXT4_OPEN_INSTALLATION_PROG, + &std::collections::HashMap::from([ + ( + "CHROOT_PATH".to_string(), + "/media/pikaos/installation", + ), + ( + "ROOT_PART_SIZE_AS_I64_MIB".to_string(), + (partition_method_automatic_ratio_refcell + .borrow() + .round() + as i64 + / 1048576) + .to_string() + .replace("'", r###"'"'"'"###) + .as_str(), + ), + ]), + ) + .unwrap(), + ); } } "none" => { @@ -218,78 +264,122 @@ pub fn create_installation_script( ) .unwrap()); } else { - final_script.push_str(&strfmt::strfmt( - auto_ext4::AUTOMATIC_HOME_NONE_EXT4_OPEN_INSTALLATION_PROG, - &std::collections::HashMap::from([ - ("CHROOT_PATH".to_string(), "/media/pikaos/installation"), - ]), - ) - .unwrap()); + final_script.push_str( + &strfmt::strfmt( + auto_ext4::AUTOMATIC_HOME_NONE_EXT4_OPEN_INSTALLATION_PROG, + &std::collections::HashMap::from([( + "CHROOT_PATH".to_string(), + "/media/pikaos/installation", + )]), + ) + .unwrap(), + ); } } - _ => panic!() + _ => panic!(), } } "xfs" => { - match partition_method_automatic_seperation_refcell.borrow().as_str() { + match partition_method_automatic_seperation_refcell + .borrow() + .as_str() + { "partition" => { if is_encrypted { - final_script.push_str(&strfmt::strfmt( - auto_xfs::AUTOMATIC_HOME_PART_XFS_LOCKED_INSTALLATION_PROG, - &std::collections::HashMap::from([ - ("CHROOT_PATH".to_string(), "/media/pikaos/installation"), - ( - "AUTO_LUKS_PASSWORD".to_string(), - partition_method_automatic_luks_refcell.borrow().replace("'", r###"'"'"'"###).as_str(), - ), - ( - "ROOT_PART_SIZE_AS_I64_MIB".to_string(), - (partition_method_automatic_ratio_refcell.borrow().round() as i64 / 1048576).to_string().replace("'", r###"'"'"'"###).as_str(), - ) - ]), - ) - .unwrap()); + final_script.push_str( + &strfmt::strfmt( + auto_xfs::AUTOMATIC_HOME_PART_XFS_LOCKED_INSTALLATION_PROG, + &std::collections::HashMap::from([ + ( + "CHROOT_PATH".to_string(), + "/media/pikaos/installation", + ), + ( + "AUTO_LUKS_PASSWORD".to_string(), + partition_method_automatic_luks_refcell + .borrow() + .replace("'", r###"'"'"'"###) + .as_str(), + ), + ( + "ROOT_PART_SIZE_AS_I64_MIB".to_string(), + (partition_method_automatic_ratio_refcell + .borrow() + .round() + as i64 + / 1048576) + .to_string() + .replace("'", r###"'"'"'"###) + .as_str(), + ), + ]), + ) + .unwrap(), + ); } else { - final_script.push_str(&strfmt::strfmt( - auto_xfs::AUTOMATIC_HOME_PART_XFS_OPEN_INSTALLATION_PROG, - &std::collections::HashMap::from([ - ("CHROOT_PATH".to_string(), "/media/pikaos/installation"), - ( - "ROOT_PART_SIZE_AS_I64_MIB".to_string(), - (partition_method_automatic_ratio_refcell.borrow().round() as i64 / 1048576).to_string().replace("'", r###"'"'"'"###).as_str(), - ) - ]), - ) - .unwrap()); + final_script.push_str( + &strfmt::strfmt( + auto_xfs::AUTOMATIC_HOME_PART_XFS_OPEN_INSTALLATION_PROG, + &std::collections::HashMap::from([ + ( + "CHROOT_PATH".to_string(), + "/media/pikaos/installation", + ), + ( + "ROOT_PART_SIZE_AS_I64_MIB".to_string(), + (partition_method_automatic_ratio_refcell + .borrow() + .round() + as i64 + / 1048576) + .to_string() + .replace("'", r###"'"'"'"###) + .as_str(), + ), + ]), + ) + .unwrap(), + ); } } "none" => { if is_encrypted { - final_script.push_str(&strfmt::strfmt( - auto_xfs::AUTOMATIC_HOME_NONE_XFS_LOCKED_INSTALLATION_PROG, - &std::collections::HashMap::from([ - ("CHROOT_PATH".to_string(), "/media/pikaos/installation"), - ( - "AUTO_LUKS_PASSWORD".to_string(), - partition_method_automatic_luks_refcell.borrow().replace("'", r###"'"'"'"###).as_str(), - ) - ]), - ) - .unwrap()); + final_script.push_str( + &strfmt::strfmt( + auto_xfs::AUTOMATIC_HOME_NONE_XFS_LOCKED_INSTALLATION_PROG, + &std::collections::HashMap::from([ + ( + "CHROOT_PATH".to_string(), + "/media/pikaos/installation", + ), + ( + "AUTO_LUKS_PASSWORD".to_string(), + partition_method_automatic_luks_refcell + .borrow() + .replace("'", r###"'"'"'"###) + .as_str(), + ), + ]), + ) + .unwrap(), + ); } else { - final_script.push_str(&strfmt::strfmt( - auto_xfs::AUTOMATIC_HOME_NONE_XFS_OPEN_INSTALLATION_PROG, - &std::collections::HashMap::from([ - ("CHROOT_PATH".to_string(), "/media/pikaos/installation"), - ]), - ) - .unwrap()); + final_script.push_str( + &strfmt::strfmt( + auto_xfs::AUTOMATIC_HOME_NONE_XFS_OPEN_INSTALLATION_PROG, + &std::collections::HashMap::from([( + "CHROOT_PATH".to_string(), + "/media/pikaos/installation", + )]), + ) + .unwrap(), + ); } } - _ => panic!() + _ => panic!(), } } - _ => panic!() + _ => panic!(), } // if is_encrypted { @@ -300,117 +390,143 @@ pub fn create_installation_script( } "manual" => { let is_encrypted = *partition_method_manual_luks_enabled_refcell.borrow(); - + if is_encrypted { final_script.push_str( -r###" + r###" mkdir -p /tmp/PIKA_CRYPT/ touch /tmp/PIKA_CRYPT/crypttab -"### +"###, ); - - for crypt_entry in partition_method_manual_crypttab_entry_array_refcell.borrow().iter() { + + for crypt_entry in partition_method_manual_crypttab_entry_array_refcell + .borrow() + .iter() + { match &crypt_entry.password { Some(p) => { - final_script.push_str(&strfmt::strfmt( - manual_basic::MANUAL_CRYPT_ENTRY_WITH_KEYFILE, - &std::collections::HashMap::from([ - ( - "MAP".to_string(), - crypt_entry.map.replace("'", r###"'"'"'"###).as_str() - ), - ( - "UUID".to_string(), - crypt_entry.uuid.replace("'", r###"'"'"'"###).as_str() - ), - ( - "LUKS_PASSWD".to_string(), - p.replace("'", r###"'"'"'"###).as_str() - ) - ]), - ) - .unwrap()); + final_script.push_str( + &strfmt::strfmt( + manual_basic::MANUAL_CRYPT_ENTRY_WITH_KEYFILE, + &std::collections::HashMap::from([ + ( + "MAP".to_string(), + crypt_entry.map.replace("'", r###"'"'"'"###).as_str(), + ), + ( + "UUID".to_string(), + crypt_entry.uuid.replace("'", r###"'"'"'"###).as_str(), + ), + ( + "LUKS_PASSWD".to_string(), + p.replace("'", r###"'"'"'"###).as_str(), + ), + ]), + ) + .unwrap(), + ); } None => { - final_script.push_str(&strfmt::strfmt( - manual_basic::MANUAL_CRYPT_ENTRY, - &std::collections::HashMap::from([ - ( - "MAP".to_string(), - crypt_entry.map.replace("'", r###"'"'"'"###).as_str() - ), - ( - "UUID".to_string(), - crypt_entry.uuid.replace("'", r###"'"'"'"###).as_str() - ) - ]), - ) - .unwrap()); + final_script.push_str( + &strfmt::strfmt( + manual_basic::MANUAL_CRYPT_ENTRY, + &std::collections::HashMap::from([ + ( + "MAP".to_string(), + crypt_entry.map.replace("'", r###"'"'"'"###).as_str(), + ), + ( + "UUID".to_string(), + crypt_entry.uuid.replace("'", r###"'"'"'"###).as_str(), + ), + ]), + ) + .unwrap(), + ); } } - }; + } } let mut did_make_swap_list = false; - for fstab_entry in partition_method_manual_fstab_entry_array_refcell.borrow().iter() { + for fstab_entry in partition_method_manual_fstab_entry_array_refcell + .borrow() + .iter() + { if fstab_entry.mountpoint == "[SWAP]" { if !did_make_swap_list { final_script.push_str( -r###" + r###" touch /tmp/pika-installer-gtk4-swaplist -"### +"###, ); did_make_swap_list = true } - final_script.push_str(&strfmt::strfmt( - manual_basic::MANUAL_SWAP_MOUNT_PROG, - &std::collections::HashMap::from([ - ( + final_script.push_str( + &strfmt::strfmt( + manual_basic::MANUAL_SWAP_MOUNT_PROG, + &std::collections::HashMap::from([( "PART".to_string(), - fstab_entry.partition.part_name.replace("'", r###"'"'"'"###).as_str() - ), - ]), - ) - .unwrap()); + fstab_entry + .partition + .part_name + .replace("'", r###"'"'"'"###) + .as_str(), + )]), + ) + .unwrap(), + ); } else if !fstab_entry.mountopts.is_empty() { - final_script.push_str(&strfmt::strfmt( - manual_basic::MANUAL_PARTITION_MOUNT_WITH_OPTS_PROG, - &std::collections::HashMap::from([ - ( - "PART".to_string(), - fstab_entry.partition.part_name.replace("'", r###"'"'"'"###).as_str() - ), - ( - "MOUNTPOINT".to_string(), - fstab_entry.mountpoint.replace("'", r###"'"'"'"###).as_str() - ), - ( - "OPTS".to_string(), - fstab_entry.mountopts.replace("'", r###"'"'"'"###).as_str() - ), - ]), - ) - .unwrap()); + final_script.push_str( + &strfmt::strfmt( + manual_basic::MANUAL_PARTITION_MOUNT_WITH_OPTS_PROG, + &std::collections::HashMap::from([ + ( + "PART".to_string(), + fstab_entry + .partition + .part_name + .replace("'", r###"'"'"'"###) + .as_str(), + ), + ( + "MOUNTPOINT".to_string(), + fstab_entry.mountpoint.replace("'", r###"'"'"'"###).as_str(), + ), + ( + "OPTS".to_string(), + fstab_entry.mountopts.replace("'", r###"'"'"'"###).as_str(), + ), + ]), + ) + .unwrap(), + ); } else { - final_script.push_str(&strfmt::strfmt( - manual_basic::MANUAL_PARTITION_MOUNT_PROG, - &std::collections::HashMap::from([ - ( - "PART".to_string(), - fstab_entry.partition.part_name.replace("'", r###"'"'"'"###).as_str() - ), - ( - "MOUNTPOINT".to_string(), - fstab_entry.mountpoint.replace("'", r###"'"'"'"###).as_str() - ), - ]), - ) - .unwrap()); + final_script.push_str( + &strfmt::strfmt( + manual_basic::MANUAL_PARTITION_MOUNT_PROG, + &std::collections::HashMap::from([ + ( + "PART".to_string(), + fstab_entry + .partition + .part_name + .replace("'", r###"'"'"'"###) + .as_str(), + ), + ( + "MOUNTPOINT".to_string(), + fstab_entry.mountpoint.replace("'", r###"'"'"'"###).as_str(), + ), + ]), + ) + .unwrap(), + ); } } @@ -420,7 +536,7 @@ touch /tmp/pika-installer-gtk4-swaplist final_script.push_str(manual_basic::MANUAL_OPEN_PART_PIKAINSTALL_PROG); } } - _ => panic!() + _ => panic!(), } final_script diff --git a/src/keyboard_page/mod.rs b/src/keyboard_page/mod.rs index 3315a7d..b096e33 100644 --- a/src/keyboard_page/mod.rs +++ b/src/keyboard_page/mod.rs @@ -1,8 +1,11 @@ -use crate::{build_ui::{PikaKeymap, KBDMap}, installer_stack_page}; +use crate::{ + build_ui::{KBDMap, PikaKeymap}, + installer_stack_page, +}; use adw::prelude::*; +use glib::{clone, closure_local}; use gnome_desktop::XkbInfoExt; use gtk::{gio, glib}; -use glib::{clone, closure_local}; use std::{cell::RefCell, process::Command, rc::Rc}; pub fn keyboard_page( @@ -67,377 +70,317 @@ pub fn keyboard_page( let current_keymap_variant: Option = None; let kbd_map_list = [ - KBDMap { - console: "sg".to_string(), - layout: "ch".to_string(), - variant: "de_nodeadkeys".to_string() - }, - - KBDMap { - console: "nl".to_string(), - layout: "nl".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "mk-utf".to_string(), - layout: "mk".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "trq".to_string(), - layout: "tr".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "trf".to_string(), - layout: "tr".to_string(), - variant: "f".to_string() - }, - - KBDMap { - console: "uk".to_string(), - layout: "gb".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "is-latin1".to_string(), - layout: "is".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "de".to_string(), - layout: "de".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "la-latin1".to_string(), - layout: "latam".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "us".to_string(), - layout: "us".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "ko".to_string(), - layout: "kr".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "ro_std".to_string(), - layout: "ro".to_string(), - variant: "std".to_string() - }, - - KBDMap { - console: "slovene".to_string(), - layout: "si".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "hu".to_string(), - layout: "hu".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "jp106".to_string(), - layout: "jp".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "croat".to_string(), - layout: "hr".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "hu101".to_string(), - layout: "hu".to_string(), - variant: "qwerty".to_string() - }, - - KBDMap { - console: "sr-latin".to_string(), - layout: "rs".to_string(), - variant: "latin".to_string() - }, - - KBDMap { - console: "fi".to_string(), - layout: "fi".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "fr_CH".to_string(), - layout: "ch".to_string(), - variant: "fr".to_string() - }, - - KBDMap { - console: "dk-latin1".to_string(), - layout: "dk".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "fr".to_string(), - layout: "fr".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "ua-utf".to_string(), - layout: "ua".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "fr-latin9".to_string(), - layout: "fr".to_string(), - variant: "latin9".to_string() - }, - - KBDMap { - console: "sg-latin1".to_string(), - layout: "ch".to_string(), - variant: "de_nodeadkeys".to_string() - }, - - KBDMap { - console: "be-latin1".to_string(), - layout: "be".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "dk".to_string(), - layout: "dk".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "bg_pho-utf8".to_string(), - layout: "bg".to_string(), - variant: "phonetic".to_string() - }, - - KBDMap { - console: "it-ibm".to_string(), - layout: "it".to_string(), - variant: "ibm".to_string() - }, - - KBDMap { - console: "cz-us-qwertz".to_string(), - layout: "cz".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "cz-qwerty".to_string(), - layout: "cz".to_string(), - variant: "qwerty".to_string() - }, - - KBDMap { - console: "br".to_string(), - layout: "br".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "ro".to_string(), - layout: "ro".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "us-acentos".to_string(), - layout: "us".to_string(), - variant: "intl".to_string() - }, - - KBDMap { - console: "pt-latin1".to_string(), - layout: "pt".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "tj_alt-UTF8".to_string(), - layout: "tj".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "de-latin1-nodeadkeys".to_string(), - layout: "de".to_string(), - variant: "nodeadkeys".to_string() - }, - - KBDMap { - console: "no".to_string(), - layout: "no".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "bg_bds-utf8".to_string(), - layout: "bg".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "dvorak".to_string(), - layout: "us".to_string(), - variant: "dvorak".to_string() - }, - - KBDMap { - console: "ru".to_string(), - layout: "ru".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "cz-lat2".to_string(), - layout: "cz".to_string(), - variant: "qwerty".to_string() - }, - - KBDMap { - console: "pl".to_string(), - layout: "pl".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "es".to_string(), - layout: "es".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "ie".to_string(), - layout: "ie".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "et".to_string(), - layout: "ee".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "sk-qwerty".to_string(), - layout: "sk".to_string(), - variant: "qwerty".to_string() - }, - - KBDMap { - console: "sk-qwertz".to_string(), - layout: "sk".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "fr-latin9".to_string(), - layout: "fr".to_string(), - variant: "latin9".to_string() - }, - - KBDMap { - console: "fr_CH-latin1".to_string(), - layout: "ch".to_string(), - variant: "fr".to_string() - }, - - KBDMap { - console: "cf".to_string(), - layout: "ca".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "sv-latin1".to_string(), - layout: "se".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "sr-cy".to_string(), - layout: "rs".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "gr".to_string(), - layout: "gr".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "by".to_string(), - layout: "by".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "il".to_string(), - layout: "il".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "kazakh".to_string(), - layout: "kz".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "lt".to_string(), - layout: "lt".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "khmer".to_string(), - layout: "kh".to_string(), - variant: "".to_string() - }, - - KBDMap { - console: "dvorak-es".to_string(), - layout: "es".to_string(), - variant: "dvorak".to_string() - }, - - KBDMap { - console: "lv".to_string(), - layout: "lv".to_string(), - variant: "apostrophe".to_string() - }, - - KBDMap { - console: "lv-tilde".to_string(), - layout: "lv".to_string(), - variant: "tilde".to_string() - }]; + KBDMap { + console: "sg".to_string(), + layout: "ch".to_string(), + variant: "de_nodeadkeys".to_string(), + }, + KBDMap { + console: "nl".to_string(), + layout: "nl".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "mk-utf".to_string(), + layout: "mk".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "trq".to_string(), + layout: "tr".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "trf".to_string(), + layout: "tr".to_string(), + variant: "f".to_string(), + }, + KBDMap { + console: "uk".to_string(), + layout: "gb".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "is-latin1".to_string(), + layout: "is".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "de".to_string(), + layout: "de".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "la-latin1".to_string(), + layout: "latam".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "us".to_string(), + layout: "us".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "ko".to_string(), + layout: "kr".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "ro_std".to_string(), + layout: "ro".to_string(), + variant: "std".to_string(), + }, + KBDMap { + console: "slovene".to_string(), + layout: "si".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "hu".to_string(), + layout: "hu".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "jp106".to_string(), + layout: "jp".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "croat".to_string(), + layout: "hr".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "hu101".to_string(), + layout: "hu".to_string(), + variant: "qwerty".to_string(), + }, + KBDMap { + console: "sr-latin".to_string(), + layout: "rs".to_string(), + variant: "latin".to_string(), + }, + KBDMap { + console: "fi".to_string(), + layout: "fi".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "fr_CH".to_string(), + layout: "ch".to_string(), + variant: "fr".to_string(), + }, + KBDMap { + console: "dk-latin1".to_string(), + layout: "dk".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "fr".to_string(), + layout: "fr".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "ua-utf".to_string(), + layout: "ua".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "fr-latin9".to_string(), + layout: "fr".to_string(), + variant: "latin9".to_string(), + }, + KBDMap { + console: "sg-latin1".to_string(), + layout: "ch".to_string(), + variant: "de_nodeadkeys".to_string(), + }, + KBDMap { + console: "be-latin1".to_string(), + layout: "be".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "dk".to_string(), + layout: "dk".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "bg_pho-utf8".to_string(), + layout: "bg".to_string(), + variant: "phonetic".to_string(), + }, + KBDMap { + console: "it-ibm".to_string(), + layout: "it".to_string(), + variant: "ibm".to_string(), + }, + KBDMap { + console: "cz-us-qwertz".to_string(), + layout: "cz".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "cz-qwerty".to_string(), + layout: "cz".to_string(), + variant: "qwerty".to_string(), + }, + KBDMap { + console: "br".to_string(), + layout: "br".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "ro".to_string(), + layout: "ro".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "us-acentos".to_string(), + layout: "us".to_string(), + variant: "intl".to_string(), + }, + KBDMap { + console: "pt-latin1".to_string(), + layout: "pt".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "tj_alt-UTF8".to_string(), + layout: "tj".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "de-latin1-nodeadkeys".to_string(), + layout: "de".to_string(), + variant: "nodeadkeys".to_string(), + }, + KBDMap { + console: "no".to_string(), + layout: "no".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "bg_bds-utf8".to_string(), + layout: "bg".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "dvorak".to_string(), + layout: "us".to_string(), + variant: "dvorak".to_string(), + }, + KBDMap { + console: "ru".to_string(), + layout: "ru".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "cz-lat2".to_string(), + layout: "cz".to_string(), + variant: "qwerty".to_string(), + }, + KBDMap { + console: "pl".to_string(), + layout: "pl".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "es".to_string(), + layout: "es".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "ie".to_string(), + layout: "ie".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "et".to_string(), + layout: "ee".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "sk-qwerty".to_string(), + layout: "sk".to_string(), + variant: "qwerty".to_string(), + }, + KBDMap { + console: "sk-qwertz".to_string(), + layout: "sk".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "fr-latin9".to_string(), + layout: "fr".to_string(), + variant: "latin9".to_string(), + }, + KBDMap { + console: "fr_CH-latin1".to_string(), + layout: "ch".to_string(), + variant: "fr".to_string(), + }, + KBDMap { + console: "cf".to_string(), + layout: "ca".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "sv-latin1".to_string(), + layout: "se".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "sr-cy".to_string(), + layout: "rs".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "gr".to_string(), + layout: "gr".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "by".to_string(), + layout: "by".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "il".to_string(), + layout: "il".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "kazakh".to_string(), + layout: "kz".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "lt".to_string(), + layout: "lt".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "khmer".to_string(), + layout: "kh".to_string(), + variant: "".to_string(), + }, + KBDMap { + console: "dvorak-es".to_string(), + layout: "es".to_string(), + variant: "dvorak".to_string(), + }, + KBDMap { + console: "lv".to_string(), + layout: "lv".to_string(), + variant: "apostrophe".to_string(), + }, + KBDMap { + console: "lv-tilde".to_string(), + layout: "lv".to_string(), + variant: "tilde".to_string(), + }, + ]; let xkbinfo = gnome_desktop::XkbInfo::new(); @@ -447,12 +390,22 @@ pub fn keyboard_page( if map.variant.is_empty() { sorted_keymap_vec.push(PikaKeymap { kbdmap: kbd_map, - pretty_name: xkbinfo.layout_info(&map.layout).unwrap().0.unwrap().to_string(), + pretty_name: xkbinfo + .layout_info(&map.layout) + .unwrap() + .0 + .unwrap() + .to_string(), }) } else { sorted_keymap_vec.push(PikaKeymap { kbdmap: kbd_map, - pretty_name: xkbinfo.layout_info(format!("{}+{}", map.layout, map.variant).as_str()).unwrap().0.unwrap().to_string(), + pretty_name: xkbinfo + .layout_info(format!("{}+{}", map.layout, map.variant).as_str()) + .unwrap() + .0 + .unwrap() + .to_string(), }) } } @@ -521,7 +474,9 @@ pub fn keyboard_page( } } )); - if current_keymap == keymap_clone0.kbdmap.layout && current_keymap_variant == keymap_variant_clone0 { + if current_keymap == keymap_clone0.kbdmap.layout + && current_keymap_variant == keymap_variant_clone0 + { keymap_checkbutton.set_active(true); } } diff --git a/src/language_page/mod.rs b/src/language_page/mod.rs index 6011090..f231495 100644 --- a/src/language_page/mod.rs +++ b/src/language_page/mod.rs @@ -1,7 +1,7 @@ use crate::{build_ui::PikaLocale, installer_stack_page}; use adw::prelude::*; -use gtk::{gio, glib}; use glib::{clone, closure_local}; +use gtk::{gio, glib}; use std::{cell::RefCell, env, process::Command, rc::Rc}; pub fn language_page( @@ -202,11 +202,11 @@ pub fn language_page( move |_language_page: installer_stack_page::InstallerStackPage| { let locale = &lang_data_refcell.borrow(); Command::new("sudo") - .arg("localectl") - .arg("set-locale") - .arg("LANG=".to_owned() + &locale.name + ".UTF-8") - .spawn() - .expect("locale failed to start"); + .arg("localectl") + .arg("set-locale") + .arg("LANG=".to_owned() + &locale.name + ".UTF-8") + .spawn() + .expect("locale failed to start"); rust_i18n::set_locale(&locale.name); language_changed_action.activate(None); main_carousel.scroll_to(&main_carousel.nth_page(2), true) diff --git a/src/main.rs b/src/main.rs index 9d322dc..de0e031 100644 --- a/src/main.rs +++ b/src/main.rs @@ -20,9 +20,9 @@ mod automatic_partitioning_page; mod manual_partitioning_page; mod partitioning_page; // -mod installation_summary_page; -mod installation_progress_page; mod installation_complete_page; +mod installation_progress_page; +mod installation_summary_page; #[macro_use] extern crate rust_i18n; diff --git a/src/manual_partitioning_page/func.rs b/src/manual_partitioning_page/func.rs index 86d97d8..d90f621 100644 --- a/src/manual_partitioning_page/func.rs +++ b/src/manual_partitioning_page/func.rs @@ -4,8 +4,8 @@ use crate::{ drive_mount_row::DriveMountRow, }; use adw::prelude::*; -use gtk::{glib, gio}; use glib::{clone, closure_local}; +use gtk::{gio, glib}; use std::{cell::RefCell, rc::Rc}; #[derive(Clone, Debug)] @@ -19,6 +19,7 @@ struct PartitionRow { pub fn create_efi_row( listbox: >k::ListBox, + window: adw::ApplicationWindow, drive_rows_size_group: >k::SizeGroup, partition_array: &Vec, partition_changed_action: &gio::SimpleAction, @@ -29,15 +30,20 @@ pub fn create_efi_row( let partition_scroll_child = gtk::ListBox::builder() .selection_mode(gtk::SelectionMode::None) .build(); + partition_scroll_child.add_css_class("boxed-list"); + partition_scroll_child.add_css_class("no-round-borders"); let partitions_scroll = gtk::ScrolledWindow::builder() .hexpand(true) .vexpand(true) + .overflow(gtk::Overflow::Hidden) + .has_frame(true) .child(&partition_scroll_child) .build(); + partitions_scroll.add_css_class("round-all-scroll-no-padding"); // Create row - let row = DriveMountRow::new_with_scroll(&partitions_scroll); + let row = DriveMountRow::new_with_widgets(&partitions_scroll, &window); row.set_deletable(false); @@ -92,7 +98,6 @@ pub fn create_efi_row( { PartitionRow { widget: { - adw::ActionRow::builder() .activatable_widget(&partition_button) .title(part_name) @@ -117,7 +122,6 @@ pub fn create_efi_row( { PartitionRow { widget: { - adw::ActionRow::builder() .activatable_widget(&partition_button) .title(part_name) @@ -169,7 +173,6 @@ pub fn create_efi_row( } else { PartitionRow { widget: { - adw::ActionRow::builder() .activatable_widget(&partition_button) .title(part_name) @@ -244,6 +247,7 @@ pub fn create_efi_row( pub fn create_boot_row( listbox: >k::ListBox, + window: adw::ApplicationWindow, drive_rows_size_group: >k::SizeGroup, partition_array: &Vec, partition_changed_action: &gio::SimpleAction, @@ -254,15 +258,20 @@ pub fn create_boot_row( let partition_scroll_child = gtk::ListBox::builder() .selection_mode(gtk::SelectionMode::None) .build(); + partition_scroll_child.add_css_class("boxed-list"); + partition_scroll_child.add_css_class("no-round-borders"); let partitions_scroll = gtk::ScrolledWindow::builder() .hexpand(true) .vexpand(true) + .overflow(gtk::Overflow::Hidden) + .has_frame(true) .child(&partition_scroll_child) .build(); + partitions_scroll.add_css_class("round-all-scroll-no-padding"); // Create row - let row = DriveMountRow::new_with_scroll(&partitions_scroll); + let row = DriveMountRow::new_with_widgets(&partitions_scroll, &window); row.set_deletable(false); @@ -317,7 +326,6 @@ pub fn create_boot_row( { PartitionRow { widget: { - adw::ActionRow::builder() .activatable_widget(&partition_button) .title(part_name) @@ -342,7 +350,6 @@ pub fn create_boot_row( { PartitionRow { widget: { - adw::ActionRow::builder() .activatable_widget(&partition_button) .title(part_name) @@ -394,7 +401,6 @@ pub fn create_boot_row( } else { PartitionRow { widget: { - adw::ActionRow::builder() .activatable_widget(&partition_button) .title(part_name) @@ -469,6 +475,7 @@ pub fn create_boot_row( pub fn create_root_row( listbox: >k::ListBox, + window: adw::ApplicationWindow, drive_rows_size_group: >k::SizeGroup, partition_array: &Vec, partition_changed_action: &gio::SimpleAction, @@ -479,15 +486,20 @@ pub fn create_root_row( let partition_scroll_child = gtk::ListBox::builder() .selection_mode(gtk::SelectionMode::None) .build(); + partition_scroll_child.add_css_class("boxed-list"); + partition_scroll_child.add_css_class("no-round-borders"); let partitions_scroll = gtk::ScrolledWindow::builder() .hexpand(true) .vexpand(true) + .overflow(gtk::Overflow::Hidden) + .has_frame(true) .child(&partition_scroll_child) .build(); + partitions_scroll.add_css_class("round-all-scroll-no-padding"); // Create row - let row = DriveMountRow::new_with_scroll(&partitions_scroll); + let row = DriveMountRow::new_with_widgets(&partitions_scroll, &window); row.set_deletable(false); @@ -542,7 +554,6 @@ pub fn create_root_row( { PartitionRow { widget: { - adw::ActionRow::builder() .activatable_widget(&partition_button) .title(part_name) @@ -567,7 +578,6 @@ pub fn create_root_row( { PartitionRow { widget: { - adw::ActionRow::builder() .activatable_widget(&partition_button) .title(part_name) @@ -624,7 +634,6 @@ pub fn create_root_row( } else { PartitionRow { widget: { - adw::ActionRow::builder() .activatable_widget(&partition_button) .title(part_name) @@ -699,6 +708,7 @@ pub fn create_root_row( pub fn create_mount_row( listbox: >k::ListBox, + window: adw::ApplicationWindow, drive_rows_size_group: >k::SizeGroup, partition_array: &Vec, partition_changed_action: &gio::SimpleAction, @@ -710,15 +720,20 @@ pub fn create_mount_row( let partition_scroll_child = gtk::ListBox::builder() .selection_mode(gtk::SelectionMode::None) .build(); + partition_scroll_child.add_css_class("boxed-list"); + partition_scroll_child.add_css_class("no-round-borders"); let partitions_scroll = gtk::ScrolledWindow::builder() .hexpand(true) .vexpand(true) + .overflow(gtk::Overflow::Hidden) + .has_frame(true) .child(&partition_scroll_child) .build(); + partitions_scroll.add_css_class("round-all-scroll-no-padding"); // Create row - let row = DriveMountRow::new_with_scroll(&partitions_scroll); + let row = DriveMountRow::new_with_widgets(&partitions_scroll, &window); row.set_deletable(true); @@ -773,7 +788,6 @@ pub fn create_mount_row( { PartitionRow { widget: { - adw::ActionRow::builder() .activatable_widget(&partition_button) .title(part_name) @@ -798,7 +812,6 @@ pub fn create_mount_row( { PartitionRow { widget: { - adw::ActionRow::builder() .activatable_widget(&partition_button) .title(part_name) @@ -818,7 +831,6 @@ pub fn create_mount_row( } else { PartitionRow { widget: { - adw::ActionRow::builder() .activatable_widget(&partition_button) .title(part_name) @@ -984,7 +996,7 @@ fn post_check_drive_mount( row, move |_| { if row.mountpoint() == "[SWAP]" { - if partition.part_fs == "linux-swap" || partition.part_fs == "swap" { + if partition.part_fs == "linux-swap" || partition.part_fs == "swap" { (*partition_row_struct.swap_fs_error.borrow_mut()) = false; if !(*partition_row_struct.never.borrow()) && !(*partition_row_struct.swap_fs_error.borrow()) diff --git a/src/manual_partitioning_page/mod.rs b/src/manual_partitioning_page/mod.rs index 6fda190..473e6db 100644 --- a/src/manual_partitioning_page/mod.rs +++ b/src/manual_partitioning_page/mod.rs @@ -1,13 +1,18 @@ use crate::{ build_ui::{CrypttabEntry, FstabEntry, Partition, SubvolDeclaration}, - installer_stack_page, drive_mount_row::DriveMountRow, + installer_stack_page, partitioning_page::{get_luks_uuid, get_partitions, test_luks_passwd}, }; -use gtk::{glib, gio, Orientation}; use adw::prelude::*; use glib::{clone, closure_local}; -use std::{cell::RefCell, collections::HashSet, rc::Rc, sync::{Arc, atomic::AtomicBool}}; +use gtk::{gio, glib, Orientation}; +use std::{ + cell::RefCell, + collections::HashSet, + rc::Rc, + sync::{atomic::AtomicBool, Arc}, +}; mod func; @@ -68,6 +73,7 @@ pub fn manual_partitioning_page( create_hardcoded_rows( &drive_mounts_adw_listbox, + window.clone(), &drive_rows_size_group, &partition_array_refcell, &partition_changed_action, @@ -189,6 +195,8 @@ pub fn manual_partitioning_page( partition_method_manual_valid_label, #[strong] manual_partitioning_page, + #[strong] + window, move |_| { while let Some(row) = drive_mounts_adw_listbox.last_child() { drive_mounts_adw_listbox.remove(&row); @@ -209,6 +217,7 @@ pub fn manual_partitioning_page( manual_partitioning_page.set_next_sensitive(false); create_hardcoded_rows( &drive_mounts_adw_listbox, + window.clone(), &drive_rows_size_group, &partition_array_refcell, &partition_changed_action, @@ -264,11 +273,15 @@ pub fn manual_partitioning_page( for fs_entry in generate_filesystem_table_array(&drive_mounts_adw_listbox) { let fs_entry_clone0 = fs_entry.clone(); - if subvol_partition_array_refcell.borrow().is_empty() && !seen_partitions.insert(fs_entry.clone().partition.part_name) { + if subvol_partition_array_refcell.borrow().is_empty() + && !seen_partitions.insert(fs_entry.clone().partition.part_name) + { (errored.store(true, std::sync::atomic::Ordering::Relaxed)); } if fs_entry.mountpoint == "[SWAP]" { - if fs_entry.partition.part_fs == "linux-swap" || fs_entry.partition.part_fs == "swap" { + if fs_entry.partition.part_fs == "linux-swap" + || fs_entry.partition.part_fs == "swap" + { } else { (errored.store(true, std::sync::atomic::Ordering::Relaxed)); } @@ -339,7 +352,8 @@ pub fn manual_partitioning_page( )); } - (*partition_method_manual_fstab_entry_array_refcell.borrow_mut()).sort_by_key(|p| p.mountpoint.clone()) + (*partition_method_manual_fstab_entry_array_refcell.borrow_mut()) + .sort_by_key(|p| p.mountpoint.clone()) } )); @@ -444,6 +458,7 @@ pub fn manual_partitioning_page( fn create_hardcoded_rows( drive_mounts_adw_listbox: >k::ListBox, + window: adw::ApplicationWindow, drive_rows_size_group: >k::SizeGroup, partition_array_refcell: &Rc>>, partition_changed_action: &gio::SimpleAction, @@ -476,6 +491,7 @@ fn create_hardcoded_rows( func::create_efi_row( drive_mounts_adw_listbox, + window.clone(), drive_rows_size_group, &partition_array_refcell.borrow(), partition_changed_action, @@ -485,6 +501,7 @@ fn create_hardcoded_rows( ); func::create_boot_row( drive_mounts_adw_listbox, + window.clone(), drive_rows_size_group, &partition_array_refcell.borrow(), partition_changed_action, @@ -494,6 +511,7 @@ fn create_hardcoded_rows( ); func::create_root_row( drive_mounts_adw_listbox, + window.clone(), drive_rows_size_group, &partition_array_refcell.borrow(), partition_changed_action, @@ -524,6 +542,7 @@ fn create_hardcoded_rows( move |_| { func::create_mount_row( &drive_mounts_adw_listbox, + window.clone(), &drive_rows_size_group, &partition_array_refcell.borrow(), &partition_changed_action, diff --git a/src/partitioning_page/mod.rs b/src/partitioning_page/mod.rs index b57f4ea..c4b4a46 100644 --- a/src/partitioning_page/mod.rs +++ b/src/partitioning_page/mod.rs @@ -3,9 +3,9 @@ use crate::{ build_ui::{BlockDevice, CrypttabEntry, FstabEntry, Partition}, installer_stack_page, manual_partitioning_page, }; -use gtk::{gio, glib, prelude::*}; use glib::{clone, closure_local}; -use std::{cell::RefCell, rc::Rc, io::BufRead}; +use gtk::{gio, glib, prelude::*}; +use std::{cell::RefCell, io::BufRead, rc::Rc}; pub fn partitioning_page( main_carousel: &adw::Carousel, diff --git a/src/timezone_page/mod.rs b/src/timezone_page/mod.rs index 21dc4b9..e2dfea7 100644 --- a/src/timezone_page/mod.rs +++ b/src/timezone_page/mod.rs @@ -1,7 +1,7 @@ use crate::installer_stack_page; use adw::prelude::*; -use gtk::{gio, glib}; use glib::{clone, closure_local}; +use gtk::{gio, glib}; use std::{cell::RefCell, io::BufRead, process::Command, rc::Rc}; pub fn timezone_page( diff --git a/src/unix_socket_tools/mod.rs b/src/unix_socket_tools/mod.rs index d2f429b..bde3152 100644 --- a/src/unix_socket_tools/mod.rs +++ b/src/unix_socket_tools/mod.rs @@ -1,13 +1,10 @@ use std::fs; use std::path::Path; -use tokio::io::{AsyncReadExt}; +use tokio::io::AsyncReadExt; use tokio::net::{UnixListener, UnixStream}; use tokio::task; -pub async fn handle_client( - mut stream: UnixStream, - buffer_sender: async_channel::Sender, -) { +pub async fn handle_client(mut stream: UnixStream, buffer_sender: async_channel::Sender) { // Buffer to store incoming data let mut buffer = [0; 1024]; @@ -29,10 +26,7 @@ pub async fn handle_client( } } -pub async fn start_socket_server( - buffer_sender: async_channel::Sender, - socket_path: &str, -) { +pub async fn start_socket_server(buffer_sender: async_channel::Sender, socket_path: &str) { // Remove the socket file if it already exists if Path::new(socket_path).exists() { fs::remove_file(socket_path).expect("Could not remove existing socket file"); @@ -57,4 +51,4 @@ pub async fn start_socket_server( } } } -} \ No newline at end of file +}