feat: limit profile dropdown width

This commit is contained in:
Gabriele Musco 2023-07-23 10:44:55 +02:00
commit d41ce0d1e2
No known key found for this signature in database
GPG key ID: 1068D795C80E51DE
3 changed files with 75 additions and 19 deletions

View file

@ -10,6 +10,7 @@ use crate::ui::app::{
LibsurviveSetupAction, LibsurviveSetupAction,
}; };
use crate::ui::profile_editor::ProfileEditorInit; use crate::ui::profile_editor::ProfileEditorInit;
use crate::ui::util::limit_dropdown_width;
use crate::xr_devices::XRDevices; use crate::xr_devices::XRDevices;
use gtk::prelude::*; use gtk::prelude::*;
use relm4::adw::traits::MessageDialogExt; use relm4::adw::traits::MessageDialogExt;
@ -80,14 +81,16 @@ pub struct MainViewInit {
impl MainView { impl MainView {
fn create_profile_editor(&mut self, sender: ComponentSender<MainView>, prof: Profile) { fn create_profile_editor(&mut self, sender: ComponentSender<MainView>, prof: Profile) {
self.profile_editor = Some(ProfileEditor::builder() self.profile_editor = Some(
.launch(ProfileEditorInit { ProfileEditor::builder()
root_win: self.root_win.clone(), .launch(ProfileEditorInit {
profile: prof, root_win: self.root_win.clone(),
}) profile: prof,
.forward(sender.input_sender(), |message| match message { })
ProfileEditorOutMsg::SaveProfile(p) => MainViewMsg::SaveProfile(p), .forward(sender.input_sender(), |message| match message {
})); ProfileEditorOutMsg::SaveProfile(p) => MainViewMsg::SaveProfile(p),
}),
);
} }
} }
@ -118,7 +121,7 @@ impl SimpleComponent for MainView {
#[track = "model.changed(Self::enable_debug_view())"] #[track = "model.changed(Self::enable_debug_view())"]
set_hexpand: !model.enable_debug_view, set_hexpand: !model.enable_debug_view,
set_vexpand: true, set_vexpand: true,
set_size_request: (270, 350), set_size_request: (360, 350),
gtk::WindowHandle { gtk::WindowHandle {
set_hexpand: true, set_hexpand: true,
set_vexpand: false, set_vexpand: false,
@ -199,14 +202,22 @@ impl SimpleComponent for MainView {
#[name(profiles_dropdown)] #[name(profiles_dropdown)]
gtk::DropDown { gtk::DropDown {
set_hexpand: true, set_hexpand: true,
set_tooltip_text: Some("Profiles"), #[track = "model.changed(Self::selected_profile())"]
set_tooltip_text: Some(format!("Profile: {}", model.selected_profile).as_str()),
#[track = "model.changed(Self::profiles())"] #[track = "model.changed(Self::profiles())"]
set_model: Some(&{ set_model: Some(&{
let names: Vec<_> = model.profiles.iter().map(|p| p.name.as_str()).collect(); let names: Vec<_> = model.profiles.iter().map(|p| p.name.as_str()).collect();
gtk::StringList::new(&names) gtk::StringList::new(&names)
}), }),
connect_selected_item_notify[sender] => move |this| { connect_selected_item_notify[sender] => move |dd| {
sender.input(MainViewMsg::ProfileSelected(this.selected())); sender.input(MainViewMsg::ProfileSelected(dd.selected()));
},
connect_realize => move |dd| {
limit_dropdown_width(
&dd, match model.enable_debug_view {
true => 18,
false => -1,
});
}, },
}, },
gtk::Button { gtk::Button {
@ -214,21 +225,21 @@ impl SimpleComponent for MainView {
set_tooltip_text: Some("Edit Profile"), set_tooltip_text: Some("Edit Profile"),
connect_clicked[sender] => move |_| { connect_clicked[sender] => move |_| {
sender.input(Self::Input::EditProfile); sender.input(Self::Input::EditProfile);
} },
}, },
gtk::Button { gtk::Button {
set_icon_name: "edit-copy-symbolic", set_icon_name: "edit-copy-symbolic",
set_tooltip_text: Some("Duplicate Profile"), set_tooltip_text: Some("Duplicate Profile"),
connect_clicked[sender] => move |_| { connect_clicked[sender] => move |_| {
sender.input(Self::Input::DuplicateProfile); sender.input(Self::Input::DuplicateProfile);
} },
}, },
gtk::Button { gtk::Button {
set_icon_name: "list-add-symbolic", set_icon_name: "list-add-symbolic",
set_tooltip_text: Some("Create Profile"), set_tooltip_text: Some("Create Profile"),
connect_clicked[sender] => move |_| { connect_clicked[sender] => move |_| {
sender.input(Self::Input::CreateProfile); sender.input(Self::Input::CreateProfile);
} },
}, },
gtk::Button { gtk::Button {
set_icon_name: "edit-delete-symbolic", set_icon_name: "edit-delete-symbolic",
@ -238,7 +249,7 @@ impl SimpleComponent for MainView {
set_sensitive: model.selected_profile.editable, set_sensitive: model.selected_profile.editable,
connect_clicked[sender] => move |_| { connect_clicked[sender] => move |_| {
sender.input(Self::Input::DeleteProfile); sender.input(Self::Input::DeleteProfile);
} },
}, },
}, },
} }
@ -279,6 +290,13 @@ impl SimpleComponent for MainView {
} }
Self::Input::EnableDebugViewChanged(val) => { Self::Input::EnableDebugViewChanged(val) => {
self.set_enable_debug_view(val); self.set_enable_debug_view(val);
limit_dropdown_width(
self.profiles_dropdown.as_ref().unwrap(),
match val {
true => 18,
false => -1,
},
)
} }
Self::Input::UpdateSelectedProfile(prof) => { Self::Input::UpdateSelectedProfile(prof) => {
self.set_selected_profile(prof.clone()); self.set_selected_profile(prof.clone());
@ -319,14 +337,21 @@ impl SimpleComponent for MainView {
Self::Input::EditProfile => { Self::Input::EditProfile => {
if self.selected_profile.editable { if self.selected_profile.editable {
self.create_profile_editor(sender, self.selected_profile.clone()); self.create_profile_editor(sender, self.selected_profile.clone());
self.profile_editor.as_ref().unwrap().emit(ProfileEditorMsg::Present); self.profile_editor
.as_ref()
.unwrap()
.emit(ProfileEditorMsg::Present);
} else { } else {
self.profile_not_editable_dialog.present(); self.profile_not_editable_dialog.present();
} }
} }
Self::Input::CreateProfile => { Self::Input::CreateProfile => {
self.create_profile_editor(sender, Profile::default()); self.create_profile_editor(sender, Profile::default());
self.profile_editor.as_ref().unwrap().sender().emit(ProfileEditorMsg::Present); self.profile_editor
.as_ref()
.unwrap()
.sender()
.emit(ProfileEditorMsg::Present);
} }
Self::Input::DeleteProfile => { Self::Input::DeleteProfile => {
self.profile_delete_confirm_dialog.present(); self.profile_delete_confirm_dialog.present();
@ -337,7 +362,11 @@ impl SimpleComponent for MainView {
Self::Input::DuplicateProfile => { Self::Input::DuplicateProfile => {
if self.selected_profile.can_be_built { if self.selected_profile.can_be_built {
self.create_profile_editor(sender, self.selected_profile.create_duplicate()); self.create_profile_editor(sender, self.selected_profile.create_duplicate());
self.profile_editor.as_ref().unwrap().sender().emit(ProfileEditorMsg::Present); self.profile_editor
.as_ref()
.unwrap()
.sender()
.emit(ProfileEditorMsg::Present);
} else { } else {
self.cannot_duplicate_profile_dialog.present(); self.cannot_duplicate_profile_dialog.present();
} }

View file

@ -12,3 +12,4 @@ pub mod wivrn_conf_editor;
pub mod devices_box; pub mod devices_box;
pub mod preference_rows; pub mod preference_rows;
pub mod macros; pub mod macros;
pub mod util;

26
src/ui/util.rs Normal file
View file

@ -0,0 +1,26 @@
use gtk4::prelude::*;
pub fn limit_dropdown_width(dd: &gtk4::DropDown, chars: i32) {
let mut dd_child = dd
.first_child()
.unwrap()
.first_child()
.unwrap()
.first_child()
.unwrap()
.last_child();
loop {
if dd_child.is_none() {
break;
}
match dd_child.clone().unwrap().downcast::<gtk4::Label>() {
Ok(label) => {
label.set_max_width_chars(chars);
label.set_ellipsize(gtk4::pango::EllipsizeMode::End);
}
_ => {}
}
let nc = dd_child.unwrap().first_child().clone();
dd_child = nc;
}
}