Skip to content
This repository has been archived by the owner on Sep 20, 2024. It is now read-only.

Sort instances by label in pyblish gui #719

Merged
merged 5 commits into from
Nov 17, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 28 additions & 9 deletions pype/tools/pyblish_pype/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -717,15 +717,18 @@ def reset(self):

def append(self, instance):
new_item = InstanceItem(instance)
families = new_item.data(Roles.FamiliesRole)
group_item = self.group_items.get(families[0])
if not group_item:
group_item = GroupItem(families[0])
self.appendRow(group_item)
self.group_items[families[0]] = group_item
self.group_created.emit(group_item.index())

group_item.appendRow(new_item)
if new_item.is_context:
self.appendRow(new_item)
else:
families = new_item.data(Roles.FamiliesRole)
group_item = self.group_items.get(families[0])
if not group_item:
group_item = GroupItem(families[0])
self.appendRow(group_item)
self.group_items[families[0]] = group_item
self.group_created.emit(group_item.index())

group_item.appendRow(new_item)
instance_id = instance.id
self.instance_items[instance_id] = new_item

Expand Down Expand Up @@ -842,6 +845,22 @@ def update_compatibility(self, context, instances):
)


class InstanceSortProxy(QtCore.QSortFilterProxyModel):
def __init__(self, *args, **kwargs):
super(InstanceSortProxy, self).__init__(*args, **kwargs)
# Do not care about lower/upper case
self.setSortCaseSensitivity(QtCore.Qt.CaseInsensitive)

def lessThan(self, x_index, y_index):
x_type = x_index.data(Roles.TypeRole)
y_type = y_index.data(Roles.TypeRole)
if x_type != y_type:
if x_type == GroupType:
return False
return True
return super(InstanceSortProxy, self).lessThan(x_index, y_index)


class TerminalDetailItem(QtGui.QStandardItem):
key_label_record_map = (
("instance", "Instance"),
Expand Down
2 changes: 2 additions & 0 deletions pype/tools/pyblish_pype/view.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,8 @@ def mouseReleaseEvent(self, event):
class InstanceView(OverviewView):
def __init__(self, *args, **kwargs):
super(InstanceView, self).__init__(*args, **kwargs)
self.setSortingEnabled(True)
self.sortByColumn(0, QtCore.Qt.AscendingOrder)
self.viewport().setMouseTracking(True)
self._pressed_group_index = None
self._pressed_expander = None
Expand Down
31 changes: 18 additions & 13 deletions pype/tools/pyblish_pype/window.py
Original file line number Diff line number Diff line change
Expand Up @@ -143,16 +143,18 @@ def __init__(self, controller, parent=None):
# TODO add parent
overview_page = QtWidgets.QWidget()

instance_model = model.InstanceModel(controller)
overview_instance_view = view.InstanceView(
animated=settings.Animated, parent=overview_page
)
overview_instance_delegate = delegate.InstanceDelegate(
parent=overview_instance_view
)
instance_model = model.InstanceModel(controller)
instance_sort_proxy = model.InstanceSortProxy()
instance_sort_proxy.setSourceModel(instance_model)

overview_instance_view.setItemDelegate(overview_instance_delegate)
overview_instance_view.setModel(instance_model)
overview_instance_view.setModel(instance_sort_proxy)

overview_plugin_view = view.PluginView(
animated=settings.Animated, parent=overview_page
Expand Down Expand Up @@ -437,9 +439,7 @@ def __init__(self, controller, parent=None):
self.on_plugin_action_menu_requested
)

instance_model.group_created.connect(
overview_instance_view.expand
)
instance_model.group_created.connect(self.on_instance_group_created)

self.main_widget = main_widget

Expand All @@ -461,6 +461,7 @@ def __init__(self, controller, parent=None):
self.plugin_model = plugin_model
self.plugin_proxy = plugin_proxy
self.instance_model = instance_model
self.instance_sort_proxy = instance_sort_proxy

self.presets_button = presets_button

Expand Down Expand Up @@ -586,6 +587,10 @@ def on_instance_toggle(self, index, state=None):

self.update_compatibility()

def on_instance_group_created(self, index):
_index = self.instance_sort_proxy.mapFromSource(index)
self.overview_instance_view.expand(_index)

def on_plugin_toggle(self, index, state=None):
"""An item is requesting to be toggled"""
if not index.data(Roles.IsOptionalRole):
Expand Down Expand Up @@ -982,11 +987,14 @@ def on_was_reset(self):

def on_passed_group(self, order):
for group_item in self.instance_model.group_items.values():
if self.overview_instance_view.isExpanded(group_item.index()):
group_index = self.instance_sort_proxy.mapFromSource(
group_item.index()
)
if self.overview_instance_view.isExpanded(group_index):
continue

if group_item.publish_states & GroupStates.HasError:
self.overview_instance_view.expand(group_item.index())
self.overview_instance_view.expand(group_index)

for group_item in self.plugin_model.group_items.values():
# TODO check only plugins from the group
Expand All @@ -996,19 +1004,16 @@ def on_passed_group(self, order):
if order != group_item.order:
continue

group_index = self.plugin_proxy.mapFromSource(group_item.index())
if group_item.publish_states & GroupStates.HasError:
self.overview_plugin_view.expand(
self.plugin_proxy.mapFromSource(group_item.index())
)
self.overview_plugin_view.expand(group_index)
continue

group_item.setData(
{GroupStates.HasFinished: True},
Roles.PublishFlagsRole
)
self.overview_plugin_view.collapse(
self.plugin_proxy.mapFromSource(group_item.index())
)
self.overview_plugin_view.collapse(group_index)

def on_was_stopped(self):
errored = self.controller.errored
Expand Down