mirror of
https://gitlab.com/gabmus/envision.git
synced 2025-09-02 15:45:49 +00:00
feat!: upgrade to relm 0.8; upgrade crates
This commit is contained in:
parent
93eaefbabe
commit
27325e2b65
23 changed files with 537 additions and 446 deletions
720
Cargo.lock
generated
720
Cargo.lock
generated
File diff suppressed because it is too large
Load diff
17
Cargo.toml
17
Cargo.toml
|
@ -11,25 +11,26 @@ gettext-rs = { version = "0.7.0", features = [
|
||||||
"gettext-system"
|
"gettext-system"
|
||||||
] }
|
] }
|
||||||
git2 = "0.18.2"
|
git2 = "0.18.2"
|
||||||
gtk4 = { version = "0.7.2", features = [
|
gtk4 = { version = "0.8.2", features = [
|
||||||
"v4_10",
|
"v4_10",
|
||||||
] }
|
] }
|
||||||
lazy_static = "1.4.0"
|
lazy_static = "1.4.0"
|
||||||
libadwaita = { version = "0.5.3", features = [
|
libadwaita = { version = "0.6.0", features = [
|
||||||
"v1_4"
|
"v1_4"
|
||||||
] }
|
] }
|
||||||
libmonado-rs = { git = "https://github.com/technobaboo/libmonado-rs", version = "0.1.0" }
|
libmonado-rs = { git = "https://github.com/technobaboo/libmonado-rs", version = "0.1.0" }
|
||||||
libusb = "0.3.0"
|
libusb = "0.3.0"
|
||||||
nix = { version = "0.26.4", features = [
|
nix = { version = "0.29.0", features = [
|
||||||
"fs"
|
"fs",
|
||||||
|
"signal"
|
||||||
] }
|
] }
|
||||||
phf = "0.11.2"
|
phf = "0.11.2"
|
||||||
phf_macros = "0.11.2"
|
phf_macros = "0.11.2"
|
||||||
relm4 = { version = "0.7.0-beta.1", features = [
|
relm4 = { version = "0.8.1", features = [
|
||||||
"libadwaita"
|
"libadwaita"
|
||||||
] }
|
] }
|
||||||
relm4-components = "0.7.0-alpha.1"
|
relm4-components = "0.8.1"
|
||||||
reqwest = { version = "0.11.20", features = [
|
reqwest = { version = "0.12.4", features = [
|
||||||
"blocking"
|
"blocking"
|
||||||
] }
|
] }
|
||||||
serde = { version = "1.0.188", features = [
|
serde = { version = "1.0.188", features = [
|
||||||
|
@ -38,4 +39,4 @@ serde = { version = "1.0.188", features = [
|
||||||
serde_json = "1.0.106"
|
serde_json = "1.0.106"
|
||||||
tracker = "0.2.1"
|
tracker = "0.2.1"
|
||||||
uuid = { version = "1.4.1", features = ["v4", "fast-rng"] }
|
uuid = { version = "1.4.1", features = ["v4", "fast-rng"] }
|
||||||
zoha-vte4 = { version = "0.0.2", features = ["v0_72"] }
|
vte4 = { version = "0.7.1", features = ["v0_72"] }
|
||||||
|
|
|
@ -1,8 +1,3 @@
|
||||||
use crate::{
|
|
||||||
file_utils::get_writer,
|
|
||||||
profile::{Profile, XRServiceType},
|
|
||||||
runner::{Runner, RunnerStatus},
|
|
||||||
};
|
|
||||||
use nix::{
|
use nix::{
|
||||||
sys::signal::{
|
sys::signal::{
|
||||||
kill,
|
kill,
|
||||||
|
@ -10,6 +5,12 @@ use nix::{
|
||||||
},
|
},
|
||||||
unistd::Pid,
|
unistd::Pid,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
use crate::{
|
||||||
|
file_utils::get_writer,
|
||||||
|
profile::{Profile, XRServiceType},
|
||||||
|
runner::{Runner, RunnerStatus},
|
||||||
|
};
|
||||||
use std::{
|
use std::{
|
||||||
collections::HashMap,
|
collections::HashMap,
|
||||||
io::{BufRead, BufReader, Write},
|
io::{BufRead, BufReader, Write},
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use crate::constants::{get_developers, APP_ID, APP_NAME, REPO_URL, SINGLE_DEVELOPER, VERSION};
|
use crate::constants::{get_developers, APP_ID, APP_NAME, REPO_URL, SINGLE_DEVELOPER, VERSION};
|
||||||
use relm4::gtk::traits::GtkWindowExt;
|
use relm4::gtk::prelude::GtkWindowExt;
|
||||||
use relm4::prelude::*;
|
use relm4::prelude::*;
|
||||||
use relm4::{ComponentParts, SimpleComponent};
|
use relm4::{ComponentParts, SimpleComponent};
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@ impl SimpleComponent for AboutDialog {
|
||||||
|
|
||||||
fn init(
|
fn init(
|
||||||
_init: Self::Init,
|
_init: Self::Init,
|
||||||
root: &Self::Root,
|
root: Self::Root,
|
||||||
_sender: relm4::ComponentSender<Self>,
|
_sender: relm4::ComponentSender<Self>,
|
||||||
) -> relm4::ComponentParts<Self> {
|
) -> relm4::ComponentParts<Self> {
|
||||||
let model = AboutDialog {};
|
let model = AboutDialog {};
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use gtk::traits::{GtkApplicationExt, GtkWindowExt};
|
use gtk::prelude::{GtkApplicationExt, GtkWindowExt};
|
||||||
use relm4::{adw::traits::MessageDialogExt, prelude::*};
|
use relm4::{adw::prelude::MessageDialogExt, prelude::*};
|
||||||
|
|
||||||
fn alert_base(title: &str, msg: Option<&str>, parent: Option<>k::Window>) -> adw::MessageDialog {
|
fn alert_base(title: &str, msg: Option<&str>, parent: Option<>k::Window>) -> adw::MessageDialog {
|
||||||
let d = adw::MessageDialog::builder()
|
let d = adw::MessageDialog::builder()
|
||||||
|
|
|
@ -47,7 +47,7 @@ use crate::xr_devices::XRDevice;
|
||||||
use gtk::glib::clone;
|
use gtk::glib::clone;
|
||||||
use gtk::prelude::*;
|
use gtk::prelude::*;
|
||||||
use relm4::actions::{AccelsPlus, ActionGroupName, RelmAction, RelmActionGroup};
|
use relm4::actions::{AccelsPlus, ActionGroupName, RelmAction, RelmActionGroup};
|
||||||
use relm4::adw::traits::MessageDialogExt;
|
use relm4::adw::prelude::MessageDialogExt;
|
||||||
use relm4::adw::ResponseAppearance;
|
use relm4::adw::ResponseAppearance;
|
||||||
use relm4::gtk::glib;
|
use relm4::gtk::glib;
|
||||||
use relm4::{new_action_group, new_stateful_action, new_stateless_action, prelude::*};
|
use relm4::{new_action_group, new_stateful_action, new_stateless_action, prelude::*};
|
||||||
|
@ -743,7 +743,7 @@ impl SimpleComponent for App {
|
||||||
|
|
||||||
fn init(
|
fn init(
|
||||||
init: Self::Init,
|
init: Self::Init,
|
||||||
root: &Self::Root,
|
root: Self::Root,
|
||||||
sender: ComponentSender<Self>,
|
sender: ComponentSender<Self>,
|
||||||
) -> ComponentParts<Self> {
|
) -> ComponentParts<Self> {
|
||||||
let config = Config::get_config();
|
let config = Config::get_config();
|
||||||
|
@ -751,7 +751,7 @@ impl SimpleComponent for App {
|
||||||
let profiles = config.profiles();
|
let profiles = config.profiles();
|
||||||
let setcap_confirm_dialog = adw::MessageDialog::builder()
|
let setcap_confirm_dialog = adw::MessageDialog::builder()
|
||||||
.modal(true)
|
.modal(true)
|
||||||
.transient_for(root)
|
.transient_for(&root)
|
||||||
.heading("Set Capabilities")
|
.heading("Set Capabilities")
|
||||||
.body(concat!(
|
.body(concat!(
|
||||||
"We need to set certain capabilities (CAP_SYS_NICE=eip) on the ",
|
"We need to set certain capabilities (CAP_SYS_NICE=eip) on the ",
|
||||||
|
@ -801,17 +801,17 @@ impl SimpleComponent for App {
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
about_dialog: AboutDialog::builder()
|
about_dialog: AboutDialog::builder()
|
||||||
.transient_for(root)
|
.transient_for(&root)
|
||||||
.launch(())
|
.launch(())
|
||||||
.detach(),
|
.detach(),
|
||||||
build_window: BuildWindow::builder()
|
build_window: BuildWindow::builder()
|
||||||
.transient_for(root)
|
.transient_for(&root)
|
||||||
.launch(())
|
.launch(())
|
||||||
.forward(sender.input_sender(), |msg| match msg {
|
.forward(sender.input_sender(), |msg| match msg {
|
||||||
BuildWindowOutMsg::CancelBuild => Msg::CancelBuild,
|
BuildWindowOutMsg::CancelBuild => Msg::CancelBuild,
|
||||||
}),
|
}),
|
||||||
libsurvive_setup_window: LibsurviveSetupWindow::builder()
|
libsurvive_setup_window: LibsurviveSetupWindow::builder()
|
||||||
.transient_for(root)
|
.transient_for(&root)
|
||||||
.launch(())
|
.launch(())
|
||||||
.detach(),
|
.detach(),
|
||||||
split_view: None,
|
split_view: None,
|
||||||
|
|
|
@ -163,7 +163,7 @@ impl SimpleComponent for BuildWindow {
|
||||||
|
|
||||||
fn init(
|
fn init(
|
||||||
_init: Self::Init,
|
_init: Self::Init,
|
||||||
root: &Self::Root,
|
root: Self::Root,
|
||||||
sender: ComponentSender<Self>,
|
sender: ComponentSender<Self>,
|
||||||
) -> ComponentParts<Self> {
|
) -> ComponentParts<Self> {
|
||||||
let mut model = Self {
|
let mut model = Self {
|
||||||
|
|
|
@ -4,7 +4,7 @@ use gtk4::{
|
||||||
prelude::{ApplicationCommandLineExt, ApplicationExt},
|
prelude::{ApplicationCommandLineExt, ApplicationExt},
|
||||||
Application, ApplicationCommandLine,
|
Application, ApplicationCommandLine,
|
||||||
},
|
},
|
||||||
glib::{self, IsA},
|
glib::{self, prelude::IsA},
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
|
|
|
@ -7,7 +7,7 @@ use gtk::glib::clone;
|
||||||
use gtk::prelude::*;
|
use gtk::prelude::*;
|
||||||
use relm4::prelude::*;
|
use relm4::prelude::*;
|
||||||
use relm4::{ComponentSender, SimpleComponent};
|
use relm4::{ComponentSender, SimpleComponent};
|
||||||
use zoha_vte4::TerminalExt;
|
use vte4::TerminalExt;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum SearchDirection {
|
pub enum SearchDirection {
|
||||||
|
@ -195,7 +195,7 @@ impl SimpleComponent for DebugView {
|
||||||
|
|
||||||
fn init(
|
fn init(
|
||||||
_init: Self::Init,
|
_init: Self::Init,
|
||||||
root: &Self::Root,
|
root: Self::Root,
|
||||||
sender: ComponentSender<Self>,
|
sender: ComponentSender<Self>,
|
||||||
) -> ComponentParts<Self> {
|
) -> ComponentParts<Self> {
|
||||||
let log_level_dropdown = gtk::DropDown::from_strings(
|
let log_level_dropdown = gtk::DropDown::from_strings(
|
||||||
|
@ -240,10 +240,10 @@ impl SimpleComponent for DebugView {
|
||||||
sc.add_shortcut(gtk::Shortcut::new(
|
sc.add_shortcut(gtk::Shortcut::new(
|
||||||
gtk::ShortcutTrigger::parse_string("<Control>c"),
|
gtk::ShortcutTrigger::parse_string("<Control>c"),
|
||||||
Some(gtk::CallbackAction::new(move |_, _| {
|
Some(gtk::CallbackAction::new(move |_, _| {
|
||||||
if let Some(text) = term.text_selected(zoha_vte4::Format::Text) {
|
if let Some(text) = term.text_selected(vte4::Format::Text) {
|
||||||
copy_text(text.as_str());
|
copy_text(text.as_str());
|
||||||
}
|
}
|
||||||
true
|
gtk::glib::Propagation::Proceed
|
||||||
})),
|
})),
|
||||||
));
|
));
|
||||||
let term = model.term.term.clone();
|
let term = model.term.term.clone();
|
||||||
|
@ -251,7 +251,7 @@ impl SimpleComponent for DebugView {
|
||||||
gtk::ShortcutTrigger::parse_string("<Control>a"),
|
gtk::ShortcutTrigger::parse_string("<Control>a"),
|
||||||
Some(gtk::CallbackAction::new(move |_, _| {
|
Some(gtk::CallbackAction::new(move |_, _| {
|
||||||
term.select_all();
|
term.select_all();
|
||||||
true
|
gtk::glib::Propagation::Proceed
|
||||||
})),
|
})),
|
||||||
));
|
));
|
||||||
model.term.term.add_controller(sc);
|
model.term.term.add_controller(sc);
|
||||||
|
|
|
@ -182,8 +182,8 @@ impl SimpleComponent for DevicesBox {
|
||||||
|
|
||||||
fn init(
|
fn init(
|
||||||
_init: Self::Init,
|
_init: Self::Init,
|
||||||
root: &Self::Root,
|
root: Self::Root,
|
||||||
sender: ComponentSender<Self>,
|
_sender: ComponentSender<Self>,
|
||||||
) -> ComponentParts<Self> {
|
) -> ComponentParts<Self> {
|
||||||
let devices_listbox = gtk::ListBox::builder()
|
let devices_listbox = gtk::ListBox::builder()
|
||||||
.css_classes(["boxed-list"])
|
.css_classes(["boxed-list"])
|
||||||
|
@ -193,7 +193,9 @@ impl SimpleComponent for DevicesBox {
|
||||||
let model = Self {
|
let model = Self {
|
||||||
tracker: 0,
|
tracker: 0,
|
||||||
devices: vec![],
|
devices: vec![],
|
||||||
device_rows: AsyncFactoryVecDeque::new(devices_listbox.clone(), sender.input_sender()),
|
device_rows: AsyncFactoryVecDeque::builder()
|
||||||
|
.launch(devices_listbox.clone())
|
||||||
|
.detach(),
|
||||||
};
|
};
|
||||||
|
|
||||||
let widgets = view_output!();
|
let widgets = view_output!();
|
||||||
|
|
|
@ -82,7 +82,6 @@ impl AsyncFactoryComponent for DeviceRowModel {
|
||||||
type Input = ();
|
type Input = ();
|
||||||
type Output = ();
|
type Output = ();
|
||||||
type CommandOutput = ();
|
type CommandOutput = ();
|
||||||
type ParentInput = DevicesBoxMsg;
|
|
||||||
type ParentWidget = gtk::ListBox;
|
type ParentWidget = gtk::ListBox;
|
||||||
|
|
||||||
view! {
|
view! {
|
||||||
|
@ -115,7 +114,7 @@ impl AsyncFactoryComponent for DeviceRowModel {
|
||||||
fn init_widgets(
|
fn init_widgets(
|
||||||
&mut self,
|
&mut self,
|
||||||
_index: &DynamicIndex,
|
_index: &DynamicIndex,
|
||||||
root: &Self::Root,
|
root: Self::Root,
|
||||||
_returned_widget: &<Self::ParentWidget as relm4::factory::FactoryView>::ReturnedWidget,
|
_returned_widget: &<Self::ParentWidget as relm4::factory::FactoryView>::ReturnedWidget,
|
||||||
_sender: AsyncFactorySender<Self>,
|
_sender: AsyncFactorySender<Self>,
|
||||||
) -> Self::Widgets {
|
) -> Self::Widgets {
|
||||||
|
|
|
@ -1,24 +1,15 @@
|
||||||
use crate::ui::profile_editor::ProfileEditorMsg;
|
|
||||||
use adw::prelude::*;
|
use adw::prelude::*;
|
||||||
use relm4::{factory::AsyncFactoryComponent, prelude::*, AsyncFactorySender};
|
use relm4::{factory::AsyncFactoryComponent, prelude::*, AsyncFactorySender};
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy)]
|
|
||||||
pub enum VarType {
|
|
||||||
EnvVar,
|
|
||||||
XrServiceCmakeFlags,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct EnvVarModel {
|
pub struct EnvVarModel {
|
||||||
pub name: String,
|
pub name: String,
|
||||||
value: String,
|
value: String,
|
||||||
var_type: VarType,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct EnvVarModelInit {
|
pub struct EnvVarModelInit {
|
||||||
pub name: String,
|
pub name: String,
|
||||||
pub value: String,
|
pub value: String,
|
||||||
pub var_type: VarType,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
@ -29,8 +20,8 @@ pub enum EnvVarModelMsg {
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum EnvVarModelOutMsg {
|
pub enum EnvVarModelOutMsg {
|
||||||
Changed(VarType, String, String),
|
Changed(String, String),
|
||||||
Delete(VarType, String),
|
Delete(String),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[relm4::factory(async pub)]
|
#[relm4::factory(async pub)]
|
||||||
|
@ -39,7 +30,6 @@ impl AsyncFactoryComponent for EnvVarModel {
|
||||||
type Input = EnvVarModelMsg;
|
type Input = EnvVarModelMsg;
|
||||||
type Output = EnvVarModelOutMsg;
|
type Output = EnvVarModelOutMsg;
|
||||||
type CommandOutput = ();
|
type CommandOutput = ();
|
||||||
type ParentInput = ProfileEditorMsg;
|
|
||||||
type ParentWidget = adw::PreferencesGroup;
|
type ParentWidget = adw::PreferencesGroup;
|
||||||
|
|
||||||
view! {
|
view! {
|
||||||
|
@ -66,33 +56,16 @@ impl AsyncFactoryComponent for EnvVarModel {
|
||||||
match message {
|
match message {
|
||||||
Self::Input::Changed(val) => {
|
Self::Input::Changed(val) => {
|
||||||
self.value = val.clone();
|
self.value = val.clone();
|
||||||
sender.output_sender().emit(Self::Output::Changed(
|
sender
|
||||||
self.var_type,
|
.output_sender()
|
||||||
self.name.clone(),
|
.emit(Self::Output::Changed(self.name.clone(), val));
|
||||||
val,
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
Self::Input::Delete => {
|
Self::Input::Delete => {
|
||||||
sender.output(Self::Output::Delete(self.var_type, self.name.clone()));
|
sender.output(Self::Output::Delete(self.name.clone()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn forward_to_parent(output: Self::Output) -> Option<Self::ParentInput> {
|
|
||||||
Some(match output {
|
|
||||||
Self::Output::Changed(var_type, name, value) => match var_type {
|
|
||||||
VarType::EnvVar => ProfileEditorMsg::EnvVarChanged(name, value),
|
|
||||||
VarType::XrServiceCmakeFlags => {
|
|
||||||
ProfileEditorMsg::XrServiceCmakeFlagsChanged(name, value)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
Self::Output::Delete(var_type, name) => match var_type {
|
|
||||||
VarType::EnvVar => ProfileEditorMsg::EnvVarDelete(name),
|
|
||||||
VarType::XrServiceCmakeFlags => ProfileEditorMsg::XrServiceCmakeFlagsDelete(name),
|
|
||||||
},
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
async fn init_model(
|
async fn init_model(
|
||||||
init: Self::Init,
|
init: Self::Init,
|
||||||
_index: &DynamicIndex,
|
_index: &DynamicIndex,
|
||||||
|
@ -101,7 +74,6 @@ impl AsyncFactoryComponent for EnvVarModel {
|
||||||
Self {
|
Self {
|
||||||
name: init.name,
|
name: init.name,
|
||||||
value: init.value,
|
value: init.value,
|
||||||
var_type: init.var_type,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,7 +36,6 @@ impl AsyncFactoryComponent for TrackerRoleModel {
|
||||||
type Input = TrackerRoleModelMsg;
|
type Input = TrackerRoleModelMsg;
|
||||||
type Output = TrackerRoleModelOutMsg;
|
type Output = TrackerRoleModelOutMsg;
|
||||||
type CommandOutput = ();
|
type CommandOutput = ();
|
||||||
type ParentInput = FbtConfigEditorMsg;
|
|
||||||
type ParentWidget = adw::PreferencesPage;
|
type ParentWidget = adw::PreferencesPage;
|
||||||
|
|
||||||
view! {
|
view! {
|
||||||
|
@ -82,22 +81,15 @@ impl AsyncFactoryComponent for TrackerRoleModel {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn forward_to_parent(output: Self::Output) -> Option<Self::ParentInput> {
|
|
||||||
Some(match output {
|
|
||||||
Self::Output::Changed(index, tracker_role) => {
|
|
||||||
Self::ParentInput::TrackerRoleChanged(index, tracker_role.clone())
|
|
||||||
}
|
|
||||||
Self::Output::Delete(index) => Self::ParentInput::TrackerRoleDeleted(index),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
async fn update(&mut self, message: Self::Input, sender: AsyncFactorySender<Self>) {
|
async fn update(&mut self, message: Self::Input, sender: AsyncFactorySender<Self>) {
|
||||||
match message {
|
match message {
|
||||||
Self::Input::Changed(r) => {
|
Self::Input::Changed(r) => {
|
||||||
self.tracker_role = r;
|
self.tracker_role = r;
|
||||||
sender.output(Self::Output::Changed(self.index, self.tracker_role.clone()));
|
sender.output(Self::Output::Changed(self.index, self.tracker_role.clone()));
|
||||||
}
|
}
|
||||||
Self::Input::Delete => sender.output(Self::Output::Delete(self.index)),
|
Self::Input::Delete => {
|
||||||
|
sender.output(Self::Output::Delete(self.index));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,15 +1,8 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
file_builders::wivrn_config::{Codec, Encoder, WivrnConfEncoder},
|
file_builders::wivrn_config::{Codec, Encoder, WivrnConfEncoder},
|
||||||
ui::{
|
ui::preference_rows::{combo_row, spin_row},
|
||||||
preference_rows::{combo_row, number_entry_row, spin_row},
|
|
||||||
util::{bits_from_mbits, bits_to_mbits},
|
|
||||||
wivrn_conf_editor::WivrnConfEditorMsg,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
use relm4::{
|
|
||||||
adw::prelude::*, factory::AsyncFactoryComponent, gtk::prelude::*, prelude::*,
|
|
||||||
AsyncFactorySender,
|
|
||||||
};
|
};
|
||||||
|
use relm4::{adw::prelude::*, factory::AsyncFactoryComponent, prelude::*, AsyncFactorySender};
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
@ -46,7 +39,6 @@ impl AsyncFactoryComponent for WivrnEncoderModel {
|
||||||
type Input = WivrnEncoderModelMsg;
|
type Input = WivrnEncoderModelMsg;
|
||||||
type Output = WivrnEncoderModelOutMsg;
|
type Output = WivrnEncoderModelOutMsg;
|
||||||
type CommandOutput = ();
|
type CommandOutput = ();
|
||||||
type ParentInput = WivrnConfEditorMsg;
|
|
||||||
type ParentWidget = adw::PreferencesPage;
|
type ParentWidget = adw::PreferencesPage;
|
||||||
|
|
||||||
view! {
|
view! {
|
||||||
|
@ -190,16 +182,12 @@ impl AsyncFactoryComponent for WivrnEncoderModel {
|
||||||
Self::Input::GroupChanged(val) => {
|
Self::Input::GroupChanged(val) => {
|
||||||
self.encoder_conf.group = val;
|
self.encoder_conf.group = val;
|
||||||
}
|
}
|
||||||
Self::Input::Delete => sender.output(Self::Output::Delete(self.uid.clone())),
|
Self::Input::Delete => {
|
||||||
|
sender.output(Self::Output::Delete(self.uid.clone()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn forward_to_parent(output: Self::Output) -> Option<Self::ParentInput> {
|
|
||||||
Some(match output {
|
|
||||||
Self::Output::Delete(id) => Self::ParentInput::DeleteEncoder(id),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
async fn init_model(
|
async fn init_model(
|
||||||
init: Self::Init,
|
init: Self::Init,
|
||||||
_index: &DynamicIndex,
|
_index: &DynamicIndex,
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use super::factories::tracker_role_group_factory::TrackerRoleModel;
|
use super::factories::tracker_role_group_factory::{TrackerRoleModel, TrackerRoleModelOutMsg};
|
||||||
use crate::{
|
use crate::{
|
||||||
file_builders::monado_config_v0::{
|
file_builders::monado_config_v0::{
|
||||||
dump_monado_config_v0, get_monado_config_v0, MonadoConfigV0, TrackerRole,
|
dump_monado_config_v0, get_monado_config_v0, MonadoConfigV0, TrackerRole,
|
||||||
|
@ -101,7 +101,7 @@ impl SimpleComponent for FbtConfigEditor {
|
||||||
|
|
||||||
fn init(
|
fn init(
|
||||||
init: Self::Init,
|
init: Self::Init,
|
||||||
root: &Self::Root,
|
root: Self::Root,
|
||||||
sender: ComponentSender<Self>,
|
sender: ComponentSender<Self>,
|
||||||
) -> ComponentParts<Self> {
|
) -> ComponentParts<Self> {
|
||||||
let page = adw::PreferencesPage::builder().build();
|
let page = adw::PreferencesPage::builder().build();
|
||||||
|
@ -124,7 +124,15 @@ impl SimpleComponent for FbtConfigEditor {
|
||||||
win: None,
|
win: None,
|
||||||
tracker: 0,
|
tracker: 0,
|
||||||
monado_config_v0: get_monado_config_v0(),
|
monado_config_v0: get_monado_config_v0(),
|
||||||
tracker_role_groups: AsyncFactoryVecDeque::new(page, sender.input_sender()),
|
tracker_role_groups: AsyncFactoryVecDeque::builder().launch(page).forward(
|
||||||
|
sender.input_sender(),
|
||||||
|
|msg| match msg {
|
||||||
|
TrackerRoleModelOutMsg::Changed(index, tracker_role) => {
|
||||||
|
Self::Input::TrackerRoleChanged(index, tracker_role.clone())
|
||||||
|
}
|
||||||
|
TrackerRoleModelOutMsg::Delete(index) => Self::Input::TrackerRoleDeleted(index),
|
||||||
|
},
|
||||||
|
),
|
||||||
};
|
};
|
||||||
|
|
||||||
model.populate_tracker_roles();
|
model.populate_tracker_roles();
|
||||||
|
@ -141,7 +149,7 @@ impl SimpleComponent for FbtConfigEditor {
|
||||||
gtk::ShortcutTrigger::parse_string("Escape"),
|
gtk::ShortcutTrigger::parse_string("Escape"),
|
||||||
Some(gtk::CallbackAction::new(move |_, _| {
|
Some(gtk::CallbackAction::new(move |_, _| {
|
||||||
win.close();
|
win.close();
|
||||||
true
|
gtk::glib::Propagation::Proceed
|
||||||
})),
|
})),
|
||||||
));
|
));
|
||||||
widgets.win.add_controller(sc);
|
widgets.win.add_controller(sc);
|
||||||
|
|
|
@ -196,7 +196,7 @@ impl SimpleComponent for InstallWivrnBox {
|
||||||
|
|
||||||
fn init(
|
fn init(
|
||||||
init: Self::Init,
|
init: Self::Init,
|
||||||
root: &Self::Root,
|
root: Self::Root,
|
||||||
sender: ComponentSender<Self>,
|
sender: ComponentSender<Self>,
|
||||||
) -> ComponentParts<Self> {
|
) -> ComponentParts<Self> {
|
||||||
let model = Self {
|
let model = Self {
|
||||||
|
|
|
@ -480,7 +480,7 @@ impl SimpleComponent for LibsurviveSetupWindow {
|
||||||
|
|
||||||
fn init(
|
fn init(
|
||||||
_init: Self::Init,
|
_init: Self::Init,
|
||||||
root: &Self::Root,
|
root: Self::Root,
|
||||||
sender: relm4::ComponentSender<Self>,
|
sender: relm4::ComponentSender<Self>,
|
||||||
) -> relm4::ComponentParts<Self> {
|
) -> relm4::ComponentParts<Self> {
|
||||||
let json_filter = gtk::FileFilter::new();
|
let json_filter = gtk::FileFilter::new();
|
||||||
|
|
|
@ -22,8 +22,7 @@ use crate::ui::steamvr_calibration_box::SteamVrCalibrationBoxMsg;
|
||||||
use crate::ui::util::{copy_text, limit_dropdown_width, warning_heading};
|
use crate::ui::util::{copy_text, limit_dropdown_width, warning_heading};
|
||||||
use crate::xr_devices::XRDevice;
|
use crate::xr_devices::XRDevice;
|
||||||
use gtk::prelude::*;
|
use gtk::prelude::*;
|
||||||
use relm4::adw::traits::MessageDialogExt;
|
use relm4::adw::{prelude::MessageDialogExt, ResponseAppearance};
|
||||||
use relm4::adw::ResponseAppearance;
|
|
||||||
use relm4::prelude::*;
|
use relm4::prelude::*;
|
||||||
use relm4::{ComponentParts, ComponentSender, SimpleComponent};
|
use relm4::{ComponentParts, ComponentSender, SimpleComponent};
|
||||||
|
|
||||||
|
@ -622,7 +621,7 @@ impl SimpleComponent for MainView {
|
||||||
|
|
||||||
fn init(
|
fn init(
|
||||||
init: Self::Init,
|
init: Self::Init,
|
||||||
root: &Self::Root,
|
root: Self::Root,
|
||||||
sender: ComponentSender<Self>,
|
sender: ComponentSender<Self>,
|
||||||
) -> ComponentParts<Self> {
|
) -> ComponentParts<Self> {
|
||||||
let profile_not_editable_dialog = adw::MessageDialog::builder()
|
let profile_not_editable_dialog = adw::MessageDialog::builder()
|
||||||
|
|
|
@ -1,11 +1,14 @@
|
||||||
use super::{
|
use super::{
|
||||||
alert::alert,
|
alert::alert,
|
||||||
factories::env_var_row_factory::{EnvVarModel, EnvVarModelInit, VarType},
|
factories::env_var_row_factory::{EnvVarModel, EnvVarModelInit},
|
||||||
};
|
};
|
||||||
use crate::{
|
use crate::{
|
||||||
env_var_descriptions::env_var_descriptions_as_paragraph,
|
env_var_descriptions::env_var_descriptions_as_paragraph,
|
||||||
profile::{LighthouseDriver, Profile, XRServiceType},
|
profile::{LighthouseDriver, Profile, XRServiceType},
|
||||||
ui::preference_rows::{combo_row, entry_row, path_row, switch_row},
|
ui::{
|
||||||
|
factories::env_var_row_factory::EnvVarModelOutMsg,
|
||||||
|
preference_rows::{combo_row, entry_row, path_row, switch_row},
|
||||||
|
},
|
||||||
};
|
};
|
||||||
use adw::prelude::*;
|
use adw::prelude::*;
|
||||||
use gtk::glib::clone;
|
use gtk::glib::clone;
|
||||||
|
@ -415,11 +418,9 @@ impl SimpleComponent for ProfileEditor {
|
||||||
(var, "".to_string())
|
(var, "".to_string())
|
||||||
};
|
};
|
||||||
prof.environment.insert(name.clone(), value.clone());
|
prof.environment.insert(name.clone(), value.clone());
|
||||||
self.env_rows.guard().push_back(EnvVarModelInit {
|
self.env_rows
|
||||||
name,
|
.guard()
|
||||||
value,
|
.push_back(EnvVarModelInit { name, value });
|
||||||
var_type: VarType::EnvVar,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Self::Input::AddXrServiceCmakeFlag(name) => {
|
Self::Input::AddXrServiceCmakeFlag(name) => {
|
||||||
|
@ -432,7 +433,6 @@ impl SimpleComponent for ProfileEditor {
|
||||||
.push_back(EnvVarModelInit {
|
.push_back(EnvVarModelInit {
|
||||||
name,
|
name,
|
||||||
value: "".to_string(),
|
value: "".to_string(),
|
||||||
var_type: VarType::XrServiceCmakeFlags,
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -441,7 +441,7 @@ impl SimpleComponent for ProfileEditor {
|
||||||
|
|
||||||
fn init(
|
fn init(
|
||||||
init: Self::Init,
|
init: Self::Init,
|
||||||
root: &Self::Root,
|
root: Self::Root,
|
||||||
sender: ComponentSender<Self>,
|
sender: ComponentSender<Self>,
|
||||||
) -> ComponentParts<Self> {
|
) -> ComponentParts<Self> {
|
||||||
let (add_env_var_btn, add_cmake_flag_btn) = {
|
let (add_env_var_btn, add_cmake_flag_btn) = {
|
||||||
|
@ -499,21 +499,35 @@ impl SimpleComponent for ProfileEditor {
|
||||||
let mut model = Self {
|
let mut model = Self {
|
||||||
profile,
|
profile,
|
||||||
win: None,
|
win: None,
|
||||||
env_rows: AsyncFactoryVecDeque::new(
|
env_rows: AsyncFactoryVecDeque::builder()
|
||||||
adw::PreferencesGroup::builder()
|
.launch(
|
||||||
.title("Environment Variables")
|
adw::PreferencesGroup::builder()
|
||||||
.description(env_var_descriptions_as_paragraph())
|
.title("Environment Variables")
|
||||||
.header_suffix(&add_env_var_btn)
|
.description(env_var_descriptions_as_paragraph())
|
||||||
.build(),
|
.header_suffix(&add_env_var_btn)
|
||||||
sender.input_sender(),
|
.build(),
|
||||||
),
|
)
|
||||||
xrservice_cmake_flags_rows: AsyncFactoryVecDeque::new(
|
.forward(sender.input_sender(), |msg| match msg {
|
||||||
adw::PreferencesGroup::builder()
|
EnvVarModelOutMsg::Changed(name, value) => {
|
||||||
.title("XR Service CMake Flags")
|
ProfileEditorMsg::EnvVarChanged(name, value)
|
||||||
.header_suffix(&add_cmake_flag_btn)
|
}
|
||||||
.build(),
|
EnvVarModelOutMsg::Delete(name) => ProfileEditorMsg::EnvVarDelete(name),
|
||||||
sender.input_sender(),
|
}),
|
||||||
),
|
xrservice_cmake_flags_rows: AsyncFactoryVecDeque::builder()
|
||||||
|
.launch(
|
||||||
|
adw::PreferencesGroup::builder()
|
||||||
|
.title("XR Service CMake Flags")
|
||||||
|
.header_suffix(&add_cmake_flag_btn)
|
||||||
|
.build(),
|
||||||
|
)
|
||||||
|
.forward(sender.input_sender(), |msg| match msg {
|
||||||
|
EnvVarModelOutMsg::Changed(name, value) => {
|
||||||
|
ProfileEditorMsg::XrServiceCmakeFlagsChanged(name, value)
|
||||||
|
}
|
||||||
|
EnvVarModelOutMsg::Delete(name) => {
|
||||||
|
ProfileEditorMsg::XrServiceCmakeFlagsDelete(name)
|
||||||
|
}
|
||||||
|
}),
|
||||||
tracker: 0,
|
tracker: 0,
|
||||||
};
|
};
|
||||||
{
|
{
|
||||||
|
@ -523,7 +537,6 @@ impl SimpleComponent for ProfileEditor {
|
||||||
guard.push_back(EnvVarModelInit {
|
guard.push_back(EnvVarModelInit {
|
||||||
name: k.clone(),
|
name: k.clone(),
|
||||||
value: v.clone(),
|
value: v.clone(),
|
||||||
var_type: VarType::EnvVar,
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -534,7 +547,6 @@ impl SimpleComponent for ProfileEditor {
|
||||||
guard.push_back(EnvVarModelInit {
|
guard.push_back(EnvVarModelInit {
|
||||||
name: k.clone(),
|
name: k.clone(),
|
||||||
value: v.clone(),
|
value: v.clone(),
|
||||||
var_type: VarType::XrServiceCmakeFlags,
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -108,7 +108,7 @@ impl SimpleComponent for SteamLaunchOptionsBox {
|
||||||
|
|
||||||
fn init(
|
fn init(
|
||||||
_init: Self::Init,
|
_init: Self::Init,
|
||||||
root: &Self::Root,
|
root: Self::Root,
|
||||||
sender: ComponentSender<Self>,
|
sender: ComponentSender<Self>,
|
||||||
) -> ComponentParts<Self> {
|
) -> ComponentParts<Self> {
|
||||||
let model = Self {
|
let model = Self {
|
||||||
|
|
|
@ -211,7 +211,7 @@ impl SimpleComponent for SteamVrCalibrationBox {
|
||||||
|
|
||||||
fn init(
|
fn init(
|
||||||
init: Self::Init,
|
init: Self::Init,
|
||||||
root: &Self::Root,
|
root: Self::Root,
|
||||||
sender: ComponentSender<Self>,
|
sender: ComponentSender<Self>,
|
||||||
) -> ComponentParts<Self> {
|
) -> ComponentParts<Self> {
|
||||||
let model = Self {
|
let model = Self {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use gtk4::gdk;
|
use gtk4::gdk;
|
||||||
use relm4::adw;
|
use relm4::adw;
|
||||||
use zoha_vte4::{Terminal, TerminalExt};
|
use vte4::{Terminal, TerminalExt};
|
||||||
|
|
||||||
const MAX_SCROLLBACK: u32 = 2000;
|
const MAX_SCROLLBACK: u32 = 2000;
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ impl TermWidget {
|
||||||
|
|
||||||
pub fn set_search_term(&self, term: Option<&str>) {
|
pub fn set_search_term(&self, term: Option<&str>) {
|
||||||
self.term.search_set_regex(
|
self.term.search_set_regex(
|
||||||
term.map(|txt| zoha_vte4::Regex::for_search(txt, 0).ok())
|
term.map(|txt| vte4::Regex::for_search(txt, 0).ok())
|
||||||
.flatten()
|
.flatten()
|
||||||
.as_ref(),
|
.as_ref(),
|
||||||
0,
|
0,
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
use super::{
|
use super::{
|
||||||
factories::wivrn_encoder_group_factory::{WivrnEncoderModel, WivrnEncoderModelInit},
|
factories::wivrn_encoder_group_factory::{
|
||||||
|
WivrnEncoderModel, WivrnEncoderModelInit, WivrnEncoderModelOutMsg,
|
||||||
|
},
|
||||||
util::bits_from_mbits,
|
util::bits_from_mbits,
|
||||||
};
|
};
|
||||||
use crate::{
|
use crate::{
|
||||||
|
@ -121,10 +123,7 @@ impl SimpleComponent for WivrnConfEditor {
|
||||||
})
|
})
|
||||||
.unwrap_or_default(),
|
.unwrap_or_default(),
|
||||||
false,
|
false,
|
||||||
{
|
move |_| {}
|
||||||
let sender = sender.clone();
|
|
||||||
move |_| {}
|
|
||||||
}
|
|
||||||
) -> adw::EntryRow,
|
) -> adw::EntryRow,
|
||||||
},
|
},
|
||||||
add: encodersrgp = &adw::PreferencesGroup {
|
add: encodersrgp = &adw::PreferencesGroup {
|
||||||
|
@ -207,7 +206,7 @@ impl SimpleComponent for WivrnConfEditor {
|
||||||
|
|
||||||
fn init(
|
fn init(
|
||||||
init: Self::Init,
|
init: Self::Init,
|
||||||
root: &Self::Root,
|
root: Self::Root,
|
||||||
sender: ComponentSender<Self>,
|
sender: ComponentSender<Self>,
|
||||||
) -> ComponentParts<Self> {
|
) -> ComponentParts<Self> {
|
||||||
let mut model = Self {
|
let mut model = Self {
|
||||||
|
@ -227,7 +226,11 @@ impl SimpleComponent for WivrnConfEditor {
|
||||||
model.bitrate_row = Some(widgets.bitrate_row.clone());
|
model.bitrate_row = Some(widgets.bitrate_row.clone());
|
||||||
|
|
||||||
let mut encoder_models: AsyncFactoryVecDeque<WivrnEncoderModel> =
|
let mut encoder_models: AsyncFactoryVecDeque<WivrnEncoderModel> =
|
||||||
AsyncFactoryVecDeque::new(widgets.pref_page.clone(), sender.input_sender());
|
AsyncFactoryVecDeque::builder()
|
||||||
|
.launch(widgets.pref_page.clone())
|
||||||
|
.forward(sender.input_sender(), |msg| match msg {
|
||||||
|
WivrnEncoderModelOutMsg::Delete(id) => WivrnConfEditorMsg::DeleteEncoder(id),
|
||||||
|
});
|
||||||
for encoder_conf in model.conf.encoders.clone() {
|
for encoder_conf in model.conf.encoders.clone() {
|
||||||
encoder_models.guard().push_back(WivrnEncoderModelInit {
|
encoder_models.guard().push_back(WivrnEncoderModelInit {
|
||||||
encoder_conf: Some(encoder_conf),
|
encoder_conf: Some(encoder_conf),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue