mirror of
https://github.com/hinto-janai/gupax.git
synced 2024-11-17 09:47:36 +00:00
Status Submenu: add submenu UI to [Status] tab
This commit is contained in:
parent
51816323cd
commit
a66e52bee5
5 changed files with 86 additions and 10 deletions
|
@ -482,7 +482,7 @@ You need [`cargo`](https://www.rust-lang.org/learn/get-started), Rust's build to
|
||||||
|
|
||||||
The `--release` profile in Gupax is set to prefer code performance & small binary sizes over compilation speed (see [`Cargo.toml`](https://github.com/hinto-janaiyo/gupax/blob/main/Cargo.toml)). Gupax itself (with all dependencies already built) takes around 1m30s to build (vs 10s on a normal `--release`) with a Ryzen 5950x.
|
The `--release` profile in Gupax is set to prefer code performance & small binary sizes over compilation speed (see [`Cargo.toml`](https://github.com/hinto-janaiyo/gupax/blob/main/Cargo.toml)). Gupax itself (with all dependencies already built) takes around 1m30s to build (vs 10s on a normal `--release`) with a Ryzen 5950x.
|
||||||
|
|
||||||
There are `25` unit tests throughout the codebase files, you should probably run:
|
There are `26` unit tests throughout the codebase files, you should probably run:
|
||||||
```
|
```
|
||||||
cargo test
|
cargo test
|
||||||
```
|
```
|
||||||
|
|
|
@ -63,8 +63,10 @@ r#"*---------------------------------------*
|
||||||
| Escape | Quit screen |
|
| Escape | Quit screen |
|
||||||
| Up | Start/Restart |
|
| Up | Start/Restart |
|
||||||
| Down | Stop |
|
| Down | Stop |
|
||||||
| Z | Switch to Left Tab |
|
| Z | Left Tab |
|
||||||
| X | Switch to Right Tab |
|
| X | Right Tab |
|
||||||
|
| C | Left Submenu |
|
||||||
|
| V | Right Submenu |
|
||||||
| S | Save |
|
| S | Save |
|
||||||
| R | Reset |
|
| R | Reset |
|
||||||
*---------------------------------------*"#;
|
*---------------------------------------*"#;
|
||||||
|
@ -173,6 +175,10 @@ pub const STATUS_XMRIG_DIFFICULTY: &str = "The current difficulty of the job XMR
|
||||||
pub const STATUS_XMRIG_SHARES: &str = "The amount of accepted and rejected shares";
|
pub const STATUS_XMRIG_SHARES: &str = "The amount of accepted and rejected shares";
|
||||||
pub const STATUS_XMRIG_POOL: &str = "The pool XMRig is currently mining to";
|
pub const STATUS_XMRIG_POOL: &str = "The pool XMRig is currently mining to";
|
||||||
pub const STATUS_XMRIG_THREADS: &str = "The amount of threads XMRig is currently using";
|
pub const STATUS_XMRIG_THREADS: &str = "The amount of threads XMRig is currently using";
|
||||||
|
// Status Submenus
|
||||||
|
pub const STATUS_SUBMENU_PROCESSES: &str = "View the status of process related data for [Gupax|P2Pool|XMRig]";
|
||||||
|
pub const STATUS_SUBMENU_P2POOL: &str = "View P2Pool specific data";
|
||||||
|
pub const STATUS_SUBMENU_MONERO: &str = "View general Monero blockchain data";
|
||||||
|
|
||||||
// Gupax
|
// Gupax
|
||||||
pub const GUPAX_UPDATE: &str = "Check for updates on Gupax, P2Pool, and XMRig via GitHub's API and upgrade automatically";
|
pub const GUPAX_UPDATE: &str = "Check for updates on Gupax, P2Pool, and XMRig via GitHub's API and upgrade automatically";
|
||||||
|
|
|
@ -209,6 +209,14 @@ impl HumanNumber {
|
||||||
let hash = format!("{:.3} GH/s", hash);
|
let hash = format!("{:.3} GH/s", hash);
|
||||||
Self(hash)
|
Self(hash)
|
||||||
}
|
}
|
||||||
|
pub fn from_f64_13_floating_point(f: f64) -> Self {
|
||||||
|
let f = format!("{:.13}", f);
|
||||||
|
Self(f)
|
||||||
|
}
|
||||||
|
pub fn from_f64_no_fmt(f: f64) -> Self {
|
||||||
|
let f = format!("{}", f);
|
||||||
|
Self(f)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------- TESTS
|
//---------------------------------------------------------------------------------------------------- TESTS
|
||||||
|
|
67
src/main.rs
67
src/main.rs
|
@ -649,6 +649,8 @@ enum KeyPressed {
|
||||||
Esc,
|
Esc,
|
||||||
Z,
|
Z,
|
||||||
X,
|
X,
|
||||||
|
C,
|
||||||
|
V,
|
||||||
S,
|
S,
|
||||||
R,
|
R,
|
||||||
D,
|
D,
|
||||||
|
@ -683,6 +685,12 @@ impl KeyPressed {
|
||||||
fn is_d(&self) -> bool {
|
fn is_d(&self) -> bool {
|
||||||
*self == Self::D
|
*self == Self::D
|
||||||
}
|
}
|
||||||
|
fn is_c(&self) -> bool {
|
||||||
|
*self == Self::C
|
||||||
|
}
|
||||||
|
fn is_v(&self) -> bool {
|
||||||
|
*self == Self::V
|
||||||
|
}
|
||||||
fn is_none(&self) -> bool {
|
fn is_none(&self) -> bool {
|
||||||
*self == Self::None
|
*self == Self::None
|
||||||
}
|
}
|
||||||
|
@ -1006,6 +1014,10 @@ impl eframe::App for App {
|
||||||
KeyPressed::Z
|
KeyPressed::Z
|
||||||
} else if input.consume_key(Modifiers::NONE, Key::X) {
|
} else if input.consume_key(Modifiers::NONE, Key::X) {
|
||||||
KeyPressed::X
|
KeyPressed::X
|
||||||
|
} else if input.consume_key(Modifiers::NONE, Key::C) {
|
||||||
|
KeyPressed::C
|
||||||
|
} else if input.consume_key(Modifiers::NONE, Key::V) {
|
||||||
|
KeyPressed::V
|
||||||
} else if input.consume_key(Modifiers::NONE, Key::ArrowUp) {
|
} else if input.consume_key(Modifiers::NONE, Key::ArrowUp) {
|
||||||
KeyPressed::Up
|
KeyPressed::Up
|
||||||
} else if input.consume_key(Modifiers::NONE, Key::ArrowDown) {
|
} else if input.consume_key(Modifiers::NONE, Key::ArrowDown) {
|
||||||
|
@ -1049,6 +1061,36 @@ impl eframe::App for App {
|
||||||
Tab::P2pool => self.tab = Tab::Xmrig,
|
Tab::P2pool => self.tab = Tab::Xmrig,
|
||||||
Tab::Xmrig => self.tab = Tab::About,
|
Tab::Xmrig => self.tab = Tab::About,
|
||||||
};
|
};
|
||||||
|
// Change Submenu LEFT
|
||||||
|
} else if key.is_c() && !wants_input {
|
||||||
|
match self.tab {
|
||||||
|
Tab::Status => {
|
||||||
|
match self.state.status.submenu {
|
||||||
|
Submenu::Processes => self.state.status.submenu = Submenu::Monero,
|
||||||
|
Submenu::P2pool => self.state.status.submenu = Submenu::Processes,
|
||||||
|
Submenu::Monero => self.state.status.submenu = Submenu::P2pool,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Tab::Gupax => self.state.gupax.simple = !self.state.gupax.simple,
|
||||||
|
Tab::P2pool => self.state.p2pool.simple = !self.state.p2pool.simple,
|
||||||
|
Tab::Xmrig => self.state.xmrig.simple = !self.state.xmrig.simple,
|
||||||
|
_ => (),
|
||||||
|
};
|
||||||
|
// Change Submenu RIGHT
|
||||||
|
} else if key.is_v() && !wants_input {
|
||||||
|
match self.tab {
|
||||||
|
Tab::Status => {
|
||||||
|
match self.state.status.submenu {
|
||||||
|
Submenu::Processes => self.state.status.submenu = Submenu::P2pool,
|
||||||
|
Submenu::P2pool => self.state.status.submenu = Submenu::Monero,
|
||||||
|
Submenu::Monero => self.state.status.submenu = Submenu::Processes,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Tab::Gupax => self.state.gupax.simple = !self.state.gupax.simple,
|
||||||
|
Tab::P2pool => self.state.p2pool.simple = !self.state.p2pool.simple,
|
||||||
|
Tab::Xmrig => self.state.xmrig.simple = !self.state.xmrig.simple,
|
||||||
|
_ => (),
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// Refresh AT LEAST once a second
|
// Refresh AT LEAST once a second
|
||||||
|
@ -1398,10 +1440,7 @@ impl eframe::App for App {
|
||||||
|
|
||||||
// [Save/Reset]
|
// [Save/Reset]
|
||||||
ui.with_layout(Layout::right_to_left(Align::RIGHT), |ui| {
|
ui.with_layout(Layout::right_to_left(Align::RIGHT), |ui| {
|
||||||
let width = match self.tab {
|
let width = (ui.available_width()/3.0)-(SPACE*3.0);
|
||||||
Tab::Gupax => (ui.available_width()/2.0)-(SPACE*3.0),
|
|
||||||
_ => (ui.available_width()/3.0)-(SPACE*3.0),
|
|
||||||
};
|
|
||||||
ui.group(|ui| {
|
ui.group(|ui| {
|
||||||
ui.set_enabled(self.diff);
|
ui.set_enabled(self.diff);
|
||||||
let width = width / 2.0;
|
let width = width / 2.0;
|
||||||
|
@ -1440,9 +1479,25 @@ impl eframe::App for App {
|
||||||
|
|
||||||
// [Simple/Advanced] + [Start/Stop/Restart]
|
// [Simple/Advanced] + [Start/Stop/Restart]
|
||||||
match self.tab {
|
match self.tab {
|
||||||
|
Tab::Status => {
|
||||||
|
ui.group(|ui| {
|
||||||
|
let width = (ui.available_width() / 3.0)-14.25;
|
||||||
|
if ui.add_sized([width, height], SelectableLabel::new(self.state.status.submenu == Submenu::Monero, "Monero")).on_hover_text(STATUS_SUBMENU_MONERO).clicked() {
|
||||||
|
self.state.status.submenu = Submenu::Monero;
|
||||||
|
}
|
||||||
|
ui.separator();
|
||||||
|
if ui.add_sized([width, height], SelectableLabel::new(self.state.status.submenu == Submenu::P2pool, "P2Pool")).on_hover_text(STATUS_SUBMENU_P2POOL).clicked() {
|
||||||
|
self.state.status.submenu = Submenu::P2pool;
|
||||||
|
}
|
||||||
|
ui.separator();
|
||||||
|
if ui.add_sized([width, height], SelectableLabel::new(self.state.status.submenu == Submenu::Processes, "Processes")).on_hover_text(STATUS_SUBMENU_PROCESSES).clicked() {
|
||||||
|
self.state.status.submenu = Submenu::Processes;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
Tab::Gupax => {
|
Tab::Gupax => {
|
||||||
ui.group(|ui| {
|
ui.group(|ui| {
|
||||||
let width = width / 2.0;
|
let width = (ui.available_width() / 2.0)-10.5;
|
||||||
if ui.add_sized([width, height], SelectableLabel::new(!self.state.gupax.simple, "Advanced")).on_hover_text(GUPAX_ADVANCED).clicked() {
|
if ui.add_sized([width, height], SelectableLabel::new(!self.state.gupax.simple, "Advanced")).on_hover_text(GUPAX_ADVANCED).clicked() {
|
||||||
self.state.gupax.simple = false;
|
self.state.gupax.simple = false;
|
||||||
}
|
}
|
||||||
|
@ -1698,7 +1753,7 @@ XMRig console byte length: {}\n
|
||||||
}
|
}
|
||||||
Tab::Status => {
|
Tab::Status => {
|
||||||
debug!("App | Entering [Status] Tab");
|
debug!("App | Entering [Status] Tab");
|
||||||
crate::disk::Status::show(&self.pub_sys, &self.p2pool_api, &self.xmrig_api, &self.p2pool_img, &self.xmrig_img, p2pool_is_alive, xmrig_is_alive, self.max_threads, self.width, self.height, ctx, ui);
|
crate::disk::Status::show(&mut self.state.status, &self.pub_sys, &self.p2pool_api, &self.xmrig_api, &self.p2pool_img, &self.xmrig_img, p2pool_is_alive, xmrig_is_alive, self.max_threads, self.width, self.height, ctx, ui);
|
||||||
}
|
}
|
||||||
Tab::Gupax => {
|
Tab::Gupax => {
|
||||||
debug!("App | Entering [Gupax] Tab");
|
debug!("App | Entering [Gupax] Tab");
|
||||||
|
|
|
@ -22,6 +22,8 @@ use crate::{
|
||||||
ImgXmrig,
|
ImgXmrig,
|
||||||
constants::*,
|
constants::*,
|
||||||
Sys,
|
Sys,
|
||||||
|
Hash,
|
||||||
|
Submenu,
|
||||||
};
|
};
|
||||||
use std::sync::{Arc,Mutex};
|
use std::sync::{Arc,Mutex};
|
||||||
use log::*;
|
use log::*;
|
||||||
|
@ -32,7 +34,9 @@ use egui::{
|
||||||
};
|
};
|
||||||
|
|
||||||
impl crate::disk::Status {
|
impl crate::disk::Status {
|
||||||
pub fn show(sys: &Arc<Mutex<Sys>>, p2pool_api: &Arc<Mutex<PubP2poolApi>>, xmrig_api: &Arc<Mutex<PubXmrigApi>>, p2pool_img: &Arc<Mutex<ImgP2pool>>, xmrig_img: &Arc<Mutex<ImgXmrig>>, p2pool_alive: bool, xmrig_alive: bool, max_threads: usize, width: f32, height: f32, _ctx: &egui::Context, ui: &mut egui::Ui) {
|
pub fn show(&mut self, sys: &Arc<Mutex<Sys>>, p2pool_api: &Arc<Mutex<PubP2poolApi>>, xmrig_api: &Arc<Mutex<PubXmrigApi>>, p2pool_img: &Arc<Mutex<ImgP2pool>>, xmrig_img: &Arc<Mutex<ImgXmrig>>, p2pool_alive: bool, xmrig_alive: bool, max_threads: usize, width: f32, height: f32, _ctx: &egui::Context, ui: &mut egui::Ui) {
|
||||||
|
//---------------------------------------------------------------------------------------------------- [Processes]
|
||||||
|
if self.submenu == Submenu::Processes {
|
||||||
let width = (width/3.0)-(SPACE*1.666);
|
let width = (width/3.0)-(SPACE*1.666);
|
||||||
let min_height = height/1.1;
|
let min_height = height/1.1;
|
||||||
let height = height/25.0;
|
let height = height/25.0;
|
||||||
|
@ -118,5 +122,8 @@ pub fn show(sys: &Arc<Mutex<Sys>>, p2pool_api: &Arc<Mutex<PubP2poolApi>>, xmrig_
|
||||||
drop(api);
|
drop(api);
|
||||||
})});
|
})});
|
||||||
});
|
});
|
||||||
|
} else if self.submenu == Submenu::P2pool {
|
||||||
|
} else if self.submenu == Submenu::Monero {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue