From bfba5b6e1481cd3ae1fc299c1cb6a3edf63ee0b0 Mon Sep 17 00:00:00 2001 From: Leon Liu Date: Thu, 26 Dec 2024 09:06:49 +0900 Subject: [PATCH] update --- src/components/app.rs | 6 +-- src/components/rule_item.rs | 102 ++++++++++++++++++++++++++++-------- src/components/rule_list.rs | 54 ++++++++++++------- src/models/loot_filter.rs | 2 +- 4 files changed, 120 insertions(+), 44 deletions(-) diff --git a/src/components/app.rs b/src/components/app.rs index 52a4dd2..4ad2bb7 100644 --- a/src/components/app.rs +++ b/src/components/app.rs @@ -11,7 +11,7 @@ pub struct App { pub settings: Settings, pub filter_config: FilterConfig, } -#[derive(Debug, Clone, Copy)] +#[derive(Debug, Clone)] pub enum Message { RuleList(rule_list::Message), } @@ -19,7 +19,7 @@ pub enum Message { pub fn view(state: &App) -> Element { container( row![ - rule_list::view(&state.filter_config).map(Message::RuleList), + rule_list::view(&state.filter_config.filters).map(Message::RuleList), vertical_rule(2), column![] ] @@ -32,7 +32,7 @@ pub fn view(state: &App) -> Element { pub fn update(state: &mut App, msg: Message) -> Task { match msg { Message::RuleList(msg) => { - rule_list::update(&mut state.filter_config, msg).map(Message::RuleList) + rule_list::update(&mut state.filter_config.filters, msg).map(Message::RuleList) } } } diff --git a/src/components/rule_item.rs b/src/components/rule_item.rs index 34a3ed1..c3dcd4e 100644 --- a/src/components/rule_item.rs +++ b/src/components/rule_item.rs @@ -1,39 +1,92 @@ use iced::{ - widget::{button, row, text, toggler}, - Element, Task, + padding, + widget::{button, column, container, row, text, toggler}, + Border, Element, Task, Theme, }; -use crate::models::{Filter, FilterRule, FilterText}; +use crate::models::{Filter, FilterGroup, FilterLeaf, FilterRule, FilterText}; -#[derive(Debug, Clone, Copy)] +use super::rule_list; + +#[derive(Debug, Clone)] pub enum Message { TogglerToggled(bool), Delete, MoveUp, MoveDown, + RuleList(Box), +} + +fn view_leaf(enabled: bool, state: &FilterLeaf) -> Element { + let preview_text = if state.show { "Show" } else { "Hide" }; + row![ + button(text("x").size(10)) + .padding(4) + .style(button::danger) + .on_press(Message::Delete), + button(text("↑").size(10)) + .padding(4) + .on_press(Message::MoveUp), + button(text("↓").size(10)) + .padding(4) + .on_press(Message::MoveDown), + toggler(enabled) + .label("") + .on_toggle(Message::TogglerToggled), + preview_text + ] + .spacing(4) + .into() +} + +pub fn bordered_box(theme: &Theme) -> container::Style { + let palette = theme.extended_palette(); + + container::Style { + border: Border { + width: 1.0, + radius: 0.0.into(), + color: palette.background.strong.color, + }, + ..container::Style::default() + } +} + +fn view_group(enabled: bool, state: &FilterGroup) -> Element { + let header = row![ + button(text("x").size(10)) + .padding(4) + .style(button::danger) + .on_press(Message::Delete), + button(text("↑").size(10)) + .padding(4) + .on_press(Message::MoveUp), + button(text("↓").size(10)) + .padding(4) + .on_press(Message::MoveDown), + toggler(enabled) + .label("") + .on_toggle(Message::TogglerToggled), + // button(text("expand").size(10)) + // .padding(4) + // .on_press(Message::MoveDown), + ] + .spacing(4); + column![ + header, + container(rule_list::view(&state.filters).map(|msg| Message::RuleList(Box::new(msg)))) + .padding(padding::left(32)) + .style(bordered_box) + ] + .spacing(4) + .into() } pub fn view(state: &Filter) -> Element { match &state.rule { - FilterRule::Leaf(_) => row![ - button(text("x").size(10)) - .padding(4) - .on_press(Message::Delete), - button(text("↑").size(10)) - .padding(4) - .on_press(Message::MoveUp), - button(text("↓").size(10)) - .padding(4) - .on_press(Message::MoveDown), - toggler(state.enabled) - .label("") - .on_toggle(Message::TogglerToggled), - text(format!("{}", state.to_filter_text().replace("\n", " "))) - ] - .spacing(4), - FilterRule::Group(group) => todo!(), + FilterRule::Leaf(leaf) => view_leaf(state.enabled, leaf), + FilterRule::Group(group) => view_group(state.enabled, group), } - .into() } pub fn update(state: &mut Filter, msg: Message) -> Task { @@ -45,5 +98,10 @@ pub fn update(state: &mut Filter, msg: Message) -> Task { Message::Delete => Task::none(), Message::MoveUp => Task::none(), Message::MoveDown => Task::none(), + Message::RuleList(msg) => match state.rule { + FilterRule::Leaf(_) => panic!("Should be group rule"), + FilterRule::Group(ref mut group) => rule_list::update(&mut group.filters, *msg) + .map(|msg| Message::RuleList(Box::new(msg))), + }, } } diff --git a/src/components/rule_list.rs b/src/components/rule_list.rs index e275793..f19e0e6 100644 --- a/src/components/rule_list.rs +++ b/src/components/rule_list.rs @@ -1,5 +1,5 @@ use iced::{ - widget::{button, column, keyed_column}, + widget::{button, column, keyed_column, row, text}, Element, Task, }; use uuid::Uuid; @@ -8,53 +8,71 @@ use crate::models::{Filter, FilterConfig}; use super::rule_item; -#[derive(Debug, Clone, Copy)] +#[derive(Debug, Clone)] pub enum Message { - AddRule, + AddRule(RuleType), RuleItem(Uuid, rule_item::Message), } -pub fn view(state: &FilterConfig) -> Element { - let rows = keyed_column(state.filters.iter().map(|filter| { +#[derive(Debug, Clone, Copy)] +pub enum RuleType { + Leaf, + Group, +} + +pub fn view(state: &Vec) -> Element { + let rows = keyed_column(state.iter().map(|filter| { ( filter.id, rule_item::view(filter).map(|msg| Message::RuleItem(filter.id, msg)), ) })) .spacing(4); - column![button("Add Rule").on_press(Message::AddRule), rows] - .spacing(4) - .into() + column![ + row![ + button(text("New Rule").size(10)).on_press(Message::AddRule(RuleType::Leaf)), + button(text("New Group").size(10)).on_press(Message::AddRule(RuleType::Group)) + ] + .spacing(8), + rows + ] + .spacing(4) + .into() } -pub fn update(state: &mut FilterConfig, msg: Message) -> Task { +pub fn update(state: &mut Vec, msg: Message) -> Task { match msg { - Message::AddRule => { - state.filters.push(Filter::default_leaf()); + Message::AddRule(RuleType::Leaf) => { + state.push(Filter::default_leaf()); + Task::none() + } + + Message::AddRule(RuleType::Group) => { + state.push(Filter::default_group()); Task::none() } Message::RuleItem(uuid, rule_item::Message::Delete) => { - state.filters.retain(|f| f.id != uuid); + state.retain(|f| f.id != uuid); Task::none() } Message::RuleItem(uuid, rule_item::Message::MoveUp) => { - if let Some(index) = state.filters.iter().position(|f| f.id == uuid) { + if let Some(index) = state.iter().position(|f| f.id == uuid) { if index > 0 { - state.filters.swap(index, index - 1); + state.swap(index, index - 1); } } Task::none() } Message::RuleItem(uuid, rule_item::Message::MoveDown) => { - if let Some(index) = state.filters.iter().position(|f| f.id == uuid) { - if index < state.filters.len() - 1 { - state.filters.swap(index, index + 1); + if let Some(index) = state.iter().position(|f| f.id == uuid) { + if index < state.len() - 1 { + state.swap(index, index + 1); } } Task::none() } Message::RuleItem(uuid, msg) => { - if let Some(filter) = state.filters.iter_mut().find(|filter| filter.id == uuid) { + if let Some(filter) = state.iter_mut().find(|filter| filter.id == uuid) { rule_item::update(filter, msg).map(move |msg| Message::RuleItem(uuid, msg)) } else { Task::none() diff --git a/src/models/loot_filter.rs b/src/models/loot_filter.rs index 7c62bf4..09baaa0 100644 --- a/src/models/loot_filter.rs +++ b/src/models/loot_filter.rs @@ -27,7 +27,7 @@ impl Filter { } } - fn default_group() -> Self { + pub fn default_group() -> Self { Self { id: Uuid::new_v4(), enabled: true,