Files
focus_annotator/src/main.rs

156 lines
4.5 KiB
Rust

#[macro_use]
extern crate derive_builder;
mod constants;
mod state;
mod ui;
pub use crate::constants::MARGIN_BOTTOM;
pub use crate::state::AnnotationImage;
pub use crate::ui::ImageUI;
use adw::{prelude::*, Application};
use gtk::gio::SimpleAction;
use gtk::glib::{MainContext, PRIORITY_DEFAULT};
use state::{Message, State, UIMessage};
fn main() {
let application = Application::builder()
.application_id("org.kuchelmeister.FocusAnnotator")
.build();
application.connect_startup(|_| {
adw::init();
});
application.connect_startup(ImageUI::setup_shortcuts);
application.connect_activate(build_ui);
application.run();
}
fn build_ui(app: &Application) {
let (sender, receiver) = MainContext::channel(PRIORITY_DEFAULT);
let mut state = State::new();
let image_ui = ImageUI::new(app, sender.clone());
//////////////////
// MAIN CONTENT //
//////////////////
//image_ui.build_ui();
let _sender = sender.clone();
image_ui.focus_scale.connect_value_changed(move |x| {
let index = x.value() as usize;
_sender.send(Message::FocusLevelChange(index)).unwrap();
});
////////////////////
// BOTTOM TOOLBAR //
///////////////////
image_ui.back_button.connect_clicked(|button| {
button
.activate_action("win.back_focus", None)
.expect("The action does not exist.");
});
image_ui.skip_button.connect_clicked(|button| {
button
.activate_action("win.skip_focus", None)
.expect("The action does not exist.");
});
image_ui.focus_button.connect_clicked(|button| {
button
.activate_action("win.mark_focus", None)
.expect("The action does not exist.");
});
let _sender = sender.clone();
image_ui.neighbour_toggle_button.connect_toggled(move |x| {
_sender
.send(Message::UI(UIMessage::ShowGrid(x.is_active())))
.unwrap();
});
let _sender = sender.clone();
image_ui.open_button.connect_clicked(move |_| {
_sender
.send(Message::UI(UIMessage::OpenFileChooser))
.unwrap();
});
////////////////////////
// Keyboard Shortcuts //
////////////////////////
let _sender = sender.clone();
let action_toggle_neighbour = SimpleAction::new("toggle_neighbour", None);
action_toggle_neighbour
.connect_activate(move |_, _| _sender.send(Message::UI(UIMessage::ToggleGrid)).unwrap());
let _sender = sender.clone();
image_ui
.skip_marked_checkbox
.connect_toggled(move |check_button| {
let value = check_button.is_active();
_sender.send(Message::SkipMarkedToogled(value)).unwrap();
});
let _sender = sender.clone();
let action_focus_scale_increment = SimpleAction::new("increment_focus_scale", None);
action_focus_scale_increment.connect_activate(move |_, _| {
_sender
.send(Message::UI(UIMessage::IncrementFocus))
.unwrap()
});
let _sender = sender.clone();
let action_focus_scale_decrement = SimpleAction::new("decrement_focus_scale", None);
action_focus_scale_decrement.connect_activate(move |_, _| {
_sender
.send(Message::UI(UIMessage::DecrementFocus))
.unwrap()
});
let _sender = sender.clone();
let mark_focus = SimpleAction::new("mark_focus", None);
mark_focus.connect_activate(move |_, _| {
_sender.send(Message::MarkFocus).unwrap();
});
let _sender = sender.clone();
let skip_focus = SimpleAction::new("skip_focus", None);
skip_focus.connect_activate(move |_, _| {
_sender.send(Message::NextImage).unwrap();
});
let _sender = sender.clone();
let back_focus = SimpleAction::new("back_focus", None);
back_focus.connect_activate(move |_, _| {
_sender.send(Message::PreviousImage).unwrap();
});
image_ui.window.add_action(&action_toggle_neighbour);
image_ui.window.add_action(&action_focus_scale_increment);
image_ui.window.add_action(&action_focus_scale_decrement);
image_ui.window.add_action(&mark_focus);
image_ui.window.add_action(&skip_focus);
image_ui.window.add_action(&back_focus);
let _sender = sender.clone();
app.connect_shutdown(move |_| {
_sender.send(Message::Quit).unwrap();
});
image_ui.show();
receiver.attach(None, move |msg| {
eprintln!("Received message: {:?}", msg);
state.update(&msg);
image_ui.refresh(&msg, &state);
Continue(true)
});
}