cleanup hash map on tab page remove

This commit is contained in:
yggverse 2024-09-24 21:29:05 +03:00
parent f407117470
commit 1b5af238b8
2 changed files with 29 additions and 16 deletions

View File

@ -1,12 +1,12 @@
mod tab; mod tab;
use gtk::{Box, Orientation};
use tab::Tab; use tab::Tab;
use gtk::prelude::BoxExt; use gtk::{prelude::BoxExt, Box, Orientation};
use std::sync::Arc;
pub struct Main { pub struct Main {
tab: Tab, tab: Arc<Tab>,
widget: Box, widget: Box,
} }

View File

@ -9,10 +9,11 @@ use gtk::{
prelude::WidgetExt, prelude::WidgetExt,
GestureClick, Notebook, Widget, GestureClick, Notebook, Widget,
}; };
use std::{cell::RefCell, collections::HashMap, sync::Arc}; use std::{cell::RefCell, collections::HashMap, sync::Arc};
pub struct Tab { pub struct Tab {
widget: Notebook, widget: Arc<Notebook>,
// Dynamically allocated reference index // Dynamically allocated reference index
labels: RefCell<HashMap<GString, Arc<Label>>>, labels: RefCell<HashMap<GString, Arc<Label>>>,
pages: RefCell<HashMap<GString, Arc<Page>>>, pages: RefCell<HashMap<GString, Arc<Page>>>,
@ -20,19 +21,32 @@ pub struct Tab {
impl Tab { impl Tab {
// Construct // Construct
pub fn new() -> Tab { pub fn new() -> Arc<Tab> {
// Init widget // Init GTK component
let widget = Notebook::builder().scrollable(true).build(); let notebook = Arc::new(Notebook::builder().scrollable(true).build());
// Connect actions // Init new Tab struct
widget.connect_page_reordered(|this: &Notebook, widget: &Widget, page_number: u32| todo!()); let tab = Arc::new(Self {
// Reference wanted for async events, create new smart pointer
Self { widget: notebook.clone(),
widget, // Init empty HashMap index as no tabs appended yet
// Init empty hashmap as no tabs yet
labels: RefCell::new(HashMap::new()), labels: RefCell::new(HashMap::new()),
pages: RefCell::new(HashMap::new()), pages: RefCell::new(HashMap::new()),
} });
// Connect events
notebook.connect_page_removed({
// Make new local ref
let tab = tab.clone();
// Begin async action
move |_, widget: &Widget, _| {
// Cleanup HashMap index
tab.labels.borrow_mut().remove(&widget.widget_name());
tab.pages.borrow_mut().remove(&widget.widget_name());
}
});
tab // return Arc pointer to the new Tab constructed
} }
// Actions // Actions
@ -45,7 +59,6 @@ impl Tab {
let page = Arc::new(Page::new(id.clone())); let page = Arc::new(Page::new(id.clone()));
// Register dynamically created tab components in the HashMap index // Register dynamically created tab components in the HashMap index
// @TODO cleanup on tab remove
self.labels.borrow_mut().insert(id.clone(), label.clone()); self.labels.borrow_mut().insert(id.clone(), label.clone());
self.pages.borrow_mut().insert(id.clone(), page.clone()); self.pages.borrow_mut().insert(id.clone(), page.clone());
@ -107,6 +120,6 @@ impl Tab {
// Getters // Getters
pub fn widget(&self) -> &Notebook { pub fn widget(&self) -> &Notebook {
&self.widget self.widget.as_ref()
} }
} }