From 809ba3bce18d8a988fb92f0fbb257b41a2b3d085 Mon Sep 17 00:00:00 2001 From: Ward from fusion-voyager-3 Date: Sat, 20 Jul 2024 01:26:46 +0300 Subject: [PATCH] sidebar --- .idea/workspace.xml | 6 +- locales/en_US.json | 16 +++- src/bin/gui/apt_update_page/mod.rs | 9 ++ src/bin/gui/build_ui/mod.rs | 149 ++++++++++++++++++++++------- 4 files changed, 140 insertions(+), 40 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 73afd77..a800650 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -8,8 +8,9 @@ - + + diff --git a/locales/en_US.json b/locales/en_US.json index b24e5f0..8eda58c 100644 --- a/locales/en_US.json +++ b/locales/en_US.json @@ -47,12 +47,13 @@ "upgrade_status_error_perms": "Unknown Error! (Likely Permission Denied)", "apt_upgrade_dialog_heading": "APT Upgrade Transaction: Hang Tight!", "apt_upgrade_dialog_ok_label": "OK", - "apt_upgrade_dialog_open_log_file_label": "Open Log File", + "apt_upgrade_dialog_open_log_file_label": "Open Apt Log File", "apt_upgrade_dialog_status_successful": "APT Upgrade Transaction Successful!", "apt_upgrade_dialog_status_failed": "APT Upgrade Transaction Failed!", "banner_text_no_internet": "Warning: No Internet Connection!", "refresh_button_tooltip_text": "Refresh Opened Page", "apt_update_page_title": "Native Updates (APT)", + "flatpak_update_page_title" : "Flatpak Updates", "apt_packages_no_viewport_page_title": "All Native APT Packages are Up to date!", "summary_button_label": "Summary", "flatpak_extra_info_ref_name": "Ref Codename", @@ -68,5 +69,16 @@ "flatpak_ref": "Flatpak Ref", "flatpak_status": "Status", "flatpak_transaction_bytes_transferred": "Downloaded", - "flatpak_transaction_installed_size": "Saved to Disk" + "flatpak_transaction_installed_size": "Saved to Disk", + "flatpak_confirm_dialog_body": "The following changes are going to be made:", + "system_flatref_count_badge_label": "System Flatpaks to Update", + "user_flatref_count_badge_label": "User Flatpaks to Update", + "flatpak_confirm_dialog_heading": "Flatpak Update Transaction: Please Review", + "flatpak_confirm_dialog_cancel_label": "Decline", + "flatpak_confirm_dialog_confirm_label": "Confirm & Accept", + "flatpak_transaction_dialog_heading": "Flatpak Update Transaction: Hang Tight!", + "flatpak_transaction_dialog_ok_label": "OK", + "flatpak_transaction_dialog_open_log_file_label": "Open Flatpak Log File", + "flatpak_transaction_dialog_status_successful": "Flatpak Update Transaction: Successful!", + "flatpak_transaction_dialog_status_failed": "Flatpak Update Transaction: Failed!" } \ No newline at end of file diff --git a/src/bin/gui/apt_update_page/mod.rs b/src/bin/gui/apt_update_page/mod.rs index bbfc940..6c69826 100644 --- a/src/bin/gui/apt_update_page/mod.rs +++ b/src/bin/gui/apt_update_page/mod.rs @@ -31,6 +31,8 @@ pub struct AptPackageSocket { pub fn apt_update_page( window: adw::ApplicationWindow, retry_signal_action: &SimpleAction, + flatpak_retry_signal_action: &SimpleAction, + flatpak_ran_once: Rc> ) -> gtk::Box { let (update_percent_sender, update_percent_receiver) = async_channel::unbounded::(); let update_percent_sender = update_percent_sender.clone(); @@ -254,6 +256,8 @@ pub fn apt_update_page( apt_update_dialog, #[weak] apt_update_dialog_child_box, + #[weak] + flatpak_retry_signal_action, async move { while let Ok(state) = update_status_receiver.recv().await { match state.as_ref() { @@ -307,6 +311,11 @@ pub fn apt_update_page( } }); apt_update_dialog.close(); + let mut flatpak_ran_once_borrow = flatpak_ran_once.borrow_mut(); + if *flatpak_ran_once_borrow != true { + flatpak_retry_signal_action.activate(None); + *flatpak_ran_once_borrow = true; + } } "FN_OVERRIDE_FAILED" => { apt_update_dialog_child_box.set_visible(false); diff --git a/src/bin/gui/build_ui/mod.rs b/src/bin/gui/build_ui/mod.rs index f54fe85..777d8f0 100644 --- a/src/bin/gui/build_ui/mod.rs +++ b/src/bin/gui/build_ui/mod.rs @@ -60,8 +60,15 @@ pub fn build_ui(app: &Application) { let window_headerbar = HeaderBar::builder() .title_widget(&WindowTitle::builder().title(t!("application_name")).build()) + .show_title(false) .build(); + let window_breakpoint = adw::Breakpoint::new(BreakpointCondition::new_length( + BreakpointConditionLengthType::MaxWidth, + 800.0, + LengthUnit::Px, + )); + let window_adw_stack = gtk::Stack::builder() .hhomogeneous(true) .vhomogeneous(true) @@ -77,10 +84,56 @@ pub fn build_ui(app: &Application) { let window_adw_view_switcher_sidebar = gtk::StackSidebar::builder() .vexpand(true) .hexpand(true) + .margin_start(5) + .margin_end(5) .stack(&window_adw_stack) .build(); - window_headerbar.pack_start(&window_adw_view_switcher_sidebar); + let window_adw_view_switcher_sidebar_box = gtk::Box::new(gtk::Orientation::Vertical, 0); + window_adw_view_switcher_sidebar_box.append(&WindowTitle::builder().title(t!("application_name")).margin_top(20).margin_bottom(20).margin_start(5).margin_end(5).build()); + window_adw_view_switcher_sidebar_box.append(&window_adw_view_switcher_sidebar); + + let window_adw_view_sidebar_navigation_page = adw::NavigationPage::new(&window_adw_view_switcher_sidebar_box, "sidebar_view"); + + let sidebar_toggle_button = gtk::ToggleButton::builder() + .icon_name("view-right-pane-symbolic") + .visible(false) + .build(); + + let window_content_page_split_view = adw::OverlaySplitView::builder() + .vexpand(true) + .hexpand(true) + .content(&window_toolbar) + .sidebar(&window_adw_view_sidebar_navigation_page) + .max_sidebar_width(300.0) + .min_sidebar_width(300.0) + .enable_hide_gesture(true) + .enable_show_gesture(true) + .build(); + + let _sidebar_toggle_button_binding = window_content_page_split_view + .bind_property("show_sidebar", &sidebar_toggle_button, "active") + .sync_create() + .bidirectional() + .build(); + + window_breakpoint.add_setter( + &window_content_page_split_view, + "collapsed", + Some(&true.to_value()), + ); + window_breakpoint.add_setter( + &sidebar_toggle_button, + "visible", + Some(&true.to_value()), + ); + window_breakpoint.add_setter( + &window_headerbar, + "show_title", + Some(&true.to_value()), + ); + + window_headerbar.pack_end(&sidebar_toggle_button); window_toolbar.add_top_bar(&window_headerbar); window_toolbar.add_top_bar(&window_banner); @@ -100,12 +153,14 @@ pub fn build_ui(app: &Application) { // .width_request(700) .height_request(500) - .content(&window_toolbar) + .content(&window_content_page_split_view) // Startup .startup_id(APP_ID) // build the window .build(); + window.add_breakpoint(window_breakpoint); + if glib_settings.boolean("is-maximized") == true { window.maximize() } @@ -149,68 +204,90 @@ pub fn build_ui(app: &Application) { window.present(); - // Apt Update Page - let apt_retry_signal_action = gio::SimpleAction::new("retry", None); + // Flatpak Update Page - //let apt_update_view_stack_bin = Bin::builder() - // .child(&apt_update_page::apt_update_page( - // window.clone(), - // &apt_retry_signal_action, - // )) - // .build(); + let flatpak_retry_signal_action = gio::SimpleAction::new("retry", None); - // apt_retry_signal_action.connect_activate(clone!( - // #[weak] - // window, - // #[strong] - // apt_retry_signal_action, - // #[strong] - // apt_update_view_stack_bin, - // move |_, _| { - // apt_update_view_stack_bin.set_child(Some(&apt_update_page::apt_update_page( - // window, - // &apt_retry_signal_action, - // ))); - // } - // )); - - let apt_update_view_stack_bin = Bin::builder() - .child(&flatpak_update_page::flatpak_update_page( - window.clone(), - &apt_retry_signal_action, - )) + let flatpak_update_view_stack_bin = Bin::builder() .build(); - apt_retry_signal_action.connect_activate(clone!( + flatpak_retry_signal_action.connect_activate(clone!( #[weak] window, #[strong] - apt_retry_signal_action, + flatpak_retry_signal_action, #[strong] - apt_update_view_stack_bin, + flatpak_update_view_stack_bin, move |_, _| { - apt_update_view_stack_bin.set_child(Some(&flatpak_update_page::flatpak_update_page( + flatpak_update_view_stack_bin.set_child(Some(&flatpak_update_page::flatpak_update_page( window, - &apt_retry_signal_action, + &flatpak_retry_signal_action, ))); } )); + // Apt Update Page + let apt_retry_signal_action = gio::SimpleAction::new("retry", None); + + let flatpak_ran_once = Rc::new(RefCell::new(false)); + + let apt_update_view_stack_bin = Bin::builder().build(); + + apt_retry_signal_action.connect_activate(clone!( + #[weak] + window, + #[strong] + apt_retry_signal_action, + #[strong] + flatpak_retry_signal_action, + #[strong] + apt_update_view_stack_bin, + #[weak] + flatpak_ran_once, + move |_, _| { + apt_update_view_stack_bin.set_child(Some(&apt_update_page::apt_update_page( + window, + &apt_retry_signal_action, + &flatpak_retry_signal_action, + flatpak_ran_once, + ))); + } + )); + + apt_update_view_stack_bin.set_child(Some(&apt_update_page::apt_update_page( + window.clone(), + &apt_retry_signal_action, + &flatpak_retry_signal_action, + flatpak_ran_once, + ))); + + // Add to stack switcher + window_adw_stack.add_titled( &apt_update_view_stack_bin, Some("apt_update_page"), &t!("apt_update_page_title"), ); - // + + window_adw_stack.add_titled( + &flatpak_update_view_stack_bin, + Some("flatpak_update_page"), + &t!("flatpak_update_page_title"), + ); + + // Refresh button refresh_button.connect_clicked(clone!( #[weak] apt_retry_signal_action, #[weak] + flatpak_retry_signal_action, + #[weak] window_adw_stack, move |_| { match window_adw_stack.visible_child_name().unwrap().as_str() { "apt_update_page" => apt_retry_signal_action.activate(None), + "flatpak_update_page" => flatpak_retry_signal_action.activate(None), _ => {} } }