first prototype
This commit is contained in:
parent
0c8c0463d5
commit
1ea9e22d01
3 changed files with 208 additions and 7 deletions
56
Cargo.lock
generated
56
Cargo.lock
generated
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
158
src/main.rs
158
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()
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue