From 06cfd72c620e1017038a3649eff0a484a5d16d36 Mon Sep 17 00:00:00 2001 From: yggverse Date: Fri, 11 Oct 2024 05:01:42 +0300 Subject: [PATCH] implement tabs id features --- src/app/browser/window/tab.rs | 43 +++++++++++++---------- src/app/browser/window/tab/item.rs | 2 +- src/app/browser/window/tab/item/widget.rs | 3 ++ src/app/browser/window/tab/widget.rs | 13 ++----- 4 files changed, 31 insertions(+), 30 deletions(-) diff --git a/src/app/browser/window/tab.rs b/src/app/browser/window/tab.rs index 57203148..ac6052d9 100644 --- a/src/app/browser/window/tab.rs +++ b/src/app/browser/window/tab.rs @@ -23,7 +23,7 @@ pub struct Tab { action_tab_page_navigation_reload: Arc, action_update: Arc, // Dynamically allocated reference index - index: RefCell>>, + index: Arc>>>, // GTK widget: Arc, } @@ -39,24 +39,29 @@ impl Tab { action_update: Arc, ) -> Arc { // Init empty HashMap index as no tabs appended yet - let index = RefCell::new(HashMap::new()); + let index = Arc::new(RefCell::new(HashMap::new())); // Init widget let widget = Arc::new(Widget::new()); // Init events - widget.gobject().connect_close_page(move |_, _| { - /* @TODO - // Cleanup HashMap index - let id = tab_page.widget_name(); - - // Check for required value as raw access to gobject @TODO - if id.is_empty() { - panic!("Undefined tab index!") - } + widget.gobject().connect_close_page({ + let index = index.clone(); + move |_, item| { + // Get index ID by keyword saved + match item.keyword() { + Some(id) => { + if id.is_empty() { + panic!("Tab index can not be empty!") + } + // Cleanup HashMap index + index.borrow_mut().remove(&id); + } + None => panic!("Undefined tab index!"), + } - tab.index.borrow_mut().remove(&id); */ - Propagation::Proceed + Propagation::Proceed + } }); // Return activated struct @@ -108,7 +113,7 @@ impl Tab { // Toggle pin status for active tab pub fn pin(&self) { - if let Some(id) = self.widget.current_name() { + if let Some(id) = self.widget.current_page_keyword() { if let Some(item) = self.index.borrow().get(&id) { item.pin(); // toggle } @@ -116,7 +121,7 @@ impl Tab { } pub fn page_navigation_base(&self) { - if let Some(id) = self.widget.current_name() { + if let Some(id) = self.widget.current_page_keyword() { if let Some(item) = self.index.borrow().get(&id) { item.page_navigation_base(); } @@ -124,7 +129,7 @@ impl Tab { } pub fn page_navigation_history_back(&self) { - if let Some(id) = self.widget.current_name() { + if let Some(id) = self.widget.current_page_keyword() { if let Some(item) = self.index.borrow().get(&id) { item.page_navigation_history_back(); } @@ -132,7 +137,7 @@ impl Tab { } pub fn page_navigation_history_forward(&self) { - if let Some(id) = self.widget.current_name() { + if let Some(id) = self.widget.current_page_keyword() { if let Some(item) = self.index.borrow().get(&id) { item.page_navigation_history_forward(); } @@ -140,7 +145,7 @@ impl Tab { } pub fn page_navigation_reload(&self) { - if let Some(id) = self.widget.current_name() { + if let Some(id) = self.widget.current_page_keyword() { if let Some(item) = self.index.borrow().get(&id) { item.page_navigation_reload(); } @@ -148,7 +153,7 @@ impl Tab { } pub fn update(&self) { - if let Some(id) = self.widget.current_name() { + if let Some(id) = self.widget.current_page_keyword() { if let Some(item) = self.index.borrow().get(&id) { item.update(); } diff --git a/src/app/browser/window/tab/item.rs b/src/app/browser/window/tab/item.rs index 2e0f57df..26ba59d4 100644 --- a/src/app/browser/window/tab/item.rs +++ b/src/app/browser/window/tab/item.rs @@ -49,7 +49,7 @@ impl Item { action_update.clone(), ); - let widget = Widget::new_arc(tab_view, page.gobject(), None, is_selected); // @TODO + let widget = Widget::new_arc(id.as_str(), tab_view, page.gobject(), None, is_selected); // @TODO // Return struct Arc::new(Self { id, page, widget }) diff --git a/src/app/browser/window/tab/item/widget.rs b/src/app/browser/window/tab/item/widget.rs index 7668fd03..e66774e1 100644 --- a/src/app/browser/window/tab/item/widget.rs +++ b/src/app/browser/window/tab/item/widget.rs @@ -11,6 +11,7 @@ pub struct Widget { impl Widget { // Construct pub fn new_arc( + keyword: &str, // ID tab_view: &TabView, page: &Box, title: Option<&str>, @@ -18,6 +19,8 @@ impl Widget { ) -> Arc { let gobject = tab_view.append(page); + gobject.set_keyword(keyword); + gobject.set_title(match title { Some(value) => value, None => DEFAULT_TITLE, diff --git a/src/app/browser/window/tab/widget.rs b/src/app/browser/window/tab/widget.rs index 1cbdc0c1..1fed0cbe 100644 --- a/src/app/browser/window/tab/widget.rs +++ b/src/app/browser/window/tab/widget.rs @@ -29,17 +29,10 @@ impl Widget { } // Getters - pub fn current_name(&self) -> Option { + pub fn current_page_keyword(&self) -> Option { let page = self.gobject.selected_page()?; - - /* @TODO - let widget_name = page.widget_name(); - if !widget_name.is_empty() { - Some(widget_name) - } else { - None - } */ - None + let id = page.keyword()?; + Some(id) } pub fn gobject(&self) -> &TabView {