mirror of
https://github.com/Cyrix126/gupaxx.git
synced 2024-12-22 14:49:21 +00:00
fix threads, gupax tab, inline about tab
This commit is contained in:
parent
773bc65593
commit
14a5538173
7 changed files with 139 additions and 128 deletions
23
README.md
23
README.md
|
@ -3,23 +3,18 @@
|
||||||
**Gupax** (*guh-picks*) is a cross-platform GUI for mining [**Monero**](https://github.com/monero-project/monero) on the decentralized [**P2Pool**](https://github.com/SChernykh/p2pool), using the dedicated [**XMRig**](https://github.com/xmrig/xmrig) miner for max hashrate.
|
**Gupax** (*guh-picks*) is a cross-platform GUI for mining [**Monero**](https://github.com/monero-project/monero) on the decentralized [**P2Pool**](https://github.com/SChernykh/p2pool), using the dedicated [**XMRig**](https://github.com/xmrig/xmrig) miner for max hashrate.
|
||||||
|
|
||||||
## Demo
|
## Demo
|
||||||
* <details>
|
https://user-images.githubusercontent.com/101352116/194763334-d8e936c9-a71e-474e-ac65-3a339b96a9d2.mp4
|
||||||
<summary>Click me to load the demo!</summary>
|
|
||||||
|
|
||||||
https://user-images.githubusercontent.com/101352116/194763334-d8e936c9-a71e-474e-ac65-3a339b96a9d2.mp4
|
<details>
|
||||||
|
<summary>Click me to load images!</summary>
|
||||||
|
|
||||||
</details>
|
![about.png](https://github.com/hinto-janaiyo/gupax/blob/main/images/tabs/about.png)
|
||||||
|
![status.png](https://github.com/hinto-janaiyo/gupax/blob/main/images/tabs/status.png)
|
||||||
|
![gupax.png](https://github.com/hinto-janaiyo/gupax/blob/main/images/tabs/gupax.png)
|
||||||
|
![p2pool.png](https://github.com/hinto-janaiyo/gupax/blob/main/images/tabs/p2pool.png)
|
||||||
|
![xmrig.png](https://github.com/hinto-janaiyo/gupax/blob/main/images/tabs/xmrig.png)
|
||||||
|
|
||||||
* <details>
|
</details>
|
||||||
<summary>Click me to load images!</summary>
|
|
||||||
|
|
||||||
![about.png](https://github.com/hinto-janaiyo/gupax/blob/main/images/tabs/about.png)
|
|
||||||
![status.png](https://github.com/hinto-janaiyo/gupax/blob/main/images/tabs/status.png)
|
|
||||||
![gupax.png](https://github.com/hinto-janaiyo/gupax/blob/main/images/tabs/gupax.png)
|
|
||||||
![p2pool.png](https://github.com/hinto-janaiyo/gupax/blob/main/images/tabs/p2pool.png)
|
|
||||||
![xmrig.png](https://github.com/hinto-janaiyo/gupax/blob/main/images/tabs/xmrig.png)
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
|
|
||||||
## Implementation
|
## Implementation
|
||||||
|
|
|
@ -6,15 +6,14 @@
|
||||||
## Structure
|
## Structure
|
||||||
| File/Folder | Purpose |
|
| File/Folder | Purpose |
|
||||||
|----------------|---------|
|
|----------------|---------|
|
||||||
| `about.rs` | Struct/impl for `About` tab
|
|
||||||
| `constants.rs` | General constants needed in Gupax
|
| `constants.rs` | General constants needed in Gupax
|
||||||
| `gupax.rs` | Struct/impl for `Gupax` tab
|
| `gupax.rs` | Impl for `Gupax` tab
|
||||||
| `main.rs` | Struct/enum/impl for `App/Tab/State`, init functions, main function
|
| `main.rs` | Struct/enum/impl for `App/Tab/State`, init functions, main function
|
||||||
| `node.rs` | Struct/impl for Community Nodes
|
| `node.rs` | Struct/impl for Community Nodes
|
||||||
| `p2pool.rs` | Struct/impl for `P2Pool` tab
|
| `p2pool.rs` | Impl for `P2Pool` tab
|
||||||
| `state.rs` | Struct/impl for `gupax.toml`, the disk state
|
| `state.rs` | Struct/impl for `gupax.toml`, the disk state. This holds the structs representing tabs with mutable state (Gupax/P2Pool/XMRig)
|
||||||
| `status.rs` | Struct/impl for `Status` tab
|
| `status.rs` | Struct/impl for `Status` tab
|
||||||
| `xmrig.rs` | Struct/impl for `XMRig` tab
|
| `xmrig.rs` | Impl for `XMRig` tab
|
||||||
|
|
||||||
## Bootstrap
|
## Bootstrap
|
||||||
This is how Gupax works internally when starting up, divided into 3 sections.
|
This is how Gupax works internally when starting up, divided into 3 sections.
|
||||||
|
|
|
@ -15,9 +15,10 @@
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
pub const GUPAX_VERSION: &'static str = "v0.1.0";
|
pub const GUPAX_VERSION: &'static str = concat!("v", env!("CARGO_PKG_VERSION"));
|
||||||
pub const P2POOL_VERSION: &'static str = "v2.4";
|
pub const P2POOL_VERSION: &'static str = "v2.4";
|
||||||
pub const XMRIG_VERSION: &'static str = "v6.18.0";
|
pub const XMRIG_VERSION: &'static str = "v6.18.0";
|
||||||
|
pub const COMMIT: &'static str = include_str!("../.git/refs/heads/main");
|
||||||
|
|
||||||
pub const BYTES_ICON: &[u8] = include_bytes!("../images/png/icon.png");
|
pub const BYTES_ICON: &[u8] = include_bytes!("../images/png/icon.png");
|
||||||
pub const BYTES_BANNER: &[u8] = include_bytes!("../images/png/banner.png");
|
pub const BYTES_BANNER: &[u8] = include_bytes!("../images/png/banner.png");
|
||||||
|
@ -34,22 +35,26 @@ pub const HUGEPAGES_1GB: bool = false;
|
||||||
#[cfg(target_os = "macos")]
|
#[cfg(target_os = "macos")]
|
||||||
pub const OS: &'static str = " macOS";
|
pub const OS: &'static str = " macOS";
|
||||||
#[cfg(target_os = "macos")]
|
#[cfg(target_os = "macos")]
|
||||||
|
pub const OS_NAME: &'static str = "macOS";
|
||||||
|
#[cfg(target_os = "macos")]
|
||||||
pub const HUGEPAGES_1GB: bool = false;
|
pub const HUGEPAGES_1GB: bool = false;
|
||||||
|
|
||||||
#[cfg(target_os = "linux")]
|
#[cfg(target_os = "linux")]
|
||||||
pub const OS: &'static str = "🐧 Linux";
|
pub const OS: &'static str = "🐧 Linux";
|
||||||
#[cfg(target_os = "linux")]
|
#[cfg(target_os = "linux")]
|
||||||
|
pub const OS_NAME: &'static str = "Linux";
|
||||||
|
#[cfg(target_os = "linux")]
|
||||||
pub const HUGEPAGES_1GB: bool = true;
|
pub const HUGEPAGES_1GB: bool = true;
|
||||||
|
|
||||||
// Tooltips
|
// Tooltips
|
||||||
// Gupax
|
// Gupax
|
||||||
pub const GUPAX_CHECK_FOR_UPDATES: &'static str = "Check for Gupax, P2Pool, and XMRig updates via GitHub's API";
|
pub const GUPAX_UPDATE: &'static str = "Update Gupax, P2Pool, and XMRig via GitHub's API";
|
||||||
pub const GUPAX_UPGRADE: &'static str = "Upgrade anything that is out-of-date";
|
|
||||||
pub const GUPAX_AUTO_UPDATE: &'static str = "Automatically check for updates at startup";
|
pub const GUPAX_AUTO_UPDATE: &'static str = "Automatically check for updates at startup";
|
||||||
pub const GUPAX_ASK_BEFORE_QUIT: &'static str = "Ask before quitting if processes are still alive";
|
pub const GUPAX_AUTO_NODE: &'static str = "Automatically ping the community Monero nodes and select the fastest at startup";
|
||||||
pub const GUPAX_PATH_CONFIG: &'static str = "The location of the Gupax configuration file";
|
pub const GUPAX_ASK_BEFORE_QUIT: &'static str = "Ask before quitting if processes are still alive, or if an update is in progress";
|
||||||
pub const GUPAX_PATH_P2POOL: &'static str = "The location of the P2Pool binary";
|
pub const GUPAX_SAVE_BEFORE_QUIT: &'static str = "Automatically save any changed settings before quitting";
|
||||||
pub const GUPAX_PATH_XMRIG: &'static str = "The location of the XMRig binary";
|
pub const GUPAX_PATH_P2POOL: &'static str = "The location of the P2Pool binary, both absolute and relative paths are accepted";
|
||||||
|
pub const GUPAX_PATH_XMRIG: &'static str = "The location of the XMRig binary, both absolute and relative paths are accepted";
|
||||||
// P2Pool
|
// P2Pool
|
||||||
pub const P2POOL_MAIN: &'static str = "The P2Pool main-chain. This P2Pool finds shares faster, but has a higher difficulty. Suitable for miners with more than 50kH/s";
|
pub const P2POOL_MAIN: &'static str = "The P2Pool main-chain. This P2Pool finds shares faster, but has a higher difficulty. Suitable for miners with more than 50kH/s";
|
||||||
pub const P2POOL_MINI: &'static str = "The P2Pool mini-chain. This P2Pool finds shares slower, but has a lower difficulty. Suitable for miners with less than 50kH/s";
|
pub const P2POOL_MINI: &'static str = "The P2Pool mini-chain. This P2Pool finds shares slower, but has a lower difficulty. Suitable for miners with less than 50kH/s";
|
||||||
|
@ -77,9 +82,8 @@ r#"USAGE: gupax [--flags]
|
||||||
-n | --no-startup Disable auto-update/node connections at startup
|
-n | --no-startup Disable auto-update/node connections at startup
|
||||||
-r | --reset Reset all Gupax configuration/state"#;
|
-r | --reset Reset all Gupax configuration/state"#;
|
||||||
pub const ARG_COPYRIGHT: &'static str =
|
pub const ARG_COPYRIGHT: &'static str =
|
||||||
r#"For more information:
|
r#"Gupax, P2Pool, and XMRig are licensed under GPLv3.
|
||||||
https://github.com/hinto-janaiyo/gupax
|
For more information, see here:
|
||||||
https://github.com/SChernykh/p2pool
|
- https://github.com/hinto-janaiyo/gupax
|
||||||
https://github.com/xmrig/xmrig
|
- https://github.com/SChernykh/p2pool
|
||||||
|
- https://github.com/xmrig/xmrig"#;
|
||||||
Gupax, P2Pool, and XMRig are licensed under GPLv3."#;
|
|
||||||
|
|
56
src/gupax.rs
56
src/gupax.rs
|
@ -19,32 +19,9 @@ use std::path::Path;
|
||||||
use crate::App;
|
use crate::App;
|
||||||
use egui::WidgetType::Button;
|
use egui::WidgetType::Button;
|
||||||
use crate::constants::*;
|
use crate::constants::*;
|
||||||
|
use crate::state::Gupax;
|
||||||
// Main data structure for the Gupax tab
|
|
||||||
#[derive(Clone, Debug, Eq, PartialEq)]
|
|
||||||
pub struct Gupax {
|
|
||||||
auto_update: bool,
|
|
||||||
ask_before_quit: bool,
|
|
||||||
updating: bool,
|
|
||||||
upgrading: bool,
|
|
||||||
config: String,
|
|
||||||
p2pool: String,
|
|
||||||
xmrig: String,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Gupax {
|
impl Gupax {
|
||||||
pub fn new() -> Self {
|
|
||||||
Self {
|
|
||||||
auto_update: false,
|
|
||||||
ask_before_quit: true,
|
|
||||||
updating: false,
|
|
||||||
upgrading: false,
|
|
||||||
config: String::from("/home/hinto/gupax/gupax.toml"),
|
|
||||||
p2pool: String::from("/home/hinto/gupax/p2pool"),
|
|
||||||
xmrig: String::from("/home/hinto/gupax/xmrig"),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn show(state: &mut Gupax, ctx: &egui::Context, ui: &mut egui::Ui) {
|
pub fn show(state: &mut Gupax, ctx: &egui::Context, ui: &mut egui::Ui) {
|
||||||
let height = ui.available_height();
|
let height = ui.available_height();
|
||||||
let width = ui.available_width();
|
let width = ui.available_width();
|
||||||
|
@ -54,41 +31,40 @@ impl Gupax {
|
||||||
ui.horizontal(|ui| {
|
ui.horizontal(|ui| {
|
||||||
ui.group(|ui| {
|
ui.group(|ui| {
|
||||||
ui.vertical(|ui| {
|
ui.vertical(|ui| {
|
||||||
ui.add_sized([half_width - 8.0, half_height], egui::Button::new("Check for updates")).on_hover_text(GUPAX_CHECK_FOR_UPDATES);
|
ui.add_sized([half_width - 8.0, half_height], egui::Button::new("Check for updates")).on_hover_text(GUPAX_UPDATE);
|
||||||
ui.set_enabled(false);
|
ui.set_enabled(false);
|
||||||
ui.add_sized([half_width - 8.0, half_height], egui::Button::new("Upgrade")).on_hover_text(GUPAX_UPGRADE);
|
ui.add_sized([half_width - 8.0, half_height], egui::Button::new("Upgrade")).on_hover_text("asdf");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
ui.group(|ui| {
|
ui.group(|ui| {
|
||||||
|
let mut style = (*ctx.style()).clone();
|
||||||
|
style.spacing.icon_width_inner = ui.available_height() / 6.0;
|
||||||
|
style.spacing.icon_width = ui.available_height() / 4.0;
|
||||||
|
style.spacing.icon_spacing = ui.available_width() / 20.0;
|
||||||
|
ctx.set_style(style);
|
||||||
|
let half_width = (half_width/2.0)-15.0;
|
||||||
ui.vertical(|ui| {
|
ui.vertical(|ui| {
|
||||||
let mut style = (*ctx.style()).clone();
|
|
||||||
style.spacing.icon_width_inner = ui.available_height() / 6.0;
|
|
||||||
style.spacing.icon_width = ui.available_height() / 4.0;
|
|
||||||
style.spacing.icon_spacing = ui.available_width() / 20.0;
|
|
||||||
ctx.set_style(style);
|
|
||||||
ui.add_sized([half_width, half_height], egui::Checkbox::new(&mut state.auto_update, "Auto-update")).on_hover_text(GUPAX_AUTO_UPDATE);
|
ui.add_sized([half_width, half_height], egui::Checkbox::new(&mut state.auto_update, "Auto-update")).on_hover_text(GUPAX_AUTO_UPDATE);
|
||||||
|
|
||||||
ui.add_sized([half_width, half_height], egui::Checkbox::new(&mut state.ask_before_quit, "Ask before quitting")).on_hover_text(GUPAX_ASK_BEFORE_QUIT);
|
ui.add_sized([half_width, half_height], egui::Checkbox::new(&mut state.ask_before_quit, "Ask before quitting")).on_hover_text(GUPAX_ASK_BEFORE_QUIT);
|
||||||
});
|
});
|
||||||
|
ui.vertical(|ui| {
|
||||||
|
ui.add_sized([half_width, half_height], egui::Checkbox::new(&mut state.auto_node, "Auto-node")).on_hover_text(GUPAX_AUTO_NODE);
|
||||||
|
ui.add_sized([half_width, half_height], egui::Checkbox::new(&mut state.save_before_quit, "Save before quitting")).on_hover_text(GUPAX_SAVE_BEFORE_QUIT);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
ui.add_space(10.0);
|
ui.add_space(10.0);
|
||||||
|
|
||||||
ui.horizontal(|ui| {
|
|
||||||
ui.label("Gupax config path: ");
|
|
||||||
ui.spacing_mut().text_edit_width = ui.available_width() - 35.0;
|
|
||||||
ui.text_edit_singleline(&mut state.config).on_hover_text(GUPAX_PATH_CONFIG);
|
|
||||||
});
|
|
||||||
ui.horizontal(|ui| {
|
ui.horizontal(|ui| {
|
||||||
ui.label("P2Pool binary path:");
|
ui.label("P2Pool binary path:");
|
||||||
ui.spacing_mut().text_edit_width = ui.available_width() - 35.0;
|
ui.spacing_mut().text_edit_width = ui.available_width() - 35.0;
|
||||||
ui.text_edit_singleline(&mut state.p2pool).on_hover_text(GUPAX_PATH_P2POOL);
|
ui.text_edit_singleline(&mut state.p2pool_path).on_hover_text(GUPAX_PATH_P2POOL);
|
||||||
});
|
});
|
||||||
ui.horizontal(|ui| {
|
ui.horizontal(|ui| {
|
||||||
ui.label("XMRig binary path: ");
|
ui.label("XMRig binary path: ");
|
||||||
ui.spacing_mut().text_edit_width = ui.available_width() - 35.0;
|
ui.spacing_mut().text_edit_width = ui.available_width() - 35.0;
|
||||||
ui.text_edit_singleline(&mut state.xmrig).on_hover_text(GUPAX_PATH_XMRIG);
|
ui.text_edit_singleline(&mut state.xmrig_path).on_hover_text(GUPAX_PATH_XMRIG);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
113
src/main.rs
113
src/main.rs
|
@ -23,6 +23,7 @@ use egui::TextStyle::*;
|
||||||
use egui::color::Color32;
|
use egui::color::Color32;
|
||||||
use egui::FontFamily::Proportional;
|
use egui::FontFamily::Proportional;
|
||||||
use egui::{FontId,Label,RichText,Stroke,Vec2,Pos2};
|
use egui::{FontId,Label,RichText,Stroke,Vec2,Pos2};
|
||||||
|
use egui::special_emojis::GITHUB;
|
||||||
use egui_extras::RetainedImage;
|
use egui_extras::RetainedImage;
|
||||||
use eframe::{egui,NativeOptions};
|
use eframe::{egui,NativeOptions};
|
||||||
|
|
||||||
|
@ -97,7 +98,7 @@ impl App {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn default() -> Self {
|
fn new() -> Self {
|
||||||
let app = Self {
|
let app = Self {
|
||||||
tab: Tab::default(),
|
tab: Tab::default(),
|
||||||
quit: false,
|
quit: false,
|
||||||
|
@ -116,11 +117,30 @@ impl App {
|
||||||
now: Instant::now(),
|
now: Instant::now(),
|
||||||
resolution: Vec2::new(1280.0, 720.0),
|
resolution: Vec2::new(1280.0, 720.0),
|
||||||
os: OS,
|
os: OS,
|
||||||
version: "v0.0.1".to_string(),
|
version: format!("{}", GUPAX_VERSION),
|
||||||
name_version: "Gupax v0.0.1".to_string(),
|
name_version: format!("Gupax {}", GUPAX_VERSION),
|
||||||
banner: RetainedImage::from_image_bytes("banner.png", BYTES_BANNER).expect("oops"),
|
banner: RetainedImage::from_image_bytes("banner.png", BYTES_BANNER).expect("oops"),
|
||||||
};
|
};
|
||||||
parse_args(app)
|
// Apply arg state
|
||||||
|
let mut app = parse_args(app);
|
||||||
|
// Read disk state if no [--reset] arg
|
||||||
|
if app.reset == false {
|
||||||
|
app.og = match State::get() {
|
||||||
|
Ok(toml) => toml,
|
||||||
|
Err(err) => {
|
||||||
|
error!("{}", err);
|
||||||
|
let error_msg = err.to_string();
|
||||||
|
let options = Panic::options();
|
||||||
|
eframe::run_native("Gupax", options, Box::new(|cc| Box::new(Panic::new(cc, error_msg))),);
|
||||||
|
exit(1);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
// Make sure thread count is accurate/doesn't overflow
|
||||||
|
app.og.xmrig.max_threads = num_cpus::get();
|
||||||
|
if app.og.xmrig.current_threads > app.og.xmrig.max_threads { app.og.xmrig.current_threads = app.og.xmrig.max_threads; }
|
||||||
|
app.state = app.og.clone();
|
||||||
|
app
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -238,7 +258,7 @@ fn parse_args(mut app: App) -> App {
|
||||||
match arg.as_str() {
|
match arg.as_str() {
|
||||||
"-h"|"--help" => { println!("{}", ARG_HELP); exit(0); },
|
"-h"|"--help" => { println!("{}", ARG_HELP); exit(0); },
|
||||||
"-v"|"--version" => {
|
"-v"|"--version" => {
|
||||||
println!("Gupax | {}\nP2Pool | {}\nXMRig | {}\n\n{}", GUPAX_VERSION, P2POOL_VERSION, XMRIG_VERSION, ARG_COPYRIGHT);
|
println!("Gupax | {}\nP2Pool | {}\nXMRig | {}\n\nOS: [{}], Commit: [{}]\n\n{}", GUPAX_VERSION, P2POOL_VERSION, XMRIG_VERSION, OS_NAME, &COMMIT[..40], ARG_COPYRIGHT);
|
||||||
exit(0);
|
exit(0);
|
||||||
},
|
},
|
||||||
_ => (),
|
_ => (),
|
||||||
|
@ -300,30 +320,22 @@ impl eframe::App for Panic {
|
||||||
//---------------------------------------------------------------------------------------------------- Main [App] frame
|
//---------------------------------------------------------------------------------------------------- Main [App] frame
|
||||||
fn main() {
|
fn main() {
|
||||||
init_logger();
|
init_logger();
|
||||||
let app = App::default();
|
let app = App::new();
|
||||||
let options = init_options();
|
let options = init_options();
|
||||||
let toml = match State::get() {
|
|
||||||
Ok(toml) => toml,
|
|
||||||
Err(err) => {
|
|
||||||
error!("{}", err);
|
|
||||||
let error_msg = err.to_string();
|
|
||||||
let options = Panic::options();
|
|
||||||
eframe::run_native("Gupax", options, Box::new(|cc| Box::new(Panic::new(cc, error_msg))),);
|
|
||||||
exit(1);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
eframe::run_native("Gupax", options, Box::new(|cc| Box::new(App::cc(cc, app))),);
|
eframe::run_native("Gupax", options, Box::new(|cc| Box::new(App::cc(cc, app))),);
|
||||||
}
|
}
|
||||||
|
|
||||||
impl eframe::App for App {
|
impl eframe::App for App {
|
||||||
fn on_close_event(&mut self) -> bool {
|
fn on_close_event(&mut self) -> bool {
|
||||||
self.quit = true;
|
self.quit = true;
|
||||||
self.quit_confirm
|
if self.og.gupax.ask_before_quit {
|
||||||
|
self.quit_confirm
|
||||||
|
} else {
|
||||||
|
true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update(&mut self, ctx: &egui::Context, frame: &mut eframe::Frame) {
|
fn update(&mut self, ctx: &egui::Context, frame: &mut eframe::Frame) {
|
||||||
// init_text_styles(ctx, 1280.0);
|
|
||||||
|
|
||||||
// Close confirmation.
|
// Close confirmation.
|
||||||
if self.quit {
|
if self.quit {
|
||||||
egui::CentralPanel::default().show(ctx, |ui| {
|
egui::CentralPanel::default().show(ctx, |ui| {
|
||||||
|
@ -332,10 +344,11 @@ impl eframe::App for App {
|
||||||
let width = width - 10.0;
|
let width = width - 10.0;
|
||||||
let height = ui.available_height();
|
let height = ui.available_height();
|
||||||
// Detect processes or update
|
// Detect processes or update
|
||||||
if self.p2pool || self.xmrig {
|
if self.p2pool || self.xmrig || self.updating {
|
||||||
ui.add_sized([width, height/6.0], Label::new("Are you sure you want to quit?"));
|
ui.add_sized([width, height/6.0], Label::new("Are you sure you want to quit?"));
|
||||||
if self.p2pool { ui.add_sized([width, height/6.0], Label::new("P2Pool is online...!")); }
|
if self.updating { ui.add_sized([width, height/9.0], Label::new("Update is in progress...!")); }
|
||||||
if self.xmrig { ui.add_sized([width, height/6.0], Label::new("XMRig is online...!")); }
|
if self.p2pool { ui.add_sized([width, height/9.0], Label::new("P2Pool is online...!")); }
|
||||||
|
if self.xmrig { ui.add_sized([width, height/9.0], Label::new("XMRig is online...!")); }
|
||||||
// Else, just quit
|
// Else, just quit
|
||||||
} else {
|
} else {
|
||||||
if self.state.gupax.save_before_quit {
|
if self.state.gupax.save_before_quit {
|
||||||
|
@ -383,27 +396,6 @@ impl eframe::App for App {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// If ping-ING, display stats
|
|
||||||
// if *self.pinging.lock().unwrap() {
|
|
||||||
// egui::CentralPanel::default().show(ctx, |ui| {
|
|
||||||
// let width = ui.available_width();
|
|
||||||
// let width = width - 10.0;
|
|
||||||
// let height = ui.available_height();
|
|
||||||
// init_text_styles(ctx, width);
|
|
||||||
// ui.add_sized([width, height/2.0], Label::new(format!("In progress: {}", *self.pinging.lock().unwrap())));
|
|
||||||
// ui.group(|ui| {
|
|
||||||
// if ui.add_sized([width, height/10.0], egui::Button::new("Yes")).clicked() {
|
|
||||||
// info!("Quit confirmation = yes ... goodbye!");
|
|
||||||
// exit(0);
|
|
||||||
// } else if ui.add_sized([width, height/10.0], egui::Button::new("No")).clicked() {
|
|
||||||
// info!("Quit confirmation = no ... returning!");
|
|
||||||
// self.show_confirmation_dialog = false;
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
// });
|
|
||||||
// return
|
|
||||||
// }
|
|
||||||
|
|
||||||
// Top: Tabs
|
// Top: Tabs
|
||||||
egui::CentralPanel::default().show(ctx, |ui| {
|
egui::CentralPanel::default().show(ctx, |ui| {
|
||||||
init_text_styles(ctx, ui.available_width());
|
init_text_styles(ctx, ui.available_width());
|
||||||
|
@ -439,19 +431,19 @@ impl eframe::App for App {
|
||||||
ui.horizontal(|ui| {
|
ui.horizontal(|ui| {
|
||||||
ui.group(|ui| {
|
ui.group(|ui| {
|
||||||
let width = width / 2.0;
|
let width = width / 2.0;
|
||||||
ui.add_sized([width, height], Label::new(&self.name_version));
|
ui.add_sized([width, height], Label::new(&*self.name_version));
|
||||||
ui.separator();
|
ui.separator();
|
||||||
ui.add_sized([width, height], Label::new(self.os));
|
ui.add_sized([width, height], Label::new(self.os));
|
||||||
ui.separator();
|
ui.separator();
|
||||||
ui.add_sized([width/1.5, height], Label::new("P2Pool"));
|
ui.add_sized([width/1.5, height], Label::new("P2Pool"));
|
||||||
if self.p2pool == true {
|
if self.p2pool {
|
||||||
ui.add_sized([width/4.0, height], Label::new(RichText::new("⏺").color(Color32::from_rgb(100, 230, 100))));
|
ui.add_sized([width/4.0, height], Label::new(RichText::new("⏺").color(Color32::from_rgb(100, 230, 100))));
|
||||||
} else {
|
} else {
|
||||||
ui.add_sized([width/4.0, height], Label::new(RichText::new("⏺").color(Color32::from_rgb(230, 50, 50))));
|
ui.add_sized([width/4.0, height], Label::new(RichText::new("⏺").color(Color32::from_rgb(230, 50, 50))));
|
||||||
}
|
}
|
||||||
ui.separator();
|
ui.separator();
|
||||||
ui.add_sized([width/1.5, height], Label::new("XMRig"));
|
ui.add_sized([width/1.5, height], Label::new("XMRig"));
|
||||||
if self.xmrig == true {
|
if self.xmrig {
|
||||||
ui.add_sized([width/4.0, height], Label::new(RichText::new("⏺").color(Color32::from_rgb(100, 230, 100))));
|
ui.add_sized([width/4.0, height], Label::new(RichText::new("⏺").color(Color32::from_rgb(100, 230, 100))));
|
||||||
} else {
|
} else {
|
||||||
ui.add_sized([width/4.0, height], Label::new(RichText::new("⏺").color(Color32::from_rgb(230, 50, 50))));
|
ui.add_sized([width/4.0, height], Label::new(RichText::new("⏺").color(Color32::from_rgb(230, 50, 50))));
|
||||||
|
@ -464,7 +456,7 @@ impl eframe::App for App {
|
||||||
ui.set_enabled(false)
|
ui.set_enabled(false)
|
||||||
}
|
}
|
||||||
let width = width / 2.0;
|
let width = width / 2.0;
|
||||||
if ui.add_sized([width, height], egui::Button::new("Save")).on_hover_text("Save changes").clicked() { self.og = self.state.clone(); }
|
if ui.add_sized([width, height], egui::Button::new("Save")).on_hover_text("Save changes").clicked() { self.og = self.state.clone(); self.state.save(); }
|
||||||
if ui.add_sized([width, height], egui::Button::new("Reset")).on_hover_text("Reset changes").clicked() { self.state = self.og.clone(); }
|
if ui.add_sized([width, height], egui::Button::new("Reset")).on_hover_text("Reset changes").clicked() { self.state = self.og.clone(); }
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -472,7 +464,7 @@ impl eframe::App for App {
|
||||||
match self.tab {
|
match self.tab {
|
||||||
Tab::P2pool => {
|
Tab::P2pool => {
|
||||||
ui.group(|ui| {
|
ui.group(|ui| {
|
||||||
if self.p2pool == true {
|
if self.p2pool {
|
||||||
if ui.add_sized([width, height], egui::Button::new("⟲")).on_hover_text("Restart P2Pool").clicked() { self.p2pool = false; }
|
if ui.add_sized([width, height], egui::Button::new("⟲")).on_hover_text("Restart P2Pool").clicked() { self.p2pool = false; }
|
||||||
if ui.add_sized([width, height], egui::Button::new("⏹")).on_hover_text("Stop P2Pool").clicked() { self.p2pool = false; }
|
if ui.add_sized([width, height], egui::Button::new("⏹")).on_hover_text("Stop P2Pool").clicked() { self.p2pool = false; }
|
||||||
ui.add_enabled_ui(false, |ui| {
|
ui.add_enabled_ui(false, |ui| {
|
||||||
|
@ -489,7 +481,7 @@ impl eframe::App for App {
|
||||||
}
|
}
|
||||||
Tab::Xmrig => {
|
Tab::Xmrig => {
|
||||||
ui.group(|ui| {
|
ui.group(|ui| {
|
||||||
if self.xmrig == true {
|
if self.xmrig {
|
||||||
if ui.add_sized([width, height], egui::Button::new("⟲")).on_hover_text("Restart XMRig").clicked() { self.xmrig = false; }
|
if ui.add_sized([width, height], egui::Button::new("⟲")).on_hover_text("Restart XMRig").clicked() { self.xmrig = false; }
|
||||||
if ui.add_sized([width, height], egui::Button::new("⏹")).on_hover_text("Stop XMRig").clicked() { self.xmrig = false; }
|
if ui.add_sized([width, height], egui::Button::new("⏹")).on_hover_text("Stop XMRig").clicked() { self.xmrig = false; }
|
||||||
ui.add_enabled_ui(false, |ui| {
|
ui.add_enabled_ui(false, |ui| {
|
||||||
|
@ -513,14 +505,31 @@ impl eframe::App for App {
|
||||||
ui.style_mut().override_text_style = Some(egui::TextStyle::Body);
|
ui.style_mut().override_text_style = Some(egui::TextStyle::Body);
|
||||||
match self.tab {
|
match self.tab {
|
||||||
Tab::About => {
|
Tab::About => {
|
||||||
About::show(self, ctx, ui);
|
ui.add_space(10.0);
|
||||||
|
ui.vertical_centered(|ui| {
|
||||||
|
let space = ui.available_height()/2.2;
|
||||||
|
self.banner.show(ui);
|
||||||
|
ui.label("Gupax (guh-picks) is a cross-platform GUI for mining");
|
||||||
|
ui.hyperlink_to("[Monero]", "https://www.github.com/monero-project/monero");
|
||||||
|
ui.label("on the decentralized");
|
||||||
|
ui.hyperlink_to("[P2Pool]", "https://www.github.com/SChernykh/p2pool");
|
||||||
|
ui.label("using the dedicated");
|
||||||
|
ui.hyperlink_to("[XMRig]", "https://www.github.com/xmrig/xmrig");
|
||||||
|
ui.label("miner for max hashrate");
|
||||||
|
|
||||||
|
ui.add_space(ui.available_height()/2.4);
|
||||||
|
|
||||||
|
ui.hyperlink_to("Powered by egui", "https://github.com/emilk/egui");
|
||||||
|
ui.hyperlink_to(format!("{} {}", GITHUB, "Gupax made by hinto-janaiyo"), "https://www.github.com/hinto-janaiyo/gupax");
|
||||||
|
ui.label("egui is licensed under MIT & Apache-2.0");
|
||||||
|
ui.label("Gupax, P2Pool, and XMRig are licensed under GPLv3");
|
||||||
|
});
|
||||||
}
|
}
|
||||||
Tab::Status => {
|
Tab::Status => {
|
||||||
Status::show(self, ctx, ui);
|
Status::show(self, ctx, ui);
|
||||||
}
|
}
|
||||||
Tab::Gupax => {
|
Tab::Gupax => {
|
||||||
// Gupax::show(self.state.gupax, ctx, ui);
|
Gupax::show(&mut self.state.gupax, ctx, ui);
|
||||||
exit(0);
|
|
||||||
}
|
}
|
||||||
Tab::P2pool => {
|
Tab::P2pool => {
|
||||||
P2pool::show(&mut self.state.p2pool, ctx, ui);
|
P2pool::show(&mut self.state.p2pool, ctx, ui);
|
||||||
|
|
|
@ -35,6 +35,29 @@ use crate::node::{RINO,SETH,SELSTA};
|
||||||
|
|
||||||
impl P2pool {
|
impl P2pool {
|
||||||
pub fn show(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) {
|
pub fn show(&mut self, ctx: &egui::Context, ui: &mut egui::Ui) {
|
||||||
|
// TODO:
|
||||||
|
// ping code
|
||||||
|
// If ping-ING, display stats
|
||||||
|
// if *self.pinging.lock().unwrap() {
|
||||||
|
// egui::CentralPanel::default().show(ctx, |ui| {
|
||||||
|
// let width = ui.available_width();
|
||||||
|
// let width = width - 10.0;
|
||||||
|
// let height = ui.available_height();
|
||||||
|
// init_text_styles(ctx, width);
|
||||||
|
// ui.add_sized([width, height/2.0], Label::new(format!("In progress: {}", *self.pinging.lock().unwrap())));
|
||||||
|
// ui.group(|ui| {
|
||||||
|
// if ui.add_sized([width, height/10.0], egui::Button::new("Yes")).clicked() {
|
||||||
|
// info!("Quit confirmation = yes ... goodbye!");
|
||||||
|
// exit(0);
|
||||||
|
// } else if ui.add_sized([width, height/10.0], egui::Button::new("No")).clicked() {
|
||||||
|
// info!("Quit confirmation = no ... returning!");
|
||||||
|
// self.show_confirmation_dialog = false;
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
// });
|
||||||
|
// return
|
||||||
|
// }
|
||||||
|
|
||||||
let height = ui.available_height() / 10.0;
|
let height = ui.available_height() / 10.0;
|
||||||
let mut width = ui.available_width() - 50.0;
|
let mut width = ui.available_width() - 50.0;
|
||||||
ui.group(|ui| {
|
ui.group(|ui| {
|
||||||
|
|
13
src/state.rs
13
src/state.rs
|
@ -40,9 +40,13 @@ use log::*;
|
||||||
impl State {
|
impl State {
|
||||||
pub fn default() -> Self {
|
pub fn default() -> Self {
|
||||||
use crate::constants::{P2POOL_VERSION,XMRIG_VERSION};
|
use crate::constants::{P2POOL_VERSION,XMRIG_VERSION};
|
||||||
|
let max_threads = num_cpus::get();
|
||||||
|
let current_threads;
|
||||||
|
if max_threads == 1 { current_threads = 1; } else { current_threads = max_threads / 2; }
|
||||||
Self {
|
Self {
|
||||||
gupax: Gupax {
|
gupax: Gupax {
|
||||||
auto_update: true,
|
auto_update: true,
|
||||||
|
auto_node: true,
|
||||||
ask_before_quit: true,
|
ask_before_quit: true,
|
||||||
save_before_quit: true,
|
save_before_quit: true,
|
||||||
p2pool_path: DEFAULT_P2POOL_PATH.to_string(),
|
p2pool_path: DEFAULT_P2POOL_PATH.to_string(),
|
||||||
|
@ -66,8 +70,8 @@ impl State {
|
||||||
nicehash: false,
|
nicehash: false,
|
||||||
keepalive: false,
|
keepalive: false,
|
||||||
hugepages_jit: true,
|
hugepages_jit: true,
|
||||||
current_threads: 1,
|
current_threads,
|
||||||
max_threads: 1,
|
max_threads,
|
||||||
priority: 2,
|
priority: 2,
|
||||||
pool: "localhost:3333".to_string(),
|
pool: "localhost:3333".to_string(),
|
||||||
address: "".to_string(),
|
address: "".to_string(),
|
||||||
|
@ -224,6 +228,7 @@ pub struct State {
|
||||||
#[derive(Clone,Eq,PartialEq,Debug,Deserialize,Serialize)]
|
#[derive(Clone,Eq,PartialEq,Debug,Deserialize,Serialize)]
|
||||||
pub struct Gupax {
|
pub struct Gupax {
|
||||||
pub auto_update: bool,
|
pub auto_update: bool,
|
||||||
|
pub auto_node: bool,
|
||||||
pub ask_before_quit: bool,
|
pub ask_before_quit: bool,
|
||||||
pub save_before_quit: bool,
|
pub save_before_quit: bool,
|
||||||
pub p2pool_path: String,
|
pub p2pool_path: String,
|
||||||
|
@ -253,8 +258,8 @@ pub struct Xmrig {
|
||||||
pub nicehash: bool,
|
pub nicehash: bool,
|
||||||
pub keepalive: bool,
|
pub keepalive: bool,
|
||||||
pub hugepages_jit: bool,
|
pub hugepages_jit: bool,
|
||||||
pub max_threads: u16,
|
pub max_threads: usize,
|
||||||
pub current_threads: u16,
|
pub current_threads: usize,
|
||||||
pub priority: u8,
|
pub priority: u8,
|
||||||
pub pool: String,
|
pub pool: String,
|
||||||
pub address: String,
|
pub address: String,
|
||||||
|
|
Loading…
Reference in a new issue