From 1ea9e22d013311876b819b09db33d05512965341 Mon Sep 17 00:00:00 2001 From: electria Date: Thu, 25 Jun 2026 14:24:07 -0700 Subject: [PATCH] first prototype --- Cargo.lock | 56 +++++++++++++++++++ Cargo.toml | 1 + src/main.rs | 158 +++++++++++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 208 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e54bc4a..4def450 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -621,6 +621,27 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.61.2", +] + [[package]] name = "dispatch" version = "0.2.0" @@ -858,6 +879,7 @@ checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" name = "fridge" version = "0.1.0" dependencies = [ + "dirs", "iced", "ron", "serde", @@ -974,6 +996,17 @@ dependencies = [ "windows-link", ] +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + [[package]] name = "getrandom" version = "0.3.4" @@ -2077,6 +2110,12 @@ version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + [[package]] name = "orbclient" version = "0.3.55" @@ -2366,6 +2405,17 @@ dependencies = [ "bitflags 2.13.0", ] +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 2.0.18", +] + [[package]] name = "renderdoc-sys" version = "1.1.0" @@ -3032,6 +3082,12 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + [[package]] name = "wasip2" version = "1.0.4+wasi-0.2.12" diff --git a/Cargo.toml b/Cargo.toml index 3d47da6..d43559d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,3 +7,4 @@ edition = "2024" iced = "0.14.0" serde = { version = "1.0.228", features = [ "derive" ] } ron = "0.12.2" +dirs = "6.0.0" diff --git a/src/main.rs b/src/main.rs index a882805..b045ba3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,20 +1,164 @@ -use iced::{Element, Renderer, Theme, widget}; +use std::fs; + +use iced::{ + Color, Element, Renderer, Theme, + alignment::{Horizontal, Vertical}, + color, widget, +}; mod data; -enum Message {} +macro_rules! data { + () => { + dirs::data_dir().unwrap().join("fridge.ron") + }; +} -struct State {} +#[derive(Clone, Debug)] +enum Message { + AddCategory, + RemoveCategory { + i_category: usize, + }, + CategoryChanged { + i_category: usize, + new_value: String, + }, + + AddElement { + i_category: usize, + }, + RemoveElement { + i_category: usize, + i_element: usize, + }, + ElementChanged { + i_category: usize, + i_element: usize, + new_value: String, + }, +} + +#[derive(Clone, Debug, Default)] +struct State { + table: data::Table, +} impl State { fn new() -> Self { - Self {} + let mut state = Self::default(); + if let Ok(file) = + fs::File::open(data!()).inspect_err(|e| eprintln!("failed to read data file: {e}")) + { + state.table = ron::de::from_reader(file).unwrap(); + } + + state } fn view(&self) -> Element<'_, Message, Theme, Renderer> { - widget::space().into() + widget::row(self.table.iter().enumerate().map(|(i_category, category)| { + widget::column([ + widget::row([ + widget::text_input("category", &category.header) + .on_input(move |new_value| Message::CategoryChanged { + i_category, + new_value, + }) + .size(30) + .into(), + widget::button("X") + .style(widget::button::danger) + .on_press(Message::RemoveCategory { i_category }) + .height(50) + .into(), + ]) + .align_y(Vertical::Center) + .into(), + widget::scrollable(widget::column(category.elements.iter().enumerate().map( + |(i_element, element)| { + widget::row([ + widget::text_input("content", &element) + .on_input(move |new_value| Message::ElementChanged { + i_category, + i_element, + new_value, + }) + .into(), + widget::button("X") + .style(widget::button::warning) + .on_press(Message::RemoveElement { + i_category, + i_element, + }) + .into(), + ]) + .into() + }, + ))) + .into(), + widget::button("add element") + .on_press(Message::AddElement { i_category }) + .into(), + ]) + .align_x(Horizontal::Center) + .into() + })) + .push(widget::button("add category").on_press(Message::AddCategory)) + .into() + } + fn update(&mut self, message: Message) { + match message { + Message::AddCategory => { + self.table.push(Default::default()); + } + Message::RemoveCategory { i_category } => { + self.table.remove(i_category); + } + Message::CategoryChanged { + i_category, + new_value, + } => { + self.table[i_category].header = new_value; + } + + Message::AddElement { i_category } => { + self.table[i_category].elements.push(Default::default()); + } + Message::RemoveElement { + i_category, + i_element, + } => { + self.table[i_category].elements.remove(i_element); + } + Message::ElementChanged { + i_category, + i_element, + new_value, + } => { + self.table[i_category].elements[i_element] = new_value; + } + } + } +} +impl Drop for State { + fn drop(&mut self) { + ron::Options::default() + .to_io_writer(fs::File::create(data!()).unwrap(), &self.table) + .unwrap(); } - fn update(&mut self, message: Message) {} } fn main() -> Result<(), iced::Error> { - iced::application(State::new, State::update, State::view).run() + iced::application(State::new, State::update, State::view) + .theme(Theme::custom( + "custom", + iced::theme::Palette { + background: color!(0x080808), + text: Color::WHITE, + primary: color!(0xff00ff), + success: color!(0x00ff00), + warning: color!(0x880000), + danger: color!(0xff0000), + }, + )) + .run() }