diff --git a/src/app/browser.rs b/src/app/browser.rs index c9e6840f..e7a6b5a9 100644 --- a/src/app/browser.rs +++ b/src/app/browser.rs @@ -7,11 +7,11 @@ mod window; use about::About; use action::Action; -use welcome::Welcome; +//use welcome::Welcome; use widget::Widget; use window::Window; -use crate::profile::Profile; +use crate::Profile; use gtk::{ gio::{Cancellable, File}, prelude::{GtkWindowExt, IsA}, @@ -32,7 +32,7 @@ impl Browser { pub fn new(profile: Rc) -> Browser { // Init components let action = Rc::new(Action::new()); - let window = Rc::new(Window::new(action.clone())); + let window = Rc::new(Window::new(profile.clone(), action.clone())); // Init widget let widget = Rc::new(Widget::new( diff --git a/src/app/browser/window.rs b/src/app/browser/window.rs index f949d536..4016b2ee 100644 --- a/src/app/browser/window.rs +++ b/src/app/browser/window.rs @@ -11,6 +11,7 @@ use tab::Tab; use widget::Widget; use crate::app::browser::action::Action as BrowserAction; +use crate::Profile; use gtk::glib::GString; use std::rc::Rc; @@ -22,15 +23,12 @@ pub struct Window { impl Window { // Construct - pub fn new( - // Actions - browser_action: Rc, - ) -> Self { + pub fn new(profile: Rc, browser_action: Rc) -> Self { // Init local actions let action = Rc::new(Action::new()); // Init components - let tab = Rc::new(Tab::new(browser_action.clone(), action.clone())); + let tab = Rc::new(Tab::new(profile, (browser_action.clone(), action.clone()))); let header = Header::new(browser_action, action.clone(), tab.widget().gobject()); let widget = Rc::new(Widget::new(header.gobject(), tab.widget().gobject())); @@ -52,7 +50,7 @@ impl Window { action.bookmark().connect_activate({ let tab = tab.clone(); move |position| tab.bookmark(position) - }); + }); // @TODO action.pin().connect_activate({ let tab = tab.clone(); diff --git a/src/app/browser/window/tab.rs b/src/app/browser/window/tab.rs index eac3f048..754b2d3c 100644 --- a/src/app/browser/window/tab.rs +++ b/src/app/browser/window/tab.rs @@ -11,6 +11,7 @@ use crate::app::browser::{ window::action::{Action as WindowAction, Position}, Action as BrowserAction, }; +use crate::Profile; use gtk::{ glib::{GString, Propagation}, prelude::WidgetExt, @@ -20,6 +21,7 @@ use std::{cell::RefCell, collections::HashMap, rc::Rc}; // Main pub struct Tab { + profile: Rc, browser_action: Rc, window_action: Rc, index: Rc>>>, @@ -28,12 +30,12 @@ pub struct Tab { impl Tab { // Construct - pub fn new(browser_action: Rc, window_action: Rc) -> Self { + pub fn new(profile: Rc, action: (Rc, Rc)) -> Self { // Init empty HashMap index let index: Rc>>> = Rc::new(RefCell::new(HashMap::new())); // Init context menu - let menu = Menu::new(window_action.clone()); + let menu = Menu::new(action.1.clone()); // Init widget let widget = Rc::new(Widget::new(menu.gobject())); @@ -41,20 +43,20 @@ impl Tab { // Init events widget.gobject().connect_setup_menu({ - let window_action = window_action.clone(); + let action = action.1.clone(); move |tab_view, tab_page| { // Set new state for page selected on menu open // * this action return default state (`None`) on menu close let state = tab_page.map(|this| tab_view.page_position(this)); // Update actions with new state value - window_action.close_all().change_state(state); - window_action.close().change_state(state); - window_action.history_back().change_state(state); - window_action.history_forward().change_state(state); - window_action.home().change_state(state); - window_action.pin().change_state(state); - window_action.reload().change_state(state); + action.close_all().change_state(state); + action.close().change_state(state); + action.history_back().change_state(state); + action.history_forward().change_state(state); + action.home().change_state(state); + action.pin().change_state(state); + action.reload().change_state(state); } }); @@ -94,8 +96,9 @@ impl Tab { // Return activated `Self` Self { - browser_action, - window_action, + profile, + browser_action: action.0, + window_action: action.1, index, widget, } @@ -114,6 +117,7 @@ impl Tab { // Init new tab item let item = Rc::new(Item::new( self.widget.gobject(), + self.profile.clone(), self.browser_action.clone(), self.window_action.clone(), // Options tuple @@ -280,8 +284,8 @@ impl Tab { self.widget.gobject(), transaction, &record.id, - self.browser_action.clone(), - self.window_action.clone(), + self.profile.clone(), + (self.browser_action.clone(), self.window_action.clone()), ) { Ok(items) => { for item in items { diff --git a/src/app/browser/window/tab/item.rs b/src/app/browser/window/tab/item.rs index 1e2714cb..de2945a8 100644 --- a/src/app/browser/window/tab/item.rs +++ b/src/app/browser/window/tab/item.rs @@ -11,6 +11,7 @@ use crate::app::browser::{ window::action::{Action as WindowAction, Position}, Action as BrowserAction, }; +use crate::Profile; use adw::TabView; use gtk::{ glib::{uuid_string_random, GString}, @@ -32,6 +33,7 @@ impl Item { // Construct pub fn new( tab_view: &TabView, + profile: Rc, // Actions browser_action: Rc, window_action: Rc, @@ -50,6 +52,7 @@ impl Item { let page = Rc::new(Page::new( id.clone(), + profile, (browser_action, window_action, action.clone()), )); @@ -133,9 +136,9 @@ impl Item { tab_view: &TabView, transaction: &Transaction, app_browser_window_tab_id: &i64, + profile: Rc, // Actions - browser_action: Rc, - window_action: Rc, + action: (Rc, Rc), ) -> Result>, String> { let mut items = Vec::new(); @@ -145,9 +148,10 @@ impl Item { // Construct new item object let item = Rc::new(Item::new( tab_view, + profile.clone(), // Actions - browser_action.clone(), - window_action.clone(), + action.0.clone(), + action.1.clone(), // Options tuple ( Position::End, diff --git a/src/app/browser/window/tab/item/page.rs b/src/app/browser/window/tab/item/page.rs index f57f023b..4646a493 100644 --- a/src/app/browser/window/tab/item/page.rs +++ b/src/app/browser/window/tab/item/page.rs @@ -15,6 +15,7 @@ use crate::app::browser::{ window::{tab::item::Action as TabAction, Action as WindowAction}, Action as BrowserAction, }; +use crate::Profile; use gtk::{ gdk_pixbuf::Pixbuf, gio::{Cancellable, SocketClient, SocketClientEvent, SocketProtocol, TlsCertificateFlags}, @@ -44,15 +45,18 @@ pub struct Page { impl Page { // Constructors - pub fn new(id: GString, action: (Rc, Rc, Rc)) -> Self { + pub fn new( + id: GString, + profile: Rc, + action: (Rc, Rc, Rc), + ) -> Self { // Init components let content = Rc::new(Content::new((action.1.clone(), action.2.clone()))); - let navigation = Rc::new(Navigation::new(( - action.0.clone(), - action.1.clone(), - action.2.clone(), - ))); + let navigation = Rc::new(Navigation::new( + profile, + (action.0.clone(), action.1.clone(), action.2.clone()), + )); let input = Rc::new(Input::new()); diff --git a/src/app/browser/window/tab/item/page/navigation.rs b/src/app/browser/window/tab/item/page/navigation.rs index b1d882ca..829bb753 100644 --- a/src/app/browser/window/tab/item/page/navigation.rs +++ b/src/app/browser/window/tab/item/page/navigation.rs @@ -16,11 +16,13 @@ use widget::Widget; use crate::app::browser::window::tab::item::Action as TabAction; use crate::app::browser::window::Action as WindowAction; use crate::app::browser::Action as BrowserAction; +use crate::Profile; use gtk::prelude::EditableExt; use sqlite::Transaction; use std::rc::Rc; pub struct Navigation { + profile: Rc, bookmark: Rc, history: Rc, home: Rc, @@ -30,7 +32,10 @@ pub struct Navigation { } impl Navigation { - pub fn new(action: (Rc, Rc, Rc)) -> Self { + pub fn new( + profile: Rc, + action: (Rc, Rc, Rc), + ) -> Self { // Init components let home = Rc::new(Home::new(action.1.clone())); let history = Rc::new(History::new(action.1.clone())); @@ -49,6 +54,7 @@ impl Navigation { // Done Self { + profile, bookmark, history, home, @@ -61,11 +67,13 @@ impl Navigation { // Actions pub fn update(&self, progress_fraction: Option) { - self.bookmark.update(false); // @TODO DB from request + let request = self.request.widget().gobject().text(); + + self.bookmark + .update(!self.profile.bookmark.has_request(&request, true)); self.history.update(); self.home.update(self.request.uri()); - self.reload - .update(!self.request.widget().gobject().text().is_empty()); + self.reload.update(!request.is_empty()); self.request.update(progress_fraction); } diff --git a/src/app/browser/window/tab/item/page/navigation/bookmark.rs b/src/app/browser/window/tab/item/page/navigation/bookmark.rs index a9c4da37..27b17b4a 100644 --- a/src/app/browser/window/tab/item/page/navigation/bookmark.rs +++ b/src/app/browser/window/tab/item/page/navigation/bookmark.rs @@ -6,26 +6,23 @@ use crate::app::browser::window::action::Action as WindowAction; use std::rc::Rc; pub struct Bookmark { - window_action: Rc, + action: Rc, widget: Rc, } impl Bookmark { // Construct - pub fn new(window_action: Rc) -> Self { + pub fn new(action: Rc) -> Self { Self { - widget: Rc::new(Widget::new(window_action.clone())), - window_action, + widget: Rc::new(Widget::new(action.clone())), + action, } } // Actions pub fn update(&self, is_enabled: bool) { // Update actions - self.window_action - .bookmark() - .gobject() - .set_enabled(is_enabled); + self.action.bookmark().gobject().set_enabled(is_enabled); // Update child components self.widget.update(is_enabled); diff --git a/src/app/browser/window/tab/item/page/navigation/bookmark/widget.rs b/src/app/browser/window/tab/item/page/navigation/bookmark/widget.rs index 2e533b5d..57dbaaea 100644 --- a/src/app/browser/window/tab/item/page/navigation/bookmark/widget.rs +++ b/src/app/browser/window/tab/item/page/navigation/bookmark/widget.rs @@ -13,7 +13,7 @@ pub struct Widget { impl Widget { // Constructors - pub fn new(window_action: Rc) -> Self { + pub fn new(action: Rc) -> Self { // Init gobject let gobject = Button::builder() .icon_name("starred-symbolic") @@ -22,7 +22,7 @@ impl Widget { .build(); // Init events - gobject.connect_clicked(move |_| window_action.home().activate()); + gobject.connect_clicked(move |_| action.home().activate()); // Return activated `Self` Self { gobject } diff --git a/src/app/browser/window/tab/item/page/navigation/home.rs b/src/app/browser/window/tab/item/page/navigation/home.rs index 04b16520..1a00e07c 100644 --- a/src/app/browser/window/tab/item/page/navigation/home.rs +++ b/src/app/browser/window/tab/item/page/navigation/home.rs @@ -7,18 +7,18 @@ use gtk::glib::{gformat, GString, Uri}; use std::{cell::RefCell, rc::Rc}; pub struct Home { - window_action: Rc, + action: Rc, uri: RefCell>, widget: Rc, } impl Home { // Construct - pub fn new(window_action: Rc) -> Self { + pub fn new(action: Rc) -> Self { Self { - window_action: window_action.clone(), + action: action.clone(), uri: RefCell::new(None), - widget: Rc::new(Widget::new(window_action)), + widget: Rc::new(Widget::new(action)), } } @@ -34,7 +34,7 @@ impl Home { self.uri.replace(uri); // Update action status - self.window_action.home().gobject().set_enabled(status); + self.action.home().gobject().set_enabled(status); // Update child components self.widget.update(status); diff --git a/src/app/browser/window/tab/item/page/navigation/home/widget.rs b/src/app/browser/window/tab/item/page/navigation/home/widget.rs index 2b494818..66dde9c1 100644 --- a/src/app/browser/window/tab/item/page/navigation/home/widget.rs +++ b/src/app/browser/window/tab/item/page/navigation/home/widget.rs @@ -11,7 +11,7 @@ pub struct Widget { impl Widget { // Construct - pub fn new(window_action: Rc) -> Self { + pub fn new(action: Rc) -> Self { // Init gobject let gobject = Button::builder() .icon_name("go-home-symbolic") @@ -20,7 +20,7 @@ impl Widget { .build(); // Init events - gobject.connect_clicked(move |_| window_action.home().activate()); + gobject.connect_clicked(move |_| action.home().activate()); // Return activated `Self` Self { gobject } diff --git a/src/app/browser/window/tab/item/page/navigation/reload.rs b/src/app/browser/window/tab/item/page/navigation/reload.rs index 108de94d..c44c9b8e 100644 --- a/src/app/browser/window/tab/item/page/navigation/reload.rs +++ b/src/app/browser/window/tab/item/page/navigation/reload.rs @@ -6,16 +6,16 @@ use crate::app::browser::window::action::Action as WindowAction; use std::rc::Rc; pub struct Reload { - window_action: Rc, + action: Rc, widget: Rc, } impl Reload { // Construct - pub fn new(window_action: Rc) -> Self { + pub fn new(action: Rc) -> Self { Self { - window_action: window_action.clone(), - widget: Rc::new(Widget::new(window_action)), + action: action.clone(), + widget: Rc::new(Widget::new(action)), } } @@ -23,10 +23,7 @@ impl Reload { pub fn update(&self, is_enabled: bool) { // Update actions - self.window_action - .reload() - .gobject() - .set_enabled(is_enabled); + self.action.reload().gobject().set_enabled(is_enabled); // Update child components self.widget.update(is_enabled); diff --git a/src/app/browser/window/tab/item/page/navigation/reload/widget.rs b/src/app/browser/window/tab/item/page/navigation/reload/widget.rs index ec167e11..370df634 100644 --- a/src/app/browser/window/tab/item/page/navigation/reload/widget.rs +++ b/src/app/browser/window/tab/item/page/navigation/reload/widget.rs @@ -11,7 +11,7 @@ pub struct Widget { impl Widget { // Construct - pub fn new(window_action: Rc) -> Self { + pub fn new(action: Rc) -> Self { // Init gobject let gobject = Button::builder() .icon_name("view-refresh-symbolic") @@ -20,7 +20,7 @@ impl Widget { .build(); // Init events - gobject.connect_clicked(move |_| window_action.reload().activate()); + gobject.connect_clicked(move |_| action.reload().activate()); // Return activated `Self` Self { gobject }