feat: Add HeaderBar widget
This commit is contained in:
parent
daf4cb1eb8
commit
b848931920
3 changed files with 120 additions and 5 deletions
15
Cargo.toml
15
Cargo.toml
|
|
@ -12,28 +12,33 @@ debug = ["iced/debug"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
freedesktop-icons = "0.2.1"
|
freedesktop-icons = "0.2.1"
|
||||||
|
apply = "0.3.0"
|
||||||
|
|
||||||
[dependencies.iced]
|
[dependencies.iced]
|
||||||
git = "https://github.com/pop-os/iced.git"
|
git = "https://github.com/pop-os/iced.git"
|
||||||
branch = "cosmic-design-system"
|
branch = "cosmic-design-system"
|
||||||
#path = "../iced"
|
# path = "../iced"
|
||||||
features = ["cosmic-theme", "svg"]
|
features = ["cosmic-theme", "svg"]
|
||||||
|
|
||||||
[dependencies.iced_native]
|
[dependencies.iced_native]
|
||||||
git = "https://github.com/pop-os/iced.git"
|
git = "https://github.com/pop-os/iced.git"
|
||||||
branch = "cosmic-design-system"
|
branch = "cosmic-design-system"
|
||||||
#path = "../iced/native"
|
# path = "../iced/native"
|
||||||
features = ["cosmic-theme"]
|
features = ["cosmic-theme"]
|
||||||
|
|
||||||
[dependencies.iced_lazy]
|
[dependencies.iced_lazy]
|
||||||
git = "https://github.com/pop-os/iced.git"
|
git = "https://github.com/pop-os/iced.git"
|
||||||
branch = "cosmic-design-system"
|
branch = "cosmic-design-system"
|
||||||
#path = "../iced/lazy"
|
# path = "../iced/lazy"
|
||||||
|
|
||||||
|
[dependencies.iced_winit]
|
||||||
|
git = "https://github.com/pop-os/iced.git"
|
||||||
|
branch = "cosmic-design-system"
|
||||||
|
# path = "../iced/winit"
|
||||||
|
|
||||||
[workspace]
|
[workspace]
|
||||||
members = [
|
members = [
|
||||||
"examples/cosmic",
|
"examples/*",
|
||||||
"examples/text",
|
|
||||||
"gtk4",
|
"gtk4",
|
||||||
"gtk4/widgets"
|
"gtk4/widgets"
|
||||||
]
|
]
|
||||||
|
|
|
||||||
10
src/lib.rs
10
src/lib.rs
|
|
@ -1,9 +1,19 @@
|
||||||
pub use iced;
|
pub use iced;
|
||||||
pub use iced_lazy;
|
pub use iced_lazy;
|
||||||
|
pub use iced_winit;
|
||||||
|
|
||||||
pub mod font;
|
pub mod font;
|
||||||
pub mod widget;
|
pub mod widget;
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, Debug)]
|
||||||
|
pub enum WindowMsg {
|
||||||
|
Close,
|
||||||
|
Drag,
|
||||||
|
Minimize,
|
||||||
|
Maximize,
|
||||||
|
ToggleSidebar,
|
||||||
|
}
|
||||||
|
|
||||||
pub fn settings<Flags: Default>() -> iced::Settings<Flags> {
|
pub fn settings<Flags: Default>() -> iced::Settings<Flags> {
|
||||||
let mut settings = iced::Settings::default();
|
let mut settings = iced::Settings::default();
|
||||||
settings.default_font = match font::FONT {
|
settings.default_font = match font::FONT {
|
||||||
|
|
|
||||||
100
src/widget/headerbar.rs
Normal file
100
src/widget/headerbar.rs
Normal file
|
|
@ -0,0 +1,100 @@
|
||||||
|
use apply::Apply;
|
||||||
|
use iced::{self, alignment::Vertical, Element, Length, theme, widget};
|
||||||
|
use crate::WindowMsg;
|
||||||
|
|
||||||
|
#[derive(Default)]
|
||||||
|
pub struct HeaderBar {
|
||||||
|
pub title: String,
|
||||||
|
pub nav_title: String,
|
||||||
|
pub sidebar_active: bool,
|
||||||
|
pub show_minimize: bool,
|
||||||
|
pub show_maximize: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl HeaderBar {
|
||||||
|
pub fn render<T>(&self) -> Element<'_, T>
|
||||||
|
where T: Clone + From<WindowMsg> + 'static
|
||||||
|
{
|
||||||
|
let navbutton = {
|
||||||
|
let text = widget::text(&self.nav_title)
|
||||||
|
.vertical_alignment(Vertical::Center)
|
||||||
|
.width(Length::Shrink)
|
||||||
|
.height(Length::Fill);
|
||||||
|
|
||||||
|
let icon = super::icon(
|
||||||
|
if self.sidebar_active {
|
||||||
|
"go-previous-symbolic"
|
||||||
|
} else {
|
||||||
|
"go-next-symbolic"
|
||||||
|
},
|
||||||
|
24,
|
||||||
|
)
|
||||||
|
.width(Length::Units(24))
|
||||||
|
.height(Length::Fill);
|
||||||
|
|
||||||
|
widget::row!(text, icon)
|
||||||
|
.padding(4)
|
||||||
|
.spacing(4)
|
||||||
|
.apply(widget::button)
|
||||||
|
.on_press(T::from(WindowMsg::ToggleSidebar))
|
||||||
|
.apply(widget::container)
|
||||||
|
.center_y()
|
||||||
|
.height(Length::Fill)
|
||||||
|
.into()
|
||||||
|
};
|
||||||
|
|
||||||
|
let content = widget::container(widget::text(&self.title))
|
||||||
|
.center_x()
|
||||||
|
.center_y()
|
||||||
|
.width(Length::Fill)
|
||||||
|
.height(Length::Fill)
|
||||||
|
.into();
|
||||||
|
|
||||||
|
let window_controls = {
|
||||||
|
let mut widgets: Vec<Element<'_, T>> = Vec::with_capacity(3);
|
||||||
|
|
||||||
|
if self.show_minimize {
|
||||||
|
widgets.push(
|
||||||
|
super::icon("window-minimize-symbolic", 16)
|
||||||
|
.apply(widget::button)
|
||||||
|
.on_press(T::from(WindowMsg::Minimize))
|
||||||
|
.style(theme::Button::Primary)
|
||||||
|
.into(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if self.show_maximize {
|
||||||
|
widgets.push(
|
||||||
|
super::icon("window-maximize-symbolic", 16)
|
||||||
|
.apply(widget::button)
|
||||||
|
.on_press(T::from(WindowMsg::Maximize))
|
||||||
|
.style(crate::iced::theme::Button::Primary)
|
||||||
|
.into(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
widgets.push(
|
||||||
|
super::icon("window-close-symbolic", 16)
|
||||||
|
.apply(widget::button)
|
||||||
|
.on_press(T::from(WindowMsg::Close))
|
||||||
|
.style(crate::iced::theme::Button::Primary)
|
||||||
|
.into(),
|
||||||
|
);
|
||||||
|
|
||||||
|
widget::row(widgets)
|
||||||
|
.spacing(8)
|
||||||
|
.apply(widget::container)
|
||||||
|
.height(Length::Fill)
|
||||||
|
.center_y()
|
||||||
|
.into()
|
||||||
|
};
|
||||||
|
|
||||||
|
widget::row(vec![navbutton, content, window_controls])
|
||||||
|
.height(Length::Units(48))
|
||||||
|
.padding(4)
|
||||||
|
.apply(widget::event_container)
|
||||||
|
.center_y()
|
||||||
|
.on_press(T::from(WindowMsg::Drag))
|
||||||
|
.into()
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue