From 6eec9cdc042674074f743fc7acc545571da3a9e6 Mon Sep 17 00:00:00 2001 From: Ward from fusion-voyager-3 Date: Sun, 4 Aug 2024 23:56:30 +0300 Subject: [PATCH] Start UI Rewrite --- .gitignore | 2 + .idea/.gitignore | 8 -- .idea/modules.xml | 8 -- .idea/pkg-pika-installer-gtk4.iml | 11 -- .vscode/settings.json | 8 -- Cargo.lock | 63 +-------- Makefile | 19 +++ locales/en_US.json | 1 + src/build_ui.rs | 134 +++++++------------- src/efi_error_page/mod.rs | 65 +++------- src/main.rs | 74 ++++------- {src => src2}/automatic_partitioning/mod.rs | 0 src2/build_ui.rs | 114 +++++++++++++++++ src2/config.rs | 7 + {src => src2}/done_page/mod.rs | 0 {src => src2}/drive_mount_row/imp.rs | 0 {src => src2}/drive_mount_row/mod.rs | 0 src2/efi_error_page/mod.rs | 111 ++++++++++++++++ {src => src2}/eula_page/mod.rs | 0 {src => src2}/install_page/mod.rs | 0 {src => src2}/keyboard_page/mod.rs | 0 {src => src2}/language_page/mod.rs | 0 src2/main.rs | 59 +++++++++ {src => src2}/manual_partitioning/mod.rs | 0 {src => src2}/partitioning_page/mod.rs | 0 {src => src2}/save_window_size/mod.rs | 0 src2/style.css | 36 ++++++ {src => src2}/timezone_page/mod.rs | 0 {src => src2}/welcome_page/mod.rs | 0 29 files changed, 443 insertions(+), 277 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/modules.xml delete mode 100644 .idea/pkg-pika-installer-gtk4.iml delete mode 100644 .vscode/settings.json rename {src => src2}/automatic_partitioning/mod.rs (100%) create mode 100644 src2/build_ui.rs create mode 100644 src2/config.rs rename {src => src2}/done_page/mod.rs (100%) rename {src => src2}/drive_mount_row/imp.rs (100%) rename {src => src2}/drive_mount_row/mod.rs (100%) create mode 100644 src2/efi_error_page/mod.rs rename {src => src2}/eula_page/mod.rs (100%) rename {src => src2}/install_page/mod.rs (100%) rename {src => src2}/keyboard_page/mod.rs (100%) rename {src => src2}/language_page/mod.rs (100%) create mode 100644 src2/main.rs rename {src => src2}/manual_partitioning/mod.rs (100%) rename {src => src2}/partitioning_page/mod.rs (100%) rename {src => src2}/save_window_size/mod.rs (100%) create mode 100644 src2/style.css rename {src => src2}/timezone_page/mod.rs (100%) rename {src => src2}/welcome_page/mod.rs (100%) diff --git a/.gitignore b/.gitignore index ea8c4bf..06a5314 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ /target +.idea +.vscode diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 13566b8..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index e957f63..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/pkg-pika-installer-gtk4.iml b/.idea/pkg-pika-installer-gtk4.iml deleted file mode 100644 index cf84ae4..0000000 --- a/.idea/pkg-pika-installer-gtk4.iml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 5c49f12..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "css.lint.emptyRules": "ignore", - "scss.lint.emptyRules": "ignore", - "rust-analyzer.linkedProjects": [ - "./Cargo.toml", - "./Cargo.toml" - ] -} \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 17a3b9c..4855f25 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -46,18 +46,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" -[[package]] -name = "bitflags" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f67931368edf3a9a51d29886d245f1c3db2f1ef0dcc9e35ff70341b78c10d23" - -[[package]] -name = "bitflags" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1370e9fc2a6ae53aea8b7a5110edbd08836ed87c88736dfabccade1c2b44bff4" - [[package]] name = "bitflags" version = "1.3.2" @@ -424,19 +412,6 @@ dependencies = [ "windows-sys", ] -[[package]] -name = "glib" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81f514a8abd315ede0e94e39ce5987fdb99191c5f812e5066bc5bdb965104fc4" -dependencies = [ - "bitflags 0.5.0", - "glib-sys 0.3.4", - "gobject-sys 0.3.4", - "lazy_static 0.2.11", - "libc", -] - [[package]] name = "glib" version = "0.18.5" @@ -509,17 +484,6 @@ dependencies = [ "syn 2.0.72", ] -[[package]] -name = "glib-sys" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8826cbc94631507bdd91ee40f7e099bfaa3cc4f43c086b4d1c15cff5b4e8220b" -dependencies = [ - "bitflags 0.8.2", - "libc", - "pkg-config", -] - [[package]] name = "glib-sys" version = "0.18.1" @@ -599,18 +563,6 @@ dependencies = [ "system-deps 6.2.0", ] -[[package]] -name = "gobject-sys" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87373f64e136e9ea192ff5d3ef676a51e9ac6ab06b629223a081e0523c5f04e2" -dependencies = [ - "bitflags 0.8.2", - "glib-sys 0.3.4", - "libc", - "pkg-config", -] - [[package]] name = "gobject-sys" version = "0.18.0" @@ -843,12 +795,6 @@ version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" -[[package]] -name = "lazy_static" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" - [[package]] name = "lazy_static" version = "1.4.0" @@ -980,7 +926,7 @@ version = "1.0.2" dependencies = [ "async-channel", "duct", - "glib 0.1.3", + "glib 0.20.0", "glob", "gnome-desktop", "gtk4", @@ -1156,7 +1102,7 @@ checksum = "399801f4d955abf1c3ce3ce2215dc76bd40beb4ae39e3a84936b21a79ce2caa5" dependencies = [ "arc-swap", "globwalk", - "lazy_static 1.4.0", + "lazy_static", "normpath", "once_cell", "proc-macro2", @@ -1220,11 +1166,12 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.113" +version = "1.0.122" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79" +checksum = "784b6203951c57ff748476b126ccb5e8e2959a5c19e5c617ab1956be3dbc68da" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] diff --git a/Makefile b/Makefile index aa79b02..4027dbe 100644 --- a/Makefile +++ b/Makefile @@ -24,3 +24,22 @@ install: #cp -vf data/pika-drivers.svg $(DESTDIR)/usr/share/icons/hicolor/scalable/apps/ #cp -vf data/com.pika.drivers.desktop $(DESTDIR)/usr/share/applications/ #makepot $(DESTDIR)/usr/share/locale + +install_no_build_debug: + #cp -vf target/release/pika-installer-gtk4 $(DESTDIR)/usr/bin/ + #chmod 755 $(DESTDIR)/usr/bin/pika-installer-gtk4 + mkdir -p $(DESTDIR)/usr/lib/pika/pika-installer-gtk4/bin/ + cp -vf target/debug/pika-installer-gtk4 $(DESTDIR)/usr/lib/pika/pika-installer-gtk4/bin/ + chmod 755 $(DESTDIR)/usr/lib/pika/pika-installer-gtk4/bin/pika-installer-gtk4 + mkdir -p $(DESTDIR)/usr/lib/pika/pika-installer-gtk4/scripts/ + mkdir -p $(DESTDIR)/usr/share/glib-2.0/schemas/ + cp -rvf data/scripts/*.sh $(DESTDIR)/usr/lib/pika/pika-installer-gtk4/scripts/ + cp -rvf data/scripts/*.py $(DESTDIR)/usr/lib/pika/pika-installer-gtk4/scripts/ + cp data/*.xml $(DESTDIR)/usr/share/glib-2.0/schemas/ + chmod 755 $(DESTDIR)/usr/lib/pika/pika-installer-gtk4/scripts/*.sh + chmod 755 $(DESTDIR)/usr/lib/pika/pika-installer-gtk4/scripts/*.py + mkdir -p $(DESTDIR)/usr/share/applications + mkdir -p $(DESTDIR)/usr/share/icons/hicolor/scalable/apps + #cp -vf data/pika-drivers.svg $(DESTDIR)/usr/share/icons/hicolor/scalable/apps/ + #cp -vf data/com.pika.drivers.desktop $(DESTDIR)/usr/share/applications/ + #makepot $(DESTDIR)/usr/share/locale diff --git a/locales/en_US.json b/locales/en_US.json index 69aa106..57581a9 100644 --- a/locales/en_US.json +++ b/locales/en_US.json @@ -72,6 +72,7 @@ "eula_buffer": "There are a few things to keep in mind: \n 1 - You understand that this distribution is -NOT- to be considered an ‘Ubuntu Flavor’. \n 2 - This is a hobby distribution, so we will try our best to provide formal support but it will -NOT- be guaranteed. \n 3 - Although PikaOS might provide identical patches and user experience to the Nobara project, we are -NOT- directly a part of them so questions and bug reports should not be sent directly to them (they dont have to deal with it!) \n 4 - While the installer is running DO NOT INTERRUPT IT! or you will end up with a corrupted system. \n 5 - Try to use pikman instead of apt when using the terminal, it is much faster! \n 6 - You understand the xone driver downloads needed binaries locally and does not directly package or distribute any copyrighted firmware or other related data. \n 7 - Automatic partitioning will format all partitons on a drive, so if you want to dualboot make a separate EFI partition for PikaOS and use manual partitioning \n 8 - In case you need the login info for this session: \n - username: pikaos \n - password: \n MEANING: JUST PRESS ENTER", "i_agree_eula": "I Agree and Accept the User license Agreement", "eula": "EULA", + "bad_boot_platform": "Un Supported Boot Platform", "pika_nowork_csm": "PikaOS Only works on GPT UEFI Systems, this machine is booted in CSM/LEGACY mode.", "exit": "Exit", "subtitle_partition": "Partition", diff --git a/src/build_ui.rs b/src/build_ui.rs index 72a49cc..65eec4c 100644 --- a/src/build_ui.rs +++ b/src/build_ui.rs @@ -1,114 +1,66 @@ -// Use libraries -use adw::prelude::*; -use adw::*; -use gtk::glib; -use gtk::glib::*; -/// Use all gtk4 libraries (gtk4 -> gtk because cargo) -/// Use all libadwaita libraries (libadwaita -> adw because cargo) -use gtk::*; - use std::path::Path; +use gtk::{prelude::*, glib as glib}; +use vte::ffi::VTE_ALIGN_CENTER; +use crate::efi_error_page; +use crate::installer_stack_page; -use crate::save_window_size::save_window_size; - -use crate::welcome_page::welcome_page; - -use crate::efi_error_page::efi_error_page; - -use crate::language_page::language_page; - -// build ui function linked to app startup above pub fn build_ui(app: &adw::Application) { - // setup glib - gtk::glib::set_prgname(Some("pikaos_installer")); + glib::set_prgname(Some("pikaos_installer")); glib::set_application_name(&t!("pikaos_installer")); - let glib_settings = gio::Settings::new("com.github.pikaos-linux.pikainstallergtk4"); - // Widget Bank - - let _main_box = gtk::Box::builder() - // that puts items vertically - .orientation(Orientation::Vertical) - .build(); - - let window_title_bar = adw::HeaderBar::builder().build(); - - let content_stack = gtk::Stack::builder() - .hexpand(true) + let carousel = adw::Carousel::builder() + .allow_long_swipes(false) + .allow_mouse_drag(false) + .allow_scroll_wheel(false) + .interactive(false) .vexpand(true) - .transition_type(StackTransitionType::SlideLeftRight) + .hexpand(true) .build(); - let content_stack_switcher = gtk::StackSwitcher::builder() - .stack(&content_stack) - .margin_top(15) - .margin_bottom(15) - .margin_start(15) - .margin_end(15) - .sensitive(false) + let carousel_indicator = adw::CarouselIndicatorDots::builder() + .carousel(&carousel) .build(); - // / _main_box appends - //// Add the a title bar to the _main_box - _main_box.append(&window_title_bar); - //// Add the step indicator to _main_box - _main_box.append(&content_stack_switcher); - //// Add the stack pager containing all the steps to _main_box - _main_box.append(&content_stack); + let window_headerbar = adw::HeaderBar::builder() + .show_start_title_buttons(true) + .title_widget(&carousel_indicator) + .build(); + + let toolbarview = adw::ToolbarView::builder() + .top_bar_style(adw::ToolbarStyle::Flat) + .content(&carousel) + .build(); + + toolbarview.add_top_bar(&window_headerbar); let window = adw::ApplicationWindow::builder() - // The text on the titlebar .title(t!("pikaos_installer")) - // link it to the application "app" .application(app) - // Add the box called "_main_box" to it - .content(&_main_box) - // Application icon .icon_name("calamares") - // Get current size from glib - .default_width(glib_settings.int("window-width")) - .default_height(glib_settings.int("window-height")) - // Minimum Size/Default .width_request(700) .height_request(500) - // Hide window instead of destroy - .hide_on_close(true) - // + .default_width(700) + .default_height(500) .deletable(false) - // Startup + .content(&toolbarview) .startup_id("pika-installer-gtk4") - // build the window .build(); - // Add welcome_page.rs as a page for content_stack - if Path::new("/sys/firmware/efi/efivars").exists() { - welcome_page(&window, &content_stack); - } else { - efi_error_page(&window, &content_stack); + match Path::new("/sys/firmware/efi/efivars").exists() { + true => { + let page = installer_stack_page::InstallerStackPage::new(); + page.set_page_icon("pika-logo"); + page.set_page_title("Title"); + page.set_page_subtitle("Subtitle"); + let gbox = gtk::Box::new(gtk::Orientation::Vertical, 0); + gbox.append(>k::Image::builder().icon_name("pika-logo").build()); + page.set_child_widget(&gbox); + carousel.append(&page); + } + _ => efi_error_page::efi_error_page(&window, &carousel) } + //welcome_page(&window, &carousel), + //language_page(&window, &carousel); - // bottom_box moved per page - // if content_stack visible child becomes NOT content_stack, show the buttom box - //content_stack.connect_visible_child_notify(clone!(@weak bottom_box => move |content_stack| { - // let state = content_stack.visible_child_name().as_deref() != Some("welcome_page"); - // bottom_box.set_visible(state); - // })); - - // Add language_page.rs as a page for content_stack - language_page(&content_stack, &window); - - // glib maximization - if glib_settings.boolean("is-maximized") == true { - window.maximize() - } - - // Connect the hiding of window to the save_window_size function and window destruction - window.connect_hide(clone!(@weak window => move |_| save_window_size(&window, &glib_settings))); - window.connect_hide(clone!(@weak window => move |_| window.destroy())); - // bottom_box moved per page - //let content_stack_clone = content_stack.clone(); - //let content_stack_clone2 = content_stack.clone(); - //bottom_next_button.connect_clicked(move |_| content_stack_clone.set_visible_child(&content_stack_clone.visible_child().expect("null").next_sibling().unwrap())); - //bottom_back_button.connect_clicked(move |_| content_stack_clone2.set_visible_child(&content_stack_clone2.visible_child().expect("null").prev_sibling().unwrap())); - window.present(); -} + window.present() +} \ No newline at end of file diff --git a/src/efi_error_page/mod.rs b/src/efi_error_page/mod.rs index 46306bc..6e7b39d 100644 --- a/src/efi_error_page/mod.rs +++ b/src/efi_error_page/mod.rs @@ -1,32 +1,22 @@ +use gtk::{prelude::*, glib as glib, Justification}; +use glib::clone; +pub fn efi_error_page(window: &adw::ApplicationWindow, main_carousel: &adw::Carousel) { -// Use libraries -use adw::prelude::*; -use adw::*; -use gtk::glib; -use gtk::glib::*; -/// Use all gtk4 libraries (gtk4 -> gtk because cargo) -/// Use all libadwaita libraries (libadwaita -> adw because cargo) -use gtk::*; - - - -pub fn efi_error_page(window: &adw::ApplicationWindow, content_stack: >k::Stack) { - - // the header box for the efi_error page let efi_error_main_box = gtk::Box::builder() - .orientation(Orientation::Vertical) + .orientation(gtk::Orientation::Vertical) .build(); - // the header box for the efi_error page let efi_error_header_box = gtk::Box::builder() - .orientation(Orientation::Horizontal) + .orientation(gtk::Orientation::Horizontal) .build(); - // the header text for the efi_error page let efi_error_header_text = gtk::Label::builder() - .label(t!("bad_boot_platfrom")) + .label(t!("bad_boot_platform")) .halign(gtk::Align::End) .hexpand(true) + .wrap(true) + .justify(Justification::Center) + .width_chars(20) .margin_top(15) .margin_bottom(15) .margin_start(15) @@ -34,7 +24,6 @@ pub fn efi_error_page(window: &adw::ApplicationWindow, content_stack: >k::Stac .build(); efi_error_header_text.add_css_class("header_sized_text"); - // the header icon for the efi_error icon let efi_error_header_icon = gtk::Image::builder() .icon_name("emblem-error") .halign(gtk::Align::Start) @@ -46,9 +35,8 @@ pub fn efi_error_page(window: &adw::ApplicationWindow, content_stack: >k::Stac .margin_end(15) .build(); - // make efi_error selection box for choosing installation or live media let efi_error_selection_box = gtk::Box::builder() - .orientation(Orientation::Vertical) + .orientation(gtk::Orientation::Vertical) .margin_bottom(15) .margin_top(15) .margin_start(15) @@ -59,6 +47,7 @@ pub fn efi_error_page(window: &adw::ApplicationWindow, content_stack: >k::Stac .vexpand(true) .hexpand(true) .label(t!("pika_nowork_csm")) + .wrap(true) .halign(gtk::Align::Center) .valign(gtk::Align::Center) .build(); @@ -72,40 +61,22 @@ pub fn efi_error_page(window: &adw::ApplicationWindow, content_stack: >k::Stac .valign(gtk::Align::Center) .build(); - // / efi_error_selection_box appends - - // / efi_error_header_box appends - //// Add the efi_error page header text and icon efi_error_header_box.append(&efi_error_header_text); efi_error_header_box.append(&efi_error_header_icon); - - // / efi_error_main_box appends - //// Add the efi_error header to efi_error main box efi_error_main_box.append(&efi_error_header_box); - //// Add the efi_error selection/page content box to efi_error main box efi_error_main_box.append(&efi_error_selection_box); - - // Start Appending widgets to boxes - - // / efi_error_selection_box appends - //// add live and install media button to efi_error page selections efi_error_selection_box.append(&efi_error_text); efi_error_selection_box.append(&exit_button); - - // / efi_error_header_box appends - //// Add the efi_error page header text and icon efi_error_header_box.append(&efi_error_header_text); efi_error_header_box.append(&efi_error_header_icon); - - // / efi_error_main_box appends - //// Add the efi_error header to efi_error main box efi_error_main_box.append(&efi_error_header_box); - //// Add the efi_error selection/page content box to efi_error main box efi_error_main_box.append(&efi_error_selection_box); + main_carousel.append(&efi_error_main_box); - // / Content stack appends - //// Add the efi_error_main_box as page: efi_error_page, Give it nice title - content_stack.add_titled(&efi_error_main_box, Some("efi_error_page"), "Welcome"); - - exit_button.connect_clicked(clone!(@weak window => move |_| window.close())); + exit_button.connect_clicked(clone!( + #[weak] + window, + move |_| + window.close() + )); } diff --git a/src/main.rs b/src/main.rs index 2dd2257..dd393ea 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,59 +1,41 @@ - -// Use libraries use std::env; -use crate::build_ui::build_ui; -use adw::prelude::*; -use adw::*; -use gdk::Display; -/// Use all gtk4 libraries (gtk4 -> gtk because cargo) -/// Use all libadwaita libraries (libadwaita -> adw because cargo) -use gtk::{CssProvider, STYLE_PROVIDER_PRIORITY_APPLICATION}; - +use gtk::{CssProvider, gdk, STYLE_PROVIDER_PRIORITY_APPLICATION, prelude::*}; +use gdk::{Display}; mod config; -use config::{APP_ID}; +mod build_ui; +mod efi_error_page; +mod installer_stack_page; -// Init translations for current crate. #[macro_use] extern crate rust_i18n; i18n!("locales", fallback = "en_US"); - -mod automatic_partitioning; -mod build_ui; -mod done_page; -mod drive_mount_row; -mod efi_error_page; -mod eula_page; -mod install_page; -mod keyboard_page; -mod language_page; -mod manual_partitioning; -mod partitioning_page; -mod save_window_size; -mod timezone_page; -mod welcome_page; - -/// main function -fn main() { +fn main() -> glib::ExitCode { let current_locale = match env::var_os("LANG") { - Some(v) => v.into_string().unwrap(), + Some(v) => v.into_string().unwrap().chars() + .take_while(|&ch| ch != '.') + .collect::(), None => panic!("$LANG is not set"), }; - rust_i18n::set_locale(current_locale.strip_suffix(".UTF-8").unwrap()); - let application = adw::Application::new(Some(APP_ID), Default::default()); - application.connect_startup(|app| { - // The CSS "magic" happens here. - let provider = CssProvider::new(); - provider.load_from_string(include_str!("style.css")); - // We give the CssProvided to the default screen so the CSS rules we added - // can be applied to our window. - gtk::style_context_add_provider_for_display( - &Display::default().expect("Could not connect to a display."), - &provider, - STYLE_PROVIDER_PRIORITY_APPLICATION, - ); - app.connect_activate(build_ui); + rust_i18n::set_locale(¤t_locale); + + let app = adw::Application::builder().application_id(config::APP_ID).build(); + + app.connect_startup(|app| { + load_css(); + app.connect_activate(build_ui::build_ui); }); - application.run(); + // Run the application + app.run() } + +fn load_css() { + let provider = CssProvider::new(); + provider.load_from_string(include_str!("style.css")); + gtk::style_context_add_provider_for_display( + &Display::default().expect("Could not connect to a display."), + &provider, + STYLE_PROVIDER_PRIORITY_APPLICATION, + ); +} \ No newline at end of file diff --git a/src/automatic_partitioning/mod.rs b/src2/automatic_partitioning/mod.rs similarity index 100% rename from src/automatic_partitioning/mod.rs rename to src2/automatic_partitioning/mod.rs diff --git a/src2/build_ui.rs b/src2/build_ui.rs new file mode 100644 index 0000000..72a49cc --- /dev/null +++ b/src2/build_ui.rs @@ -0,0 +1,114 @@ +// Use libraries +use adw::prelude::*; +use adw::*; +use gtk::glib; +use gtk::glib::*; +/// Use all gtk4 libraries (gtk4 -> gtk because cargo) +/// Use all libadwaita libraries (libadwaita -> adw because cargo) +use gtk::*; + +use std::path::Path; + +use crate::save_window_size::save_window_size; + +use crate::welcome_page::welcome_page; + +use crate::efi_error_page::efi_error_page; + +use crate::language_page::language_page; + +// build ui function linked to app startup above +pub fn build_ui(app: &adw::Application) { + // setup glib + gtk::glib::set_prgname(Some("pikaos_installer")); + glib::set_application_name(&t!("pikaos_installer")); + let glib_settings = gio::Settings::new("com.github.pikaos-linux.pikainstallergtk4"); + + // Widget Bank + + let _main_box = gtk::Box::builder() + // that puts items vertically + .orientation(Orientation::Vertical) + .build(); + + let window_title_bar = adw::HeaderBar::builder().build(); + + let content_stack = gtk::Stack::builder() + .hexpand(true) + .vexpand(true) + .transition_type(StackTransitionType::SlideLeftRight) + .build(); + + let content_stack_switcher = gtk::StackSwitcher::builder() + .stack(&content_stack) + .margin_top(15) + .margin_bottom(15) + .margin_start(15) + .margin_end(15) + .sensitive(false) + .build(); + + // / _main_box appends + //// Add the a title bar to the _main_box + _main_box.append(&window_title_bar); + //// Add the step indicator to _main_box + _main_box.append(&content_stack_switcher); + //// Add the stack pager containing all the steps to _main_box + _main_box.append(&content_stack); + + let window = adw::ApplicationWindow::builder() + // The text on the titlebar + .title(t!("pikaos_installer")) + // link it to the application "app" + .application(app) + // Add the box called "_main_box" to it + .content(&_main_box) + // Application icon + .icon_name("calamares") + // Get current size from glib + .default_width(glib_settings.int("window-width")) + .default_height(glib_settings.int("window-height")) + // Minimum Size/Default + .width_request(700) + .height_request(500) + // Hide window instead of destroy + .hide_on_close(true) + // + .deletable(false) + // Startup + .startup_id("pika-installer-gtk4") + // build the window + .build(); + + // Add welcome_page.rs as a page for content_stack + if Path::new("/sys/firmware/efi/efivars").exists() { + welcome_page(&window, &content_stack); + } else { + efi_error_page(&window, &content_stack); + } + + // bottom_box moved per page + // if content_stack visible child becomes NOT content_stack, show the buttom box + //content_stack.connect_visible_child_notify(clone!(@weak bottom_box => move |content_stack| { + // let state = content_stack.visible_child_name().as_deref() != Some("welcome_page"); + // bottom_box.set_visible(state); + // })); + + // Add language_page.rs as a page for content_stack + language_page(&content_stack, &window); + + // glib maximization + if glib_settings.boolean("is-maximized") == true { + window.maximize() + } + + // Connect the hiding of window to the save_window_size function and window destruction + window.connect_hide(clone!(@weak window => move |_| save_window_size(&window, &glib_settings))); + window.connect_hide(clone!(@weak window => move |_| window.destroy())); + // bottom_box moved per page + //let content_stack_clone = content_stack.clone(); + //let content_stack_clone2 = content_stack.clone(); + //bottom_next_button.connect_clicked(move |_| content_stack_clone.set_visible_child(&content_stack_clone.visible_child().expect("null").next_sibling().unwrap())); + //bottom_back_button.connect_clicked(move |_| content_stack_clone2.set_visible_child(&content_stack_clone2.visible_child().expect("null").prev_sibling().unwrap())); + window.present(); +} diff --git a/src2/config.rs b/src2/config.rs new file mode 100644 index 0000000..c9a4897 --- /dev/null +++ b/src2/config.rs @@ -0,0 +1,7 @@ +pub const APP_ID: &str = "com.github.pikaos-linux.pikainstallergtk4"; +//pub const GETTEXT_PACKAGE: &str = env!("CARGO_PKG_NAME"); +//pub const LOCALEDIR: &str = "/usr/share/locale"; +//pub const PKGDATADIR: &str = " /usr/share"; +//pub const RESOURCES_FILE: &str = concat!(@PKGDATADIR@, "/resources.gresource"); +//pub const VERSION: &str = env!("CARGO_PKG_VERSION"); +pub const DISTRO_ICON: &str = "pika-logo"; diff --git a/src/done_page/mod.rs b/src2/done_page/mod.rs similarity index 100% rename from src/done_page/mod.rs rename to src2/done_page/mod.rs diff --git a/src/drive_mount_row/imp.rs b/src2/drive_mount_row/imp.rs similarity index 100% rename from src/drive_mount_row/imp.rs rename to src2/drive_mount_row/imp.rs diff --git a/src/drive_mount_row/mod.rs b/src2/drive_mount_row/mod.rs similarity index 100% rename from src/drive_mount_row/mod.rs rename to src2/drive_mount_row/mod.rs diff --git a/src2/efi_error_page/mod.rs b/src2/efi_error_page/mod.rs new file mode 100644 index 0000000..46306bc --- /dev/null +++ b/src2/efi_error_page/mod.rs @@ -0,0 +1,111 @@ + +// Use libraries +use adw::prelude::*; +use adw::*; +use gtk::glib; +use gtk::glib::*; +/// Use all gtk4 libraries (gtk4 -> gtk because cargo) +/// Use all libadwaita libraries (libadwaita -> adw because cargo) +use gtk::*; + + + +pub fn efi_error_page(window: &adw::ApplicationWindow, content_stack: >k::Stack) { + + // the header box for the efi_error page + let efi_error_main_box = gtk::Box::builder() + .orientation(Orientation::Vertical) + .build(); + + // the header box for the efi_error page + let efi_error_header_box = gtk::Box::builder() + .orientation(Orientation::Horizontal) + .build(); + + // the header text for the efi_error page + let efi_error_header_text = gtk::Label::builder() + .label(t!("bad_boot_platfrom")) + .halign(gtk::Align::End) + .hexpand(true) + .margin_top(15) + .margin_bottom(15) + .margin_start(15) + .margin_end(5) + .build(); + efi_error_header_text.add_css_class("header_sized_text"); + + // the header icon for the efi_error icon + let efi_error_header_icon = gtk::Image::builder() + .icon_name("emblem-error") + .halign(gtk::Align::Start) + .hexpand(true) + .pixel_size(78) + .margin_top(15) + .margin_bottom(15) + .margin_start(0) + .margin_end(15) + .build(); + + // make efi_error selection box for choosing installation or live media + let efi_error_selection_box = gtk::Box::builder() + .orientation(Orientation::Vertical) + .margin_bottom(15) + .margin_top(15) + .margin_start(15) + .margin_end(15) + .build(); + + let efi_error_text = gtk::Label::builder() + .vexpand(true) + .hexpand(true) + .label(t!("pika_nowork_csm")) + .halign(gtk::Align::Center) + .valign(gtk::Align::Center) + .build(); + efi_error_text.add_css_class("big_error_text"); + + let exit_button = gtk::Button::builder() + .label(t!("exit")) + .vexpand(true) + .hexpand(true) + .halign(gtk::Align::Center) + .valign(gtk::Align::Center) + .build(); + + // / efi_error_selection_box appends + + // / efi_error_header_box appends + //// Add the efi_error page header text and icon + efi_error_header_box.append(&efi_error_header_text); + efi_error_header_box.append(&efi_error_header_icon); + + // / efi_error_main_box appends + //// Add the efi_error header to efi_error main box + efi_error_main_box.append(&efi_error_header_box); + //// Add the efi_error selection/page content box to efi_error main box + efi_error_main_box.append(&efi_error_selection_box); + + // Start Appending widgets to boxes + + // / efi_error_selection_box appends + //// add live and install media button to efi_error page selections + efi_error_selection_box.append(&efi_error_text); + efi_error_selection_box.append(&exit_button); + + // / efi_error_header_box appends + //// Add the efi_error page header text and icon + efi_error_header_box.append(&efi_error_header_text); + efi_error_header_box.append(&efi_error_header_icon); + + // / efi_error_main_box appends + //// Add the efi_error header to efi_error main box + efi_error_main_box.append(&efi_error_header_box); + //// Add the efi_error selection/page content box to efi_error main box + efi_error_main_box.append(&efi_error_selection_box); + + // / Content stack appends + //// Add the efi_error_main_box as page: efi_error_page, Give it nice title + content_stack.add_titled(&efi_error_main_box, Some("efi_error_page"), "Welcome"); + + exit_button.connect_clicked(clone!(@weak window => move |_| window.close())); +} diff --git a/src/eula_page/mod.rs b/src2/eula_page/mod.rs similarity index 100% rename from src/eula_page/mod.rs rename to src2/eula_page/mod.rs diff --git a/src/install_page/mod.rs b/src2/install_page/mod.rs similarity index 100% rename from src/install_page/mod.rs rename to src2/install_page/mod.rs diff --git a/src/keyboard_page/mod.rs b/src2/keyboard_page/mod.rs similarity index 100% rename from src/keyboard_page/mod.rs rename to src2/keyboard_page/mod.rs diff --git a/src/language_page/mod.rs b/src2/language_page/mod.rs similarity index 100% rename from src/language_page/mod.rs rename to src2/language_page/mod.rs diff --git a/src2/main.rs b/src2/main.rs new file mode 100644 index 0000000..2dd2257 --- /dev/null +++ b/src2/main.rs @@ -0,0 +1,59 @@ + +// Use libraries +use std::env; +use crate::build_ui::build_ui; +use adw::prelude::*; +use adw::*; +use gdk::Display; +/// Use all gtk4 libraries (gtk4 -> gtk because cargo) +/// Use all libadwaita libraries (libadwaita -> adw because cargo) +use gtk::{CssProvider, STYLE_PROVIDER_PRIORITY_APPLICATION}; + +mod config; +use config::{APP_ID}; + +// Init translations for current crate. +#[macro_use] +extern crate rust_i18n; +i18n!("locales", fallback = "en_US"); + + +mod automatic_partitioning; +mod build_ui; +mod done_page; +mod drive_mount_row; +mod efi_error_page; +mod eula_page; +mod install_page; +mod keyboard_page; +mod language_page; +mod manual_partitioning; +mod partitioning_page; +mod save_window_size; +mod timezone_page; +mod welcome_page; + +/// main function +fn main() { + let current_locale = match env::var_os("LANG") { + Some(v) => v.into_string().unwrap(), + None => panic!("$LANG is not set"), + }; + rust_i18n::set_locale(current_locale.strip_suffix(".UTF-8").unwrap()); + let application = adw::Application::new(Some(APP_ID), Default::default()); + application.connect_startup(|app| { + // The CSS "magic" happens here. + let provider = CssProvider::new(); + provider.load_from_string(include_str!("style.css")); + // We give the CssProvided to the default screen so the CSS rules we added + // can be applied to our window. + gtk::style_context_add_provider_for_display( + &Display::default().expect("Could not connect to a display."), + &provider, + STYLE_PROVIDER_PRIORITY_APPLICATION, + ); + app.connect_activate(build_ui); + }); + + application.run(); +} diff --git a/src/manual_partitioning/mod.rs b/src2/manual_partitioning/mod.rs similarity index 100% rename from src/manual_partitioning/mod.rs rename to src2/manual_partitioning/mod.rs diff --git a/src/partitioning_page/mod.rs b/src2/partitioning_page/mod.rs similarity index 100% rename from src/partitioning_page/mod.rs rename to src2/partitioning_page/mod.rs diff --git a/src/save_window_size/mod.rs b/src2/save_window_size/mod.rs similarity index 100% rename from src/save_window_size/mod.rs rename to src2/save_window_size/mod.rs diff --git a/src2/style.css b/src2/style.css new file mode 100644 index 0000000..13bf2c4 --- /dev/null +++ b/src2/style.css @@ -0,0 +1,36 @@ +.small_error_text { + font-size: 14px; + color: red; +} + +.small_warn_text { + font-size: 14px; + color: orange; +} + +.small_valid_text { + font-size: 14px; + color: green; +} + +.small_fg_text { + font-size: 48px; +} + +.big_error_text { + font-size: 32px; + color: red; +} + +.header_sized_text { + font-size: 32px; +} + +.medium_sized_text { + font-size: 18px; +} + +.valid-action { + background-color:green; + color: white; +} diff --git a/src/timezone_page/mod.rs b/src2/timezone_page/mod.rs similarity index 100% rename from src/timezone_page/mod.rs rename to src2/timezone_page/mod.rs diff --git a/src/welcome_page/mod.rs b/src2/welcome_page/mod.rs similarity index 100% rename from src/welcome_page/mod.rs rename to src2/welcome_page/mod.rs