diff --git a/pype/tools/pyblish_pype/model.py b/pype/tools/pyblish_pype/model.py index ffcf9a6501..ec9689381e 100644 --- a/pype/tools/pyblish_pype/model.py +++ b/pype/tools/pyblish_pype/model.py @@ -717,15 +717,18 @@ class InstanceModel(QtGui.QStandardItemModel): 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()) + 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) + group_item.appendRow(new_item) instance_id = instance.id self.instance_items[instance_id] = new_item @@ -842,6 +845,22 @@ class InstanceModel(QtGui.QStandardItemModel): ) +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"), diff --git a/pype/tools/pyblish_pype/view.py b/pype/tools/pyblish_pype/view.py index 777871ca8e..7245393714 100644 --- a/pype/tools/pyblish_pype/view.py +++ b/pype/tools/pyblish_pype/view.py @@ -105,6 +105,8 @@ class PluginView(OverviewView): 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 diff --git a/pype/tools/pyblish_pype/window.py b/pype/tools/pyblish_pype/window.py index 66015c4255..df1d8687d5 100644 --- a/pype/tools/pyblish_pype/window.py +++ b/pype/tools/pyblish_pype/window.py @@ -143,16 +143,18 @@ class Window(QtWidgets.QDialog): # 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 @@ -437,9 +439,7 @@ class Window(QtWidgets.QDialog): 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 @@ -461,6 +461,7 @@ class Window(QtWidgets.QDialog): 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 @@ -586,6 +587,10 @@ class Window(QtWidgets.QDialog): 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): @@ -982,11 +987,14 @@ class Window(QtWidgets.QDialog): 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 @@ -996,19 +1004,16 @@ class Window(QtWidgets.QDialog): 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