diff --git a/src/build_ui.rs b/src/build_ui.rs index bc8f7a9..c33135b 100644 --- a/src/build_ui.rs +++ b/src/build_ui.rs @@ -13,6 +13,7 @@ use crate::welcome_page; use crate::language_page; use crate::keyboard_page; use crate::eula_page; +use crate::partitioning_page; // build ui function linked to app startup above pub fn build_ui(app: &adw::Application) { @@ -105,6 +106,9 @@ pub fn build_ui(app: &adw::Application) { // Add keyboard_page.rs as a page for content_stack keyboard_page(&content_stack); + // Add partitioning_page.rs as a page for content_stack + partitioning_page(&content_stack); + // glib maximization if glib_settings.boolean("is-maximized") == true { window.maximize() diff --git a/src/eula_page.rs b/src/eula_page.rs index 3b2f5ee..e513310 100644 --- a/src/eula_page.rs +++ b/src/eula_page.rs @@ -105,7 +105,7 @@ pub fn eula_page(content_stack: >k::Stack) { // text above eula selection box let eula_selection_text = gtk::Label::builder() - .label("Please carefully read and consent to the follwing before installing PikaOS:") + .label("Please carefully read and make sure you consent to the following before installing PikaOS:") .halign(gtk::Align::Center) .hexpand(true) .margin_top(15) diff --git a/src/main.rs b/src/main.rs index 2df7336..94e486a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -16,11 +16,13 @@ mod welcome_page; mod language_page; mod keyboard_page; mod eula_page; +mod partitioning_page; use crate::save_window_size::save_window_size; use crate::welcome_page::welcome_page; use crate::language_page::language_page; use crate::keyboard_page::keyboard_page; use crate::eula_page::eula_page; +use crate::partitioning_page::partitioning_page; /// main function fn main() { diff --git a/src/partitioning_page.rs b/src/partitioning_page.rs new file mode 100644 index 0000000..e0b9340 --- /dev/null +++ b/src/partitioning_page.rs @@ -0,0 +1,307 @@ +// Use libraries +/// Use all gtk4 libraries (gtk4 -> gtk because cargo) +/// Use all libadwaita libraries (libadwaita -> adw because cargo) +use gtk::prelude::*; +use gtk::*; +use adw::prelude::*; +use adw::*; +use glib::*; +use gdk::Display; +use gtk::subclass::layout_child; + +pub fn partitioning_page(content_stack: >k::Stack) { + + // create the bottom box for next and back buttons + let bottom_box = gtk::Box::builder() + .orientation(Orientation::Horizontal) + .valign(gtk::Align::End) + .vexpand(true) + .build(); + + // Next and back button + let bottom_back_button = gtk::Button::builder() + .label("Back") + .margin_top(15) + .margin_bottom(15) + .margin_start(15) + .margin_end(15) + .halign(gtk::Align::Start) + .hexpand(true) + .build(); + let bottom_next_button = gtk::Button::builder() + .label("Next") + .margin_top(15) + .margin_bottom(15) + .margin_start(15) + .margin_end(15) + .halign(gtk::Align::End) + .hexpand(true) + .sensitive(false) + .build(); + + // Start Applying css classes + bottom_next_button.add_css_class("suggested-action"); + + // / bottom_box appends + //// Add the next and back buttons + bottom_box.append(&bottom_back_button); + bottom_box.append(&bottom_next_button); + + // the header box for the partitioning page + let partitioning_main_box = gtk::Box::builder() + .orientation(Orientation::Vertical) + .build(); + + // the header box for the partitioning page + let partitioning_header_box = gtk::Box::builder() + .orientation(Orientation::Horizontal) + .build(); + + // the header text for the partitioning page + let partitioning_header_text = gtk::Label::builder() + .label("Choose an install method") + .halign(gtk::Align::End) + .hexpand(true) + .margin_top(15) + .margin_bottom(15) + .margin_start(15) + .margin_end(5) + .build(); + partitioning_header_text.add_css_class("header_sized_text"); + + // the header icon for the partitioning icon + let partitioning_header_icon = gtk::Image::builder() + .icon_name("media-floppy") + .halign(gtk::Align::Start) + .hexpand(true) + .pixel_size(78) + .margin_top(15) + .margin_bottom(15) + .margin_start(0) + .margin_end(15) + .build(); + + // a stack for the 2 partitioning methods + let partitioning_stack = gtk::Stack::builder() + .transition_type(StackTransitionType::SlideLeftRight) + .build(); + + let partitioning_method_main_box = gtk::Box::builder() + .orientation(Orientation::Vertical) + .build(); + + // make partitioning selection box for choosing installation or live media + let partitioning_selection_box = gtk::Box::builder() + .orientation(Orientation::Horizontal) + .spacing(200) + .build(); + + let manual_method_button_content_box = gtk::Box::builder() + .orientation(Orientation::Vertical) + .margin_top(30) + .margin_bottom(30) + .build(); + + let manual_method_button_content_image = gtk::Image::builder() + .icon_name("input-tablet") + .pixel_size(128) + .margin_top(15) + .margin_bottom(15) + .margin_start(15) + .margin_end(15) + .build(); + + let manual_method_button_content_text = gtk::Label::builder() + .label("Manually Partition The Drive") + .margin_top(0) + .margin_bottom(15) + .margin_start(15) + .margin_end(15) + .build(); + manual_method_button_content_text.add_css_class("medium_sized_text"); + + let automatic_method_button_content_box = gtk::Box::builder() + .orientation(Orientation::Vertical) + .margin_top(20) + .margin_bottom(20) + .margin_end(15) + .margin_start(15) + .build(); + + let automatic_method_button_content_image = gtk::Image::builder() + .icon_name("media-playlist-shuffle") + .pixel_size(128) + .margin_top(15) + .margin_bottom(15) + .margin_start(15) + .margin_end(15) + .build(); + + let automatic_method_button_content_text = gtk::Label::builder() + .label("Automatically Partition\nThe Drive") + .margin_top(0) + .margin_bottom(15) + .margin_start(15) + .margin_end(15) + .build(); + automatic_method_button_content_text.add_css_class("medium_sized_text"); + + let manual_method_button = gtk::Button::builder() + .child(&manual_method_button_content_box) + .vexpand(true) + .hexpand(true) + .halign(gtk::Align::End) + .valign(gtk::Align::Center) + .build(); + + + let automatic_method_button = gtk::Button::builder() + .child(&automatic_method_button_content_box) + .vexpand(true) + .hexpand(true) + .halign(gtk::Align::Start) + .valign(gtk::Align::Center) + .build(); + + // / manual_method_button_content_box appends + //// add image and text to the manual_method_button + manual_method_button_content_box.append(&manual_method_button_content_image); + manual_method_button_content_box.append(&manual_method_button_content_text); + + // / automatic_method_button_content_box appends + //// add image and text to the automatic_method_button + automatic_method_button_content_box.append(&automatic_method_button_content_image); + automatic_method_button_content_box.append(&automatic_method_button_content_text); + + // / partitioning_selection_box appends + //// add live and install media button to partitioning page selections + partitioning_selection_box.append(&manual_method_button); + partitioning_selection_box.append(&automatic_method_button); + + // / partitioning_header_box appends + //// Add the partitioning page header text and icon + partitioning_header_box.append(&partitioning_header_text); + partitioning_header_box.append(&partitioning_header_icon); + + partitioning_method_main_box.append(&partitioning_header_box); + partitioning_method_main_box.append(&partitioning_selection_box); + + manual_method_button_content_box.append(&manual_method_button_content_image); + + // Automatic Partitioning Yard + let partition_method_automatic_main_box = gtk::Box::builder() + .orientation(Orientation::Vertical) + .margin_bottom(15) + .margin_top(15) + .margin_end(15) + .margin_start(15) + .build(); + + let partition_method_automatic_header_box = gtk::Box::builder() + .orientation(Orientation::Horizontal) + .build(); + + // the header text for the partitioning page + let partition_method_automatic_header_text = gtk::Label::builder() + .label("Choose an install method") + .halign(gtk::Align::End) + .hexpand(true) + .margin_top(15) + .margin_bottom(15) + .margin_start(15) + .margin_end(5) + .build(); + partition_method_automatic_header_text.add_css_class("header_sized_text"); + + // the header icon for the partitioning icon + let partition_method_automatic_header_icon = gtk::Image::builder() + .icon_name("media-floppy") + .halign(gtk::Align::Start) + .hexpand(true) + .pixel_size(78) + .margin_top(15) + .margin_bottom(15) + .margin_start(0) + .margin_end(15) + .build(); + + let partition_method_automatic_selection_box = gtk::Box::builder() + .orientation(Orientation::Vertical) + .build(); + + let partition_method_automatic_selection_text = gtk::Label::builder() + .label("Choose the Drive you want to install PikaOS on\nNote: This will erase the entire drive backup your data!") + .justify(Justification::Center) + .halign(gtk::Align::Center) + .hexpand(true) + .margin_top(15) + .margin_bottom(15) + .margin_start(15) + .margin_end(15) + .build(); + + let partition_method_automatic_luks_box = gtk::Box::builder() + .orientation(Orientation::Horizontal) + .build(); + + let partition_method_automatic_luks_checkbutton = gtk::CheckButton::builder() + .label("Enable LUKS2 Disk Encryption") + .margin_top(15) + .margin_bottom(15) + .margin_start(15) + .margin_end(15) + .build(); + + let partition_method_automatic_luks_listbox = gtk::ListBox::builder() + .margin_top(15) + .margin_bottom(15) + .margin_start(0) + .margin_end(15) + .build(); + partition_method_automatic_luks_listbox.add_css_class("boxed-list"); + + let partition_method_automatic_luks_password_entry = adw::PasswordEntryRow::builder() + .title("LUKS Password") + .hexpand(true) + .build(); + + partition_method_automatic_luks_listbox.append(&partition_method_automatic_luks_password_entry); + partition_method_automatic_luks_box.append(&partition_method_automatic_luks_checkbutton); + partition_method_automatic_luks_box.append(&partition_method_automatic_luks_listbox); + partition_method_automatic_header_box.append(&partition_method_automatic_header_text); + partition_method_automatic_header_box.append(&partition_method_automatic_header_icon); + partition_method_automatic_selection_box.append(&partition_method_automatic_selection_text); + partition_method_automatic_main_box.append(&partition_method_automatic_header_box); + partition_method_automatic_main_box.append(&partition_method_automatic_selection_box); + + partition_method_automatic_main_box.append(&partition_method_automatic_luks_box); + + partitioning_stack.add_titled(&partitioning_method_main_box, Some("partition_method_select_page"), "partition_method_select_page"); + partitioning_stack.add_titled(&partition_method_automatic_main_box, Some("partition_method_automatic_page"), "partition_method_automatic_page"); + + partitioning_main_box.append(&partitioning_stack); + partitioning_main_box.append(&bottom_box); + + // / Content stack appends + //// Add the partitioning_main_box as page: partitioning_page, Give it nice title + content_stack.add_titled(&partitioning_main_box, Some("partitioning_page"), "Partitioning"); + + + let partitioning_stack_clone = partitioning_stack.clone(); + automatic_method_button.connect_clicked(move |_| partitioning_stack_clone.set_visible_child_name("partition_method_automatic_page")); + manual_method_button.connect_clicked(move |_| println!("fuck")); + + let content_stack_clone = content_stack.clone(); + let content_stack_clone2 = content_stack.clone(); + let partitioning_stack_clone2 = partitioning_stack.clone(); + bottom_next_button.connect_clicked(move |_| { + content_stack_clone.set_visible_child_name("installation_page") + }); + bottom_back_button.connect_clicked(move |_| { + content_stack_clone2.set_visible_child_name("keyboard_page") + }); + bottom_back_button.connect_clicked(move |_| { + partitioning_stack_clone2.set_visible_child_name("partition_method_select_page") + }); + +} \ No newline at end of file