abacus/abacus-ui/src/app_delegate.rs

87 lines
2.6 KiB
Rust

use druid::AppDelegate;
use crate::{
commands,
data::{AppData, Block},
};
pub struct Delegate;
impl AppDelegate<AppData> for Delegate {
fn command(
&mut self,
_ctx: &mut druid::DelegateCtx,
_target: druid::Target,
cmd: &druid::Command,
data: &mut AppData,
_env: &druid::Env,
) -> druid::Handled {
if let Some(file_info) = cmd.get(druid::commands::SAVE_FILE_AS) {
let filepath = file_info.path().as_os_str().to_str().unwrap().to_string();
data.filename = Some(filepath);
data.save();
return druid::Handled::Yes;
}
if let Some(file_info) = cmd.get(druid::commands::OPEN_FILE) {
let filepath = file_info.path().as_os_str().to_str().unwrap();
match abacus_core::SaveFile::open(filepath) {
Ok(save_file) => {
data.blocks = save_file
.blocks
.iter()
.enumerate()
.map(|(i, b)| Block::new_with_content(&b.name, i, &b.content))
.collect();
}
Err(e) => {
println!("{}", e);
}
}
data.filename = Some(filepath.to_string());
return druid::Handled::Yes;
}
if cmd.is(commands::PROCESS_WORKBOOK) {
data.process();
return druid::Handled::Yes;
}
if cmd.is(commands::PROCESS_BLOCK) {
if let Some(index) = cmd.get(commands::PROCESS_BLOCK) {
data.process_block(*index);
return druid::Handled::Yes;
}
}
if cmd.is(commands::DELETE_BLOCK) {
if let Some(index) = cmd.get(commands::DELETE_BLOCK) {
data.remove_block(*index);
return druid::Handled::Yes;
}
}
druid::Handled::No
}
fn event(
&mut self,
_ctx: &mut druid::DelegateCtx,
_window_id: druid::WindowId,
event: druid::Event,
data: &mut AppData,
_env: &druid::Env,
) -> Option<druid::Event> {
if let druid::Event::KeyDown(ref e) = event {
if druid::keyboard_types::Key::Character(String::from("n")) == e.key && e.mods.ctrl() {
data.blocks.push_back(Block::new(
&format!("Block #{}", data.blocks.len() + 1),
data.blocks.len(),
));
return None;
}
}
Some(event)
}
}