feat: additional styling

This commit is contained in:
Gabriele Musco 2023-06-04 20:20:44 +02:00
commit 742a40f694
No known key found for this signature in database
GPG key ID: 1068D795C80E51DE
6 changed files with 107 additions and 32 deletions

View file

@ -10,7 +10,7 @@ iced = { version = "0.9.0", features = [
"smol" "smol"
] } ] }
iced_aw = { version = "0.5.2", default-features = false, features = [ iced_aw = { version = "0.5.2", default-features = false, features = [
"tab_bar", "tabs" "tab_bar", "tabs", "quad"
] } ] }
serde = { version = "1.0.163", features = [ serde = { version = "1.0.163", features = [
"derive" "derive"

View file

@ -1,18 +1,25 @@
use std::{borrow::BorrowMut, time::{Duration, Instant}}; use super::{
styles::bordered_container::{BorderedContainer, RoundedBorderedContainer},
widgets::widgets::hspacer,
};
use crate::{ use crate::{
config::{get_config, save_config, Config}, config::{get_config, save_config, Config},
constants::APP_NAME, constants::APP_NAME,
profile::{load_profile, Profile}, profile::{load_profile, Profile},
runner::{Runner, RunnerStatus}, runner::{Runner, RunnerStatus},
ui::widgets::widgets::vseparator,
}; };
use iced::{ use iced::{
executor, executor,
widget::{button, checkbox, column, pick_list, row, scrollable, text, text_input}, theme::{Container, Button},
Alignment, Application, Command, Element, Length, Padding, Theme, Subscription, time, time,
widget::{button, checkbox, column, container, pick_list, row, scrollable, text, text_input},
Alignment, Application, Command, Element, Length, Padding, Subscription, Theme,
};
use std::{
borrow::BorrowMut,
time::{Duration, Instant},
}; };
use super::widgets::widgets::hspacer;
pub struct MainWin { pub struct MainWin {
profiles: Vec<Profile>, profiles: Vec<Profile>,
@ -95,7 +102,7 @@ impl Application for MainWin {
debug_search_term: "".into(), debug_search_term: "".into(),
monado_runner: None, monado_runner: None,
monado_active: false, monado_active: false,
monado_log: "".into() monado_log: "".into(),
}, },
Command::none(), Command::none(),
) )
@ -133,10 +140,10 @@ impl Application for MainWin {
Some(runner) => match runner.status() { Some(runner) => match runner.status() {
RunnerStatus::Running => true, RunnerStatus::Running => true,
RunnerStatus::Stopped => false, RunnerStatus::Stopped => false,
} },
}; };
self.get_monado_log(); self.get_monado_log();
}, }
_ => println!("unhandled"), _ => println!("unhandled"),
}; };
Command::none() Command::none()
@ -147,10 +154,10 @@ impl Application for MainWin {
} }
fn view(&self) -> Element<Message> { fn view(&self) -> Element<Message> {
let debug_view = match self.config.debug_view_enabled { let debug_view: Element<Message> = match self.config.debug_view_enabled {
false => column![], false => row![].into(),
true => { true => {
let debug_toolbar = row![ let debug_toolbar = container(row![
pick_list( pick_list(
vec![ vec![
"Debug".to_string(), "Debug".to_string(),
@ -164,21 +171,30 @@ impl Application for MainWin {
hspacer!(), hspacer!(),
text_input("Search...", self.debug_search_term.as_str()) text_input("Search...", self.debug_search_term.as_str())
.on_input(Message::DebugSearchChanged), .on_input(Message::DebugSearchChanged),
] ])
.style(Container::Custom(Box::new(BorderedContainer)))
.padding(12); .padding(12);
column![ let view = column![
// TODO: tab bar // TODO: tab bar
scrollable(text(self.monado_log.clone())) container(
.width(Length::Fill) scrollable(text(self.monado_log.clone()))
.height(Length::Fill)
.width(Length::Fill)
)
// .style(Container::Custom(Box::new(RoundedBorderedContainer)))
.padding(6)
.height(Length::Fill), .height(Length::Fill),
debug_toolbar, debug_toolbar,
] ];
.width(Length::Fill)
row![vseparator(), view]
.width(Length::FillPortion(2))
.into()
} }
}; };
let toolbar = row![ let toolbar = container(row![
pick_list( pick_list(
self.profiles.to_vec(), self.profiles.to_vec(),
self.get_selected_profile().cloned(), self.get_selected_profile().cloned(),
@ -191,24 +207,25 @@ impl Application for MainWin {
self.config.debug_view_enabled, self.config.debug_view_enabled,
Message::DebugViewChanged Message::DebugViewChanged
), ),
] ])
.width(Length::Fill); .padding(12)
.style(Container::Custom(Box::new(BorderedContainer)));
let monado_view = column![ let monado_view = column![
match self.monado_active { match self.monado_active {
true => button("Stop").on_press(Message::Stop), true => button("Stop").on_press(Message::Stop).style(Button::Destructive),
false => button("Start").on_press(Message::Start), false => button("Start").on_press(Message::Start),
} }
.padding(Padding::from([6, 24])), .padding(Padding::from([6, 24])),
scrollable(column![]) scrollable(column![]) // device info goes here
] ]
.height(Length::Fill) .height(Length::Fill)
.padding(12)
.align_items(Alignment::Center); .align_items(Alignment::Center);
let main_view = column![monado_view, toolbar,] let main_view = column![monado_view, toolbar,]
.width(Length::Fill) .width(Length::FillPortion(1))
.height(Length::Fill) .height(Length::Fill);
.padding(12);
row![main_view, debug_view,].into() row![main_view, debug_view,].into()
} }

View file

@ -1,3 +1,4 @@
pub mod main_win; pub mod main_win;
pub mod widgets; pub mod widgets;
pub mod styles;

View file

@ -0,0 +1,41 @@
use iced::{
widget::container::{Appearance, StyleSheet},
Color,
};
const BORDER_COLOR: Color = Color {
r: 0.5,
g: 0.5,
b: 0.5,
a: 1.0,
};
#[derive(Default)]
pub struct RoundedBorderedContainer;
impl StyleSheet for RoundedBorderedContainer {
type Style = iced::Theme;
fn appearance(&self, _style: &Self::Style) -> Appearance {
Appearance {
border_width: 1.0,
border_color: BORDER_COLOR,
border_radius: 3.0,
..Default::default()
}
}
}
pub struct BorderedContainer;
impl StyleSheet for BorderedContainer {
type Style = iced::Theme;
fn appearance(&self, _style: &Self::Style) -> Appearance {
Appearance {
border_width: 1.0,
border_color: BORDER_COLOR,
..Default::default()
}
}
}

1
src/ui/styles/mod.rs Normal file
View file

@ -0,0 +1 @@
pub mod bordered_container;

View file

@ -1,10 +1,5 @@
#[macro_use] #[macro_use]
pub mod widgets { pub mod widgets {
use iced::{
widget::{column, row, Column},
Length,
};
macro_rules! vspacer { macro_rules! vspacer {
() => { () => {
column![].height(Length::Fill) column![].height(Length::Fill)
@ -17,6 +12,26 @@ pub mod widgets {
}; };
} }
use iced::Length;
use iced_aw::quad::{Quad, InnerBounds};
pub(crate) use vspacer; pub(crate) use vspacer;
pub(crate) use hspacer; pub(crate) use hspacer;
pub fn vseparator() -> Quad {
Quad {
width: Length::Fixed(1.0),
height: Length::Fill,
inner_bounds: InnerBounds::Ratio(0.0001, 0.9999),
..Default::default()
}
}
pub fn hseparator() -> Quad {
Quad {
width: Length::Fill,
height: Length::Fixed(1.0),
inner_bounds: InnerBounds::Ratio(0.9999, 0.0001),
..Default::default()
}
}
} }