reorganize widget modules

This commit is contained in:
yggverse 2024-09-23 18:51:48 +03:00
parent b9b226cc54
commit 4903968309
47 changed files with 352 additions and 786 deletions

View file

@ -1,26 +1,29 @@
mod subject;
mod tray;
mod widget;
use std::sync::Arc;
use gtk::HeaderBar;
use subject::Subject;
use tray::Tray;
pub struct Header {
widget: widget::Header,
widget: HeaderBar,
}
impl Header {
// Construct
pub fn new() -> Arc<Header> {
Arc::new(Self {
widget: widget::Header::new(
tray::Tray::new().widget().gtk(),
subject::Subject::new().widget().gtk(),
),
})
pub fn new() -> Header {
let tray = Tray::new();
let subject = Subject::new();
let widget = HeaderBar::builder().build();
widget.pack_start(tray.widget());
widget.set_title_widget(Some(subject.widget()));
Self { widget }
}
// Getters
pub fn widget(&self) -> &widget::Header {
pub fn widget(&self) -> &HeaderBar {
&self.widget
}
}

View file

@ -1,28 +1,30 @@
mod widget;
use gtk::prelude::WidgetExt;
use gtk::{pango::EllipsizeMode, Label};
pub struct Description {
widget: widget::Description,
widget: Label,
}
impl Description {
// Construct
pub fn new() -> Description {
Self {
widget: widget::Description::new(),
}
let widget = Label::builder()
.css_classes(["subtitle"])
.single_line_mode(true)
.ellipsize(EllipsizeMode::End)
.visible(false)
.build();
Self { widget }
}
// Actions
pub fn set_text(&self, text: &str) {
self.widget.gtk().set_text(text);
}
pub fn update(&self) {
self.widget.update();
self.widget.set_visible(self.widget.text().is_empty());
}
// Getters
pub fn widget(&self) -> &widget::Description {
pub fn widget(&self) -> &Label {
&self.widget
}
}

View file

@ -1,29 +0,0 @@
use gtk::prelude::WidgetExt;
pub struct Description {
gtk: gtk::Label,
}
impl Description {
// Construct
pub fn new() -> Description {
let gtk = gtk::Label::builder()
.css_classes(["subtitle"])
.single_line_mode(true)
.ellipsize(gtk::pango::EllipsizeMode::End)
.visible(false)
.build();
Self { gtk }
}
// Actions
pub fn update(&self) {
self.gtk.set_visible(self.gtk.text().is_empty());
}
// Getters
pub fn gtk(&self) -> &gtk::Label {
&self.gtk
}
}

View file

@ -1,24 +1,34 @@
mod description;
mod title;
mod widget;
use description::Description;
use gtk::prelude::BoxExt;
use gtk::{Align, Box, Orientation};
use title::Title;
pub struct Subject {
widget: widget::Subject,
widget: Box,
}
impl Subject {
// Construct
pub fn new() -> Subject {
Self {
widget: widget::Subject::new(
title::Title::new().widget().gtk(),
description::Description::new().widget().gtk(),
),
}
let title = Title::new();
let description = Description::new();
let widget = Box::builder()
.orientation(Orientation::Vertical)
.valign(Align::Center)
.build();
widget.append(title.widget());
widget.append(description.widget());
Self { widget }
}
// Getters
pub fn widget(&self) -> &widget::Subject {
pub fn widget(&self) -> &Box {
&self.widget
}
}

View file

@ -1,24 +1,36 @@
mod widget;
use gtk::{pango::EllipsizeMode, Label};
const DEFAULT_TEXT: &str = "Yoda"; // @TODO
pub struct Title {
widget: widget::Title,
widget: Label,
}
impl Title {
// Construct
pub fn new() -> Title {
Self {
widget: widget::Title::new(),
}
let widget = gtk::Label::builder()
.css_classes(["title"])
.single_line_mode(true)
.ellipsize(EllipsizeMode::End)
.label(DEFAULT_TEXT)
.build();
Self { widget }
}
// Actions
pub fn update(&self, text: &str) {
self.widget.update(text);
if text.is_empty() {
self.widget.set_text(DEFAULT_TEXT);
} else {
self.widget
.set_text(&format!("{} - {}", text, DEFAULT_TEXT));
}
}
// Getters
pub fn widget(&self) -> &widget::Title {
pub fn widget(&self) -> &Label {
&self.widget
}
}

View file

@ -1,33 +0,0 @@
const DEFAULT_TEXT: &str = "Yoda";
pub struct Title {
gtk: gtk::Label,
}
impl Title {
// Construct
pub fn new() -> Title {
let gtk = gtk::Label::builder()
.css_classes(["title"])
.single_line_mode(true)
.ellipsize(gtk::pango::EllipsizeMode::End)
.label(DEFAULT_TEXT)
.build();
Self { gtk }
}
// Actions
pub fn update(&self, text: &str) {
if text.is_empty() {
self.gtk.set_text(DEFAULT_TEXT);
} else {
self.gtk.set_text(&format!("{} - {}", text, DEFAULT_TEXT));
}
}
// Getters
pub fn gtk(&self) -> &gtk::Label {
&self.gtk
}
}

View file

@ -1,23 +0,0 @@
use gtk::prelude::BoxExt;
pub struct Subject {
gtk: gtk::Box,
}
impl Subject {
pub fn new(title: &gtk::Label, description: &gtk::Label) -> Subject {
let gtk = gtk::Box::builder()
.orientation(gtk::Orientation::Vertical)
.valign(gtk::Align::Center)
.build();
gtk.append(title);
gtk.append(description);
Self { gtk }
}
pub fn gtk(&self) -> &gtk::Box {
&self.gtk
}
}

View file

@ -1,19 +1,36 @@
mod model;
mod widget;
use gtk::{gio, MenuButton};
pub struct Menu {
widget: widget::Menu,
widget: MenuButton,
}
impl Menu {
pub fn new() -> Menu {
Self {
widget: widget::Menu::new(model::Menu::new().model()),
}
// Init model
let model_tab = gio::Menu::new();
model_tab.append(Some("New"), Some("win.tab_append"));
model_tab.append(Some("Pin"), Some("win.tab_pin"));
let model_tab_close = gio::Menu::new();
model_tab_close.append(Some("Current"), Some("win.tab_close"));
model_tab_close.append(Some("All"), Some("win.tab_close_all"));
model_tab.append_submenu(Some("Close"), &model_tab_close);
let model = gio::Menu::new();
model.append_submenu(Some("Tab"), &model_tab);
model.append(Some("Debug"), Some("win.debug"));
model.append(Some("Quit"), Some("win.quit"));
// Init widget
let widget = MenuButton::builder().tooltip_text("Menu").build();
widget.set_menu_model(Some(&model));
// Result
Self { widget }
}
// Getters
pub fn widget(&self) -> &widget::Menu {
pub fn widget(&self) -> &MenuButton {
&self.widget
}
}

View file

@ -1,31 +0,0 @@
use gtk::gio;
pub struct Menu {
model: gio::Menu,
}
impl Menu {
// Construct
pub fn new() -> Menu {
let model_tab = gio::Menu::new();
model_tab.append(Some("New"), Some("win.tab_append"));
model_tab.append(Some("Pin"), Some("win.tab_pin"));
let model_tab_close = gio::Menu::new();
model_tab_close.append(Some("Current"), Some("win.tab_close"));
model_tab_close.append(Some("All"), Some("win.tab_close_all"));
model_tab.append_submenu(Some("Close"), &model_tab_close);
let model = gio::Menu::new();
model.append_submenu(Some("Tab"), &model_tab);
model.append(Some("Debug"), Some("win.debug"));
model.append(Some("Quit"), Some("win.quit"));
Self { model }
}
// Getters
pub fn model(&self) -> &gio::Menu {
&self.model
}
}

View file

@ -1,21 +0,0 @@
use gtk::gio;
pub struct Menu {
gtk: gtk::MenuButton,
}
impl Menu {
// Construct
pub fn new(model: &gio::Menu) -> Menu {
let gtk = gtk::MenuButton::builder().tooltip_text("Menu").build();
gtk.set_menu_model(Some(model));
Self { gtk }
}
// Getters
pub fn gtk(&self) -> &gtk::MenuButton {
&self.gtk
}
}

View file

@ -1,23 +1,33 @@
mod menu;
mod tab;
mod widget;
use gtk::prelude::BoxExt;
use gtk::{Box, Orientation};
use menu::Menu;
use tab::Tab;
pub struct Tray {
widget: widget::Tray,
widget: Box,
}
impl Tray {
pub fn new() -> Tray {
Self {
widget: widget::Tray::new(
menu::Menu::new().widget().gtk(),
tab::Tab::new().widget().gtk(),
),
}
let menu = Menu::new();
let tab = Tab::new();
let widget = Box::builder()
.orientation(Orientation::Horizontal)
.spacing(8)
.build();
widget.append(menu.widget());
widget.append(tab.widget());
Self { widget }
}
// Getters
pub fn widget(&self) -> &widget::Tray {
pub fn widget(&self) -> &Box {
&self.widget
}
}

View file

@ -1,19 +1,23 @@
mod widget;
use gtk::Button;
pub struct Tab {
pub widget: widget::Tab,
pub widget: Button,
}
impl Tab {
// Construct
pub fn new() -> Tab {
Self {
widget: widget::Tab::new(),
widget: Button::builder()
.action_name("win.tab_append")
.icon_name("tab-new-symbolic")
.tooltip_text("New tab")
.build(),
}
}
// Getters
pub fn widget(&self) -> &widget::Tab {
pub fn widget(&self) -> &Button {
&self.widget
}
}

View file

@ -1,21 +0,0 @@
pub struct Tab {
gtk: gtk::Button,
}
impl Tab {
// Construct
pub fn new() -> Tab {
Self {
gtk: gtk::Button::builder()
.action_name("win.tab_append")
.icon_name("tab-new-symbolic")
.tooltip_text("New tab")
.build(),
}
}
// Getters
pub fn gtk(&self) -> &gtk::Button {
&self.gtk
}
}

View file

@ -1,25 +0,0 @@
use gtk::prelude::BoxExt;
pub struct Tray {
gtk: gtk::Box,
}
impl Tray {
// Construct
pub fn new(menu: &gtk::MenuButton, tab: &gtk::Button) -> Tray {
let gtk = gtk::Box::builder()
.orientation(gtk::Orientation::Horizontal)
.spacing(8)
.build();
gtk.append(menu);
gtk.append(tab);
Self { gtk }
}
// Getters
pub fn gtk(&self) -> &gtk::Box {
&self.gtk
}
}

View file

@ -1,18 +0,0 @@
pub struct Header {
gtk: gtk::HeaderBar,
}
impl Header {
pub fn new(tray: &gtk::Box, subject: &gtk::Box) -> Header {
let gtk = gtk::HeaderBar::builder().build();
gtk.pack_start(tray);
gtk.set_title_widget(Some(subject));
Self { gtk }
}
pub fn gtk(&self) -> &gtk::HeaderBar {
&self.gtk
}
}