diff --git a/README.md b/README.md index 81d0c1eb..300fa275 100644 --- a/README.md +++ b/README.md @@ -47,9 +47,10 @@ Guide and protocol draft * implement only one public `struct` per file (same as one file for one class) * implementable `struct` is public, where it members - private * contain main `struct` implementation: - * at least one constructor that must return: - * unwrapped main `Self` structure - * granted ownership for new object created + * at least one constructor that must: + * return unwrapped, non activated (_todo_) new `Self` object + * grant ownership for new `Self` object created + * public `activate` action (_todo_) * public link getter for privately constructed widget * Public API oriented to simple (`integer`, `boolean`), standard (`std::*`) or system-wide (`gio`, `glib`, etc) data types usage to reduce internal dependencies from app implementation diff --git a/src/app.rs b/src/app.rs index ab547e7b..e01c1dfc 100644 --- a/src/app.rs +++ b/src/app.rs @@ -7,6 +7,7 @@ use browser::Browser; use database::Database; use gtk::{ + gio::SimpleAction, glib::ExitCode, prelude::{ActionExt, ApplicationExt, ApplicationExtManual, GtkApplicationExt, GtkWindowExt}, Application, @@ -23,6 +24,18 @@ pub struct App { // Components //browser: Arc, database: Arc, + // Actions + action_debug: Arc, + action_quit: Arc, + action_update: Arc, + action_tab_append: Arc, + action_tab_close: Arc, + action_tab_close_all: Arc, + action_tab_page_navigation_base: Arc, + action_tab_page_navigation_history_back: Arc, + action_tab_page_navigation_history_forward: Arc, + action_tab_page_navigation_reload: Arc, + action_tab_pin: Arc, } impl App { @@ -73,9 +86,47 @@ impl App { &["r"], ); + // Return app struct + Self { + // Actions (SimpleAction) + action_debug: action_debug.simple(), + action_quit: action_quit.simple(), + action_update: action_update.simple(), + action_tab_append: action_tab_append.simple(), + action_tab_close: action_tab_close.simple(), + action_tab_close_all: action_tab_close_all.simple(), + action_tab_page_navigation_base: action_tab_page_navigation_base.simple(), + action_tab_page_navigation_history_back: action_tab_page_navigation_history_back + .simple(), + action_tab_page_navigation_history_forward: action_tab_page_navigation_history_forward + .simple(), + action_tab_page_navigation_reload: action_tab_page_navigation_reload.simple(), + action_tab_pin: action_tab_pin.simple(), + // Extras + database, + // GTK + app, + } + } + + // Actions + pub fn activate(&self) -> &Self { // Init events - app.connect_activate({ + self.app.connect_activate({ // let database = database.clone(); + let action_debug = self.action_debug.clone(); + let action_quit = self.action_quit.clone(); + let action_update = self.action_update.clone(); + let action_tab_append = self.action_tab_append.clone(); + let action_tab_close = self.action_tab_close.clone(); + let action_tab_close_all = self.action_tab_close_all.clone(); + let action_tab_page_navigation_base = self.action_tab_page_navigation_base.clone(); + let action_tab_page_navigation_history_back = + self.action_tab_page_navigation_history_back.clone(); + let action_tab_page_navigation_history_forward = + self.action_tab_page_navigation_history_forward.clone(); + let action_tab_page_navigation_reload = self.action_tab_page_navigation_reload.clone(); + let action_tab_pin = self.action_tab_pin.clone(); move |application| { // Restore previous session // @TODO @@ -84,32 +135,33 @@ impl App { let browser = Arc::new(Browser::new( &application, /*db.clone(),*/ - action_debug.simple(), - action_quit.simple(), - action_update.simple(), - action_tab_append.simple(), - action_tab_close.simple(), - action_tab_close_all.simple(), - action_tab_page_navigation_base.simple(), - action_tab_page_navigation_history_back.simple(), - action_tab_page_navigation_history_forward.simple(), - action_tab_page_navigation_reload.simple(), - action_tab_pin.simple(), + action_debug.clone(), + action_quit.clone(), + action_update.clone(), + action_tab_append.clone(), + action_tab_close.clone(), + action_tab_close_all.clone(), + action_tab_page_navigation_base.clone(), + action_tab_page_navigation_history_back.clone(), + action_tab_page_navigation_history_forward.clone(), + action_tab_page_navigation_reload.clone(), + action_tab_pin.clone(), )); + // Activate events + browser.activate(); + // Show main widget browser.widget().present(); // Make initial update - action_update.simple().activate(None); + action_update.activate(None); } }); - // Return activated struct - Self { app, database } + &self } - // Actions pub fn run(&self) -> ExitCode { self.app.run() } diff --git a/src/app/browser.rs b/src/app/browser.rs index fd5df39a..d3939e5c 100644 --- a/src/app/browser.rs +++ b/src/app/browser.rs @@ -15,12 +15,24 @@ const DEFAULT_HEIGHT: i32 = 480; const DEFAULT_WIDTH: i32 = 640; pub struct Browser { + // Actions + action_debug: Arc, + action_quit: Arc, + action_update: Arc, + action_tab_append: Arc, + action_tab_close: Arc, + action_tab_close_all: Arc, + action_tab_page_navigation_base: Arc, + action_tab_page_navigation_history_back: Arc, + action_tab_page_navigation_history_forward: Arc, + action_tab_page_navigation_reload: Arc, + action_tab_pin: Arc, // Extras // db: db::Browser, widget: ApplicationWindow, // Components - // header: Arc
, - // main: Arc
, + header: Arc
, + main: Arc
, } impl Browser { @@ -77,106 +89,128 @@ impl Browser { .default_width(DEFAULT_WIDTH) .build(); - widget.add_action(action_debug.as_ref()); - widget.add_action(action_quit.as_ref()); - widget.add_action(action_update.as_ref()); + // Return new Browser + Self { + // Actions + action_debug, + action_quit, + action_update, + action_tab_append, + action_tab_close, + action_tab_close_all, + action_tab_page_navigation_base, + action_tab_page_navigation_history_back, + action_tab_page_navigation_history_forward, + action_tab_page_navigation_reload, + action_tab_pin, + // db, + widget, + // Components + header, + main, + } + } - widget.add_action(action_tab_append.as_ref()); - widget.add_action(action_tab_close.as_ref()); - widget.add_action(action_tab_close_all.as_ref()); - widget.add_action(action_tab_page_navigation_base.as_ref()); - widget.add_action(action_tab_page_navigation_history_back.as_ref()); - widget.add_action(action_tab_page_navigation_history_forward.as_ref()); - widget.add_action(action_tab_page_navigation_reload.as_ref()); - widget.add_action(action_tab_pin.as_ref()); + // Actions + pub fn activate(&self) { + // Assign actions + self.widget.add_action(self.action_debug.as_ref()); + self.widget.add_action(self.action_quit.as_ref()); + self.widget.add_action(self.action_update.as_ref()); + self.widget.add_action(self.action_tab_append.as_ref()); + self.widget.add_action(self.action_tab_close.as_ref()); + self.widget.add_action(self.action_tab_close_all.as_ref()); + self.widget + .add_action(self.action_tab_page_navigation_base.as_ref()); + self.widget + .add_action(self.action_tab_page_navigation_history_back.as_ref()); + self.widget + .add_action(self.action_tab_page_navigation_history_forward.as_ref()); + self.widget + .add_action(self.action_tab_page_navigation_reload.as_ref()); + self.widget.add_action(self.action_tab_pin.as_ref()); - // Init events - action_debug.connect_activate({ - let widget = widget.clone(); + // Events + self.action_debug.connect_activate({ + let widget = self.widget.clone(); move |_, _| { widget.emit_enable_debugging(true); } }); - action_quit.connect_activate({ - let widget = widget.clone(); + self.action_quit.connect_activate({ + let widget = self.widget.clone(); move |_, _| { widget.close(); } }); - action_update.connect_activate({ - let header = header.clone(); - let main = main.clone(); + self.action_update.connect_activate({ + let header = self.header.clone(); + let main = self.main.clone(); move |_, _| { main.update(); header.update(main.tab_page_title(), main.tab_page_description()); } }); - action_tab_append.connect_activate({ - let main = main.clone(); + self.action_tab_append.connect_activate({ + let main = self.main.clone(); move |_, _| { main.tab_append(None); } }); - action_tab_close.connect_activate({ - let main = main.clone(); + self.action_tab_close.connect_activate({ + let main = self.main.clone(); move |_, _| { main.tab_close(); } }); - action_tab_close_all.connect_activate({ - let main = main.clone(); + self.action_tab_close_all.connect_activate({ + let main = self.main.clone(); move |_, _| { main.tab_close_all(); } }); - action_tab_page_navigation_base.connect_activate({ - let main = main.clone(); + self.action_tab_page_navigation_base.connect_activate({ + let main = self.main.clone(); move |_, _| { main.tab_page_navigation_base(); } }); - action_tab_page_navigation_history_back.connect_activate({ - let main = main.clone(); - move |_, _| { - main.tab_page_navigation_history_back(); - } - }); + self.action_tab_page_navigation_history_back + .connect_activate({ + let main = self.main.clone(); + move |_, _| { + main.tab_page_navigation_history_back(); + } + }); - action_tab_page_navigation_history_forward.connect_activate({ - let main = main.clone(); - move |_, _| { - main.tab_page_navigation_history_forward(); - } - }); + self.action_tab_page_navigation_history_forward + .connect_activate({ + let main = self.main.clone(); + move |_, _| { + main.tab_page_navigation_history_forward(); + } + }); - action_tab_page_navigation_reload.connect_activate({ - let main = main.clone(); + self.action_tab_page_navigation_reload.connect_activate({ + let main = self.main.clone(); move |_, _| { main.tab_page_navigation_reload(); } }); - action_tab_pin.connect_activate({ - let main = main.clone(); + self.action_tab_pin.connect_activate({ + let main = self.main.clone(); move |_, _| { main.tab_pin(); } }); - - // Return activated browser struct - Self { - // db, - widget, - // header, - // main, - } } // Getters diff --git a/src/main.rs b/src/main.rs index 1b42af0c..6c67d0cf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -27,5 +27,5 @@ fn main() -> ExitCode { }; // Start application - App::new(profile_database_connection).run() + App::new(profile_database_connection).activate().run() }