diff --git a/pype/tools/pyblish_pype/app.css b/pype/tools/pyblish_pype/app.css index c51126e89f3..33b6acbddb3 100644 --- a/pype/tools/pyblish_pype/app.css +++ b/pype/tools/pyblish_pype/app.css @@ -222,10 +222,6 @@ QToolButton { background: #444; } -#Header #ArtistTab { - background-image: url("img/tab-home.png"); -} - #Header #TerminalTab { background-image: url("img/tab-terminal.png"); } diff --git a/pype/tools/pyblish_pype/delegate.py b/pype/tools/pyblish_pype/delegate.py index cb9123bf3a6..bf3fbc18535 100644 --- a/pype/tools/pyblish_pype/delegate.py +++ b/pype/tools/pyblish_pype/delegate.py @@ -522,168 +522,6 @@ def sizeHint(self, option, index): return QtCore.QSize(option.rect.width(), 20) -class ArtistDelegate(QtWidgets.QStyledItemDelegate): - """Delegate used on Artist page""" - - def paint(self, painter, option, index): - """Paint checkbox and text - - _______________________________________________ - | | label | duration |arrow| - |toggle |_____________________| | to | - | | families | |persp| - |_______|_____________________|___________|_____| - - """ - - # Layout - spacing = 10 - - body_rect = QtCore.QRectF(option.rect).adjusted(2, 2, -8, -2) - content_rect = body_rect.adjusted(5, 5, -5, -5) - - perspective_rect = QtCore.QRectF(body_rect) - perspective_rect.setWidth(35) - perspective_rect.setHeight(35) - perspective_rect.translate( - content_rect.width() - (perspective_rect.width() / 2) + 10, - (content_rect.height() / 2) - (perspective_rect.height() / 2) - ) - - toggle_rect = QtCore.QRectF(body_rect) - toggle_rect.setWidth(7) - toggle_rect.adjust(1, 1, 0, -1) - - icon_rect = QtCore.QRectF(content_rect) - icon_rect.translate(toggle_rect.width() + spacing, 3) - icon_rect.setWidth(35) - icon_rect.setHeight(35) - - duration_rect = QtCore.QRectF(content_rect) - duration_rect.translate(content_rect.width() - 50, 0) - - # Colors - check_color = colors["idle"] - - publish_states = index.data(Roles.PublishFlagsRole) - if publish_states is None: - return - if publish_states & InstanceStates.InProgress: - check_color = colors["active"] - - elif publish_states & InstanceStates.HasError: - check_color = colors["error"] - - elif publish_states & InstanceStates.HasWarning: - check_color = colors["warning"] - - elif publish_states & InstanceStates.HasFinished: - check_color = colors["ok"] - - elif not index.data(Roles.IsEnabledRole): - check_color = colors["inactive"] - - perspective_icon = icons["angle-right"] - - if not index.data(QtCore.Qt.CheckStateRole): - font_color = colors["inactive"] - else: - font_color = colors["idle"] - - if ( - option.state - & ( - QtWidgets.QStyle.State_MouseOver - or QtWidgets.QStyle.State_Selected - ) - ): - perspective_color = colors["idle"] - else: - perspective_color = colors["inactive"] - # Maintan reference to state, so we can restore it once we're done - painter.save() - - # Draw background - painter.fillRect(body_rect, colors["hover"]) - - # Draw icon - icon = index.data(QtCore.Qt.DecorationRole) - - painter.setFont(fonts["largeAwesome"]) - painter.setPen(QtGui.QPen(font_color)) - painter.drawText(icon_rect, icon) - - # Draw label - painter.setFont(fonts["h3"]) - label_rect = QtCore.QRectF(content_rect) - label_x_offset = icon_rect.width() + spacing - label_rect.translate( - label_x_offset, - 0 - ) - metrics = painter.fontMetrics() - label_rect.setHeight(metrics.lineSpacing()) - label_rect.setWidth( - content_rect.width() - - label_x_offset - - perspective_rect.width() - ) - # Elide label - label = index.data(QtCore.Qt.DisplayRole) - label = metrics.elidedText( - label, QtCore.Qt.ElideRight, label_rect.width() - ) - painter.drawText(label_rect, label) - - # Draw families - painter.setFont(fonts["h5"]) - painter.setPen(QtGui.QPen(colors["inactive"])) - - families = ", ".join(index.data(Roles.FamiliesRole)) - families = painter.fontMetrics().elidedText( - families, QtCore.Qt.ElideRight, label_rect.width() - ) - - families_rect = QtCore.QRectF(label_rect) - families_rect.translate(0, label_rect.height() + spacing) - - painter.drawText(families_rect, families) - - painter.setFont(fonts["largeAwesome"]) - painter.setPen(QtGui.QPen(perspective_color)) - painter.drawText(perspective_rect, perspective_icon) - - # Draw checkbox - pen = QtGui.QPen(check_color, 1) - painter.setPen(pen) - - if index.data(Roles.IsOptionalRole): - painter.drawRect(toggle_rect) - - if index.data(QtCore.Qt.CheckStateRole): - painter.fillRect(toggle_rect, check_color) - - elif ( - index.data(QtCore.Qt.CheckStateRole) - ): - painter.fillRect(toggle_rect, check_color) - - if option.state & QtWidgets.QStyle.State_MouseOver: - painter.fillRect(body_rect, colors["hover"]) - - if option.state & QtWidgets.QStyle.State_Selected: - painter.fillRect(body_rect, colors["selected"]) - - painter.setPen(colors["outline"]) - painter.drawRect(body_rect) - - # Ok, we're done, tidy up. - painter.restore() - - def sizeHint(self, option, index): - return QtCore.QSize(option.rect.width(), 80) - - class TerminalItem(QtWidgets.QStyledItemDelegate): """Delegate used exclusively for the Terminal""" diff --git a/pype/tools/pyblish_pype/img/tab-home.png b/pype/tools/pyblish_pype/img/tab-home.png deleted file mode 100644 index 9133d06edca..00000000000 Binary files a/pype/tools/pyblish_pype/img/tab-home.png and /dev/null differ diff --git a/pype/tools/pyblish_pype/model.py b/pype/tools/pyblish_pype/model.py index 1482ff85b0b..ffcf9a65010 100644 --- a/pype/tools/pyblish_pype/model.py +++ b/pype/tools/pyblish_pype/model.py @@ -842,164 +842,6 @@ def update_compatibility(self, context, instances): ) -class ArtistProxy(QtCore.QAbstractProxyModel): - def __init__(self, *args, **kwargs): - self.mapping_from = [] - self.mapping_to = [] - super(ArtistProxy, self).__init__(*args, **kwargs) - - def on_rows_inserted(self, parent_index, from_row, to_row): - if not parent_index.isValid(): - return - - parent_row = parent_index.row() - if parent_row >= len(self.mapping_from): - self.mapping_from.append(list()) - - new_from = None - new_to = None - for row_num in range(from_row, to_row + 1): - new_row = len(self.mapping_to) - new_to = new_row - if new_from is None: - new_from = new_row - - self.mapping_from[parent_row].insert(row_num, new_row) - self.mapping_to.insert(new_row, [parent_row, row_num]) - - self.rowsInserted.emit(self.parent(), new_from, new_to + 1) - - def _remove_rows(self, parent_row, from_row, to_row): - increment_num = self.mapping_from[parent_row][from_row] - - to_end_index = len(self.mapping_from[parent_row]) - 1 - for _idx in range(0, parent_row): - to_end_index += len(self.mapping_from[_idx]) - - removed_rows = 0 - _emit_last = None - for row_num in reversed(range(from_row, to_row + 1)): - row = self.mapping_from[parent_row].pop(row_num) - _emit_last = row - removed_rows += 1 - - _emit_first = int(increment_num) - mapping_from_len = len(self.mapping_from) - mapping_from_parent_len = len(self.mapping_from[parent_row]) - if parent_row < mapping_from_len: - for idx in range(from_row, mapping_from_parent_len): - self.mapping_from[parent_row][idx] = increment_num - increment_num += 1 - - if parent_row < mapping_from_len - 1: - for idx_i in range(parent_row + 1, mapping_from_len): - sub_values = self.mapping_from[idx_i] - if not sub_values: - continue - - for idx_j in range(0, len(sub_values)): - self.mapping_from[idx_i][idx_j] = increment_num - increment_num += 1 - - for idx in range(removed_rows): - self.mapping_to.pop(to_end_index - idx) - - return (_emit_first, _emit_last) - - def on_rows_removed(self, parent_index, from_row, to_row): - if parent_index.isValid(): - parent_row = parent_index.row() - _emit_first, _emit_last = self._remove_rows( - parent_row, from_row, to_row - ) - self.rowsRemoved.emit(self.parent(), _emit_first, _emit_last) - - else: - removed_rows = False - emit_first = None - emit_last = None - for row_num in reversed(range(from_row, to_row + 1)): - remaining_rows = self.mapping_from[row_num] - if remaining_rows: - removed_rows = True - _emit_first, _emit_last = self._remove_rows( - row_num, 0, len(remaining_rows) - 1 - ) - if emit_first is None: - emit_first = _emit_first - emit_last = _emit_last - - self.mapping_from.pop(row_num) - - diff = to_row - from_row + 1 - mapping_to_len = len(self.mapping_to) - if from_row < mapping_to_len: - for idx in range(from_row, mapping_to_len): - self.mapping_to[idx][0] -= diff - - if removed_rows: - self.rowsRemoved.emit(self.parent(), emit_first, emit_last) - - def on_reset(self): - self.modelReset.emit() - self.mapping_from = [] - self.mapping_to = [] - - def setSourceModel(self, source_model): - super(ArtistProxy, self).setSourceModel(source_model) - source_model.rowsInserted.connect(self.on_rows_inserted) - source_model.rowsRemoved.connect(self.on_rows_removed) - source_model.modelReset.connect(self.on_reset) - source_model.dataChanged.connect(self.on_data_changed) - - def on_data_changed(self, from_index, to_index, roles=None): - proxy_from_index = self.mapFromSource(from_index) - if from_index == to_index: - proxy_to_index = proxy_from_index - else: - proxy_to_index = self.mapFromSource(to_index) - - args = [proxy_from_index, proxy_to_index] - if Qt.__binding__ not in ("PyQt4", "PySide"): - args.append(roles or []) - self.dataChanged.emit(*args) - - def columnCount(self, parent=QtCore.QModelIndex()): - # This is not right for global proxy, but in this case it is enough - return self.sourceModel().columnCount() - - def rowCount(self, parent=QtCore.QModelIndex()): - if parent.isValid(): - return 0 - return len(self.mapping_to) - - def mapFromSource(self, index): - if not index.isValid(): - return QtCore.QModelIndex() - - parent_index = index.parent() - if not parent_index.isValid(): - return QtCore.QModelIndex() - - parent_idx = self.mapping_from[parent_index.row()] - my_row = parent_idx[index.row()] - return self.index(my_row, index.column()) - - def mapToSource(self, index): - if not index.isValid() or index.row() > len(self.mapping_to): - return self.sourceModel().index(index.row(), index.column()) - - parent_row, item_row = self.mapping_to[index.row()] - parent_index = self.sourceModel().index(parent_row, 0) - return self.sourceModel().index(item_row, 0, parent_index) - - def index(self, row, column, parent=QtCore.QModelIndex()): - return self.createIndex(row, column, QtCore.QModelIndex()) - - def parent(self, index=None): - return QtCore.QModelIndex() - - class TerminalDetailItem(QtGui.QStandardItem): key_label_record_map = ( ("instance", "Instance"), diff --git a/pype/tools/pyblish_pype/settings.py b/pype/tools/pyblish_pype/settings.py index fefdbea77f9..5848cdf6981 100644 --- a/pype/tools/pyblish_pype/settings.py +++ b/pype/tools/pyblish_pype/settings.py @@ -8,7 +8,7 @@ # Customize which tab to start on. Possible choices are: "artist", "overview" # and "terminal". -InitialTab = "artist" +InitialTab = "overview" # Customize the window size. WindowSize = (430, 600) diff --git a/pype/tools/pyblish_pype/view.py b/pype/tools/pyblish_pype/view.py index b18738c9abb..777871ca8e5 100644 --- a/pype/tools/pyblish_pype/view.py +++ b/pype/tools/pyblish_pype/view.py @@ -11,61 +11,6 @@ def _import_widgets(): from . import widgets -class ArtistView(QtWidgets.QListView): - # An item is requesting to be toggled, with optional forced-state - toggled = QtCore.Signal(QtCore.QModelIndex, object) - show_perspective = QtCore.Signal(QtCore.QModelIndex) - - def __init__(self, parent=None): - super(ArtistView, self).__init__(parent) - - self.horizontalScrollBar().hide() - self.viewport().setAttribute(QtCore.Qt.WA_Hover, True) - self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) - self.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) - self.setResizeMode(QtWidgets.QListView.Adjust) - self.setVerticalScrollMode(QtWidgets.QListView.ScrollPerPixel) - - def event(self, event): - if not event.type() == QtCore.QEvent.KeyPress: - return super(ArtistView, self).event(event) - - elif event.key() == QtCore.Qt.Key_Space: - for index in self.selectionModel().selectedIndexes(): - self.toggled.emit(index, None) - - return True - - elif event.key() == QtCore.Qt.Key_Backspace: - for index in self.selectionModel().selectedIndexes(): - self.toggled.emit(index, False) - - return True - - elif event.key() == QtCore.Qt.Key_Return: - for index in self.selectionModel().selectedIndexes(): - self.toggled.emit(index, True) - - return True - - return super(ArtistView, self).event(event) - - def focusOutEvent(self, event): - self.selectionModel().clear() - - def mouseReleaseEvent(self, event): - if event.button() == QtCore.Qt.LeftButton: - indexes = self.selectionModel().selectedIndexes() - if len(indexes) <= 1 and event.pos().x() < 20: - for index in indexes: - self.toggled.emit(index, None) - if len(indexes) == 1 and event.pos().x() > self.width() - 40: - for index in indexes: - self.show_perspective.emit(index) - - return super(ArtistView, self).mouseReleaseEvent(event) - - class OverviewView(QtWidgets.QTreeView): # An item is requesting to be toggled, with optional forced-state toggled = QtCore.Signal(QtCore.QModelIndex, object) diff --git a/pype/tools/pyblish_pype/window.py b/pype/tools/pyblish_pype/window.py index 2f663cc08af..66015c42554 100644 --- a/pype/tools/pyblish_pype/window.py +++ b/pype/tools/pyblish_pype/window.py @@ -97,7 +97,6 @@ def __init__(self, controller, parent=None): header_widget = QtWidgets.QWidget(parent=main_widget) header_tab_widget = QtWidgets.QWidget(header_widget) - header_tab_artist = QtWidgets.QRadioButton(header_tab_widget) header_tab_overview = QtWidgets.QRadioButton(header_tab_widget) header_tab_terminal = QtWidgets.QRadioButton(header_tab_widget) header_spacer = QtWidgets.QWidget(header_tab_widget) @@ -125,7 +124,6 @@ def __init__(self, controller, parent=None): layout_tab = QtWidgets.QHBoxLayout(header_tab_widget) layout_tab.setContentsMargins(0, 0, 0, 0) layout_tab.setSpacing(0) - layout_tab.addWidget(header_tab_artist, 0) layout_tab.addWidget(header_tab_overview, 0) layout_tab.addWidget(header_tab_terminal, 0) layout_tab.addWidget(button_suspend_logs_widget, 0) @@ -141,37 +139,18 @@ def __init__(self, controller, parent=None): header_widget.setLayout(layout) - # Artist Page - instance_model = model.InstanceModel(controller) - - artist_page = QtWidgets.QWidget() - - artist_view = view.ArtistView() - artist_view.show_perspective.connect(self.toggle_perspective_widget) - artist_proxy = model.ArtistProxy() - artist_proxy.setSourceModel(instance_model) - artist_view.setModel(artist_proxy) - - artist_delegate = delegate.ArtistDelegate() - artist_view.setItemDelegate(artist_delegate) - - layout = QtWidgets.QVBoxLayout(artist_page) - layout.addWidget(artist_view) - layout.setContentsMargins(5, 5, 5, 5) - layout.setSpacing(0) - - artist_page.setLayout(layout) - # Overview Page # 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 ) + overview_instance_view.setItemDelegate(overview_instance_delegate) overview_instance_view.setModel(instance_model) @@ -223,7 +202,6 @@ def __init__(self, controller, parent=None): body_widget = QtWidgets.QWidget(main_widget) layout = QtWidgets.QHBoxLayout(body_widget) layout.setContentsMargins(5, 5, 5, 1) - layout.addWidget(artist_page) layout.addWidget(overview_page) layout.addWidget(terminal_page) @@ -361,12 +339,10 @@ def __init__(self, controller, parent=None): "Footer": footer_widget, # Pages - "Artist": artist_page, "Overview": overview_page, "Terminal": terminal_page, # Tabs - "ArtistTab": header_tab_artist, "OverviewTab": header_tab_overview, "TerminalTab": header_tab_terminal, @@ -399,7 +375,6 @@ def __init__(self, controller, parent=None): pages_widget, header_widget, body_widget, - artist_page, comment_box, overview_page, terminal_page, @@ -415,9 +390,6 @@ def __init__(self, controller, parent=None): _widget.setAttribute(QtCore.Qt.WA_StyledBackground) # Signals - header_tab_artist.toggled.connect( - lambda: self.on_tab_changed("artist") - ) header_tab_overview.toggled.connect( lambda: self.on_tab_changed("overview") ) @@ -450,7 +422,6 @@ def __init__(self, controller, parent=None): QtCore.Qt.DirectConnection ) - artist_view.toggled.connect(self.on_instance_toggle) overview_instance_view.toggled.connect(self.on_instance_toggle) overview_plugin_view.toggled.connect(self.on_plugin_toggle) @@ -491,9 +462,6 @@ def __init__(self, controller, parent=None): self.plugin_proxy = plugin_proxy self.instance_model = instance_model - self.artist_proxy = artist_proxy - self.artist_view = artist_view - self.presets_button = presets_button self.animation_info_msg = animation_info_msg @@ -510,17 +478,15 @@ def __init__(self, controller, parent=None): self.perspective_widget = perspective_widget self.tabs = { - "artist": header_tab_artist, "overview": header_tab_overview, "terminal": header_tab_terminal } self.pages = ( - ("artist", artist_page), ("overview", overview_page), ("terminal", terminal_page) ) - current_page = settings.InitialTab or "artist" + current_page = settings.InitialTab or "overview" self.comment_main_widget.setVisible( not current_page == "terminal" ) @@ -1122,11 +1088,6 @@ def on_was_processed(self, result): for instance_id in existing_ids: self.instance_model.remove(instance_id) - if result.get("error"): - # Toggle from artist to overview tab on error - if self.tabs["artist"].isChecked(): - self.tabs["overview"].toggle() - result["records"] = self.terminal_model.prepare_records( result, self._suspend_logs @@ -1274,7 +1235,6 @@ def closeEvent(self, event): self.terminal_proxy.deleteLater() self.plugin_proxy.deleteLater() - self.artist_view.setModel(None) self.overview_instance_view.setModel(None) self.overview_plugin_view.setModel(None) self.terminal_view.setModel(None)