diff --git a/src/app/browser.rs b/src/app/browser.rs index d5eb35b0..6dc5e075 100644 --- a/src/app/browser.rs +++ b/src/app/browser.rs @@ -66,31 +66,31 @@ impl Browser { // Connect events action.about.connect_activate({ - let window = window.clone(); - move || AboutDialog::about().present(Some(&window.g_box)) + let w = window.clone(); + move || AboutDialog::about().present(Some(&w.g_box)) }); action.close.connect_activate({ - let widget = widget.clone(); - move || widget.application_window.close() + let w = widget.clone(); + move || w.application_window.close() }); action.debug.connect_activate({ - let widget = widget.clone(); + let w = widget.clone(); move || { - widget.application_window.emit_enable_debugging(true); + w.application_window.emit_enable_debugging(true); } }); action.profile.connect_activate({ - let profile = profile.clone(); + let p = profile.clone(); move || { - FileLauncher::new(Some(&File::for_path(profile.config_path.as_path()))).launch( + FileLauncher::new(Some(&File::for_path(p.config_path.as_path()))).launch( adw::Window::NONE, Cancellable::NONE, - |result| { - if let Err(error) = result { - println!("{error}") + |r| { + if let Err(e) = r { + println!("{e}") } }, ); // @TODO move out? @@ -98,25 +98,32 @@ impl Browser { }); action.history.connect_activate({ - let profile = profile.clone(); - let window = window.clone(); - move || { - PreferencesDialog::history(&window.action, &profile).present(Some(&window.g_box)) - } + let p = profile.clone(); + let w = window.clone(); + move || PreferencesDialog::history(&w.action, &p).present(Some(&w.g_box)) }); action.bookmarks.connect_activate({ - let profile = profile.clone(); - let window = window.clone(); - move || { - PreferencesDialog::bookmarks(&window.action, &profile).present(Some(&window.g_box)) - } + let p = profile.clone(); + let w = window.clone(); + move || PreferencesDialog::bookmarks(&w.action, &p).present(Some(&w.g_box)) }); action.proxy.connect_activate({ - let profile = profile.clone(); - let window = window.clone(); - move || PreferencesDialog::proxy(&profile).present(Some(&window.g_box)) + let p = profile.clone(); + let w = window.clone(); + move || { + PreferencesDialog::proxy(&p, { + let w = w.clone(); + move || { + w.tab + .items() + .into_iter() + .for_each(|i| i.page.navigation.request.refresh()) + } + }) + .present(Some(&w.g_box)) + } }); // Return new activated `Self` @@ -130,11 +137,11 @@ impl Browser { // Actions pub fn clean(&self, transaction: &Transaction, app_id: i64) -> Result<()> { - for record in database::select(transaction, app_id)? { - database::delete(transaction, record.id)?; + for r in database::select(transaction, app_id)? { + database::delete(transaction, r.id)?; // Delegate clean action to childs - self.window.clean(transaction, record.id)?; - self.widget.clean(transaction, record.id)?; + self.window.clean(transaction, r.id)?; + self.widget.clean(transaction, r.id)?; /* @TODO self.header.clean(transaction, &record.id)?; */ } @@ -142,12 +149,12 @@ impl Browser { } pub fn restore(&self, transaction: &Transaction, app_id: i64) -> Result<()> { - for record in database::select(transaction, app_id)? { + for r in database::select(transaction, app_id)? { // Delegate restore action to childs - self.widget.restore(transaction, record.id)?; - self.window.restore(transaction, record.id)?; + self.widget.restore(transaction, r.id)?; + self.window.restore(transaction, r.id)?; /* @TODO - self.header.restore(transaction, &record.id)?; */ + self.header.restore(transaction, &r.id)?; */ } Ok(()) } diff --git a/src/app/browser/proxy.rs b/src/app/browser/proxy.rs index f3db3dc7..975cfe68 100644 --- a/src/app/browser/proxy.rs +++ b/src/app/browser/proxy.rs @@ -15,11 +15,11 @@ use rule::Rule; use std::rc::Rc; pub trait Proxy { - fn proxy(profile: &Rc) -> Self; + fn proxy(profile: &Rc, on_close: impl Fn() + 'static) -> Self; } impl Proxy for adw::PreferencesDialog { - fn proxy(profile: &Rc) -> Self { + fn proxy(profile: &Rc, on_close: impl Fn() + 'static) -> Self { // Init components let ignore = Ignore::build(profile); let misc = Misc::build(profile); @@ -98,6 +98,8 @@ impl Proxy for adw::PreferencesDialog { .proxy .misc .set_highlight_request_entry(misc.is_highlight_request_entry()); + + on_close() } }); d diff --git a/src/app/browser/window/tab.rs b/src/app/browser/window/tab.rs index b85081de..453427bb 100644 --- a/src/app/browser/window/tab.rs +++ b/src/app/browser/window/tab.rs @@ -358,6 +358,10 @@ impl Tab { // @TODO other/child features.. } + pub fn items(&self) -> Vec> { + self.index.borrow().values().cloned().collect() + } + /// Find `Item` by `TabPage` position in HashMap `index` fn item(&self, page_position: Option) -> Option> { match page_position { 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 b21d676f..a5202bd8 100644 --- a/src/app/browser/window/tab/item/page/navigation/request.rs +++ b/src/app/browser/window/tab/item/page/navigation/request.rs @@ -141,33 +141,8 @@ impl Request { if e.focus_child().is_some() { s.update(Some(50)); // @TODO optional } - // Indicate proxy connections @TODO cancel previous operation on update - if p.proxy.misc.is_highlight_request_entry() - && let Some(m) = p.proxy.matches(&t) - { - m.clone().lookup_async(&t, Cancellable::NONE, { - let e = e.clone(); - let r = r.clone(); - move |l| { - r.replace(Some(m)); - e.set_tooltip_text(Some(&{ - match l { - Ok(h) => { - e.set_css_classes(&["accent"]); - format!("Proxy over {}", h.join(",")) - } - Err(i) => { - e.set_css_classes(&["error"]); - i.to_string() - } - } - })) - } - }) - } else { - e.set_css_classes(&[]); - e.set_tooltip_text(None) - } + + refresh_proxy_resolver(e, &p, &r) } })); // `suggestion` wants `signal_handler_id` to block this event on autocomplete navigation @@ -280,6 +255,10 @@ impl Request { Ok(()) } + pub fn refresh(&self) { + refresh_proxy_resolver(&self.entry, &self.profile, &self.proxy_resolver) + } + pub fn update_secondary_icon(&self, info: &Info) { update_secondary_icon(&self.entry, info); } @@ -494,3 +473,38 @@ fn update_blocked( update_primary_icon(entry, profile); entry.unblock_signal(signal_handler_id); } + +/// Indicate proxy connections @TODO cancel previous operation on update +fn refresh_proxy_resolver( + entry: &Entry, + profile: &Profile, + resolver: &Rc>>, +) { + let t = entry.text(); + if profile.proxy.misc.is_highlight_request_entry() + && let Some(m) = profile.proxy.matches(&t) + { + m.clone().lookup_async(&t, Cancellable::NONE, { + let e = entry.clone(); + let r = resolver.clone(); + move |l| { + r.replace(Some(m)); + e.set_tooltip_text(Some(&{ + match l { + Ok(h) => { + e.set_css_classes(&["accent"]); + format!("Proxy over {}", h.join(",")) + } + Err(i) => { + e.set_css_classes(&["error"]); + i.to_string() + } + } + })) + } + }) + } else { + entry.set_css_classes(&[]); + entry.set_tooltip_text(None) + } +}