mirror of
https://gitlab.com/gabmus/envision.git
synced 2025-08-04 07:08:53 +00:00
feat: working libsurvive calibration import
This commit is contained in:
parent
6998cc4760
commit
24dc3374a1
1 changed files with 152 additions and 20 deletions
|
@ -1,9 +1,14 @@
|
||||||
use crate::{profile::Profile, runner::Runner};
|
use crate::{profile::Profile, runner::Runner};
|
||||||
use gtk::prelude::*;
|
use expect_dialog::ExpectDialog;
|
||||||
|
use gtk::{
|
||||||
|
glib::{self, ffi::gboolean},
|
||||||
|
prelude::*,
|
||||||
|
};
|
||||||
use relm4::prelude::*;
|
use relm4::prelude::*;
|
||||||
use std::path::Path;
|
use std::{cell::Cell, collections::HashMap, path::Path, time::Duration};
|
||||||
|
|
||||||
const NO_FILE_MSG: &str = "(No file selected)";
|
const NO_FILE_MSG: &str = "(No file selected)";
|
||||||
|
const CALIBRATION_RUN_TIME_SECONDS: f64 = 30.0;
|
||||||
|
|
||||||
#[tracker::track]
|
#[tracker::track]
|
||||||
pub struct LibsurviveSetupWindow {
|
pub struct LibsurviveSetupWindow {
|
||||||
|
@ -18,8 +23,19 @@ pub struct LibsurviveSetupWindow {
|
||||||
#[tracker::do_not_track]
|
#[tracker::do_not_track]
|
||||||
loading_page: Option<adw::StatusPage>,
|
loading_page: Option<adw::StatusPage>,
|
||||||
#[tracker::do_not_track]
|
#[tracker::do_not_track]
|
||||||
|
calibration_done_page: Option<adw::StatusPage>,
|
||||||
|
#[tracker::do_not_track]
|
||||||
|
page1: Option<adw::StatusPage>,
|
||||||
|
#[tracker::do_not_track]
|
||||||
filefilter_listmodel: gtk::gio::ListStore,
|
filefilter_listmodel: gtk::gio::ListStore,
|
||||||
|
|
||||||
|
#[tracker::do_not_track]
|
||||||
|
calibration_running: Cell<bool>,
|
||||||
|
#[tracker::do_not_track]
|
||||||
|
first_run_done: bool,
|
||||||
|
#[tracker::do_not_track]
|
||||||
|
calibration_seconds_elapsed: f64,
|
||||||
|
|
||||||
#[tracker::do_not_track]
|
#[tracker::do_not_track]
|
||||||
profile: Option<Profile>,
|
profile: Option<Profile>,
|
||||||
#[tracker::do_not_track]
|
#[tracker::do_not_track]
|
||||||
|
@ -32,6 +48,42 @@ pub enum LibsurviveSetupMsg {
|
||||||
CalibrateLibsurvive,
|
CalibrateLibsurvive,
|
||||||
SetSteamLighthousePath(Option<String>),
|
SetSteamLighthousePath(Option<String>),
|
||||||
ChooseFileDialog,
|
ChooseFileDialog,
|
||||||
|
TickCalibrationRunner,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl LibsurviveSetupWindow {
|
||||||
|
fn create_calibration_runner(&mut self) -> Runner {
|
||||||
|
let lh_path = self.steam_lighthouse_path.clone();
|
||||||
|
let mut env = HashMap::new();
|
||||||
|
env.insert(
|
||||||
|
"LD_LIBRARY_PATH".to_string(),
|
||||||
|
format!("{pfx}/lib", pfx = self.profile.as_ref().unwrap().prefix),
|
||||||
|
);
|
||||||
|
Runner::new(
|
||||||
|
Some(env),
|
||||||
|
format!(
|
||||||
|
"{pfx}/bin/survive-cli",
|
||||||
|
pfx = self.profile.as_ref().unwrap().prefix
|
||||||
|
),
|
||||||
|
vec!["--steamvr-calibration".into(), lh_path],
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn on_close_request(
|
||||||
|
sender: &relm4::ComponentSender<Self>,
|
||||||
|
carousel: &adw::Carousel,
|
||||||
|
calibration_running: &Cell<bool>,
|
||||||
|
progressbar: >k::ProgressBar,
|
||||||
|
page1: &adw::StatusPage,
|
||||||
|
) -> gtk::Inhibit {
|
||||||
|
if calibration_running.get() {
|
||||||
|
return gtk::Inhibit(true);
|
||||||
|
}
|
||||||
|
carousel.scroll_to(page1, true);
|
||||||
|
progressbar.set_fraction(0.0);
|
||||||
|
sender.input(LibsurviveSetupMsg::SetSteamLighthousePath(None));
|
||||||
|
gtk::Inhibit(false)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[relm4::component(pub)]
|
#[relm4::component(pub)]
|
||||||
|
@ -46,12 +98,12 @@ impl SimpleComponent for LibsurviveSetupWindow {
|
||||||
set_modal: true,
|
set_modal: true,
|
||||||
set_default_size: (520, 400),
|
set_default_size: (520, 400),
|
||||||
set_hide_on_close: true,
|
set_hide_on_close: true,
|
||||||
connect_close_request[sender, carousel, page1, progressbar] => move |_| {
|
// connect_close_request[sender, carousel, page1, progressbar] => move |_| {
|
||||||
carousel.scroll_to(&page1, true);
|
// carousel.scroll_to(&page1, true);
|
||||||
progressbar.set_fraction(0.0);
|
// progressbar.set_fraction(0.0);
|
||||||
sender.input(LibsurviveSetupMsg::SetSteamLighthousePath(None));
|
// sender.input(LibsurviveSetupMsg::SetSteamLighthousePath(None));
|
||||||
gtk::Inhibit(false)
|
// gtk::Inhibit(false)
|
||||||
},
|
// },
|
||||||
gtk::Box {
|
gtk::Box {
|
||||||
set_orientation: gtk::Orientation::Vertical,
|
set_orientation: gtk::Orientation::Vertical,
|
||||||
set_hexpand: true,
|
set_hexpand: true,
|
||||||
|
@ -243,6 +295,29 @@ impl SimpleComponent for LibsurviveSetupWindow {
|
||||||
set_fraction: 0.0,
|
set_fraction: 0.0,
|
||||||
set_hexpand: true,
|
set_hexpand: true,
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
#[name(calibration_done_page)]
|
||||||
|
adw::StatusPage {
|
||||||
|
set_hexpand: true,
|
||||||
|
set_vexpand: true,
|
||||||
|
set_title: "Calibration Imported",
|
||||||
|
set_description: Some(concat!(
|
||||||
|
"If you experience bad quality tracking in the form ",
|
||||||
|
"of jittering or general floatiness, you probably ",
|
||||||
|
"need to refine your SteamVR calibration, then ",
|
||||||
|
"import it again into Libsurvive.",
|
||||||
|
)),
|
||||||
|
gtk::Button {
|
||||||
|
set_hexpand: true,
|
||||||
|
set_halign: gtk::Align::Center,
|
||||||
|
add_css_class: "pill",
|
||||||
|
add_css_class: "suggested-action",
|
||||||
|
set_label: "I Understand",
|
||||||
|
connect_clicked[win] => move |_| {
|
||||||
|
win.emit_by_name::<gboolean>("close-request", &[]);
|
||||||
|
// win.close();
|
||||||
|
},
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
adw::CarouselIndicatorDots {
|
adw::CarouselIndicatorDots {
|
||||||
|
@ -264,19 +339,23 @@ impl SimpleComponent for LibsurviveSetupWindow {
|
||||||
if self.steam_lighthouse_path == NO_FILE_MSG {
|
if self.steam_lighthouse_path == NO_FILE_MSG {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let lh_path = Path::new(&self.steam_lighthouse_path);
|
let path_s = self.steam_lighthouse_path.clone();
|
||||||
|
let lh_path = Path::new(&path_s);
|
||||||
if lh_path.is_file() {
|
if lh_path.is_file() {
|
||||||
self.calibration_runner = Some(Runner::new(
|
let mut runner = self.create_calibration_runner();
|
||||||
None,
|
self.calibration_running.set(true);
|
||||||
format!(
|
self.first_run_done = false;
|
||||||
"{pfx}/bin/survive-cli",
|
self.calibration_seconds_elapsed = 0.0;
|
||||||
pfx = self.profile.as_ref().unwrap().prefix
|
runner.start();
|
||||||
),
|
{
|
||||||
vec![
|
let timer_sender = sender.clone();
|
||||||
"--steamvr-calibration".into(),
|
let continue_watching = self.calibration_running.clone();
|
||||||
lh_path.to_str().unwrap().to_string(),
|
glib::timeout_add_local(Duration::from_millis(1000), move || {
|
||||||
],
|
timer_sender.input(LibsurviveSetupMsg::TickCalibrationRunner);
|
||||||
));
|
return glib::Continue(continue_watching.get());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
self.calibration_runner = Some(runner);
|
||||||
self.carousel
|
self.carousel
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
|
@ -312,6 +391,35 @@ impl SimpleComponent for LibsurviveSetupWindow {
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
LibsurviveSetupMsg::TickCalibrationRunner => {
|
||||||
|
self.calibration_seconds_elapsed += 1.0;
|
||||||
|
self.progressbar.as_ref().unwrap().set_fraction(
|
||||||
|
(self.calibration_seconds_elapsed / (CALIBRATION_RUN_TIME_SECONDS * 2.0))
|
||||||
|
.min(1.0),
|
||||||
|
);
|
||||||
|
if !self.first_run_done {
|
||||||
|
if self.calibration_seconds_elapsed >= CALIBRATION_RUN_TIME_SECONDS {
|
||||||
|
if self.calibration_runner.is_some() {
|
||||||
|
self.first_run_done = true;
|
||||||
|
let runner = self.calibration_runner.as_mut().unwrap();
|
||||||
|
runner.terminate();
|
||||||
|
let mut n_runner = self.create_calibration_runner();
|
||||||
|
n_runner.start();
|
||||||
|
self.calibration_runner = Some(n_runner);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if self.calibration_seconds_elapsed >= (CALIBRATION_RUN_TIME_SECONDS * 2.0) {
|
||||||
|
let runner = self.calibration_runner.as_mut().unwrap();
|
||||||
|
runner.terminate();
|
||||||
|
self.calibration_running.set(false);
|
||||||
|
self.carousel
|
||||||
|
.as_ref()
|
||||||
|
.unwrap()
|
||||||
|
.scroll_to(self.calibration_done_page.as_ref().unwrap(), true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -326,13 +434,18 @@ impl SimpleComponent for LibsurviveSetupWindow {
|
||||||
win: None,
|
win: None,
|
||||||
progressbar: None,
|
progressbar: None,
|
||||||
carousel: None,
|
carousel: None,
|
||||||
|
page1: None,
|
||||||
loading_page: None,
|
loading_page: None,
|
||||||
|
calibration_done_page: None,
|
||||||
steam_lighthouse_path: NO_FILE_MSG.into(),
|
steam_lighthouse_path: NO_FILE_MSG.into(),
|
||||||
filefilter_listmodel: gtk4::gio::ListStore::builder()
|
filefilter_listmodel: gtk4::gio::ListStore::builder()
|
||||||
.item_type(gtk::FileFilter::static_type())
|
.item_type(gtk::FileFilter::static_type())
|
||||||
.build(),
|
.build(),
|
||||||
profile: None,
|
profile: None,
|
||||||
calibration_runner: None,
|
calibration_runner: None,
|
||||||
|
calibration_running: Cell::new(false),
|
||||||
|
first_run_done: false,
|
||||||
|
calibration_seconds_elapsed: 0.0,
|
||||||
tracker: 0,
|
tracker: 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -344,6 +457,25 @@ impl SimpleComponent for LibsurviveSetupWindow {
|
||||||
model.progressbar = Some(widgets.progressbar.clone());
|
model.progressbar = Some(widgets.progressbar.clone());
|
||||||
model.carousel = Some(widgets.carousel.clone());
|
model.carousel = Some(widgets.carousel.clone());
|
||||||
model.loading_page = Some(widgets.loading_page.clone());
|
model.loading_page = Some(widgets.loading_page.clone());
|
||||||
|
model.calibration_done_page = Some(widgets.calibration_done_page.clone());
|
||||||
|
model.page1 = Some(widgets.page1.clone());
|
||||||
|
|
||||||
|
{
|
||||||
|
let cr_sender = sender.clone();
|
||||||
|
let cr_carousel = widgets.carousel.clone();
|
||||||
|
let cr_calibration_running = model.calibration_running.clone();
|
||||||
|
let cr_progressbar = widgets.progressbar.clone();
|
||||||
|
let cr_page1 = widgets.page1.clone();
|
||||||
|
model.win.as_ref().unwrap().connect_close_request(move |_| {
|
||||||
|
Self::on_close_request(
|
||||||
|
&cr_sender,
|
||||||
|
&cr_carousel,
|
||||||
|
&cr_calibration_running,
|
||||||
|
&cr_progressbar,
|
||||||
|
&cr_page1,
|
||||||
|
)
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
ComponentParts { model, widgets }
|
ComponentParts { model, widgets }
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue