2024-10-06 17:41:17 +03:00
|
|
|
use gtk::{glib::GString, prelude::WidgetExt, Box, Notebook};
|
2024-10-06 16:28:46 +03:00
|
|
|
|
|
|
|
pub struct Widget {
|
|
|
|
gobject: Notebook,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Widget {
|
|
|
|
// Construct
|
|
|
|
pub fn new() -> Self {
|
2024-10-06 20:47:08 +03:00
|
|
|
Self {
|
|
|
|
gobject: Notebook::builder().scrollable(true).build(),
|
|
|
|
}
|
2024-10-06 16:28:46 +03:00
|
|
|
}
|
|
|
|
|
2024-10-06 17:12:08 +03:00
|
|
|
// Actions
|
2024-10-08 00:59:42 +03:00
|
|
|
pub fn append(&self, label: &Box, page: &Box, is_current_page: bool) -> u32 {
|
2024-10-06 17:41:17 +03:00
|
|
|
// Append new Notebook page
|
|
|
|
let page_number = self.gobject.append_page(page, Some(label));
|
|
|
|
|
|
|
|
// Additional setup for Notebook tab created
|
2024-10-08 00:59:42 +03:00
|
|
|
self.gobject.set_tab_reorderable(page, true);
|
2024-10-06 17:41:17 +03:00
|
|
|
|
|
|
|
if is_current_page {
|
|
|
|
self.gobject.set_current_page(Some(page_number));
|
|
|
|
}
|
|
|
|
|
|
|
|
// Result
|
|
|
|
page_number
|
|
|
|
}
|
|
|
|
|
2024-10-06 17:12:08 +03:00
|
|
|
pub fn close(&self) {
|
|
|
|
self.gobject.remove_page(self.gobject().current_page());
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn close_all(&self) {
|
|
|
|
// @TODO skip pinned or make confirmation alert (GTK>=4.10)
|
|
|
|
while let Some(page_number) = self.gobject.current_page() {
|
|
|
|
self.gobject.remove_page(Some(page_number));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-10-06 16:28:46 +03:00
|
|
|
// Getters
|
2024-10-06 17:12:08 +03:00
|
|
|
pub fn current_name(&self) -> Option<GString> {
|
|
|
|
let page_number = self.gobject.current_page()?;
|
|
|
|
let nth_page = self.gobject.nth_page(Some(page_number))?;
|
|
|
|
|
|
|
|
let widget_name = nth_page.widget_name();
|
|
|
|
if !widget_name.is_empty() {
|
|
|
|
Some(widget_name)
|
|
|
|
} else {
|
|
|
|
None
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-10-06 16:28:46 +03:00
|
|
|
pub fn gobject(&self) -> &Notebook {
|
|
|
|
&self.gobject
|
|
|
|
}
|
|
|
|
}
|