From 2d4a62aa013c719f5b2d11e28b192010fd322903 Mon Sep 17 00:00:00 2001
From: hinto-janaiyo <hinto.janaiyo@protonmail.com>
Date: Sun, 18 Dec 2022 23:57:06 -0500
Subject: [PATCH] main: add [d] debug info screen

---
 src/ferris.rs |  1 +
 src/main.rs   | 70 +++++++++++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 69 insertions(+), 2 deletions(-)

diff --git a/src/ferris.rs b/src/ferris.rs
index e639f3f..8691306 100644
--- a/src/ferris.rs
+++ b/src/ferris.rs
@@ -18,6 +18,7 @@
 // Some images of ferris in byte form for error messages, etc
 
 pub const FERRIS_HAPPY: &[u8] = include_bytes!("../images/ferris/happy.png");
+pub const FERRIS_CUTE: &[u8] = include_bytes!("../images/ferris/cute.png");
 pub const FERRIS_OOPS: &[u8] = include_bytes!("../images/ferris/oops.png");
 pub const FERRIS_ERROR: &[u8] = include_bytes!("../images/ferris/error.png");
 pub const FERRIS_PANIC: &[u8] = include_bytes!("../images/ferris/panic.png"); // This isnt technically ferris but its ok since its spooky
diff --git a/src/main.rs b/src/main.rs
index cf38e12..48b00a9 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -455,11 +455,13 @@ pub enum ErrorButtons {
 	Quit,
 	Sudo,
 	WindowsAdmin,
+	Debug,
 }
 
 #[derive(Clone, Copy, Debug, PartialEq, Eq)]
 pub enum ErrorFerris {
 	Happy,
+	Cute,
 	Oops,
 	Error,
 	Panic,
@@ -537,6 +539,7 @@ impl ErrorState {
 struct Images {
 	banner: RetainedImage,
 	happy: RetainedImage,
+	cute: RetainedImage,
 	oops: RetainedImage,
 	error: RetainedImage,
 	panic: RetainedImage,
@@ -548,6 +551,7 @@ impl Images {
 		Self {
 			banner: RetainedImage::from_image_bytes("banner.png", BYTES_BANNER).unwrap(),
 			happy: RetainedImage::from_image_bytes("happy.png", FERRIS_HAPPY).unwrap(),
+			cute: RetainedImage::from_image_bytes("cute.png", FERRIS_CUTE).unwrap(),
 			oops: RetainedImage::from_image_bytes("oops.png", FERRIS_OOPS).unwrap(),
 			error: RetainedImage::from_image_bytes("error.png", FERRIS_ERROR).unwrap(),
 			panic: RetainedImage::from_image_bytes("panic.png", FERRIS_PANIC).unwrap(),
@@ -601,6 +605,7 @@ enum KeyPressed {
 	X,
 	S,
 	R,
+	D,
 	None,
 }
 
@@ -629,6 +634,9 @@ impl KeyPressed {
 	fn is_r(&self) -> bool {
 		*self == Self::R
 	}
+	fn is_d(&self) -> bool {
+		*self == Self::D
+	}
 	fn is_none(&self) -> bool {
 		*self == Self::None
 	}
@@ -962,6 +970,8 @@ impl eframe::App for App {
 				KeyPressed::S
 			} else if input.consume_key(Modifiers::NONE, Key::R) {
 				KeyPressed::R
+			} else if input.consume_key(Modifiers::NONE, Key::D) {
+				KeyPressed::D
 			} else {
 				KeyPressed::None
 			}
@@ -1086,12 +1096,16 @@ impl eframe::App for App {
 				use ErrorButtons::*;
 				let ferris = match self.error_state.ferris {
 					Happy => &self.img.happy,
+					Cute => &self.img.cute,
 					Oops  => &self.img.oops,
 					Error => &self.img.error,
 					Panic => &self.img.panic,
 					ErrorFerris::Sudo => &self.img.sudo,
 				};
-				ferris.show_max_size(ui, Vec2::new(width, height));
+				match self.error_state.buttons {
+					Debug => ui.add_sized([width, height/4.0], Label::new("--- Debug Info ---")),
+					    _ => ferris.show_max_size(ui, Vec2::new(width, height)),
+				};
 
 				// Error/Quit screen
 				match self.error_state.buttons {
@@ -1119,6 +1133,10 @@ impl eframe::App for App {
 						ui.add_sized([width/2.0, height], Label::new(text));
 						ui.add_sized([width, height], Hyperlink::from_label_and_url("Click here for more info.", "https://xmrig.com/docs/miner/randomx-optimization-guide"))
 					},
+					Debug => {
+						ui.style_mut().override_text_style = Some(Monospace);
+						ui.add_sized([width, height/4.0], TextEdit::multiline(&mut self.error_state.msg.as_str()))
+					},
 					_ => {
 						match self.error_state.ferris {
 							Panic => ui.add_sized([width, height], Label::new("--- Gupax has encountered an un-recoverable error! ---")),
@@ -1229,7 +1247,7 @@ impl eframe::App for App {
 							self.error_state.reset();
 						}
 					},
-					Okay|WindowsAdmin => if key.is_esc() || ui.add_sized([width, height], Button::new("Okay")).clicked() { self.error_state.reset(); },
+					Okay|WindowsAdmin|Debug => if key.is_esc() || ui.add_sized([width, height], Button::new("Okay")).clicked() { self.error_state.reset(); },
 					Quit => if ui.add_sized([width, height], Button::new("Quit")).clicked() { exit(1); },
 				}
 			})});
@@ -1513,6 +1531,54 @@ impl eframe::App for App {
 			match self.tab {
 				Tab::About => {
 					debug!("App | Entering [About] Tab");
+					// If [D], show some debug info with [ErrorState]
+					if key.is_d() {
+						info!("App | Entering [Debug Info]");
+						#[cfg(feature = "distro")]
+						let distro = true;
+						#[cfg(not(feature = "distro"))]
+						let distro = false;
+						let debug_info = format!(
+"Gupax version: {}\n
+Bundled P2Pool version: {}\n
+Bundled XMRig version: {}\n
+Gupax uptime: {} seconds\n
+Internal resolution: {}x{}\n
+Operating system: {}\n
+Max detected threads: {}\n
+Gupax PID: {}\n
+State diff: {}\n
+Admin privilege: {}\n
+Release build: {}\n
+Debug build: {}\n
+Distro build: {}\n
+Build commit: {}\n
+OS Data PATH: {}\n
+Gupax PATH: {}\n
+P2Pool PATH: {}\n
+XMRig PATH: {}",
+							GUPAX_VERSION,
+							P2POOL_VERSION,
+							XMRIG_VERSION,
+							self.now.elapsed().as_secs_f32(),
+							self.width as u16,
+							self.height as u16,
+							OS_NAME,
+							self.max_threads,
+							self.pid,
+							self.diff,
+							self.admin,
+							!cfg!(debug_assertions),
+							cfg!(debug_assertions),
+							distro,
+							COMMIT,
+							self.os_data_path.display(),
+							self.exe,
+							self.state.gupax.absolute_p2pool_path.display(),
+							self.state.gupax.absolute_xmrig_path.display(),
+						);
+						self.error_state.set(debug_info, ErrorFerris::Cute, ErrorButtons::Debug);
+					}
 					let width = self.width;
 					let height = self.height/30.0;
 					let max_height = self.height;