From f1960cd240491b4b2dfed1e80a18cee8774424e3 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Sat, 18 Sep 2021 11:17:12 +0200 Subject: [PATCH 1/5] function to create deffered value change timer --- openpype/tools/settings/settings/lib.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 openpype/tools/settings/settings/lib.py diff --git a/openpype/tools/settings/settings/lib.py b/openpype/tools/settings/settings/lib.py new file mode 100644 index 0000000000..577aaa5671 --- /dev/null +++ b/openpype/tools/settings/settings/lib.py @@ -0,0 +1,18 @@ +from Qt import QtCore + +# Offset of value change trigger in ms +VALUE_CHANGE_OFFSET_MS = 300 + + +def create_deffered_value_change_timer(callback): + """Deffer value change callback. + + UI won't trigger all callbacks on each value change but after predefined + time. Timer is reset on each start so callback is triggered after user + finish editing. + """ + timer = QtCore.QTimer() + timer.setSingleShot(True) + timer.setInterval(VALUE_CHANGE_OFFSET_MS) + timer.timeout.connect(callback) + return timer From ab30681017cd973c177e7fb03f9deb4893866e55 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Sat, 18 Sep 2021 11:18:10 +0200 Subject: [PATCH 2/5] InputWidget has value change timer all the time --- openpype/tools/settings/settings/base.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/openpype/tools/settings/settings/base.py b/openpype/tools/settings/settings/base.py index 8235cf8642..ab6b27bdaf 100644 --- a/openpype/tools/settings/settings/base.py +++ b/openpype/tools/settings/settings/base.py @@ -3,6 +3,7 @@ import json from Qt import QtWidgets, QtGui, QtCore from openpype.tools.settings import CHILD_OFFSET from .widgets import ExpandingWidget +from .lib import create_deffered_value_change_timer class BaseWidget(QtWidgets.QWidget): @@ -329,6 +330,20 @@ class BaseWidget(QtWidgets.QWidget): class InputWidget(BaseWidget): + def __init__(self, *args, **kwargs): + super(InputWidget, self).__init__(*args, **kwargs) + + # Input widgets have always timer available (but may not be used). + self._value_change_timer = create_deffered_value_change_timer( + self._on_value_change_timer + ) + + def start_value_timer(self): + self._value_change_timer.start() + + def _on_value_change_timer(self): + pass + def create_ui(self): if self.entity.use_label_wrap: label = None From b4669e9ca6f7af1285faf4bd90515a0cc9db60f5 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Sat, 18 Sep 2021 11:18:41 +0200 Subject: [PATCH 3/5] use value change deffer in basic input widgets --- openpype/tools/settings/settings/item_widgets.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/openpype/tools/settings/settings/item_widgets.py b/openpype/tools/settings/settings/item_widgets.py index da74c2adc5..a28bee8d36 100644 --- a/openpype/tools/settings/settings/item_widgets.py +++ b/openpype/tools/settings/settings/item_widgets.py @@ -400,7 +400,9 @@ class TextWidget(InputWidget): def _on_value_change(self): if self.ignore_input_changes: return + self.start_value_timer() + def _on_value_change_timer(self): self.entity.set(self.input_value()) @@ -474,6 +476,9 @@ class NumberWidget(InputWidget): if self.ignore_input_changes: return + self.start_value_timer() + + def _on_value_change_timer(self): value = self.input_field.value() if self._slider_widget is not None and not self._ignore_input_change: self._ignore_slider_change = True @@ -571,7 +576,9 @@ class RawJsonWidget(InputWidget): def _on_value_change(self): if self.ignore_input_changes: return + self.start_value_timer() + def _on_value_change_timer(self): self._is_invalid = self.input_field.has_invalid_value() if not self.is_invalid: self.entity.set(self.input_field.json_value()) @@ -786,4 +793,7 @@ class PathInputWidget(InputWidget): def _on_value_change(self): if self.ignore_input_changes: return + self.start_value_timer() + + def _on_value_change_timer(self): self.entity.set(self.input_value()) From a1709c9f6cd4b39945d27db06b90b3662011a44b Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Sat, 18 Sep 2021 11:19:03 +0200 Subject: [PATCH 4/5] modifiable dictionary has offset key change --- openpype/tools/settings/settings/dict_mutable_widget.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/openpype/tools/settings/settings/dict_mutable_widget.py b/openpype/tools/settings/settings/dict_mutable_widget.py index ba86fe82dd..21cd5c8962 100644 --- a/openpype/tools/settings/settings/dict_mutable_widget.py +++ b/openpype/tools/settings/settings/dict_mutable_widget.py @@ -3,6 +3,7 @@ from uuid import uuid4 from Qt import QtWidgets, QtCore, QtGui from .base import BaseWidget +from .lib import create_deffered_value_change_timer from .widgets import ( ExpandingWidget, IconButton @@ -284,6 +285,8 @@ class ModifiableDictItem(QtWidgets.QWidget): self.confirm_btn = None + self._key_change_timer = create_deffered_value_change_timer(self._on_timeout) + if collapsible_key: self.create_collapsible_ui() else: @@ -516,6 +519,10 @@ class ModifiableDictItem(QtWidgets.QWidget): if self.ignore_input_changes: return + self._key_change_timer.start() + + def _on_timeout(self): + key = self.key_value() is_key_duplicated = self.entity_widget.validate_key_duplication( self.temp_key, key, self ) From fd17935a6935e986f690aa55a75b2ddc56e126f9 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Sat, 18 Sep 2021 11:25:24 +0200 Subject: [PATCH 5/5] fix hound --- openpype/tools/settings/settings/dict_mutable_widget.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/openpype/tools/settings/settings/dict_mutable_widget.py b/openpype/tools/settings/settings/dict_mutable_widget.py index 21cd5c8962..cfb9d4a4b1 100644 --- a/openpype/tools/settings/settings/dict_mutable_widget.py +++ b/openpype/tools/settings/settings/dict_mutable_widget.py @@ -285,7 +285,9 @@ class ModifiableDictItem(QtWidgets.QWidget): self.confirm_btn = None - self._key_change_timer = create_deffered_value_change_timer(self._on_timeout) + self._key_change_timer = create_deffered_value_change_timer( + self._on_timeout + ) if collapsible_key: self.create_collapsible_ui()