From 74a54741940a1ebf2303745d60665885f4ffe372 Mon Sep 17 00:00:00 2001 From: Gabriele Musco Date: Sun, 10 Dec 2023 10:14:28 +0000 Subject: [PATCH] feat: can start and stop stardust --- src/builders/build_stardust.rs | 10 +++-- src/paths.rs | 8 ++++ src/ui/stardust/stardust_view.rs | 70 ++++++++++++++++++++++++++------ 3 files changed, 72 insertions(+), 16 deletions(-) diff --git a/src/builders/build_stardust.rs b/src/builders/build_stardust.rs index 4f1f743..23dd1a1 100644 --- a/src/builders/build_stardust.rs +++ b/src/builders/build_stardust.rs @@ -1,4 +1,8 @@ -use crate::{build_tools::git::Git, paths::get_data_dir, ui::job_worker::job::WorkerJob}; +use crate::{ + build_tools::git::Git, + paths::{get_data_dir, get_stardust_base_dir, get_stardust_prefix}, + ui::job_worker::job::WorkerJob, +}; use std::{collections::VecDeque, path::PathBuf}; #[derive(Debug, Clone)] @@ -35,10 +39,10 @@ pub fn get_build_stardust_jobs( let server_git = Git { repo: server_spec.repo, - dir: get_data_dir() + "/stardust/stardust-xr-server", + dir: get_stardust_base_dir() + "/stardust-xr-server", default_branch: server_spec.branch, }; - let prefix = get_data_dir() + "/stardust/prefix"; + let prefix = get_stardust_prefix(); jobs.extend(server_git.get_pre_build_jobs(update)); jobs.push_back(WorkerJob::new_cmd( None, diff --git a/src/paths.rs b/src/paths.rs index 1f62891..c04cb7c 100644 --- a/src/paths.rs +++ b/src/paths.rs @@ -83,6 +83,14 @@ pub fn get_cache_dir() -> String { ) } +pub fn get_stardust_base_dir() -> String { + get_data_dir() + "/stardust" +} + +pub fn get_stardust_prefix() -> String { + get_stardust_base_dir() + "/prefix" +} + pub fn get_backup_dir() -> String { let p_s = format!("{data}/backups", data = get_data_dir()); let p = Path::new(&p_s); diff --git a/src/ui/stardust/stardust_view.rs b/src/ui/stardust/stardust_view.rs index a92d878..f2ec034 100644 --- a/src/ui/stardust/stardust_view.rs +++ b/src/ui/stardust/stardust_view.rs @@ -1,13 +1,16 @@ +use std::{collections::VecDeque, path::Path}; + use crate::{ builders::build_stardust::{get_build_stardust_jobs, StardustServerSpec}, dependencies::stardust_deps::get_missing_stardust_deps, linux_distro::get_distro, + paths::get_stardust_prefix, stardust_config::StardustConfig, stateless_action, ui::{ alert::alert, build_window::{BuildStatus, BuildWindow, BuildWindowMsg, BuildWindowOutMsg}, - job_worker::{internal_worker::JobWorkerOut, JobWorker}, + job_worker::{internal_worker::JobWorkerOut, job::WorkerJob, JobWorker}, }, withclones, }; @@ -24,9 +27,12 @@ pub enum StardustViewMsg { BuildStardust { update: bool }, OnBuildLog(Vec), OnBuildExit(i32), - StartClicked, - StopClicked, - RestartClicked, + Start, + Stop, + Restart, + + OnStardustLog(Vec), + OnStardustExit(i32), AutostartChanged(bool), StartAsOvelayChanged(bool), @@ -55,6 +61,8 @@ pub struct StardustViewInit { pub struct StardustView { stardust_service_active: bool, #[tracker::do_not_track] + stardust_worker: Option, + #[tracker::do_not_track] build_window: Controller, #[tracker::do_not_track] root_win: gtk::Window, @@ -104,7 +112,7 @@ impl SimpleComponent for StardustView { set_label: "Start", set_hexpand: true, connect_clicked[sender] => move |_| { - sender.input(Self::Input::StartClicked); + sender.input(Self::Input::Start); }, }, gtk::MenuButton { @@ -125,14 +133,14 @@ impl SimpleComponent for StardustView { set_label: "Stop", set_hexpand: true, connect_clicked[sender] => move |_| { - sender.input(Self::Input::StopClicked); + sender.input(Self::Input::Stop); }, }, gtk::Button { set_icon_name: "view-refresh-symbolic", set_tooltip_text: Some("Restart"), connect_clicked[sender] => move |_| { - sender.input(Self::Input::RestartClicked); + sender.input(Self::Input::Restart); }, }, }, @@ -254,6 +262,14 @@ impl SimpleComponent for StardustView { self.reset(); match message { + Self::Input::OnStardustLog(rows) => { + // TODO? + } + Self::Input::OnStardustExit(code) => { + // TODO + self.set_stardust_service_active(false); + self.stardust_worker = None; + } Self::Input::BuildStardust { update } => { let missing_deps = get_missing_stardust_deps(); if !missing_deps.is_empty() { @@ -322,15 +338,42 @@ impl SimpleComponent for StardustView { })) } Self::Input::CancelBuild => { - println!("Cancel Build"); + if let Some(worker) = self.build_worker.as_ref() { + worker.stop(); + } } - Self::Input::StartClicked => { - println!("Start"); + Self::Input::Start => { + let exec = get_stardust_prefix() + "/bin/stardust-xr-server"; + if !Path::new(&exec).is_file() { + alert( + "You need to build Stardust XR before starting it", + None, + Some(&self.root_win), + ); + return; + } + if let Some(w) = self.stardust_worker.as_ref() { + if w.exit_code().is_none() { + eprintln!("Stardust is still running!"); + return; + } + } + let mut jobs = VecDeque::new(); + jobs.push_back(WorkerJob::new_cmd(None, exec, None)); + self.set_stardust_service_active(true); + let worker = JobWorker::new(jobs, sender.input_sender(), |msg| match msg { + JobWorkerOut::Log(rows) => Self::Input::OnStardustLog(rows), + JobWorkerOut::Exit(code) => Self::Input::OnStardustExit(code), + }); + worker.start(); + self.stardust_worker = Some(worker); } - Self::Input::StopClicked => { - println!("Stop"); + Self::Input::Stop => { + if let Some(w) = self.stardust_worker.as_ref() { + w.stop(); + } } - Self::Input::RestartClicked => { + Self::Input::Restart => { println!("Restart"); } Self::Input::AutostartChanged(val) => { @@ -417,6 +460,7 @@ impl SimpleComponent for StardustView { BuildWindowOutMsg::CancelBuild => Self::Input::CancelBuild, }), stardust_config: StardustConfig::get_config(), + stardust_worker: None, build_worker: None, };