From 538696bb91d903d9b32810adca56df0244a3bf7f Mon Sep 17 00:00:00 2001 From: Steve Meyer Date: Mon, 25 Oct 2021 14:32:39 -0700 Subject: [PATCH 1/2] fix settings_write deadlock --- console_backend/src/settings_tab.rs | 43 ++++++++++++++--------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/console_backend/src/settings_tab.rs b/console_backend/src/settings_tab.rs index 113487b84..79f1df75c 100644 --- a/console_backend/src/settings_tab.rs +++ b/console_backend/src/settings_tab.rs @@ -301,31 +301,30 @@ impl<'link, S: CapnProtoSender> SettingsTab<'link, S> { } fn write_setting(&self, group: &str, name: &str, value: &str) -> Result<()> { - let settings = self.settings.lock(); - let setting = settings.get(group, name)?; + { + let mut settings = self.settings.lock(); + let setting = settings.get(group, name)?; - if let Some(ref v) = setting.value { - if v.to_string() == value { - debug!("skipping write because setting has not changed"); - return Ok(()); + if let Some(ref v) = setting.value { + if v.to_string() == value { + debug!("skipping write because setting has not changed"); + return Ok(()); + } } - } - self.sbp_client.write_setting(group, name, value)?; - - if matches!( - setting.setting.kind, - SettingKind::Float | SettingKind::Double - ) { - let new_setting = self - .sbp_client - .read_setting(group, name) - .ok_or_else(|| anyhow!("settting not found"))??; - self.settings.lock().set(group, name, new_setting)?; - } else { - self.settings - .lock() - .set(group, name, SettingValue::String(value.to_string()))?; + self.sbp_client.write_setting(group, name, value)?; + if matches!( + setting.setting.kind, + SettingKind::Float | SettingKind::Double + ) { + let new_setting = self + .sbp_client + .read_setting(group, name) + .ok_or_else(|| anyhow!("settting not found"))??; + settings.set(group, name, new_setting)?; + } else { + settings.set(group, name, SettingValue::String(value.to_string()))?; + } } if group == "ins" && name == "output_mode" { From 6f63d1cd9ec49283aa2201029581eca34f1d101b Mon Sep 17 00:00:00 2001 From: Steve Meyer Date: Mon, 25 Oct 2021 15:28:15 -0700 Subject: [PATCH 2/2] save settings value when losing focus --- resources/SettingsTab.qml | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/resources/SettingsTab.qml b/resources/SettingsTab.qml index 4319741f9..6b5100b14 100644 --- a/resources/SettingsTab.qml +++ b/resources/SettingsTab.qml @@ -281,12 +281,22 @@ Item { id: settingRowEditable TextField { + id: textField + + // these are properties because the selected row will have changed before + // the onDestruction event has triggered + property string settingGroup: selectedRowField("group") + property string settingName: selectedRowField("name") + text: selectedRowField(_fieldName) wrapMode: Text.WordWrap font.family: Constants.genericTable.fontFamily font.pointSize: Constants.largePointSize - Keys.onReturnPressed: { - data_model.settings_write_request(selectedRowField("group"), selectedRowField("name"), text); + onEditingFinished: { + data_model.settings_write_request(settingGroup, settingName, text); + } + Component.onDestruction: { + data_model.settings_write_request(settingGroup, settingName, text); } }