diff --git a/src/main.rs b/src/main.rs index a09c4d3..b6e7515 100644 --- a/src/main.rs +++ b/src/main.rs @@ -24,6 +24,7 @@ struct Game { textures: Textures, selected_level: usize, selected_solution: usize, + editing_solution_name: bool, } fn main() { @@ -56,6 +57,7 @@ impl Game { textures, selected_level: 0, selected_solution: 0, + editing_solution_name: false, } } @@ -73,7 +75,8 @@ impl Game { fn draw(&mut self, d: &mut RaylibDrawHandle) { d.clear_background(Color::new(64, 64, 64, 255)); - let level_list_width = 320; + // let level_list_width = 240; + let level_list_width = d.get_screen_width() / 4; // woah! Reactive UI! so fancy let screen_height = d.get_screen_height(); d.draw_rectangle(0, 0, level_list_width, screen_height, Color::GRAY); // let (a, b, c) = d.gui_scroll_panel( @@ -103,6 +106,7 @@ impl Game { }; if clicked && bounds.check_collision_point_rec(mouse_pos) && self.selected_level != i { self.selected_solution = 0; + self.editing_solution_name = false; self.selected_level = i; } if self.selected_level == i { @@ -130,16 +134,19 @@ impl Game { let mut y = 60; if let Some(solutions) = self.solutions.get_mut(level.id()) { let solution_entry_height = 40; + let solution_entry_width = 200; for (solution_index, solution) in solutions.iter().enumerate() { - simple_option_button( + if simple_option_button( d, level_list_width + 10, y, - 200, + solution_entry_width, solution_entry_height, solution_index, &mut self.selected_solution, - ); + ) { + self.editing_solution_name = false; + } let name_color = if solution.score.is_some() { Color::LIME } else { @@ -156,8 +163,7 @@ impl Game { y += solution_entry_height + 10; } - // d.gui_button(bounds, text) - if simple_button(d, level_list_width + 10, y, 200, 30) { + if simple_button(d, level_list_width + 10, y, solution_entry_width, 30) { let n = solutions.len(); solutions.push(Solution::new(level.id().to_owned(), n)); } @@ -168,6 +174,21 @@ impl Game { 20, Color::WHITE, ); + + if let Some(solution) = solutions.get_mut(self.selected_solution) { + let bounds = Rectangle { + x: (level_list_width + 10 + solution_entry_width + 10) as f32, + y: 60., + width: 240., + height: 30., + }; + text_input( + d, + bounds, + &mut solution.name, + &mut self.editing_solution_name, + ); + } } else { self.solutions.insert(level.id().to_owned(), Vec::new()); } diff --git a/src/util.rs b/src/util.rs index 2a250a6..44a9961 100644 --- a/src/util.rs +++ b/src/util.rs @@ -57,7 +57,8 @@ pub fn simple_option_button( height: i32, option: T, current: &mut T, -) where +) -> bool +where T: PartialEq, { let color = if &option == current { @@ -72,12 +73,16 @@ pub fn simple_option_button( height: height as f32, }; let mouse_pos = d.get_mouse_position(); + let mut changed = false; if d.is_mouse_button_pressed(MouseButton::MOUSE_BUTTON_LEFT) && bounds.check_collision_point_rec(mouse_pos) + && current != &option { *current = option; + changed = true; } d.draw_rectangle_rec(bounds, color); + changed } pub fn text_input( @@ -94,8 +99,13 @@ pub fn text_input( }; d.draw_rectangle_rec(bounds, border); d.draw_rectangle_rec(shrink_rec(bounds, 2.), bg); + let drawn_text = if *is_selected { + &format!("{text}_") + } else { + &text + }; d.draw_text( - text, + drawn_text, bounds.x as i32 + 4, bounds.y as i32 + 4, 20,