Working projects tab

This commit is contained in:
Piotr Siuszko 2022-09-25 15:24:41 +02:00
parent 7ca06bc810
commit 96db0b8125
6 changed files with 360 additions and 65 deletions

228
egui_client/Cargo.lock generated
View File

@ -74,6 +74,18 @@ version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"
[[package]]
name = "atk-sys"
version = "0.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "58aeb089fb698e06db8089971c7ee317ab9644bade33383f63631437b03aafb6"
dependencies = [
"glib-sys",
"gobject-sys",
"libc",
"system-deps",
]
[[package]] [[package]]
name = "atomic_refcell" name = "atomic_refcell"
version = "0.1.8" version = "0.1.8"
@ -145,6 +157,16 @@ version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec8a7b6a70fde80372154c65702f00a0f56f3e1c36abbc6c440484be248856db" checksum = "ec8a7b6a70fde80372154c65702f00a0f56f3e1c36abbc6c440484be248856db"
[[package]]
name = "cairo-sys-rs"
version = "0.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8"
dependencies = [
"libc",
"system-deps",
]
[[package]] [[package]]
name = "calloop" name = "calloop"
version = "0.10.1" version = "0.10.1"
@ -170,6 +192,15 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c"
[[package]]
name = "cfg-expr"
version = "0.10.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0aacacf4d96c24b2ad6eb8ee6df040e4f27b0d0b39a5710c30091baa830485db"
dependencies = [
"smallvec",
]
[[package]] [[package]]
name = "cfg-if" name = "cfg-if"
version = "0.1.10" version = "0.1.10"
@ -700,6 +731,36 @@ dependencies = [
"pkg-config", "pkg-config",
] ]
[[package]]
name = "gdk-pixbuf-sys"
version = "0.15.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "140b2f5378256527150350a8346dbdb08fadc13453a7a2d73aecd5fab3c402a7"
dependencies = [
"gio-sys",
"glib-sys",
"gobject-sys",
"libc",
"system-deps",
]
[[package]]
name = "gdk-sys"
version = "0.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32e7a08c1e8f06f4177fb7e51a777b8c1689f743a7bc11ea91d44d2226073a88"
dependencies = [
"cairo-sys-rs",
"gdk-pixbuf-sys",
"gio-sys",
"glib-sys",
"gobject-sys",
"libc",
"pango-sys",
"pkg-config",
"system-deps",
]
[[package]] [[package]]
name = "generic-array" name = "generic-array"
version = "0.14.6" version = "0.14.6"
@ -733,6 +794,19 @@ dependencies = [
"wasm-bindgen", "wasm-bindgen",
] ]
[[package]]
name = "gio-sys"
version = "0.15.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32157a475271e2c4a023382e9cab31c4584ee30a97da41d3c4e9fdd605abcf8d"
dependencies = [
"glib-sys",
"gobject-sys",
"libc",
"system-deps",
"winapi",
]
[[package]] [[package]]
name = "gl_generator" name = "gl_generator"
version = "0.14.0" version = "0.14.0"
@ -744,6 +818,16 @@ dependencies = [
"xml-rs", "xml-rs",
] ]
[[package]]
name = "glib-sys"
version = "0.15.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4"
dependencies = [
"libc",
"system-deps",
]
[[package]] [[package]]
name = "glow" name = "glow"
version = "0.11.2" version = "0.11.2"
@ -821,6 +905,41 @@ dependencies = [
"gl_generator", "gl_generator",
] ]
[[package]]
name = "gobject-sys"
version = "0.15.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a"
dependencies = [
"glib-sys",
"libc",
"system-deps",
]
[[package]]
name = "gtk-sys"
version = "0.15.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d5bc2f0587cba247f60246a0ca11fe25fb733eabc3de12d1965fc07efab87c84"
dependencies = [
"atk-sys",
"cairo-sys-rs",
"gdk-pixbuf-sys",
"gdk-sys",
"gio-sys",
"glib-sys",
"gobject-sys",
"libc",
"pango-sys",
"system-deps",
]
[[package]]
name = "heck"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9"
[[package]] [[package]]
name = "hex" name = "hex"
version = "0.4.3" version = "0.4.3"
@ -1275,6 +1394,18 @@ dependencies = [
"ttf-parser", "ttf-parser",
] ]
[[package]]
name = "pango-sys"
version = "0.15.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2a00081cde4661982ed91d80ef437c20eacaf6aa1a5962c0279ae194662c3aa"
dependencies = [
"glib-sys",
"gobject-sys",
"libc",
"system-deps",
]
[[package]] [[package]]
name = "parking_lot" name = "parking_lot"
version = "0.12.1" version = "0.12.1"
@ -1428,6 +1559,30 @@ dependencies = [
"winapi", "winapi",
] ]
[[package]]
name = "rfd"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0149778bd99b6959285b0933288206090c50e2327f47a9c463bfdbf45c8823ea"
dependencies = [
"block",
"dispatch",
"glib-sys",
"gobject-sys",
"gtk-sys",
"js-sys",
"lazy_static",
"log",
"objc",
"objc-foundation",
"objc_id",
"raw-window-handle 0.5.0",
"wasm-bindgen",
"wasm-bindgen-futures",
"web-sys",
"windows",
]
[[package]] [[package]]
name = "rusty_hub" name = "rusty_hub"
version = "0.1.0" version = "0.1.0"
@ -1446,6 +1601,7 @@ dependencies = [
"confy", "confy",
"eframe", "eframe",
"image", "image",
"rfd",
"rusty_hub", "rusty_hub",
] ]
@ -1632,6 +1788,19 @@ dependencies = [
"unicode-ident", "unicode-ident",
] ]
[[package]]
name = "system-deps"
version = "6.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1a45a1c4c9015217e12347f2a411b57ce2c4fc543913b14b6fe40483328e709"
dependencies = [
"cfg-expr",
"heck",
"pkg-config",
"toml",
"version-compare",
]
[[package]] [[package]]
name = "thiserror" name = "thiserror"
version = "1.0.35" version = "1.0.35"
@ -1788,6 +1957,12 @@ version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
[[package]]
name = "version-compare"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fe88247b92c1df6b6de80ddc290f3976dbdf2f5f5d3fd049a9fb598c6dd5ca73"
[[package]] [[package]]
name = "version_check" name = "version_check"
version = "0.9.4" version = "0.9.4"
@ -2042,17 +2217,30 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "windows"
version = "0.37.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "57b543186b344cc61c85b5aab0d2e3adf4e0f99bc076eff9aa5927bcc0b8a647"
dependencies = [
"windows_aarch64_msvc 0.37.0",
"windows_i686_gnu 0.37.0",
"windows_i686_msvc 0.37.0",
"windows_x86_64_gnu 0.37.0",
"windows_x86_64_msvc 0.37.0",
]
[[package]] [[package]]
name = "windows-sys" name = "windows-sys"
version = "0.36.1" version = "0.36.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2"
dependencies = [ dependencies = [
"windows_aarch64_msvc", "windows_aarch64_msvc 0.36.1",
"windows_i686_gnu", "windows_i686_gnu 0.36.1",
"windows_i686_msvc", "windows_i686_msvc 0.36.1",
"windows_x86_64_gnu", "windows_x86_64_gnu 0.36.1",
"windows_x86_64_msvc", "windows_x86_64_msvc 0.36.1",
] ]
[[package]] [[package]]
@ -2061,30 +2249,60 @@ version = "0.36.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47"
[[package]]
name = "windows_aarch64_msvc"
version = "0.37.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2623277cb2d1c216ba3b578c0f3cf9cdebeddb6e66b1b218bb33596ea7769c3a"
[[package]] [[package]]
name = "windows_i686_gnu" name = "windows_i686_gnu"
version = "0.36.1" version = "0.36.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6"
[[package]]
name = "windows_i686_gnu"
version = "0.37.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3925fd0b0b804730d44d4b6278c50f9699703ec49bcd628020f46f4ba07d9e1"
[[package]] [[package]]
name = "windows_i686_msvc" name = "windows_i686_msvc"
version = "0.36.1" version = "0.36.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024"
[[package]]
name = "windows_i686_msvc"
version = "0.37.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ce907ac74fe331b524c1298683efbf598bb031bc84d5e274db2083696d07c57c"
[[package]] [[package]]
name = "windows_x86_64_gnu" name = "windows_x86_64_gnu"
version = "0.36.1" version = "0.36.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1"
[[package]]
name = "windows_x86_64_gnu"
version = "0.37.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2babfba0828f2e6b32457d5341427dcbb577ceef556273229959ac23a10af33d"
[[package]] [[package]]
name = "windows_x86_64_msvc" name = "windows_x86_64_msvc"
version = "0.36.1" version = "0.36.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680"
[[package]]
name = "windows_x86_64_msvc"
version = "0.37.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f4dd6dc7df2d84cf7b33822ed5b86318fb1781948e9663bacd047fc9dd52259d"
[[package]] [[package]]
name = "winit" name = "winit"
version = "0.27.3" version = "0.27.3"

View File

@ -17,4 +17,5 @@ opt-level = 2
confy = "^0.5.0" confy = "^0.5.0"
eframe = "0.19.0" eframe = "0.19.0"
rusty_hub = { path="../rusty_hub" } rusty_hub = { path="../rusty_hub" }
image = { version = "0.24.0", default-features = false, features = ["png"] } image = { version = "0.24.0", default-features = false, features = ["png"] }
rfd = "0.10.0"

View File

@ -1,6 +1,10 @@
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] // hide console window on Windows in release #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] // hide console window on Windows in release
extern crate confy; extern crate confy;
use eframe::{egui, IconData, NativeOptions}; use eframe::{
egui::{self, Ui},
IconData, NativeOptions,
};
use rfd::FileDialog;
use rusty_hub::hub::Hub; use rusty_hub::hub::Hub;
use std::io::Cursor; use std::io::Cursor;
@ -61,8 +65,13 @@ fn setup_custom_fonts(ctx: &egui::Context) {
ctx.set_fonts(fonts); ctx.set_fonts(fonts);
} }
pub enum WindowTab {
Projects,
Editors,
}
struct MyApp { struct MyApp {
hub: Hub, hub: Hub,
current_tab: WindowTab,
} }
impl MyApp { impl MyApp {
@ -70,20 +79,18 @@ impl MyApp {
setup_custom_fonts(&cc.egui_ctx); setup_custom_fonts(&cc.egui_ctx);
Self { Self {
hub: confy::load("lwa_unity_hub", "config").unwrap(), hub: confy::load("lwa_unity_hub", "config").unwrap(),
current_tab: WindowTab::Projects,
} }
} }
}
impl eframe::App for MyApp { fn save_config(&mut self, rebuild: bool) {
fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { if rebuild {
egui::TopBottomPanel::top("topPanel").show(ctx, |ui| ui.label("Rusty Unity Hub")); self.hub.config.rebuild();
egui::SidePanel::left("dsadsa").show(ctx, |ui| { }
ui.set_height(25.0); let _ = confy::store("lwa_unity_hub", "config", &self.hub);
ui.add_space(14.0); }
ui.button("Projects");
ui.add_space(14.0); pub fn draw_central_panel(&mut self, ctx: &egui::Context) {
ui.button("Editors");
});
egui::CentralPanel::default().show(ctx, |ui| { egui::CentralPanel::default().show(ctx, |ui| {
egui::ScrollArea::vertical().show(ui, |ui| { egui::ScrollArea::vertical().show(ui, |ui| {
egui::Grid::new("some_unique_id") egui::Grid::new("some_unique_id")
@ -93,47 +100,106 @@ impl eframe::App for MyApp {
.max_col_width(1000.0) .max_col_width(1000.0)
.num_columns(3) .num_columns(3)
.show(ui, |ui| { .show(ui, |ui| {
let mut index: usize = 0; match self.current_tab {
for project in &self.hub.projects { WindowTab::Projects => self.draw_project(&ctx, ui),
ui.scope(|ui| { WindowTab::Editors => self.draw_editors(&ctx, ui),
ui.set_enabled(self.hub.editor_for_project(project).is_some()); };
if ui
.button(format!("Open {}", &project.title))
.on_disabled_hover_text(format!(
"Select different Unity version"
))
.clicked()
{
self.hub.run_project_nr(index);
}
ui.set_enabled(true);
});
let version_response = ui.add(
egui::Label::new(&project.version).sense(egui::Sense::click()),
);
version_response.context_menu(|ui| {
for editor in &self.hub.config.editors_configurations {
if ui.button(format!("Open in {}", &editor.version)).clicked() {
Hub::run_project(&editor, &project);
ui.close_menu();
}
}
});
let path_response =
ui.add(egui::Label::new(&project.path).sense(egui::Sense::click()));
path_response.context_menu(|ui| {
if ui.button("Open directory").clicked() {
use std::process::Command;
Command::new("explorer").arg(&project.path).spawn().unwrap();
ui.close_menu();
}
});
ui.end_row();
index = index + 1;
}
}); });
}); });
}); });
} }
fn draw_editors(&mut self, _ctx: &egui::Context, ui: &mut Ui) {
ui.label("Editor search paths");
if ui.button("Add new").clicked() {
let directory = FileDialog::new().pick_folder();
if let Some(dir) = directory {
self.hub
.config
.unity_search_paths
.push(dir.into_os_string().into_string().unwrap());
self.save_config(true);
}
}
if ui.button("Refresh").clicked() {
self.hub.config.rebuild();
}
ui.end_row();
let mut i = 0;
for editor in self.hub.config.unity_search_paths.clone() {
if ui.button("Remove").clicked() {
self.hub.config.unity_search_paths.remove(i);
self.save_config(true);
return;
}
ui.label(editor);
ui.end_row();
i = i + 1;
}
ui.label("Installed editor versions");
ui.end_row();
for editor in &self.hub.config.editors_configurations {
ui.label(&editor.version);
ui.label(editor.platforms.join(","));
ui.label(&editor.base_path);
ui.end_row();
}
}
fn draw_project(&mut self, _ctx: &egui::Context, ui: &mut Ui) {
let mut index: usize = 0;
for project in &self.hub.projects {
ui.scope(|ui| {
ui.set_enabled(self.hub.editor_for_project(project).is_some());
if ui
.button(format!("Open {}", &project.title))
.on_disabled_hover_text(format!("Select different Unity version"))
.clicked()
{
self.hub.run_project_nr(index);
}
ui.set_enabled(true);
});
let version_response =
ui.add(egui::Label::new(&project.version).sense(egui::Sense::click()));
version_response.context_menu(|ui| {
for editor in &self.hub.config.editors_configurations {
if ui.button(format!("Open in {}", &editor.version)).clicked() {
Hub::run_project(&editor, &project);
ui.close_menu();
}
}
});
let path_response = ui.add(egui::Label::new(&project.path).sense(egui::Sense::click()));
path_response.context_menu(|ui| {
if ui.button("Open directory").clicked() {
use std::process::Command;
Command::new("explorer").arg(&project.path).spawn().unwrap();
ui.close_menu();
}
});
ui.end_row();
index = index + 1;
}
}
}
impl eframe::App for MyApp {
fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
egui::TopBottomPanel::top("topPanel").show(ctx, |ui| {
ui.label("Rusty Unity Hub");
});
egui::SidePanel::left("dsadsa").show(ctx, |ui| {
ui.set_height(25.0);
ui.add_space(14.0);
if ui.button("Projects").clicked() {
self.current_tab = WindowTab::Projects;
}
ui.add_space(14.0);
if ui.button("Editors").clicked() {
self.current_tab = WindowTab::Editors;
}
});
self.draw_central_panel(&ctx);
}
} }

View File

@ -14,8 +14,12 @@ impl Configuration {
let paths = self.get_unity_paths(); let paths = self.get_unity_paths();
for path in &paths { for path in &paths {
let editor = UnityEditor::new(&path); let editor = UnityEditor::new(&path);
if editor.is_some() { if editor.is_none() {
self.editors_configurations.push(editor.unwrap()); continue;
}
let editor = editor.unwrap();
if !self.editors_configurations.contains(&editor) {
self.editors_configurations.push(editor);
} }
} }
} }

View File

@ -1,6 +1,6 @@
use std::process::Command; use std::process::Command;
use crate::{config::Configuration, unity_project::UnityProject, unity_editor::UnityEditor}; use crate::{config::Configuration, unity_editor::UnityEditor, unity_project::UnityProject};
#[derive(Debug, Serialize, Deserialize, Clone)] #[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Hub { pub struct Hub {
@ -34,11 +34,11 @@ impl Hub {
pub fn run_project(editor: &UnityEditor, project: &UnityProject) { pub fn run_project(editor: &UnityEditor, project: &UnityProject) {
println!("{} -projectpath {}", editor.exe_path, project.path); println!("{} -projectpath {}", editor.exe_path, project.path);
Command::new(&editor.exe_path) Command::new(&editor.exe_path)
.arg("-projectpath") .arg("-projectpath")
.arg(&project.path) .arg(&project.path)
.spawn() .spawn()
.expect("Failed to run project"); .expect("Failed to run project");
} }
} }
impl Default for Hub { impl Default for Hub {

View File

@ -12,6 +12,12 @@ pub struct UnityEditor {
pub platforms: Vec<String>, pub platforms: Vec<String>,
} }
impl PartialEq for UnityEditor {
fn eq(&self, other: &Self) -> bool {
self.exe_path == other.exe_path
}
}
impl UnityEditor { impl UnityEditor {
pub fn new(path: &str) -> Option<Self> { pub fn new(path: &str) -> Option<Self> {
let base_path = Path::new(path); let base_path = Path::new(path);