feat!: upgrade to relm 0.8; upgrade crates

This commit is contained in:
Gabriele Musco 2024-06-10 07:42:52 +02:00
commit 27325e2b65
No known key found for this signature in database
GPG key ID: 1068D795C80E51DE
23 changed files with 537 additions and 446 deletions

720
Cargo.lock generated

File diff suppressed because it is too large Load diff

View file

@ -11,25 +11,26 @@ gettext-rs = { version = "0.7.0", features = [
"gettext-system"
] }
git2 = "0.18.2"
gtk4 = { version = "0.7.2", features = [
gtk4 = { version = "0.8.2", features = [
"v4_10",
] }
lazy_static = "1.4.0"
libadwaita = { version = "0.5.3", features = [
libadwaita = { version = "0.6.0", features = [
"v1_4"
] }
libmonado-rs = { git = "https://github.com/technobaboo/libmonado-rs", version = "0.1.0" }
libusb = "0.3.0"
nix = { version = "0.26.4", features = [
"fs"
nix = { version = "0.29.0", features = [
"fs",
"signal"
] }
phf = "0.11.2"
phf_macros = "0.11.2"
relm4 = { version = "0.7.0-beta.1", features = [
relm4 = { version = "0.8.1", features = [
"libadwaita"
] }
relm4-components = "0.7.0-alpha.1"
reqwest = { version = "0.11.20", features = [
relm4-components = "0.8.1"
reqwest = { version = "0.12.4", features = [
"blocking"
] }
serde = { version = "1.0.188", features = [
@ -38,4 +39,4 @@ serde = { version = "1.0.188", features = [
serde_json = "1.0.106"
tracker = "0.2.1"
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"] }

View file

@ -1,8 +1,3 @@
use crate::{
file_utils::get_writer,
profile::{Profile, XRServiceType},
runner::{Runner, RunnerStatus},
};
use nix::{
sys::signal::{
kill,
@ -10,6 +5,12 @@ use nix::{
},
unistd::Pid,
};
use crate::{
file_utils::get_writer,
profile::{Profile, XRServiceType},
runner::{Runner, RunnerStatus},
};
use std::{
collections::HashMap,
io::{BufRead, BufReader, Write},

View file

@ -1,5 +1,5 @@
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::{ComponentParts, SimpleComponent};
@ -28,7 +28,7 @@ impl SimpleComponent for AboutDialog {
fn init(
_init: Self::Init,
root: &Self::Root,
root: Self::Root,
_sender: relm4::ComponentSender<Self>,
) -> relm4::ComponentParts<Self> {
let model = AboutDialog {};

View file

@ -1,5 +1,5 @@
use gtk::traits::{GtkApplicationExt, GtkWindowExt};
use relm4::{adw::traits::MessageDialogExt, prelude::*};
use gtk::prelude::{GtkApplicationExt, GtkWindowExt};
use relm4::{adw::prelude::MessageDialogExt, prelude::*};
fn alert_base(title: &str, msg: Option<&str>, parent: Option<&gtk::Window>) -> adw::MessageDialog {
let d = adw::MessageDialog::builder()

View file

@ -47,7 +47,7 @@ use crate::xr_devices::XRDevice;
use gtk::glib::clone;
use gtk::prelude::*;
use relm4::actions::{AccelsPlus, ActionGroupName, RelmAction, RelmActionGroup};
use relm4::adw::traits::MessageDialogExt;
use relm4::adw::prelude::MessageDialogExt;
use relm4::adw::ResponseAppearance;
use relm4::gtk::glib;
use relm4::{new_action_group, new_stateful_action, new_stateless_action, prelude::*};
@ -743,7 +743,7 @@ impl SimpleComponent for App {
fn init(
init: Self::Init,
root: &Self::Root,
root: Self::Root,
sender: ComponentSender<Self>,
) -> ComponentParts<Self> {
let config = Config::get_config();
@ -751,7 +751,7 @@ impl SimpleComponent for App {
let profiles = config.profiles();
let setcap_confirm_dialog = adw::MessageDialog::builder()
.modal(true)
.transient_for(root)
.transient_for(&root)
.heading("Set Capabilities")
.body(concat!(
"We need to set certain capabilities (CAP_SYS_NICE=eip) on the ",
@ -801,17 +801,17 @@ impl SimpleComponent for App {
},
),
about_dialog: AboutDialog::builder()
.transient_for(root)
.transient_for(&root)
.launch(())
.detach(),
build_window: BuildWindow::builder()
.transient_for(root)
.transient_for(&root)
.launch(())
.forward(sender.input_sender(), |msg| match msg {
BuildWindowOutMsg::CancelBuild => Msg::CancelBuild,
}),
libsurvive_setup_window: LibsurviveSetupWindow::builder()
.transient_for(root)
.transient_for(&root)
.launch(())
.detach(),
split_view: None,

View file

@ -163,7 +163,7 @@ impl SimpleComponent for BuildWindow {
fn init(
_init: Self::Init,
root: &Self::Root,
root: Self::Root,
sender: ComponentSender<Self>,
) -> ComponentParts<Self> {
let mut model = Self {

View file

@ -4,7 +4,7 @@ use gtk4::{
prelude::{ApplicationCommandLineExt, ApplicationExt},
Application, ApplicationCommandLine,
},
glib::{self, IsA},
glib::{self, prelude::IsA},
};
#[derive(Debug, Clone)]

View file

@ -7,7 +7,7 @@ use gtk::glib::clone;
use gtk::prelude::*;
use relm4::prelude::*;
use relm4::{ComponentSender, SimpleComponent};
use zoha_vte4::TerminalExt;
use vte4::TerminalExt;
#[derive(Debug)]
pub enum SearchDirection {
@ -195,7 +195,7 @@ impl SimpleComponent for DebugView {
fn init(
_init: Self::Init,
root: &Self::Root,
root: Self::Root,
sender: ComponentSender<Self>,
) -> ComponentParts<Self> {
let log_level_dropdown = gtk::DropDown::from_strings(
@ -240,10 +240,10 @@ impl SimpleComponent for DebugView {
sc.add_shortcut(gtk::Shortcut::new(
gtk::ShortcutTrigger::parse_string("<Control>c"),
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());
}
true
gtk::glib::Propagation::Proceed
})),
));
let term = model.term.term.clone();
@ -251,7 +251,7 @@ impl SimpleComponent for DebugView {
gtk::ShortcutTrigger::parse_string("<Control>a"),
Some(gtk::CallbackAction::new(move |_, _| {
term.select_all();
true
gtk::glib::Propagation::Proceed
})),
));
model.term.term.add_controller(sc);

View file

@ -182,8 +182,8 @@ impl SimpleComponent for DevicesBox {
fn init(
_init: Self::Init,
root: &Self::Root,
sender: ComponentSender<Self>,
root: Self::Root,
_sender: ComponentSender<Self>,
) -> ComponentParts<Self> {
let devices_listbox = gtk::ListBox::builder()
.css_classes(["boxed-list"])
@ -193,7 +193,9 @@ impl SimpleComponent for DevicesBox {
let model = Self {
tracker: 0,
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!();

View file

@ -82,7 +82,6 @@ impl AsyncFactoryComponent for DeviceRowModel {
type Input = ();
type Output = ();
type CommandOutput = ();
type ParentInput = DevicesBoxMsg;
type ParentWidget = gtk::ListBox;
view! {
@ -115,7 +114,7 @@ impl AsyncFactoryComponent for DeviceRowModel {
fn init_widgets(
&mut self,
_index: &DynamicIndex,
root: &Self::Root,
root: Self::Root,
_returned_widget: &<Self::ParentWidget as relm4::factory::FactoryView>::ReturnedWidget,
_sender: AsyncFactorySender<Self>,
) -> Self::Widgets {

View file

@ -1,24 +1,15 @@
use crate::ui::profile_editor::ProfileEditorMsg;
use adw::prelude::*;
use relm4::{factory::AsyncFactoryComponent, prelude::*, AsyncFactorySender};
#[derive(Debug, Clone, Copy)]
pub enum VarType {
EnvVar,
XrServiceCmakeFlags,
}
#[derive(Debug)]
pub struct EnvVarModel {
pub name: String,
value: String,
var_type: VarType,
}
pub struct EnvVarModelInit {
pub name: String,
pub value: String,
pub var_type: VarType,
}
#[derive(Debug)]
@ -29,8 +20,8 @@ pub enum EnvVarModelMsg {
#[derive(Debug)]
pub enum EnvVarModelOutMsg {
Changed(VarType, String, String),
Delete(VarType, String),
Changed(String, String),
Delete(String),
}
#[relm4::factory(async pub)]
@ -39,7 +30,6 @@ impl AsyncFactoryComponent for EnvVarModel {
type Input = EnvVarModelMsg;
type Output = EnvVarModelOutMsg;
type CommandOutput = ();
type ParentInput = ProfileEditorMsg;
type ParentWidget = adw::PreferencesGroup;
view! {
@ -66,33 +56,16 @@ impl AsyncFactoryComponent for EnvVarModel {
match message {
Self::Input::Changed(val) => {
self.value = val.clone();
sender.output_sender().emit(Self::Output::Changed(
self.var_type,
self.name.clone(),
val,
));
sender
.output_sender()
.emit(Self::Output::Changed(self.name.clone(), val));
}
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(
init: Self::Init,
_index: &DynamicIndex,
@ -101,7 +74,6 @@ impl AsyncFactoryComponent for EnvVarModel {
Self {
name: init.name,
value: init.value,
var_type: init.var_type,
}
}
}

View file

@ -36,7 +36,6 @@ impl AsyncFactoryComponent for TrackerRoleModel {
type Input = TrackerRoleModelMsg;
type Output = TrackerRoleModelOutMsg;
type CommandOutput = ();
type ParentInput = FbtConfigEditorMsg;
type ParentWidget = adw::PreferencesPage;
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>) {
match message {
Self::Input::Changed(r) => {
self.tracker_role = r;
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));
}
}
}

View file

@ -1,15 +1,8 @@
use crate::{
file_builders::wivrn_config::{Codec, Encoder, WivrnConfEncoder},
ui::{
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,
ui::preference_rows::{combo_row, spin_row},
};
use relm4::{adw::prelude::*, factory::AsyncFactoryComponent, prelude::*, AsyncFactorySender};
use uuid::Uuid;
#[derive(Debug)]
@ -46,7 +39,6 @@ impl AsyncFactoryComponent for WivrnEncoderModel {
type Input = WivrnEncoderModelMsg;
type Output = WivrnEncoderModelOutMsg;
type CommandOutput = ();
type ParentInput = WivrnConfEditorMsg;
type ParentWidget = adw::PreferencesPage;
view! {
@ -190,16 +182,12 @@ impl AsyncFactoryComponent for WivrnEncoderModel {
Self::Input::GroupChanged(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(
init: Self::Init,
_index: &DynamicIndex,

View file

@ -1,4 +1,4 @@
use super::factories::tracker_role_group_factory::TrackerRoleModel;
use super::factories::tracker_role_group_factory::{TrackerRoleModel, TrackerRoleModelOutMsg};
use crate::{
file_builders::monado_config_v0::{
dump_monado_config_v0, get_monado_config_v0, MonadoConfigV0, TrackerRole,
@ -101,7 +101,7 @@ impl SimpleComponent for FbtConfigEditor {
fn init(
init: Self::Init,
root: &Self::Root,
root: Self::Root,
sender: ComponentSender<Self>,
) -> ComponentParts<Self> {
let page = adw::PreferencesPage::builder().build();
@ -124,7 +124,15 @@ impl SimpleComponent for FbtConfigEditor {
win: None,
tracker: 0,
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();
@ -141,7 +149,7 @@ impl SimpleComponent for FbtConfigEditor {
gtk::ShortcutTrigger::parse_string("Escape"),
Some(gtk::CallbackAction::new(move |_, _| {
win.close();
true
gtk::glib::Propagation::Proceed
})),
));
widgets.win.add_controller(sc);

View file

@ -196,7 +196,7 @@ impl SimpleComponent for InstallWivrnBox {
fn init(
init: Self::Init,
root: &Self::Root,
root: Self::Root,
sender: ComponentSender<Self>,
) -> ComponentParts<Self> {
let model = Self {

View file

@ -480,7 +480,7 @@ impl SimpleComponent for LibsurviveSetupWindow {
fn init(
_init: Self::Init,
root: &Self::Root,
root: Self::Root,
sender: relm4::ComponentSender<Self>,
) -> relm4::ComponentParts<Self> {
let json_filter = gtk::FileFilter::new();

View file

@ -22,8 +22,7 @@ use crate::ui::steamvr_calibration_box::SteamVrCalibrationBoxMsg;
use crate::ui::util::{copy_text, limit_dropdown_width, warning_heading};
use crate::xr_devices::XRDevice;
use gtk::prelude::*;
use relm4::adw::traits::MessageDialogExt;
use relm4::adw::ResponseAppearance;
use relm4::adw::{prelude::MessageDialogExt, ResponseAppearance};
use relm4::prelude::*;
use relm4::{ComponentParts, ComponentSender, SimpleComponent};
@ -622,7 +621,7 @@ impl SimpleComponent for MainView {
fn init(
init: Self::Init,
root: &Self::Root,
root: Self::Root,
sender: ComponentSender<Self>,
) -> ComponentParts<Self> {
let profile_not_editable_dialog = adw::MessageDialog::builder()

View file

@ -1,11 +1,14 @@
use super::{
alert::alert,
factories::env_var_row_factory::{EnvVarModel, EnvVarModelInit, VarType},
factories::env_var_row_factory::{EnvVarModel, EnvVarModelInit},
};
use crate::{
env_var_descriptions::env_var_descriptions_as_paragraph,
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 gtk::glib::clone;
@ -415,11 +418,9 @@ impl SimpleComponent for ProfileEditor {
(var, "".to_string())
};
prof.environment.insert(name.clone(), value.clone());
self.env_rows.guard().push_back(EnvVarModelInit {
name,
value,
var_type: VarType::EnvVar,
});
self.env_rows
.guard()
.push_back(EnvVarModelInit { name, value });
}
}
Self::Input::AddXrServiceCmakeFlag(name) => {
@ -432,7 +433,6 @@ impl SimpleComponent for ProfileEditor {
.push_back(EnvVarModelInit {
name,
value: "".to_string(),
var_type: VarType::XrServiceCmakeFlags,
});
}
}
@ -441,7 +441,7 @@ impl SimpleComponent for ProfileEditor {
fn init(
init: Self::Init,
root: &Self::Root,
root: Self::Root,
sender: ComponentSender<Self>,
) -> ComponentParts<Self> {
let (add_env_var_btn, add_cmake_flag_btn) = {
@ -499,21 +499,35 @@ impl SimpleComponent for ProfileEditor {
let mut model = Self {
profile,
win: None,
env_rows: AsyncFactoryVecDeque::new(
adw::PreferencesGroup::builder()
.title("Environment Variables")
.description(env_var_descriptions_as_paragraph())
.header_suffix(&add_env_var_btn)
.build(),
sender.input_sender(),
),
xrservice_cmake_flags_rows: AsyncFactoryVecDeque::new(
adw::PreferencesGroup::builder()
.title("XR Service CMake Flags")
.header_suffix(&add_cmake_flag_btn)
.build(),
sender.input_sender(),
),
env_rows: AsyncFactoryVecDeque::builder()
.launch(
adw::PreferencesGroup::builder()
.title("Environment Variables")
.description(env_var_descriptions_as_paragraph())
.header_suffix(&add_env_var_btn)
.build(),
)
.forward(sender.input_sender(), |msg| match msg {
EnvVarModelOutMsg::Changed(name, value) => {
ProfileEditorMsg::EnvVarChanged(name, value)
}
EnvVarModelOutMsg::Delete(name) => ProfileEditorMsg::EnvVarDelete(name),
}),
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,
};
{
@ -523,7 +537,6 @@ impl SimpleComponent for ProfileEditor {
guard.push_back(EnvVarModelInit {
name: k.clone(),
value: v.clone(),
var_type: VarType::EnvVar,
});
}
}
@ -534,7 +547,6 @@ impl SimpleComponent for ProfileEditor {
guard.push_back(EnvVarModelInit {
name: k.clone(),
value: v.clone(),
var_type: VarType::XrServiceCmakeFlags,
});
}
}

View file

@ -108,7 +108,7 @@ impl SimpleComponent for SteamLaunchOptionsBox {
fn init(
_init: Self::Init,
root: &Self::Root,
root: Self::Root,
sender: ComponentSender<Self>,
) -> ComponentParts<Self> {
let model = Self {

View file

@ -211,7 +211,7 @@ impl SimpleComponent for SteamVrCalibrationBox {
fn init(
init: Self::Init,
root: &Self::Root,
root: Self::Root,
sender: ComponentSender<Self>,
) -> ComponentParts<Self> {
let model = Self {

View file

@ -1,6 +1,6 @@
use gtk4::gdk;
use relm4::adw;
use zoha_vte4::{Terminal, TerminalExt};
use vte4::{Terminal, TerminalExt};
const MAX_SCROLLBACK: u32 = 2000;
@ -51,7 +51,7 @@ impl TermWidget {
pub fn set_search_term(&self, term: Option<&str>) {
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()
.as_ref(),
0,

View file

@ -1,5 +1,7 @@
use super::{
factories::wivrn_encoder_group_factory::{WivrnEncoderModel, WivrnEncoderModelInit},
factories::wivrn_encoder_group_factory::{
WivrnEncoderModel, WivrnEncoderModelInit, WivrnEncoderModelOutMsg,
},
util::bits_from_mbits,
};
use crate::{
@ -121,10 +123,7 @@ impl SimpleComponent for WivrnConfEditor {
})
.unwrap_or_default(),
false,
{
let sender = sender.clone();
move |_| {}
}
move |_| {}
) -> adw::EntryRow,
},
add: encodersrgp = &adw::PreferencesGroup {
@ -207,7 +206,7 @@ impl SimpleComponent for WivrnConfEditor {
fn init(
init: Self::Init,
root: &Self::Root,
root: Self::Root,
sender: ComponentSender<Self>,
) -> ComponentParts<Self> {
let mut model = Self {
@ -227,7 +226,11 @@ impl SimpleComponent for WivrnConfEditor {
model.bitrate_row = Some(widgets.bitrate_row.clone());
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() {
encoder_models.guard().push_back(WivrnEncoderModelInit {
encoder_conf: Some(encoder_conf),