diff --git a/src/app/browser/window/tab/item.rs b/src/app/browser/window/tab/item.rs index e853088c..f4b72c38 100644 --- a/src/app/browser/window/tab/item.rs +++ b/src/app/browser/window/tab/item.rs @@ -51,7 +51,7 @@ impl Item { let page = Rc::new(Page::new( id.clone(), profile.clone(), - (actions.0, actions.1.clone(), action.clone()), + (actions.0.clone(), actions.1.clone(), action.clone()), )); let widget = Rc::new(Widget::new( @@ -75,6 +75,8 @@ impl Item { // Show identity selection for item action.ident().connect_activate({ + let browser_action = actions.0.clone(); + let window_action = actions.1.clone(); let page = page.clone(); let parent = tab_view.clone().upcast::(); move || { @@ -82,8 +84,12 @@ impl Item { if let Some(uri) = page.navigation.request.uri() { // Rout by scheme if uri.scheme().to_lowercase() == "gemini" { - return identity::new_gemini(profile.clone(), actions.1.clone(), uri) - .present(Some(&parent)); + return identity::new_gemini( + (browser_action.clone(), window_action.clone()), + profile.clone(), + uri, + ) + .present(Some(&parent)); } } // Show dialog with unsupported request message diff --git a/src/app/browser/window/tab/item/identity.rs b/src/app/browser/window/tab/item/identity.rs index e3216afb..d1029165 100644 --- a/src/app/browser/window/tab/item/identity.rs +++ b/src/app/browser/window/tab/item/identity.rs @@ -4,14 +4,19 @@ mod unsupported; use gemini::Gemini; use unsupported::Unsupported; -use crate::app::browser::window::Action; +use crate::app::browser::action::Action as BrowserAction; +use crate::app::browser::window::action::Action as WindowAction; use crate::profile::Profile; use gtk::glib::Uri; use std::rc::Rc; /// Create new identity widget for Gemini protocol match given URI -pub fn new_gemini(profile: Rc, action: Rc, auth_uri: Uri) -> Gemini { - Gemini::new(profile, action, auth_uri) +pub fn new_gemini( + action: (Rc, Rc), + profile: Rc, + auth_uri: Uri, +) -> Gemini { + Gemini::new(action, profile, auth_uri) } /// Create new identity widget for unknown request diff --git a/src/app/browser/window/tab/item/identity/gemini.rs b/src/app/browser/window/tab/item/identity/gemini.rs index 6d9f7f0d..db775740 100644 --- a/src/app/browser/window/tab/item/identity/gemini.rs +++ b/src/app/browser/window/tab/item/identity/gemini.rs @@ -1,7 +1,8 @@ mod widget; use widget::{form::list::item::value::Value, Widget}; -use crate::app::browser::window::Action; +use crate::app::browser::action::Action as BrowserAction; +use crate::app::browser::window::action::Action as WindowAction; use crate::profile::Profile; use gtk::{glib::Uri, prelude::IsA}; use std::rc::Rc; @@ -15,7 +16,11 @@ impl Gemini { // Construct /// Create new `Self` for given `Profile` - pub fn new(profile: Rc, action: Rc, auth_uri: Uri) -> Self { + pub fn new( + action: (Rc, Rc), + profile: Rc, + auth_uri: Uri, + ) -> Self { // Init shared URL string from URI let auth_url = auth_uri.to_string(); @@ -24,11 +29,8 @@ impl Gemini { // Init events widget.on_cancel({ - let action = action.clone(); - move |is_reload_request| { - if is_reload_request { - action.reload.activate(); - } + move || { + action.0.update.activate(None); } }); @@ -83,7 +85,7 @@ impl Gemini { } // Reload page to apply changes - action.reload.activate(); + action.1.reload.activate(); } }); diff --git a/src/app/browser/window/tab/item/identity/gemini/widget.rs b/src/app/browser/window/tab/item/identity/gemini/widget.rs index 283af6e0..a9c12962 100644 --- a/src/app/browser/window/tab/item/identity/gemini/widget.rs +++ b/src/app/browser/window/tab/item/identity/gemini/widget.rs @@ -10,7 +10,7 @@ use adw::{ AlertDialog, ResponseAppearance, }; use gtk::prelude::IsA; -use std::{cell::Cell, rc::Rc}; +use std::rc::Rc; // Defaults const HEADING: &str = "Ident"; @@ -27,7 +27,6 @@ pub struct Widget { // pub action: Rc, pub form: Rc
, pub alert_dialog: AlertDialog, - pub is_reload_request: Rc>, } impl Widget { @@ -38,9 +37,6 @@ impl Widget { // Init actions let action = Rc::new(Action::new()); - // Page may require reload for some widget actions - let is_reload_request = Rc::new(Cell::new(false)); - // Init child container let form = Rc::new(Form::new(profile, action.clone(), auth_url)); @@ -71,11 +67,7 @@ impl Widget { action.update.connect_activate({ let form = form.clone(); let alert_dialog = alert_dialog.clone(); - let is_reload_request = is_reload_request.clone(); - move |_is_reload_request| { - // Update reload state - is_reload_request.replace(_is_reload_request); - + move || { // Update child components form.update(); @@ -89,7 +81,6 @@ impl Widget { // action, form, alert_dialog, - is_reload_request, } } @@ -113,17 +104,14 @@ impl Widget { /// Callback wrapper to cancel /// [response](https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/signal.AlertDialog.response.html) /// * return require reload state - pub fn on_cancel(&self, callback: impl Fn(bool) + 'static) { + pub fn on_cancel(&self, callback: impl Fn() + 'static) { self.alert_dialog - .connect_response(Some(RESPONSE_CANCEL.0), { - let is_reload_request = self.is_reload_request.take(); - move |this, response| { - // Prevent double-click action - this.set_response_enabled(response, false); + .connect_response(Some(RESPONSE_CANCEL.0), move |this, response| { + // Prevent double-click action + this.set_response_enabled(response, false); - // Result - callback(is_reload_request) - } + // Result + callback() }); } diff --git a/src/app/browser/window/tab/item/identity/gemini/widget/action/update.rs b/src/app/browser/window/tab/item/identity/gemini/widget/action/update.rs index 75021613..d0ad0355 100644 --- a/src/app/browser/window/tab/item/identity/gemini/widget/action/update.rs +++ b/src/app/browser/window/tab/item/identity/gemini/widget/action/update.rs @@ -1,8 +1,4 @@ -use gtk::{ - gio::SimpleAction, - glib::uuid_string_random, - prelude::{ActionExt, StaticVariantType, ToVariant}, -}; +use gtk::{gio::SimpleAction, glib::uuid_string_random, prelude::ActionExt}; /// [SimpleAction](https://docs.gtk.org/gio/class.SimpleAction.html) wrapper for `Update` action pub struct Update { @@ -15,7 +11,7 @@ impl Update { /// Create new `Self` pub fn new() -> Self { Self { - gobject: SimpleAction::new(&uuid_string_random(), Some(&bool::static_variant_type())), + gobject: SimpleAction::new(&uuid_string_random(), None), } } @@ -23,21 +19,15 @@ impl Update { /// Emit [activate](https://docs.gtk.org/gio/signal.SimpleAction.activate.html) signal /// with formatted for this action [Variant](https://docs.gtk.org/glib/struct.Variant.html) value - pub fn activate(&self, is_reload_request: bool) { - self.gobject.activate(Some(&is_reload_request.to_variant())); + pub fn activate(&self) { + self.gobject.activate(None); } // Events /// Define callback function for /// [SimpleAction::activate](https://docs.gtk.org/gio/signal.SimpleAction.activate.html) signal - pub fn connect_activate(&self, callback: impl Fn(bool) + 'static) { - self.gobject.connect_activate(move |_, this| { - callback( - this.expect("Expected `is_reload_request` variant") - .get::() - .expect("Parameter type does not match `bool` type"), - ) - }); + pub fn connect_activate(&self, callback: impl Fn() + 'static) { + self.gobject.connect_activate(move |_, _| callback()); } } diff --git a/src/app/browser/window/tab/item/identity/gemini/widget/form/file.rs b/src/app/browser/window/tab/item/identity/gemini/widget/form/file.rs index ff4a343e..54617b23 100644 --- a/src/app/browser/window/tab/item/identity/gemini/widget/form/file.rs +++ b/src/app/browser/window/tab/item/identity/gemini/widget/form/file.rs @@ -89,7 +89,7 @@ impl File { } } button.set_sensitive(true); // unlock - action_widget.update.activate(false) + action_widget.update.activate() } }); } diff --git a/src/app/browser/window/tab/item/identity/gemini/widget/form/list.rs b/src/app/browser/window/tab/item/identity/gemini/widget/form/list.rs index facbb690..c3814bda 100644 --- a/src/app/browser/window/tab/item/identity/gemini/widget/form/list.rs +++ b/src/app/browser/window/tab/item/identity/gemini/widget/form/list.rs @@ -133,7 +133,7 @@ impl List { .build(); // Connect events - dropdown.connect_selected_notify(move |_| action_widget.update.activate(false)); + dropdown.connect_selected_notify(move |_| action_widget.update.activate()); // Return activated `Self` Self { diff --git a/src/app/browser/window/tab/item/identity/gemini/widget/form/name.rs b/src/app/browser/window/tab/item/identity/gemini/widget/form/name.rs index 23541576..7fc2bb82 100644 --- a/src/app/browser/window/tab/item/identity/gemini/widget/form/name.rs +++ b/src/app/browser/window/tab/item/identity/gemini/widget/form/name.rs @@ -29,7 +29,7 @@ impl Name { .build(); // Init events - entry.connect_changed(move |_| action_widget.update.activate(false)); + entry.connect_changed(move |_| action_widget.update.activate()); // Return activated `Self` Self { entry }