diff --git a/src/main.rs b/src/main.rs index 9c071b9..e890b3e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -10,24 +10,20 @@ const LINE_ENDING: &str = "\r\n"; #[cfg(not(windows))] const LINE_ENDING: &str = "\n"; -#[derive(Resource)] -struct InputText { - value: String, -} - -#[derive(Resource)] -struct OutputText { - value: String, +#[derive(Resource, Debug)] +struct State { + input_value: String, + output_value: String, + needs_update: bool, } fn main() { App::new() .insert_resource(WinitSettings::desktop_app()) - .insert_resource(InputText { - value: "".to_string(), - }) - .insert_resource(OutputText { - value: "".to_string(), + .insert_resource(State { + input_value: "".to_string(), + output_value: "".to_string(), + needs_update: false, }) .add_plugins(DefaultPlugins) .add_plugins(EguiPlugin) @@ -37,46 +33,51 @@ fn main() { .run(); } +// TODO: move this into init fn set_window_title(mut window_query: Query<&mut Window, With>) { if let Ok(mut window) = window_query.get_single_mut() { window.title = "dsort".to_string(); } } -fn process_text(input_text: Res, mut output_text: ResMut) { - let mut arr = input_text.value.lines().collect::>(); - arr.sort_by(|&a, &b| vsort::compare(a, b)); - output_text.value = arr.join(LINE_ENDING); +fn process_text(mut state: ResMut) { + if state.needs_update { + println!("updating sort"); + let mut arr = state.input_value.lines().collect::>(); + arr.sort_by(|&a, &b| vsort::compare(a, b)); + state.output_value = arr.join(LINE_ENDING); + state.needs_update = false; + } } -fn ui_system( - mut contexts: EguiContexts, - mut input_text: ResMut, - mut output_text: ResMut, -) { +fn ui_system(mut contexts: EguiContexts, mut state: ResMut) { contexts.ctx_mut().set_visuals(egui::Visuals::light()); + egui::CentralPanel::default().show(contexts.ctx_mut(), |ui| { let window_size = ui.available_size(); let height = window_size[1]; + ui.with_layout( egui::Layout::left_to_right(egui::Align::Center).with_cross_justify(true), |ui| { egui::ScrollArea::vertical() .id_source("left") .show(ui, |ui| { - ui.add_sized( + let response = ui.add_sized( [ui.available_width() / 2., height], - egui::TextEdit::multiline(&mut input_text.value), + egui::TextEdit::multiline(&mut state.input_value), ); + if response.changed() { + state.needs_update = true; + } }); egui::ScrollArea::vertical() .id_source("right") .show(ui, |ui| { - ui.add_sized( - [ui.available_width(), height], - egui::TextEdit::multiline(&mut output_text.value), - ); + ui.with_layout(egui::Layout::top_down_justified(egui::Align::LEFT), |ui| { + ui.add(egui::Label::new(&state.output_value).selectable(true)); + }) }); }, );