mirror of
https://github.com/ynput/ayon-core.git
synced 2026-01-02 00:44:52 +01:00
list widget has move up/down btns
This commit is contained in:
parent
35a506b5f4
commit
c6b7346a91
1 changed files with 123 additions and 13 deletions
|
|
@ -9,6 +9,7 @@ from .widgets import (
|
|||
PathInput
|
||||
)
|
||||
from .lib import NOT_SET, METADATA_KEY, TypeToKlass, CHILD_OFFSET
|
||||
from avalon.vendor import qtawesome
|
||||
|
||||
|
||||
class SettingObject(AbstractSettingObject):
|
||||
|
|
@ -898,23 +899,46 @@ class ListItem(QtWidgets.QWidget, SettingObject):
|
|||
layout.setContentsMargins(0, 0, 0, 0)
|
||||
layout.setSpacing(3)
|
||||
|
||||
self.add_btn = QtWidgets.QPushButton("+")
|
||||
self.remove_btn = QtWidgets.QPushButton("-")
|
||||
char_plus = qtawesome.charmap("fa.plus")
|
||||
char_minus = qtawesome.charmap("fa.minus")
|
||||
char_up = qtawesome.charmap("fa.angle-up")
|
||||
char_down = qtawesome.charmap("fa.angle-down")
|
||||
|
||||
self.add_btn = QtWidgets.QPushButton(char_plus)
|
||||
self.remove_btn = QtWidgets.QPushButton(char_minus)
|
||||
self.up_btn = QtWidgets.QPushButton(char_up)
|
||||
self.down_btn = QtWidgets.QPushButton(char_down)
|
||||
|
||||
font_plus_minus = qtawesome.font("fa", 10)
|
||||
font_up_down = qtawesome.font("fa", 13)
|
||||
|
||||
self.add_btn.setFont(font_plus_minus)
|
||||
self.remove_btn.setFont(font_plus_minus)
|
||||
self.up_btn.setFont(font_up_down)
|
||||
self.down_btn.setFont(font_up_down)
|
||||
|
||||
self.add_btn.setFocusPolicy(QtCore.Qt.ClickFocus)
|
||||
self.remove_btn.setFocusPolicy(QtCore.Qt.ClickFocus)
|
||||
self.up_btn.setFocusPolicy(QtCore.Qt.ClickFocus)
|
||||
self.down_btn.setFocusPolicy(QtCore.Qt.ClickFocus)
|
||||
|
||||
self.add_btn.setFixedSize(self._btn_size, self._btn_size)
|
||||
self.remove_btn.setFixedSize(self._btn_size, self._btn_size)
|
||||
self.up_btn.setFixedSize(self._btn_size, self._btn_size)
|
||||
self.down_btn.setFixedSize(self._btn_size, self._btn_size)
|
||||
|
||||
self.add_btn.setProperty("btn-type", "tool-item")
|
||||
self.remove_btn.setProperty("btn-type", "tool-item")
|
||||
self.up_btn.setProperty("btn-type", "tool-item")
|
||||
self.down_btn.setProperty("btn-type", "tool-item")
|
||||
|
||||
layout.addWidget(self.add_btn, 0)
|
||||
layout.addWidget(self.remove_btn, 0)
|
||||
|
||||
self.add_btn.clicked.connect(self.on_add_clicked)
|
||||
self.remove_btn.clicked.connect(self.on_remove_clicked)
|
||||
self.add_btn.clicked.connect(self._on_add_clicked)
|
||||
self.remove_btn.clicked.connect(self._on_remove_clicked)
|
||||
self.up_btn.clicked.connect(self._on_up_clicked)
|
||||
self.down_btn.clicked.connect(self._on_down_clicked)
|
||||
|
||||
ItemKlass = TypeToKlass.types[object_type]
|
||||
self.value_input = ItemKlass(
|
||||
|
|
@ -925,28 +949,62 @@ class ListItem(QtWidgets.QWidget, SettingObject):
|
|||
)
|
||||
layout.addWidget(self.value_input, 1)
|
||||
|
||||
layout.addWidget(self.up_btn, 0)
|
||||
layout.addWidget(self.down_btn, 0)
|
||||
|
||||
self.value_input.value_changed.connect(self._on_value_change)
|
||||
|
||||
def set_as_empty(self, is_empty=True):
|
||||
self.value_input.setEnabled(not is_empty)
|
||||
self.remove_btn.setEnabled(not is_empty)
|
||||
self.order_changed()
|
||||
self._on_value_change()
|
||||
|
||||
def order_changed(self):
|
||||
row = self.row()
|
||||
parent_row_count = self.parent_rows_count()
|
||||
if parent_row_count == 1:
|
||||
self.up_btn.setEnabled(False)
|
||||
self.down_btn.setEnabled(False)
|
||||
|
||||
elif row == 0:
|
||||
self.up_btn.setEnabled(False)
|
||||
self.down_btn.setEnabled(True)
|
||||
|
||||
elif row == parent_row_count - 1:
|
||||
self.up_btn.setEnabled(True)
|
||||
self.down_btn.setEnabled(False)
|
||||
|
||||
else:
|
||||
self.up_btn.setEnabled(True)
|
||||
self.down_btn.setEnabled(True)
|
||||
|
||||
def _on_value_change(self, item=None):
|
||||
self.value_changed.emit(self)
|
||||
|
||||
def row(self):
|
||||
return self._parent.input_fields.index(self)
|
||||
|
||||
def on_add_clicked(self):
|
||||
def parent_rows_count(self):
|
||||
return len(self._parent.input_fields)
|
||||
|
||||
def _on_add_clicked(self):
|
||||
if self.value_input.isEnabled():
|
||||
self._parent.add_row(row=self.row() + 1)
|
||||
else:
|
||||
self.set_as_empty(False)
|
||||
|
||||
def on_remove_clicked(self):
|
||||
def _on_remove_clicked(self):
|
||||
self._parent.remove_row(self)
|
||||
|
||||
def _on_up_clicked(self):
|
||||
row = self.row()
|
||||
self._parent.swap_rows(row - 1, row)
|
||||
|
||||
def _on_down_clicked(self):
|
||||
row = self.row()
|
||||
self._parent.swap_rows(row, row + 1)
|
||||
|
||||
def config_value(self):
|
||||
if self.value_input.isEnabled():
|
||||
return self.value_input.item_value()
|
||||
|
|
@ -1044,21 +1102,58 @@ class ListWidget(QtWidgets.QWidget, InputObject):
|
|||
if self.count() == 0:
|
||||
self.add_row(is_empty=True)
|
||||
|
||||
def swap_rows(self, row_1, row_2):
|
||||
if row_1 == row_2:
|
||||
return
|
||||
|
||||
if row_1 > row_2:
|
||||
row_1, row_2 = row_2, row_1
|
||||
|
||||
field_1 = self.input_fields[row_1]
|
||||
field_2 = self.input_fields[row_2]
|
||||
|
||||
self.input_fields[row_1] = field_2
|
||||
self.input_fields[row_2] = field_1
|
||||
|
||||
layout_index = self.inputs_layout.indexOf(field_1)
|
||||
self.inputs_layout.insertWidget(layout_index + 1, field_1)
|
||||
|
||||
field_1.order_changed()
|
||||
field_2.order_changed()
|
||||
|
||||
def add_row(self, row=None, value=None, is_empty=False):
|
||||
# Create new item
|
||||
item_widget = ListItem(
|
||||
self.object_type, self.input_modifiers, self, self.inputs_widget
|
||||
)
|
||||
if row is None:
|
||||
if self.input_fields:
|
||||
self.input_fields[-1].order_changed()
|
||||
self.inputs_layout.addWidget(item_widget)
|
||||
self.input_fields.append(item_widget)
|
||||
else:
|
||||
previous_field = None
|
||||
if row > 0:
|
||||
previous_field = self.input_fields[row - 1]
|
||||
|
||||
next_field = None
|
||||
max_index = self.count()
|
||||
if row < max_index:
|
||||
next_field = self.input_fields[row]
|
||||
|
||||
self.inputs_layout.insertWidget(row, item_widget)
|
||||
self.input_fields.insert(row, item_widget)
|
||||
if previous_field:
|
||||
previous_field.order_changed()
|
||||
|
||||
if next_field:
|
||||
next_field.order_changed()
|
||||
|
||||
if is_empty:
|
||||
item_widget.set_as_empty()
|
||||
item_widget.value_changed.connect(self._on_value_change)
|
||||
|
||||
if row is None:
|
||||
self.inputs_layout.addWidget(item_widget)
|
||||
self.input_fields.append(item_widget)
|
||||
else:
|
||||
self.inputs_layout.insertWidget(row, item_widget)
|
||||
self.input_fields.insert(row, item_widget)
|
||||
item_widget.order_changed()
|
||||
|
||||
previous_input = None
|
||||
for input_field in self.input_fields:
|
||||
|
|
@ -1085,11 +1180,26 @@ class ListWidget(QtWidgets.QWidget, InputObject):
|
|||
def remove_row(self, item_widget):
|
||||
item_widget.value_changed.disconnect()
|
||||
|
||||
row = self.input_fields.index(item_widget)
|
||||
previous_field = None
|
||||
next_field = None
|
||||
if row > 0:
|
||||
previous_field = self.input_fields[row - 1]
|
||||
|
||||
if row != len(self.input_fields) - 1:
|
||||
next_field = self.input_fields[row + 1]
|
||||
|
||||
self.inputs_layout.removeWidget(item_widget)
|
||||
self.input_fields.remove(item_widget)
|
||||
self.input_fields.pop(row)
|
||||
item_widget.setParent(None)
|
||||
item_widget.deleteLater()
|
||||
|
||||
if previous_field:
|
||||
previous_field.order_changed()
|
||||
|
||||
if next_field:
|
||||
next_field.order_changed()
|
||||
|
||||
if self.count() == 0:
|
||||
self.add_row(is_empty=True)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue