diff --git a/src/app/browser/window/tab/item.rs b/src/app/browser/window/tab/item.rs index ee65ab2d..8ac6b4d0 100644 --- a/src/app/browser/window/tab/item.rs +++ b/src/app/browser/window/tab/item.rs @@ -1,15 +1,14 @@ mod action; mod client; mod database; -mod identity; mod page; use super::{Action as TabAction, BrowserAction, Position, WindowAction}; use crate::Profile; use action::Action; -use adw::{prelude::AdwDialogExt, TabView}; +use adw::TabView; use client::Client; -use gtk::prelude::{ActionMapExt, Cast}; +use gtk::prelude::ActionMapExt; use page::Page; use sqlite::Transaction; use std::rc::Rc; @@ -81,29 +80,6 @@ impl Item { } }); - action.ident.connect_activate({ - let client = client.clone(); - let page = page.clone(); - let parent = tab_view.clone().upcast::(); - let profile = profile.clone(); - move || { - if let Some(request) = page.navigation.uri() { - if ["gemini", "titan"].contains(&request.scheme().as_str()) { - return identity::default(&profile, &request, { - let client = client.clone(); - let page = page.clone(); - move || { - page.navigation.update(); // update indicators immediately - client.handle(&page.navigation.request(), false); - } // on apply - }) - .present(Some(&parent)); - } - } - identity::unsupported().present(Some(&parent)); - } - }); - action.load.connect_activate({ let page = page.clone(); let client = client.clone(); diff --git a/src/app/browser/window/tab/item/action.rs b/src/app/browser/window/tab/item/action.rs index 70f1f34c..24bea278 100644 --- a/src/app/browser/window/tab/item/action.rs +++ b/src/app/browser/window/tab/item/action.rs @@ -1,13 +1,13 @@ mod history; mod home; -mod ident; +mod identity; mod load; mod reload; use gtk::gio::SimpleAction; use history::History; use home::Home; -use ident::Ident; +use identity::Identity; use load::Load; use reload::Reload; @@ -17,7 +17,7 @@ use std::rc::Rc; pub struct Action { pub history: Rc, pub home: SimpleAction, - pub ident: Rc, + pub identity: SimpleAction, pub load: Rc, pub reload: SimpleAction, } @@ -33,9 +33,9 @@ impl Action { /// Create new `Self` pub fn new() -> Self { - let ident = Rc::new(Ident::new()); - let load = Rc::new(Load::new()); let home = SimpleAction::home(); + let identity = SimpleAction::identity(); + let load = Rc::new(Load::new()); let reload = SimpleAction::reload(); let history = Rc::new(History::build({ @@ -45,10 +45,10 @@ impl Action { Self { history, - reload, home, - ident, + identity, load, + reload, } } } diff --git a/src/app/browser/window/tab/item/action/ident.rs b/src/app/browser/window/tab/item/action/ident.rs deleted file mode 100644 index c44d0763..00000000 --- a/src/app/browser/window/tab/item/action/ident.rs +++ /dev/null @@ -1,39 +0,0 @@ -use gtk::{gio::SimpleAction, glib::uuid_string_random, prelude::ActionExt}; - -/// [SimpleAction](https://docs.gtk.org/gio/class.SimpleAction.html) wrapper for `Ident` action of `Item` group -pub struct Ident { - pub simple_action: SimpleAction, -} - -impl Default for Ident { - fn default() -> Self { - Self::new() - } -} - -impl Ident { - // Constructors - - /// Create new `Self` - pub fn new() -> Self { - Self { - simple_action: SimpleAction::new(&uuid_string_random(), None), - } - } - - // Actions - - /// 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) { - self.simple_action.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() + 'static) { - self.simple_action.connect_activate(move |_, _| callback()); - } -} diff --git a/src/app/browser/window/tab/item/action/identity.rs b/src/app/browser/window/tab/item/action/identity.rs new file mode 100644 index 00000000..45134e28 --- /dev/null +++ b/src/app/browser/window/tab/item/action/identity.rs @@ -0,0 +1,13 @@ +use gtk::{gio::SimpleAction, glib::uuid_string_random}; + +pub trait Identity { + fn identity() -> Self; +} + +impl Identity for SimpleAction { + fn identity() -> Self { + let identity = SimpleAction::new(&uuid_string_random(), None); + identity.set_enabled(false); + identity + } +} diff --git a/src/app/browser/window/tab/item/page.rs b/src/app/browser/window/tab/item/page.rs index 550dac1b..00a4262b 100644 --- a/src/app/browser/window/tab/item/page.rs +++ b/src/app/browser/window/tab/item/page.rs @@ -47,7 +47,7 @@ impl Page { (position, is_pinned, is_selected, is_needs_attention): (Position, bool, bool, bool), ) -> Self { // Init components - let content = Rc::new(Content::build((window_action, item_action))); + let content = Rc::new(Content::build((window_action, tab_action, item_action))); let search = Rc::new(Search::new()); let navigation = Rc::new(Navigation::build( profile, diff --git a/src/app/browser/window/tab/item/page/content.rs b/src/app/browser/window/tab/item/page/content.rs index 43e0a97b..3ef280f8 100644 --- a/src/app/browser/window/tab/item/page/content.rs +++ b/src/app/browser/window/tab/item/page/content.rs @@ -5,7 +5,7 @@ mod text; use image::Image; use text::Text; -use super::{ItemAction, WindowAction}; +use super::{ItemAction, TabAction, WindowAction}; use adw::StatusPage; use gtk::{ gdk::Paintable, @@ -19,6 +19,7 @@ use std::{rc::Rc, time::Duration}; pub struct Content { window_action: Rc, item_action: Rc, + tab_action: Rc, pub g_box: Box, } @@ -26,11 +27,18 @@ impl Content { // Construct /// Create new container for different components - pub fn build((window_action, item_action): (&Rc, &Rc)) -> Self { + pub fn build( + (window_action, tab_action, item_action): ( + &Rc, + &Rc, + &Rc, + ), + ) -> Self { Self { g_box: Box::builder().orientation(Orientation::Vertical).build(), window_action: window_action.clone(), item_action: item_action.clone(), + tab_action: tab_action.clone(), } } @@ -90,7 +98,7 @@ impl Content { /// * action removes previous children component from `Self` pub fn to_status_identity(&self) -> StatusPage { self.clean(); - let status = status::identity::build(self.item_action.clone()); + let status = status::identity::build((&self.tab_action, &self.item_action)); self.g_box.append(&status); status } diff --git a/src/app/browser/window/tab/item/page/content/status.rs b/src/app/browser/window/tab/item/page/content/status.rs index 209e63d6..5ecfa4f7 100644 --- a/src/app/browser/window/tab/item/page/content/status.rs +++ b/src/app/browser/window/tab/item/page/content/status.rs @@ -4,4 +4,4 @@ pub mod identity; pub mod loading; pub mod mime; -use super::ItemAction; +use super::{ItemAction, TabAction}; diff --git a/src/app/browser/window/tab/item/page/content/status/identity.rs b/src/app/browser/window/tab/item/page/content/status/identity.rs index 2b68bd71..1ea12eb4 100644 --- a/src/app/browser/window/tab/item/page/content/status/identity.rs +++ b/src/app/browser/window/tab/item/page/content/status/identity.rs @@ -1,6 +1,6 @@ -use crate::app::browser::window::tab::item::Action; +use super::{ItemAction, TabAction}; use adw::StatusPage; -use gtk::{prelude::ButtonExt, Align, Button}; +use gtk::{prelude::ActionExt, Align, Button}; use std::rc::Rc; // Defaults @@ -13,18 +13,16 @@ const DEFAULT_BUTTON_CLASS: &str = "suggested-action"; /// Create new default preset for `Identity` /// [StatusPage](https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.StatusPage.html) -pub fn build(action: Rc) -> StatusPage { +pub fn build((tab_action, item_action): (&Rc, &Rc)) -> StatusPage { // Init certificate selection let button = &Button::builder() + .action_name(format!("{}.{}", tab_action.id, item_action.identity.name())) .css_classes([DEFAULT_BUTTON_CLASS]) .label(DEFAULT_BUTTON_LABEL) .tooltip_text(DEFAULT_BUTTON_TOOLTIP_TEXT) .halign(Align::Center) .build(); - // Init events - button.connect_clicked(move |_| action.ident.activate()); - // Init status page StatusPage::builder() .description(DEFAULT_DESCRIPTION) diff --git a/src/app/browser/window/tab/item/page/navigation/request.rs b/src/app/browser/window/tab/item/page/navigation/request.rs index 98704dd7..0996b63a 100644 --- a/src/app/browser/window/tab/item/page/navigation/request.rs +++ b/src/app/browser/window/tab/item/page/navigation/request.rs @@ -1,6 +1,8 @@ mod database; +mod identity; mod primary_icon; +use adw::prelude::AdwDialogExt; use primary_icon::PrimaryIcon; use super::{ItemAction, Profile}; @@ -71,8 +73,25 @@ impl Request for Entry { // Connect events entry.connect_icon_release({ let item_action = item_action.clone(); + let profile = profile.clone(); move |this, position| match position { - EntryIconPosition::Primary => item_action.ident.activate(), // @TODO PrimaryIcon impl + EntryIconPosition::Primary => { + if let Some(request) = this.uri() { + if ["gemini", "titan"].contains(&request.scheme().as_str()) { + return identity::default(&profile, &request, { + let item_action = item_action.clone(); + let profile = profile.clone(); + let this = this.clone(); + move || { + this.update(&profile); + item_action.load.activate(Some(&this.text()), false); + } // on apply + }) + .present(Some(this)); + } + } + identity::unsupported().present(Some(this)); + } EntryIconPosition::Secondary => item_action.load.activate(Some(&this.text()), true), _ => todo!(), // unexpected } diff --git a/src/app/browser/window/tab/item/identity.rs b/src/app/browser/window/tab/item/page/navigation/request/identity.rs similarity index 100% rename from src/app/browser/window/tab/item/identity.rs rename to src/app/browser/window/tab/item/page/navigation/request/identity.rs diff --git a/src/app/browser/window/tab/item/identity/default.rs b/src/app/browser/window/tab/item/page/navigation/request/identity/default.rs similarity index 100% rename from src/app/browser/window/tab/item/identity/default.rs rename to src/app/browser/window/tab/item/page/navigation/request/identity/default.rs diff --git a/src/app/browser/window/tab/item/identity/default/widget.rs b/src/app/browser/window/tab/item/page/navigation/request/identity/default/widget.rs similarity index 100% rename from src/app/browser/window/tab/item/identity/default/widget.rs rename to src/app/browser/window/tab/item/page/navigation/request/identity/default/widget.rs diff --git a/src/app/browser/window/tab/item/identity/default/widget/action.rs b/src/app/browser/window/tab/item/page/navigation/request/identity/default/widget/action.rs similarity index 100% rename from src/app/browser/window/tab/item/identity/default/widget/action.rs rename to src/app/browser/window/tab/item/page/navigation/request/identity/default/widget/action.rs diff --git a/src/app/browser/window/tab/item/identity/default/widget/action/update.rs b/src/app/browser/window/tab/item/page/navigation/request/identity/default/widget/action/update.rs similarity index 100% rename from src/app/browser/window/tab/item/identity/default/widget/action/update.rs rename to src/app/browser/window/tab/item/page/navigation/request/identity/default/widget/action/update.rs diff --git a/src/app/browser/window/tab/item/identity/default/widget/form.rs b/src/app/browser/window/tab/item/page/navigation/request/identity/default/widget/form.rs similarity index 100% rename from src/app/browser/window/tab/item/identity/default/widget/form.rs rename to src/app/browser/window/tab/item/page/navigation/request/identity/default/widget/form.rs diff --git a/src/app/browser/window/tab/item/identity/default/widget/form/drop.rs b/src/app/browser/window/tab/item/page/navigation/request/identity/default/widget/form/drop.rs similarity index 100% rename from src/app/browser/window/tab/item/identity/default/widget/form/drop.rs rename to src/app/browser/window/tab/item/page/navigation/request/identity/default/widget/form/drop.rs diff --git a/src/app/browser/window/tab/item/identity/default/widget/form/exit.rs b/src/app/browser/window/tab/item/page/navigation/request/identity/default/widget/form/exit.rs similarity index 100% rename from src/app/browser/window/tab/item/identity/default/widget/form/exit.rs rename to src/app/browser/window/tab/item/page/navigation/request/identity/default/widget/form/exit.rs diff --git a/src/app/browser/window/tab/item/identity/default/widget/form/file.rs b/src/app/browser/window/tab/item/page/navigation/request/identity/default/widget/form/file.rs similarity index 100% rename from src/app/browser/window/tab/item/identity/default/widget/form/file.rs rename to src/app/browser/window/tab/item/page/navigation/request/identity/default/widget/form/file.rs diff --git a/src/app/browser/window/tab/item/identity/default/widget/form/list.rs b/src/app/browser/window/tab/item/page/navigation/request/identity/default/widget/form/list.rs similarity index 100% rename from src/app/browser/window/tab/item/identity/default/widget/form/list.rs rename to src/app/browser/window/tab/item/page/navigation/request/identity/default/widget/form/list.rs diff --git a/src/app/browser/window/tab/item/identity/default/widget/form/list/item.rs b/src/app/browser/window/tab/item/page/navigation/request/identity/default/widget/form/list/item.rs similarity index 100% rename from src/app/browser/window/tab/item/identity/default/widget/form/list/item.rs rename to src/app/browser/window/tab/item/page/navigation/request/identity/default/widget/form/list/item.rs diff --git a/src/app/browser/window/tab/item/identity/default/widget/form/list/item/error.rs b/src/app/browser/window/tab/item/page/navigation/request/identity/default/widget/form/list/item/error.rs similarity index 100% rename from src/app/browser/window/tab/item/identity/default/widget/form/list/item/error.rs rename to src/app/browser/window/tab/item/page/navigation/request/identity/default/widget/form/list/item/error.rs diff --git a/src/app/browser/window/tab/item/identity/default/widget/form/list/item/imp.rs b/src/app/browser/window/tab/item/page/navigation/request/identity/default/widget/form/list/item/imp.rs similarity index 100% rename from src/app/browser/window/tab/item/identity/default/widget/form/list/item/imp.rs rename to src/app/browser/window/tab/item/page/navigation/request/identity/default/widget/form/list/item/imp.rs diff --git a/src/app/browser/window/tab/item/identity/default/widget/form/list/item/is_active.rs b/src/app/browser/window/tab/item/page/navigation/request/identity/default/widget/form/list/item/is_active.rs similarity index 100% rename from src/app/browser/window/tab/item/identity/default/widget/form/list/item/is_active.rs rename to src/app/browser/window/tab/item/page/navigation/request/identity/default/widget/form/list/item/is_active.rs diff --git a/src/app/browser/window/tab/item/identity/default/widget/form/list/item/subtitle.rs b/src/app/browser/window/tab/item/page/navigation/request/identity/default/widget/form/list/item/subtitle.rs similarity index 100% rename from src/app/browser/window/tab/item/identity/default/widget/form/list/item/subtitle.rs rename to src/app/browser/window/tab/item/page/navigation/request/identity/default/widget/form/list/item/subtitle.rs diff --git a/src/app/browser/window/tab/item/identity/default/widget/form/list/item/title.rs b/src/app/browser/window/tab/item/page/navigation/request/identity/default/widget/form/list/item/title.rs similarity index 100% rename from src/app/browser/window/tab/item/identity/default/widget/form/list/item/title.rs rename to src/app/browser/window/tab/item/page/navigation/request/identity/default/widget/form/list/item/title.rs diff --git a/src/app/browser/window/tab/item/identity/default/widget/form/list/item/tooltip.rs b/src/app/browser/window/tab/item/page/navigation/request/identity/default/widget/form/list/item/tooltip.rs similarity index 100% rename from src/app/browser/window/tab/item/identity/default/widget/form/list/item/tooltip.rs rename to src/app/browser/window/tab/item/page/navigation/request/identity/default/widget/form/list/item/tooltip.rs diff --git a/src/app/browser/window/tab/item/identity/default/widget/form/list/item/value.rs b/src/app/browser/window/tab/item/page/navigation/request/identity/default/widget/form/list/item/value.rs similarity index 100% rename from src/app/browser/window/tab/item/identity/default/widget/form/list/item/value.rs rename to src/app/browser/window/tab/item/page/navigation/request/identity/default/widget/form/list/item/value.rs diff --git a/src/app/browser/window/tab/item/identity/default/widget/form/name.rs b/src/app/browser/window/tab/item/page/navigation/request/identity/default/widget/form/name.rs similarity index 100% rename from src/app/browser/window/tab/item/identity/default/widget/form/name.rs rename to src/app/browser/window/tab/item/page/navigation/request/identity/default/widget/form/name.rs diff --git a/src/app/browser/window/tab/item/identity/default/widget/form/save.rs b/src/app/browser/window/tab/item/page/navigation/request/identity/default/widget/form/save.rs similarity index 100% rename from src/app/browser/window/tab/item/identity/default/widget/form/save.rs rename to src/app/browser/window/tab/item/page/navigation/request/identity/default/widget/form/save.rs diff --git a/src/app/browser/window/tab/item/identity/default/widget/form/save/certificate.rs b/src/app/browser/window/tab/item/page/navigation/request/identity/default/widget/form/save/certificate.rs similarity index 100% rename from src/app/browser/window/tab/item/identity/default/widget/form/save/certificate.rs rename to src/app/browser/window/tab/item/page/navigation/request/identity/default/widget/form/save/certificate.rs diff --git a/src/app/browser/window/tab/item/identity/default/widget/form/save/certificate/error.rs b/src/app/browser/window/tab/item/page/navigation/request/identity/default/widget/form/save/certificate/error.rs similarity index 100% rename from src/app/browser/window/tab/item/identity/default/widget/form/save/certificate/error.rs rename to src/app/browser/window/tab/item/page/navigation/request/identity/default/widget/form/save/certificate/error.rs diff --git a/src/app/browser/window/tab/item/identity/unsupported.rs b/src/app/browser/window/tab/item/page/navigation/request/identity/unsupported.rs similarity index 100% rename from src/app/browser/window/tab/item/identity/unsupported.rs rename to src/app/browser/window/tab/item/page/navigation/request/identity/unsupported.rs