feat: stardust config, wire up settings in stardust view

This commit is contained in:
Gabriele Musco 2023-12-08 09:52:42 +00:00
commit bca785d05a
3 changed files with 148 additions and 24 deletions

View file

@ -40,6 +40,7 @@ pub mod profile;
pub mod profiles; pub mod profiles;
pub mod runner; pub mod runner;
pub mod runner_pipeline; pub mod runner_pipeline;
pub mod stardust_config;
pub mod steamvr_utils; pub mod steamvr_utils;
pub mod ui; pub mod ui;
pub mod xr_devices; pub mod xr_devices;

68
src/stardust_config.rs Normal file
View file

@ -0,0 +1,68 @@
use std::{fs::File, io::BufReader};
use serde::{Deserialize, Serialize};
use crate::{constants::CMD_NAME, file_utils::get_writer, paths::get_config_dir};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct StardustExternalClient {
pub executable: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct StardustConfig {
pub autostart: bool,
pub start_as_overlay: bool,
pub overlay_priority: u32,
pub disable_controller: bool,
pub repo: String,
pub branch: String,
pub debug: bool,
pub flatland_enabled: bool,
pub flatland_repo: String,
pub flatland_branch: String,
pub external_clients: Vec<StardustExternalClient>,
}
impl Default for StardustConfig {
fn default() -> Self {
Self {
autostart: false,
start_as_overlay: false,
overlay_priority: 0,
disable_controller: false,
repo: "https://github.com/StardustXR/server".into(),
branch: "main".into(),
debug: false,
flatland_enabled: true,
flatland_repo: "https://github.com/StardustXR/flatland".into(),
flatland_branch: "main".into(),
external_clients: vec![],
}
}
}
impl StardustConfig {
fn file_path() -> String {
format!("{}/{}.stardust.json", get_config_dir(), CMD_NAME)
}
pub fn get_config() -> Self {
if let Ok(file) = File::open(Self::file_path()) {
let reader = BufReader::new(file);
if let Ok(conf) = serde_json::from_reader(reader) {
return conf;
}
}
Self::default()
}
pub fn save(&self) -> Result<(), serde_json::Error> {
let writer = get_writer(&Self::file_path());
serde_json::to_writer_pretty(writer, self)
}
}

View file

@ -1,4 +1,6 @@
use crate::{ use crate::{
builders::build_stardust::{get_build_stardust_jobs, StardustServerSpec},
stardust_config::StardustConfig,
stateless_action, stateless_action,
ui::build_window::{BuildWindow, BuildWindowMsg, BuildWindowOutMsg}, ui::build_window::{BuildWindow, BuildWindowMsg, BuildWindowOutMsg},
withclones, withclones,
@ -24,6 +26,8 @@ pub enum StardustViewMsg {
OverlayPriorityChanged(u32), OverlayPriorityChanged(u32),
DisableControllerChanged(bool), DisableControllerChanged(bool),
RepoChanged(String), RepoChanged(String),
DebugChanged(bool),
FlatlandEnabledChanged(bool), FlatlandEnabledChanged(bool),
FlatlandRepoChanged(String), FlatlandRepoChanged(String),
@ -45,6 +49,8 @@ pub struct StardustView {
stardust_service_active: bool, stardust_service_active: bool,
#[tracker::do_not_track] #[tracker::do_not_track]
build_window: Controller<BuildWindow>, build_window: Controller<BuildWindow>,
stardust_config: StardustConfig,
} }
#[relm4::component(pub)] #[relm4::component(pub)]
@ -124,16 +130,14 @@ impl SimpleComponent for StardustView {
set_selection_mode: gtk::SelectionMode::None, set_selection_mode: gtk::SelectionMode::None,
adw::SwitchRow { adw::SwitchRow {
set_title: "Autostart with XR Service", set_title: "Autostart with XR Service",
// TODO: settings set_active: model.stardust_config.autostart,
// set_active: model.settings.autostart,
connect_active_notify[sender] => move |row| { connect_active_notify[sender] => move |row| {
sender.input(Self::Input::AutostartChanged(row.is_active())); sender.input(Self::Input::AutostartChanged(row.is_active()));
} }
}, },
adw::SwitchRow { adw::SwitchRow {
set_title: "Start as an overlay", set_title: "Start as an overlay",
// TODO: settings set_active: model.stardust_config.start_as_overlay,
// set_active: model.settings.overlay,
connect_active_notify[sender] => move |row| { connect_active_notify[sender] => move |row| {
sender.input(Self::Input::StartAsOvelayChanged(row.is_active())); sender.input(Self::Input::StartAsOvelayChanged(row.is_active()));
} }
@ -142,8 +146,6 @@ impl SimpleComponent for StardustView {
set_title: "Overlay priority", set_title: "Overlay priority",
set_digits: 0, set_digits: 0,
set_snap_to_ticks: true, set_snap_to_ticks: true,
// TODO: settings -- here or in adj?
// set_value: model.settings.priority,
#[wrap(Some)] #[wrap(Some)]
set_adjustment: overlay_priority_adj = &gtk::Adjustment { set_adjustment: overlay_priority_adj = &gtk::Adjustment {
set_lower: 0.0, set_lower: 0.0,
@ -151,8 +153,7 @@ impl SimpleComponent for StardustView {
set_value: 0.0, set_value: 0.0,
set_page_increment: 10.0, set_page_increment: 10.0,
set_step_increment: 1.0, set_step_increment: 1.0,
// TODO: settings set_value: model.stardust_config.overlay_priority.into(),
// set_value: model.settings.priority,
}, },
set_range: (0.0, f64::from(u32::MAX)), set_range: (0.0, f64::from(u32::MAX)),
connect_value_notify[sender] => move |row| { connect_value_notify[sender] => move |row| {
@ -164,17 +165,21 @@ impl SimpleComponent for StardustView {
set_title: "Disable controller", set_title: "Disable controller",
set_subtitle_lines: 0, set_subtitle_lines: 0,
set_subtitle: "Necessary if you plan on using hand tracking", set_subtitle: "Necessary if you plan on using hand tracking",
// TODO: settings set_active: model.stardust_config.disable_controller,
// set_active: model.settings.autostart,
connect_active_notify[sender] => move |row| { connect_active_notify[sender] => move |row| {
sender.input(Self::Input::DisableControllerChanged(row.is_active())); sender.input(Self::Input::DisableControllerChanged(row.is_active()));
} }
}, },
adw::SwitchRow {
set_title: "Debug symbols",
set_active: model.stardust_config.debug,
connect_active_notify[sender] => move |row| {
sender.input(Self::Input::DebugChanged(row.is_active()));
}
},
adw::EntryRow { adw::EntryRow {
set_title: "Repository#git ref", set_title: "Repository#git ref",
// TODO: settings set_text: &format!("{}#{}", model.stardust_config.repo, model.stardust_config.branch),
// set_text: model.settings.repo,
set_text: "https://github.com/StardustXR/server#main",
connect_changed[sender] => move |row| { connect_changed[sender] => move |row| {
sender.input(Self::Input::RepoChanged(row.text().into())); sender.input(Self::Input::RepoChanged(row.text().into()));
} }
@ -199,6 +204,7 @@ impl SimpleComponent for StardustView {
set_valign: gtk::Align::Center, set_valign: gtk::Align::Center,
set_hexpand: false, set_hexpand: false,
set_vexpand: false, set_vexpand: false,
set_active: model.stardust_config.flatland_enabled,
connect_activate[sender] => move |sw| { connect_activate[sender] => move |sw| {
sender.input(Self::Input::FlatlandEnabledChanged(sw.is_active())); sender.input(Self::Input::FlatlandEnabledChanged(sw.is_active()));
}, },
@ -207,9 +213,7 @@ impl SimpleComponent for StardustView {
bind_property: ("enable-expansion", &flatland_switch, "active"), bind_property: ("enable-expansion", &flatland_switch, "active"),
add_row: flatland_repo_entryrow = &adw::EntryRow { add_row: flatland_repo_entryrow = &adw::EntryRow {
set_title: "Repository#git ref", set_title: "Repository#git ref",
// TODO: settings set_text: &format!("{}#{}", model.stardust_config.flatland_repo, model.stardust_config.flatland_branch),
// set_text: model.settings.clients.builtin.flatland.repo,
set_text: "https://github.com/StardustXR/flatland#main",
connect_changed[sender] => move |row| { connect_changed[sender] => move |row| {
sender.input(Self::Input::FlatlandRepoChanged(row.text().into())); sender.input(Self::Input::FlatlandRepoChanged(row.text().into()));
}, },
@ -241,6 +245,15 @@ impl SimpleComponent for StardustView {
match message { match message {
Self::Input::BuildStardust => { Self::Input::BuildStardust => {
println!("Build"); println!("Build");
get_build_stardust_jobs(
StardustServerSpec {
repo: self.stardust_config.repo.clone(),
branch: self.stardust_config.branch.clone(),
debug: self.stardust_config.debug,
wayland_support: true,
},
&vec![],
);
self.build_window.sender().emit(BuildWindowMsg::Present); self.build_window.sender().emit(BuildWindowMsg::Present);
} }
Self::Input::UpdateStardust => { Self::Input::UpdateStardust => {
@ -260,25 +273,66 @@ impl SimpleComponent for StardustView {
println!("Restart"); println!("Restart");
} }
Self::Input::AutostartChanged(val) => { Self::Input::AutostartChanged(val) => {
println!("Autostart: {}", val); self.stardust_config.autostart = val;
self.stardust_config.save();
} }
Self::Input::StartAsOvelayChanged(val) => { Self::Input::StartAsOvelayChanged(val) => {
println!("StartAsOvelayChanged: {}", val); self.stardust_config.start_as_overlay = val;
self.stardust_config.save();
} }
Self::Input::OverlayPriorityChanged(val) => { Self::Input::OverlayPriorityChanged(val) => {
println!("OverlayPriorityChanged: {}", val); self.stardust_config.overlay_priority = val;
self.stardust_config.save();
} }
Self::Input::DisableControllerChanged(val) => { Self::Input::DisableControllerChanged(val) => {
println!("DisableControllerChanged: {}", val); self.stardust_config.disable_controller = val;
self.stardust_config.save();
} }
Self::Input::RepoChanged(val) => { Self::Input::RepoChanged(val) => {
println!("RepoChanged: {}", val); let def = StardustConfig::default();
let split = val
.split('#')
.map(str::trim)
.map(String::from)
.collect::<Vec<String>>();
let repo = split.get(0).unwrap_or_else(|| &def.repo).clone();
let branch = split.get(1).unwrap_or_else(|| &def.branch).clone();
self.stardust_config.repo = if repo.is_empty() { def.repo } else { repo };
self.stardust_config.branch = if branch.is_empty() {
def.branch
} else {
branch
};
self.stardust_config.save();
}
Self::Input::DebugChanged(val) => {
self.stardust_config.debug = val;
self.stardust_config.save();
} }
Self::Input::FlatlandRepoChanged(val) => { Self::Input::FlatlandRepoChanged(val) => {
println!("FlatlandRepoChanged: {}", val); let def = StardustConfig::default();
let split = val
.split('#')
.map(str::trim)
.map(String::from)
.collect::<Vec<String>>();
let repo = split.get(0).unwrap_or_else(|| &def.flatland_repo).clone();
let branch = split.get(1).unwrap_or_else(|| &def.flatland_branch).clone();
self.stardust_config.flatland_repo = if repo.is_empty() {
def.flatland_repo
} else {
repo
};
self.stardust_config.flatland_branch = if branch.is_empty() {
def.flatland_branch
} else {
branch
};
self.stardust_config.save();
} }
Self::Input::FlatlandEnabledChanged(val) => { Self::Input::FlatlandEnabledChanged(val) => {
println!("FlatlandEnabledChanged: {}", val); self.stardust_config.flatland_enabled = val;
self.stardust_config.save();
} }
Self::Input::AddClient => { Self::Input::AddClient => {
println!("AddClient"); println!("AddClient");
@ -292,6 +346,7 @@ impl SimpleComponent for StardustView {
sender: ComponentSender<Self>, sender: ComponentSender<Self>,
) -> ComponentParts<Self> { ) -> ComponentParts<Self> {
let model = Self { let model = Self {
tracker: 0,
stardust_service_active: false, stardust_service_active: false,
build_window: BuildWindow::builder() build_window: BuildWindow::builder()
.transient_for(init.root_win) .transient_for(init.root_win)
@ -299,7 +354,7 @@ impl SimpleComponent for StardustView {
.forward(sender.input_sender(), |msg| match msg { .forward(sender.input_sender(), |msg| match msg {
BuildWindowOutMsg::CancelBuild => Self::Input::CancelBuild, BuildWindowOutMsg::CancelBuild => Self::Input::CancelBuild,
}), }),
tracker: 0, stardust_config: StardustConfig::get_config(),
}; };
let widgets = view_output!(); let widgets = view_output!();