attr defs widget can have multivalue

This commit is contained in:
iLLiCiTiT 2021-07-15 10:14:09 +02:00
parent 696bdb94c6
commit 672f124252

View file

@ -65,7 +65,7 @@ class _BaseAttrDefWidget(QtWidgets.QWidget):
)
)
def set_value(self, value):
def set_value(self, value, multivalue=False):
raise NotImplementedError(
"Method 'current_value' is not implemented. {}".format(
self.__class__.__name__
@ -102,7 +102,18 @@ class NumberAttrWidget(_BaseAttrDefWidget):
def current_value(self):
return self._input_widget.value()
def set_value(self, value):
def set_value(self, value, multivalue=False):
if multivalue:
set_value = set(value)
if None in set_value:
set_value.remove(None)
set_value.add(self.attr_def.default)
if len(set_value) > 1:
self._input_widget.setSpecialValueText("Multiselection")
return
value = tuple(set_value)[0]
if self.current_value != value:
self._input_widget.setValue(value)
@ -137,7 +148,10 @@ class TextAttrWidget(_BaseAttrDefWidget):
self.main_layout.addWidget(input_widget, 0)
def _on_value_change(self):
new_value = self._input_widget.toPlainText()
if self.multiline:
new_value = self._input_widget.toPlainText()
else:
new_value = self._input_widget.text()
self.value_changed.emit(new_value, self.attr_def.id)
def current_value(self):
@ -145,13 +159,23 @@ class TextAttrWidget(_BaseAttrDefWidget):
return self._input_widget.toPlainText()
return self._input_widget.text()
def set_value(self, value):
if value == self.current_value():
return
if self.multiline:
self._input_widget.setPlainText(value)
else:
self._input_widget.setText(value)
def set_value(self, value, multivalue=False):
if multivalue:
set_value = set(value)
if None in set_value:
set_value.remove(None)
set_value.add(self.attr_def.default)
if len(set_value) == 1:
value = tuple(set_value)[0]
else:
value = "< Multiselection >"
if value != self.current_value():
if self.multiline:
self._input_widget.setPlainText(value)
else:
self._input_widget.setText(value)
class BoolAttrWidget(_BaseAttrDefWidget):
@ -172,7 +196,18 @@ class BoolAttrWidget(_BaseAttrDefWidget):
def current_value(self):
return self._input_widget.isChecked()
def set_value(self, value):
def set_value(self, value, multivalue=False):
if multivalue:
set_value = set(value)
if None in set_value:
set_value.remove(None)
set_value.add(self.attr_def.default)
if len(set_value) > 1:
self._input_widget.setCheckState(QtCore.Qt.PartiallyChecked)
return
value = tuple(set_value)[0]
if value != self.current_value():
self._input_widget.setChecked(value)
@ -206,13 +241,15 @@ class EnumAttrWidget(_BaseAttrDefWidget):
idx = self._input_widget.currentIndex()
return self._input_widget.itemData(idx)
def set_value(self, value):
idx = self._input_widget.findData(value)
cur_idx = self._input_widget.currentIndex()
if idx == cur_idx:
return
if idx >= 0:
self._input_widget.setCurrentIndex(idx)
def set_value(self, value, multivalue=False):
if not multivalue:
idx = self._input_widget.findData(value)
cur_idx = self._input_widget.currentIndex()
if idx != cur_idx and idx >= 0:
self._input_widget.setCurrentIndex(idx)
else:
self._input_widget.lineEdit().setText("Multiselection")
class UnknownAttrWidget(_BaseAttrDefWidget):
@ -226,9 +263,18 @@ class UnknownAttrWidget(_BaseAttrDefWidget):
self.main_layout.addWidget(input_widget, 0)
def current_value(self):
return self._input_widget.text()
raise ValueError(
"{} can't hold real value.".format(self.__class__.__name__)
)
def set_value(self, value, multivalue=False):
if multivalue:
set_value = set(value)
if len(set_value) == 1:
value = tuple(set_value)[0]
else:
value = "< Multiselection >"
def set_value(self, value):
str_value = str(value)
if str_value != self._value:
self._value = str_value