From 590a2ef82d015889672ee2c4fbd10ae2cd3cbf10 Mon Sep 17 00:00:00 2001
From: hinto-janaiyo <hinto.janaiyo@protonmail.com>
Date: Fri, 23 Dec 2022 11:41:43 -0500
Subject: [PATCH] p2pool/xmrig: red/green [Start] on errors with solution in
 tooltip

---
 CHANGELOG.md     |  1 +
 src/constants.rs | 12 ++++++------
 src/main.rs      | 30 ++++++++++++++++--------------
 3 files changed, 23 insertions(+), 20 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index ea157fe..655209f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,7 @@
 # v1.0.1
 ## Fixes
 * macOS: Added warning (and solution) if `Gupax/P2Pool/XMRig` were quarantined by [`Gatekeeper`](https://support.apple.com/en-us/HT202491)
+* P2Pool/XMRig: Added a red `Start` button on errors (bad PATH, invalid file, etc) and a solution in the tooltip
 * P2Pool: Fixed custom node selection sometimes using old values after save
 * Miscellaneous UI changes
 
diff --git a/src/constants.rs b/src/constants.rs
index c0a2ed2..b3a89f8 100644
--- a/src/constants.rs
+++ b/src/constants.rs
@@ -239,10 +239,10 @@ pub const P2POOL_NAME: &str = "Add a unique name to identify this node; Only [A-
 pub const P2POOL_NODE_IP: &str = "Specify the Monero Node IP to connect to with P2Pool; It must be a valid IPv4 address or a valid domain name; Max length = 255 characters";
 pub const P2POOL_RPC_PORT: &str = "Specify the RPC port of the Monero node; [1-65535]";
 pub const P2POOL_ZMQ_PORT: &str = "Specify the ZMQ port of the Monero node; [1-65535]";
-pub const P2POOL_PATH_NOT_FILE: &str = "P2Pool binary not found at the given PATH in the Gupax tab!";
-pub const P2POOL_PATH_NOT_VALID: &str = "P2Pool binary at the given PATH in the Gupax tab doesn't look like P2Pool!";
+pub const P2POOL_PATH_NOT_FILE: &str = "P2Pool binary not found at the given PATH in the Gupax tab! To fix: goto the [Gupax Advanced] tab, select [Open] and specify where P2Pool is located.";
+pub const P2POOL_PATH_NOT_VALID: &str = "P2Pool binary at the given PATH in the Gupax tab doesn't look like P2Pool! To fix: goto the [Gupax Advanced] tab, select [Open] and specify where P2Pool is located.";
 pub const P2POOL_PATH_OK: &str = "P2Pool was found at the given PATH";
-pub const P2POOL_PATH_EMPTY: &str = "P2Pool PATH is empty";
+pub const P2POOL_PATH_EMPTY: &str = "P2Pool PATH is empty! To fix: goto the [Gupax Advanced] tab, select [Open] and specify where P2Pool is located.";
 
 // Node/Pool list
 pub const LIST_ADD: &str = "Add the current values to the list";
@@ -282,10 +282,10 @@ pub const XMRIG_API_PORT: &str = "Specify which port to bind to for XMRig's HTTP
 pub const XMRIG_TLS: &str = "Enable SSL/TLS connections (needs pool support)";
 pub const XMRIG_KEEPALIVE: &str = "Send keepalive packets to prevent timeout (needs pool support)";
 pub const XMRIG_THREADS: &str = "Number of CPU threads to use for mining";
-pub const XMRIG_PATH_NOT_FILE: &str = "XMRig binary not found at the given PATH in the Gupax tab!";
-pub const XMRIG_PATH_NOT_VALID: &str = "XMRig binary at the given PATH in the Gupax tab doesn't look like XMRig!";
+pub const XMRIG_PATH_NOT_FILE: &str = "XMRig binary not found at the given PATH in the Gupax tab! To fix: goto the [Gupax Advanced] tab, select [Open] and specify where XMRig is located.";
+pub const XMRIG_PATH_NOT_VALID: &str = "XMRig binary at the given PATH in the Gupax tab doesn't look like XMRig! To fix: goto the [Gupax Advanced] tab, select [Open] and specify where XMRig is located.";
 pub const XMRIG_PATH_OK: &str = "XMRig was found at the given PATH";
-pub const XMRIG_PATH_EMPTY: &str = "XMRig PATH is empty";
+pub const XMRIG_PATH_EMPTY: &str = "XMRig PATH is empty! To fix: goto the [Gupax Advanced] tab, select [Open] and specify where XMRig is located.";
 
 // CLI argument messages
 pub const ARG_HELP: &str =
diff --git a/src/main.rs b/src/main.rs
index 2b81e10..275d102 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1426,9 +1426,9 @@ impl eframe::App for App {
 							let width = (ui.available_width()/3.0)-5.0;
 							if p2pool_is_waiting {
 								ui.add_enabled_ui(false, |ui| {
-									ui.add_sized([width, height], Button::new("⟲")).on_disabled_hover_text("Restart P2Pool");
-									ui.add_sized([width, height], Button::new("⏹")).on_disabled_hover_text("Stop P2Pool");
-									ui.add_sized([width, height], Button::new("▶")).on_disabled_hover_text("Start P2Pool");
+									ui.add_sized([width, height], Button::new("⟲")).on_disabled_hover_text(P2POOL_MIDDLE);
+									ui.add_sized([width, height], Button::new("⏹")).on_disabled_hover_text(P2POOL_MIDDLE);
+									ui.add_sized([width, height], Button::new("▶")).on_disabled_hover_text(P2POOL_MIDDLE);
 								});
 							} else if p2pool_is_alive {
 								if key.is_up() && !wants_input || ui.add_sized([width, height], Button::new("⟲")).on_hover_text("Restart P2Pool").clicked() {
@@ -1450,16 +1450,17 @@ impl eframe::App for App {
 								let mut ui_enabled = true;
 								if !Regexes::addr_ok(&self.regex, &self.state.p2pool.address) {
 									ui_enabled = false;
-									text = P2POOL_ADDRESS.to_string();
+									text = format!("Error: {}", P2POOL_ADDRESS);
 								} else if !Gupax::path_is_file(&self.state.gupax.p2pool_path) {
 									ui_enabled = false;
-									text = P2POOL_PATH_NOT_FILE.to_string();
+									text = format!("Error: {}", P2POOL_PATH_NOT_FILE);
 								} else if !crate::update::check_p2pool_path(&self.state.gupax.p2pool_path) {
 									ui_enabled = false;
-									text = P2POOL_PATH_NOT_VALID.to_string();
+									text = format!("Error: {}", P2POOL_PATH_NOT_VALID);
 								}
 								ui.set_enabled(ui_enabled);
-								if (ui_enabled && key.is_up() && !wants_input) || ui.add_sized([width, height], Button::new("▶")).on_hover_text("Start P2Pool").on_disabled_hover_text(text).clicked() {
+								let color = if ui_enabled { GREEN } else { RED };
+								if (ui_enabled && key.is_up() && !wants_input) || ui.add_sized([width, height], Button::new(RichText::new("▶").color(color))).on_hover_text("Start P2Pool").on_disabled_hover_text(text).clicked() {
 									Helper::start_p2pool(&self.helper, &self.state.p2pool, &self.state.gupax.absolute_p2pool_path);
 								}
 							}
@@ -1480,9 +1481,9 @@ impl eframe::App for App {
 							let width = (ui.available_width()/3.0)-5.0;
 							if xmrig_is_waiting {
 								ui.add_enabled_ui(false, |ui| {
-									ui.add_sized([width, height], Button::new("⟲")).on_disabled_hover_text("Restart XMRig");
-									ui.add_sized([width, height], Button::new("⏹")).on_disabled_hover_text("Stop XMRig");
-									ui.add_sized([width, height], Button::new("▶")).on_disabled_hover_text("Start XMRig");
+									ui.add_sized([width, height], Button::new("⟲")).on_disabled_hover_text(XMRIG_MIDDLE);
+									ui.add_sized([width, height], Button::new("⏹")).on_disabled_hover_text(XMRIG_MIDDLE);
+									ui.add_sized([width, height], Button::new("▶")).on_disabled_hover_text(XMRIG_MIDDLE);
 								});
 							} else if xmrig_is_alive {
 								if key.is_up() && !wants_input || ui.add_sized([width, height], Button::new("⟲")).on_hover_text("Restart XMRig").clicked() {
@@ -1513,18 +1514,19 @@ impl eframe::App for App {
 								let mut ui_enabled = true;
 								if !Gupax::path_is_file(&self.state.gupax.xmrig_path) {
 									ui_enabled = false;
-									text = XMRIG_PATH_NOT_FILE.to_string();
+									text = format!("Error: {}", XMRIG_PATH_NOT_FILE);
 								} else if !crate::update::check_xmrig_path(&self.state.gupax.xmrig_path) {
 									ui_enabled = false;
-									text = XMRIG_PATH_NOT_VALID.to_string();
+									text = format!("Error: {}", XMRIG_PATH_NOT_VALID);
 								}
 								ui.set_enabled(ui_enabled);
+								let color = if ui_enabled { GREEN } else { RED };
 								#[cfg(target_os = "windows")]
-								if (ui_enabled && key.is_up() && !wants_input) || ui.add_sized([width, height], Button::new("▶")).on_hover_text("Start XMRig").on_disabled_hover_text(text).clicked() {
+								if (ui_enabled && key.is_up() && !wants_input) || ui.add_sized([width, height], Button::new(RichText::new("▶").color(color))).on_hover_text("Start XMRig").on_disabled_hover_text(text).clicked() {
 									Helper::start_xmrig(&self.helper, &self.state.xmrig, &self.state.gupax.absolute_xmrig_path, Arc::clone(&self.sudo));
 								}
 								#[cfg(target_family = "unix")]
-								if (ui_enabled && key.is_up() && !wants_input) || ui.add_sized([width, height], Button::new("▶")).on_hover_text("Start XMRig").on_disabled_hover_text(text).clicked() {
+								if (ui_enabled && key.is_up() && !wants_input) || ui.add_sized([width, height], Button::new(RichText::new("▶").color(color))).on_hover_text("Start XMRig").on_disabled_hover_text(text).clicked() {
 									self.sudo.lock().unwrap().signal = ProcessSignal::Start;
 									self.error_state.ask_sudo(&self.sudo);
 								}