This commit is contained in:
Leon Liu 2024-12-26 09:06:49 +09:00
parent ef1eaab359
commit bfba5b6e14
4 changed files with 120 additions and 44 deletions

View File

@ -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<Message> {
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<Message> {
pub fn update(state: &mut App, msg: Message) -> Task<Message> {
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)
}
}
}

View File

@ -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<rule_list::Message>),
}
fn view_leaf(enabled: bool, state: &FilterLeaf) -> Element<Message> {
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<Message> {
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<Message> {
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<Message> {
@ -45,5 +98,10 @@ pub fn update(state: &mut Filter, msg: Message) -> Task<Message> {
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))),
},
}
}

View File

@ -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<Message> {
let rows = keyed_column(state.filters.iter().map(|filter| {
#[derive(Debug, Clone, Copy)]
pub enum RuleType {
Leaf,
Group,
}
pub fn view(state: &Vec<Filter>) -> Element<Message> {
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<Message> {
pub fn update(state: &mut Vec<Filter>, msg: Message) -> Task<Message> {
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()

View File

@ -27,7 +27,7 @@ impl Filter {
}
}
fn default_group() -> Self {
pub fn default_group() -> Self {
Self {
id: Uuid::new_v4(),
enabled: true,