mirror of
https://github.com/ynput/ayon-core.git
synced 2026-01-01 08:24:53 +01:00
Merge pull request #2044 from pypeclub/feature/settings_deffered_entity_change
Settings UI: Deffered set value on entity
This commit is contained in:
commit
9704521bb6
4 changed files with 52 additions and 0 deletions
|
|
@ -3,6 +3,7 @@ import json
|
||||||
from Qt import QtWidgets, QtGui, QtCore
|
from Qt import QtWidgets, QtGui, QtCore
|
||||||
from openpype.tools.settings import CHILD_OFFSET
|
from openpype.tools.settings import CHILD_OFFSET
|
||||||
from .widgets import ExpandingWidget
|
from .widgets import ExpandingWidget
|
||||||
|
from .lib import create_deffered_value_change_timer
|
||||||
|
|
||||||
|
|
||||||
class BaseWidget(QtWidgets.QWidget):
|
class BaseWidget(QtWidgets.QWidget):
|
||||||
|
|
@ -329,6 +330,20 @@ class BaseWidget(QtWidgets.QWidget):
|
||||||
|
|
||||||
|
|
||||||
class InputWidget(BaseWidget):
|
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):
|
def create_ui(self):
|
||||||
if self.entity.use_label_wrap:
|
if self.entity.use_label_wrap:
|
||||||
label = None
|
label = None
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ from uuid import uuid4
|
||||||
from Qt import QtWidgets, QtCore, QtGui
|
from Qt import QtWidgets, QtCore, QtGui
|
||||||
|
|
||||||
from .base import BaseWidget
|
from .base import BaseWidget
|
||||||
|
from .lib import create_deffered_value_change_timer
|
||||||
from .widgets import (
|
from .widgets import (
|
||||||
ExpandingWidget,
|
ExpandingWidget,
|
||||||
IconButton
|
IconButton
|
||||||
|
|
@ -284,6 +285,10 @@ class ModifiableDictItem(QtWidgets.QWidget):
|
||||||
|
|
||||||
self.confirm_btn = None
|
self.confirm_btn = None
|
||||||
|
|
||||||
|
self._key_change_timer = create_deffered_value_change_timer(
|
||||||
|
self._on_timeout
|
||||||
|
)
|
||||||
|
|
||||||
if collapsible_key:
|
if collapsible_key:
|
||||||
self.create_collapsible_ui()
|
self.create_collapsible_ui()
|
||||||
else:
|
else:
|
||||||
|
|
@ -516,6 +521,10 @@ class ModifiableDictItem(QtWidgets.QWidget):
|
||||||
if self.ignore_input_changes:
|
if self.ignore_input_changes:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
self._key_change_timer.start()
|
||||||
|
|
||||||
|
def _on_timeout(self):
|
||||||
|
key = self.key_value()
|
||||||
is_key_duplicated = self.entity_widget.validate_key_duplication(
|
is_key_duplicated = self.entity_widget.validate_key_duplication(
|
||||||
self.temp_key, key, self
|
self.temp_key, key, self
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -400,7 +400,9 @@ class TextWidget(InputWidget):
|
||||||
def _on_value_change(self):
|
def _on_value_change(self):
|
||||||
if self.ignore_input_changes:
|
if self.ignore_input_changes:
|
||||||
return
|
return
|
||||||
|
self.start_value_timer()
|
||||||
|
|
||||||
|
def _on_value_change_timer(self):
|
||||||
self.entity.set(self.input_value())
|
self.entity.set(self.input_value())
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -474,6 +476,9 @@ class NumberWidget(InputWidget):
|
||||||
if self.ignore_input_changes:
|
if self.ignore_input_changes:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
self.start_value_timer()
|
||||||
|
|
||||||
|
def _on_value_change_timer(self):
|
||||||
value = self.input_field.value()
|
value = self.input_field.value()
|
||||||
if self._slider_widget is not None and not self._ignore_input_change:
|
if self._slider_widget is not None and not self._ignore_input_change:
|
||||||
self._ignore_slider_change = True
|
self._ignore_slider_change = True
|
||||||
|
|
@ -571,7 +576,9 @@ class RawJsonWidget(InputWidget):
|
||||||
def _on_value_change(self):
|
def _on_value_change(self):
|
||||||
if self.ignore_input_changes:
|
if self.ignore_input_changes:
|
||||||
return
|
return
|
||||||
|
self.start_value_timer()
|
||||||
|
|
||||||
|
def _on_value_change_timer(self):
|
||||||
self._is_invalid = self.input_field.has_invalid_value()
|
self._is_invalid = self.input_field.has_invalid_value()
|
||||||
if not self.is_invalid:
|
if not self.is_invalid:
|
||||||
self.entity.set(self.input_field.json_value())
|
self.entity.set(self.input_field.json_value())
|
||||||
|
|
@ -786,4 +793,7 @@ class PathInputWidget(InputWidget):
|
||||||
def _on_value_change(self):
|
def _on_value_change(self):
|
||||||
if self.ignore_input_changes:
|
if self.ignore_input_changes:
|
||||||
return
|
return
|
||||||
|
self.start_value_timer()
|
||||||
|
|
||||||
|
def _on_value_change_timer(self):
|
||||||
self.entity.set(self.input_value())
|
self.entity.set(self.input_value())
|
||||||
|
|
|
||||||
18
openpype/tools/settings/settings/lib.py
Normal file
18
openpype/tools/settings/settings/lib.py
Normal file
|
|
@ -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
|
||||||
Loading…
Add table
Add a link
Reference in a new issue