From 3610e44a080b84ba9006d59cf8d3894812e8291b Mon Sep 17 00:00:00 2001 From: futile Date: Sat, 26 Apr 2025 04:37:10 +0100 Subject: [PATCH] create trait `UiExt` --- src/gui/app.rs | 24 +++++++++++------------- src/gui/debug.rs | 3 ++- src/gui/mod.rs | 1 + src/gui/tools.rs | 19 ------------------- src/gui/ui_ext.rs | 38 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 52 insertions(+), 33 deletions(-) create mode 100644 src/gui/ui_ext.rs diff --git a/src/gui/app.rs b/src/gui/app.rs index b494177..f6597d3 100644 --- a/src/gui/app.rs +++ b/src/gui/app.rs @@ -1,6 +1,6 @@ use crate::{ features, - gui::{settings::Settings, tools}, + gui::{settings::Settings, tools, ui_ext::UiExt}, util::{consts::game::WINDOW_TITLE, meta::Meta, persistent_state::PersistentState, win}, }; use eframe::egui; @@ -57,7 +57,7 @@ impl eframe::App for App { .exact_height(25.0) .show(ctx, |ui| { ui.with_layout(egui::Layout::left_to_right(egui::Align::Center), |ui| { - tools::build_menu::(ui, &mut self.stage); + ui.build_menu(&mut self.stage); ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { let button = ui .add_enabled(!self.flags.elevated, egui::Button::new("Elevate")) @@ -92,7 +92,7 @@ impl eframe::App for App { impl App { fn show_game_section(&mut self, _ctx: &egui::Context, ui: &mut egui::Ui) { - tools::header(ui, "Game"); + ui.header("Game"); ui.horizontal(|ui| { if ui.button("Launch").clicked() { features::launch::launch(&self.launch.selected); @@ -101,7 +101,7 @@ impl App { .selected_text(self.launch.selected.to_string()) .width(120.0) .show_ui(ui, |ui| { - tools::build_menu(ui, &mut self.launch.selected); + ui.build_menu(&mut self.launch.selected); }); }); let force_close_button = ui.add_sized( @@ -113,7 +113,7 @@ impl App { } fn show_session_section(&mut self, _ctx: &egui::Context, ui: &mut egui::Ui) { - tools::header(ui, "Session"); + ui.header("Session"); ui.add_enabled_ui(!self.empty_session.disabled, |ui| { ui.horizontal(|ui| { if ui.button("Empty current session").clicked() { @@ -144,7 +144,7 @@ impl App { } fn show_network_section(&mut self, _ctx: &egui::Context, ui: &mut egui::Ui) { - tools::header(ui, "Network"); + ui.header("Network"); egui::Frame::new() .outer_margin(egui::vec2(0.0, -2.0)) .show(ui, |ui| { @@ -152,12 +152,10 @@ impl App { let label = ui.horizontal(|ui| { let label = ui.label("Game's network access"); ui.add_space(1.0); - ui.add( - egui::Image::new(egui::include_image!("../../assets/circle.svg")) - .max_size([4.0, 4.0].into()) - .tint(self.game_networking.blocked_status.to_color32()), - ) - .on_hover_text("This turns yellow if GTA Tools\ncannot find your game."); + ui.create_indicator_dot(self.game_networking.blocked_status.to_color32()) + .on_hover_text( + "This turns yellow if GTA Tools\ncannot find your game.", + ); self.game_networking.if_failed_return_to_boolean(); label }); @@ -198,7 +196,7 @@ impl App { egui::ComboBox::from_id_salt("Theme") .selected_text(self.settings.theme.to_string()) .show_ui(ui, |ui| { - tools::build_menu(ui, &mut self.settings.theme); + ui.build_menu(&mut self.settings.theme); }); if selection != self.settings.theme { catppuccin_egui::set_theme(ctx, self.settings.theme.into()); diff --git a/src/gui/debug.rs b/src/gui/debug.rs index e322e5b..d284006 100644 --- a/src/gui/debug.rs +++ b/src/gui/debug.rs @@ -2,6 +2,7 @@ use crate::{ gui::{ app::{App, WINDOW_SIZE}, tools, + ui_ext::UiExt, }, util::consts::{ APP_STORAGE_PATH, @@ -55,7 +56,7 @@ impl App { egui::ComboBox::from_id_salt("blocked_status") .selected_text(&self.game_networking.blocked_status.to_string()) .show_ui(ui, |ui| { - tools::build_menu(ui, &mut self.game_networking.blocked_status); + ui.build_menu(&mut self.game_networking.blocked_status); }); }); diff --git a/src/gui/mod.rs b/src/gui/mod.rs index f281df6..30b044b 100644 --- a/src/gui/mod.rs +++ b/src/gui/mod.rs @@ -4,3 +4,4 @@ mod debug; pub mod run; pub mod settings; mod tools; +mod ui_ext; diff --git a/src/gui/tools.rs b/src/gui/tools.rs index c12b48e..b84adea 100644 --- a/src/gui/tools.rs +++ b/src/gui/tools.rs @@ -11,25 +11,6 @@ pub fn load_icon() -> egui::IconData { } } -pub fn header(ui: &mut egui::Ui, text: &str) { - ui.horizontal(|ui| { - ui.label(egui::RichText::new(text).font(egui::FontId::new( - 12.5, - egui::FontFamily::Name("Ubuntu-Regular".into()), - ))); - ui.add(egui::Separator::default().horizontal()); - }); -} - -pub fn build_menu(ui: &mut egui::Ui, current_value: &mut E) -where - E: strum::IntoEnumIterator + std::fmt::Display + std::cmp::PartialEq + Copy, -{ - E::iter().for_each(|variant| { - ui.selectable_value(current_value, variant, variant.to_string()); - }); -} - pub fn debug_keycombo_pressed(ctx: &egui::Context) -> bool { ctx.input(|i| i.modifiers.all() && i.key_pressed(egui::Key::D)) } diff --git a/src/gui/ui_ext.rs b/src/gui/ui_ext.rs new file mode 100644 index 0000000..bae485c --- /dev/null +++ b/src/gui/ui_ext.rs @@ -0,0 +1,38 @@ +use eframe::egui; + +pub trait UiExt { + fn header(&mut self, text: &str); + fn build_menu(&mut self, current_value: &mut E) + where + E: strum::IntoEnumIterator + std::fmt::Display + std::cmp::PartialEq + Copy; + fn create_indicator_dot(&mut self, colour: impl Into) -> egui::Response; +} + +impl UiExt for egui::Ui { + fn header(&mut self, text: &str) { + self.horizontal(|ui| { + ui.label(egui::RichText::new(text).font(egui::FontId::new( + 12.5, + egui::FontFamily::Name("Ubuntu-Regular".into()), + ))); + ui.add(egui::Separator::default().horizontal()); + }); + } + + fn build_menu(&mut self, current_value: &mut E) + where + E: strum::IntoEnumIterator + std::fmt::Display + std::cmp::PartialEq + Copy, + { + E::iter().for_each(|variant| { + self.selectable_value(current_value, variant, variant.to_string()); + }); + } + + fn create_indicator_dot(&mut self, colour: impl Into) -> egui::Response { + self.add( + egui::Image::new(egui::include_image!("../../assets/circle.svg")) + .max_size([4.0, 4.0].into()) + .tint(colour), + ) + } +}