From 0c8684491b7a3a5f73ca63629c170b19e38d3b52 Mon Sep 17 00:00:00 2001 From: yggverse Date: Thu, 19 Sep 2024 11:29:03 +0300 Subject: [PATCH] init header components --- src/app/browser/header.rs | 18 ++++++- src/app/browser/header/subject.rs | 32 ++++++++++++ src/app/browser/header/subject/description.rs | 49 ++++++++++++++++++ src/app/browser/header/subject/title.rs | 50 +++++++++++++++++++ src/app/browser/header/tray.rs | 30 +++++++++++ src/app/browser/header/tray/menu.rs | 14 ++++++ src/app/browser/header/tray/tab.rs | 18 +++++++ 7 files changed, 210 insertions(+), 1 deletion(-) create mode 100644 src/app/browser/header/subject.rs create mode 100644 src/app/browser/header/subject/description.rs create mode 100644 src/app/browser/header/subject/title.rs create mode 100644 src/app/browser/header/tray.rs create mode 100644 src/app/browser/header/tray/menu.rs create mode 100644 src/app/browser/header/tray/tab.rs diff --git a/src/app/browser/header.rs b/src/app/browser/header.rs index 6be63892..f51bf2c3 100644 --- a/src/app/browser/header.rs +++ b/src/app/browser/header.rs @@ -1,6 +1,22 @@ +#[path = "header/subject.rs"] mod subject; +#[path = "header/tray.rs"] mod tray; + use gtk::HeaderBar; pub fn new() -> HeaderBar { - return HeaderBar::builder().build(); + let header = HeaderBar::builder().build(); + + // Compose childs + header.pack_start( + &tray::new() + ); + + header.set_title_widget( + Some( + &subject::new() + ) + ); + + return header; } \ No newline at end of file diff --git a/src/app/browser/header/subject.rs b/src/app/browser/header/subject.rs new file mode 100644 index 00000000..40a7aaab --- /dev/null +++ b/src/app/browser/header/subject.rs @@ -0,0 +1,32 @@ +#[path = "subject/title.rs"] mod title; +#[path = "subject/description.rs"] mod description; + +use gtk::Box; +use gtk::prelude::BoxExt; + +pub fn new() -> Box +{ + let subject = Box::builder() + + // Tuneup + .orientation( + gtk::Orientation::Vertical + ) + + .valign( + gtk::Align::Center + ) + + .build(); + + // Compose childs + subject.append( + &title::new() + ); + + subject.append( + &description::new() + ); + + return subject; +} \ No newline at end of file diff --git a/src/app/browser/header/subject/description.rs b/src/app/browser/header/subject/description.rs new file mode 100644 index 00000000..731ac903 --- /dev/null +++ b/src/app/browser/header/subject/description.rs @@ -0,0 +1,49 @@ +use gtk::Label; +use gtk::prelude::WidgetExt; + +pub fn new() -> Label +{ + let description = Label::builder() + + .css_classes( + [ + "subtitle" + ] + ) + + .single_line_mode( + true + ) + + .ellipsize( + gtk::pango::EllipsizeMode::End + ) + + .build(); + + update( + &description, + "" // @TODO + ); + + return description; +} + +pub fn update( + description: &Label, + text: &str +) { + description.set_text( + text + ); + + if text.is_empty() + { + description.hide(); + } + + else + { + description.show(); + } +} \ No newline at end of file diff --git a/src/app/browser/header/subject/title.rs b/src/app/browser/header/subject/title.rs new file mode 100644 index 00000000..29e3c626 --- /dev/null +++ b/src/app/browser/header/subject/title.rs @@ -0,0 +1,50 @@ +use gtk::Label; + +pub fn new() -> Label +{ + let title = Label::builder() + + .css_classes( + [ + "title" + ] + ) + + .single_line_mode( + true + ) + + .ellipsize( + gtk::pango::EllipsizeMode::End + ) + + .build(); + + update( + &title, + "Welcome" + ); + + return title; +} + +pub fn update( + title: &Label, + text: &str +) { + let default_text = "Yoda"; // @TODO + + if text.is_empty() + { + title.set_text( + default_text + ); + } + + else + { + title.set_text( + &format!("{} - {}", text, default_text) + ); + } +} \ No newline at end of file diff --git a/src/app/browser/header/tray.rs b/src/app/browser/header/tray.rs new file mode 100644 index 00000000..f1942dd7 --- /dev/null +++ b/src/app/browser/header/tray.rs @@ -0,0 +1,30 @@ +#[path = "tray/menu.rs"] mod menu; +#[path = "tray/tab.rs"] mod tab; + +use gtk::Box; +use gtk::prelude::BoxExt; + +pub fn new() -> Box +{ + let tray = Box::builder() + + // Tuneup + .orientation( + gtk::Orientation::Horizontal + ) + + .spacing(8) + + .build(); + + // Compose childs + tray.append( + &menu::new() + ); + + tray.append( + &tab::new() + ); + + return tray; +} \ No newline at end of file diff --git a/src/app/browser/header/tray/menu.rs b/src/app/browser/header/tray/menu.rs new file mode 100644 index 00000000..29a763de --- /dev/null +++ b/src/app/browser/header/tray/menu.rs @@ -0,0 +1,14 @@ +use gtk::MenuButton; + +pub fn new() -> MenuButton +{ + let menu = MenuButton::builder() + + .tooltip_text( + "Menu" + ) + + .build(); + + return menu; +} \ No newline at end of file diff --git a/src/app/browser/header/tray/tab.rs b/src/app/browser/header/tray/tab.rs new file mode 100644 index 00000000..5e06d31e --- /dev/null +++ b/src/app/browser/header/tray/tab.rs @@ -0,0 +1,18 @@ +use gtk::Button; + +pub fn new() -> Button +{ + let tab = Button::builder() + + .icon_name( + "tab-new-symbolic" + ) + + .tooltip_text( + "New tab" + ) + + .build(); + + return tab; +} \ No newline at end of file