From 1ae5e275ca273ce0870096663762576eae7d0a6c Mon Sep 17 00:00:00 2001 From: yggverse Date: Tue, 24 Sep 2024 19:10:40 +0300 Subject: [PATCH] create dynamically allocated reference index --- src/browser/main/tab/mod.rs | 43 ++++++++++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/src/browser/main/tab/mod.rs b/src/browser/main/tab/mod.rs index 471b6e3f..47bc094a 100644 --- a/src/browser/main/tab/mod.rs +++ b/src/browser/main/tab/mod.rs @@ -1,22 +1,28 @@ mod label; mod page; -use std::sync::Arc; - -use gtk::prelude::WidgetExt; -use gtk::{GestureClick, Notebook}; use label::Label; use page::Page; +use gtk::{prelude::WidgetExt, GestureClick, Notebook}; +use std::{cell::RefCell, collections::HashMap, sync::Arc}; + pub struct Tab { widget: Notebook, + // Dynamically allocated reference index + labels: RefCell>>, + pages: RefCell>>, } impl Tab { // Construct pub fn new() -> Tab { Self { + // Init widget widget: Notebook::builder().scrollable(true).build(), + // Init empty hashmap as no tabs yet + labels: RefCell::new(HashMap::new()), + pages: RefCell::new(HashMap::new()), } } @@ -24,7 +30,7 @@ impl Tab { pub fn append(&self, is_current_page: bool) -> u32 { // Init new tab components let label = Arc::new(Label::new(false)); - let page = Page::new(); + let page = Arc::new(Page::new()); // Init additional label actions let controller = GestureClick::new(); @@ -41,23 +47,37 @@ impl Tab { label.widget().add_controller(controller); - // Append new page + // Append new Notebook page let page_number = self.widget.append_page(page.widget(), Some(label.widget())); + // Additional setup for Notebook tab created self.widget.set_tab_reorderable(page.widget(), true); if is_current_page { self.widget.set_current_page(Some(page_number)); } + // Register dynamically created tab components in the HashMap index + // @TODO static key on tab reorder + // @TODO cleanup on tab remove + self.labels + .borrow_mut() + .insert(page_number.try_into().unwrap(), label); + + self.pages + .borrow_mut() + .insert(page_number.try_into().unwrap(), page); + // Result page_number } + // Close active tab pub fn close(&self) { self.widget.remove_page(self.widget.current_page()); } + // Close all tabs pub fn close_all(&self) { // @TODO skip pinned or make confirmation alert (GTK>=4.10) while let Some(page_number) = self.widget.current_page() { @@ -65,8 +85,15 @@ impl Tab { } } - pub fn pin(&self) -> bool { - todo!() + // Toggle pin status for active tab + pub fn pin(&self) { + if let Some(page_number) = self.widget.current_page() { + let label = self.labels.borrow(); + label + .get(&page_number) + .unwrap() + .pin(!label.get(&page_number).unwrap().is_pinned()); // toggle + } } // Getters