def paintEvent(self, event): """ Triggered on frame changed. :type event: QtCore.QEvent :rtype: None """ QtWidgets.QToolButton.paintEvent(self, event) painter = QtGui.QPainter() painter.begin(self) if self.currentFilename() and self._imageSequence.frameCount() > 1: r = event.rect() playheadHeight = self.playheadHeight() playheadPosition = self._imageSequence.percent() * r.width()-1 x = r.x() y = self.height() - playheadHeight painter.setPen(QtCore.Qt.NoPen) painter.setBrush(QtGui.QBrush(self.DEFAULT_PLAYHEAD_COLOR)) painter.drawRect(x, y, playheadPosition, playheadHeight) painter.end()
def paintBackground(self, painter, option, index): """ Draw the background for the item. :type painter: QtWidgets.QPainter :type option: QtWidgets.QStyleOptionViewItem :type index: QtCore.QModelIndex :rtype: None """ super(GroupItem, self).paintBackground(painter, option, index) painter.setPen(QtGui.QPen(QtCore.Qt.NoPen)) visualRect = self.visualRect(option) text = self.name() metrics = QtGui.QFontMetricsF(self._font) textWidth = metrics.width(text) padding = (25 * self.dpi()) visualRect.setX(textWidth + padding) visualRect.setY(visualRect.y() + (visualRect.height() / 2)) visualRect.setHeight(2 * self.dpi()) visualRect.setWidth(visualRect.width() - padding) color = QtGui.QColor( self.textColor().red(), self.textColor().green(), self.textColor().blue(), 10 ) painter.setBrush(QtGui.QBrush(color)) painter.drawRect(visualRect)
def setBadge(self, x, y, w, h, color=None): """ Set a for the icon. :type x: int :type y: int :type w: int :type h: int :type color: QtGui.QColor or None """ color = color or QtGui.QColor(240, 100, 100) size = self.actualSize(QtCore.QSize(256, 256)) pixmap = self.pixmap(size) painter = QtGui.QPainter(pixmap) pen = QtGui.QPen(color) pen.setWidth(0) painter.setPen(pen) painter.setBrush(color) painter.setRenderHint(QtGui.QPainter.Antialiasing) painter.drawEllipse(x, y, w, h) painter.end() icon = QtGui.QIcon(pixmap) self.swap(icon)
def paintBackground(self, painter, option, index): """ Draw the background for the item. :type painter: QtWidgets.QPainter :type option: QtWidgets.QStyleOptionViewItem :type index: QtCore.QModelIndex """ isSelected = option.state & QtWidgets.QStyle.State_Selected isMouseOver = option.state & QtWidgets.QStyle.State_MouseOver painter.setPen(QtGui.QPen(QtCore.Qt.NoPen)) visualRect = self.visualRect(option) if isSelected: color = self.backgroundSelectedColor() painter.setBrush(QtGui.QBrush(color)) elif isMouseOver: color = self.backgroundHoverColor() painter.setBrush(QtGui.QBrush(color)) else: color = self.backgroundColor() painter.setBrush(QtGui.QBrush(color)) if not self.itemsWidget().isIconView(): spacing = 1 * self.dpi() height = visualRect.height() - spacing visualRect.setHeight(height) painter.drawRect(visualRect)
def browseColor(self): """ Show the color dialog. :rtype: None """ color = self.currentColor() if color: color = studioqt.Color.fromString(color) d = QtWidgets.QColorDialog(self) d.setCurrentColor(color) standardColors = self.browserColors() if standardColors: index = -1 for standardColor in standardColors: index += 1 try: # Support for new qt5 signature standardColor = QtGui.QColor(standardColor) d.setStandardColor(index, standardColor) except: # Support for new qt4 signature standardColor = QtGui.QColor(standardColor).rgba() d.setStandardColor(index, standardColor) d.currentColorChanged.connect(self._colorChanged) if d.exec_(): self._colorChanged(d.selectedColor()) else: self._colorChanged(color)
def __init__(self, *args): QtWidgets.QWidget.__init__(self, *args) self._dpi = 1 self._padding = self.DEFAULT_PADDING w, h = self.DEFAULT_ZOOM_AMOUNT, self.DEFAULT_ZOOM_AMOUNT self._iconSize = QtCore.QSize(w, h) self._itemSizeHint = QtCore.QSize(w, h) self._zoomAmount = self.DEFAULT_ZOOM_AMOUNT self._labelDisplayOption = self.LABEL_DISPLAY_OPTION self._dataset = None self._treeWidget = TreeWidget(self) self._listView = ListView(self) self._listView.setTreeWidget(self._treeWidget) self._listView.installEventFilter(self) self._delegate = ItemDelegate() self._delegate.setItemsWidget(self) self._listView.setItemDelegate(self._delegate) self._treeWidget.setItemDelegate(self._delegate) self._treeWidget.installEventFilter(self) self._toastWidget = ToastWidget(self) self._toastWidget.hide() self._toastEnabled = True self._textColor = QtGui.QColor(255, 255, 255, 200) self._textSelectedColor = QtGui.QColor(255, 255, 255, 200) self._itemBackgroundColor = QtGui.QColor(255, 255, 255, 30) self._backgroundHoverColor = QtGui.QColor(255, 255, 255, 35) self._backgroundSelectedColor = QtGui.QColor(30, 150, 255) layout = QtWidgets.QHBoxLayout(self) layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(self._treeWidget) layout.addWidget(self._listView) header = self.treeWidget().header() header.sortIndicatorChanged.connect(self._sortIndicatorChanged) self.setLayout(layout) self.listView().itemClicked.connect(self._itemClicked) self.listView().itemDoubleClicked.connect(self._itemDoubleClicked) self.treeWidget().itemClicked.connect(self._itemClicked) self.treeWidget().itemDoubleClicked.connect(self._itemDoubleClicked) self.itemMoved = self._listView.itemMoved self.itemDropped = self._listView.itemDropped self.itemSelectionChanged = self._treeWidget.itemSelectionChanged
def _paintText(self, painter, option, column): if self.itemsWidget().isIconView(): text = self.name() else: label = self.labelFromColumn(column) text = self.displayText(label) isSelected = option.state & QtWidgets.QStyle.State_Selected if isSelected: color = self.textSelectedColor() else: color = self.textColor() visualRect = self.visualRect(option) width = visualRect.width() height = visualRect.height() padding = self.padding() x = padding / 2 y = padding / 2 visualRect.translate(x, y) visualRect.setWidth(width - padding) visualRect.setHeight(height - padding) font = self.font(column) align = self.textAlignment(column) metrics = QtGui.QFontMetricsF(font) if text: textWidth = metrics.width(text) else: textWidth = 1 # # Check if the current text fits within the rect. if textWidth > visualRect.width() - padding: visualWidth = visualRect.width() text = metrics.elidedText(text, QtCore.Qt.ElideRight, visualWidth) align = QtCore.Qt.AlignLeft if self.itemsWidget().isIconView(): align = align | QtCore.Qt.AlignBottom else: align = align | QtCore.Qt.AlignVCenter pen = QtGui.QPen(color) painter.setPen(pen) painter.setFont(font) painter.drawText(visualRect, align, text)
def createRubberBand(self): """ Create a new instance of the selection rubber band. :rtype: QtWidgets.QRubberBand """ rubberBand = QtWidgets.QRubberBand(QtWidgets.QRubberBand.Rectangle, self) palette = QtGui.QPalette() color = self.rubberBandColor() palette.setBrush(QtGui.QPalette.Highlight, QtGui.QBrush(color)) rubberBand.setPalette(palette) return rubberBand
def paintSlider(self, painter, option, index): """ Draw the virtual slider for the item. :type painter: QtWidgets.QPainter :type option: QtWidgets.QStyleOptionViewItem :type index: QtCore.QModelIndex """ if not self.PAINT_SLIDER: return if not self.itemsWidget().isIconView(): return # Draw slider background painter.setPen(QtGui.QPen(QtCore.Qt.NoPen)) rect = self.visualRect(option) color = self.itemsWidget().backgroundColor().toRgb() color.setAlpha(75) painter.setBrush(QtGui.QBrush(color)) height = rect.height() ratio = self.sliderValue() if ratio < 0: width = 0 elif ratio > 100: width = rect.width() else: width = rect.width() * (float(ratio) / 100) rect.setWidth(width) rect.setHeight(height) painter.drawRect(rect) # Draw slider value rect = self.visualRect(option) rect.setY(rect.y() + (4 * self.dpi())) color = self.itemsWidget().textColor().toRgb() color.setAlpha(220) pen = QtGui.QPen(color) align = QtCore.Qt.AlignTop | QtCore.Qt.AlignHCenter painter.setPen(pen) painter.drawText(rect, align, str(self.sliderValue()) + "%")
def _thumbnailFromImage(self, image): """ Called after the given image object has finished loading. :type image: QtGui.QImage :rtype: None """ self.clearCache() pixmap = QtGui.QPixmap() pixmap.convertFromImage(image) icon = QtGui.QIcon(pixmap) self._thumbnailIcon = icon if self.itemsWidget(): self.itemsWidget().update()
def setIcon(self, column, icon, color=None): """ Set the icon to be displayed in the given column. :type column: int or str :type icon: QtGui.QIcon :type color: QtGui.QColor or None :rtype: None """ # Safe guard for when the class is being used without the gui. isAppRunning = bool(QtWidgets.QApplication.instance()) if not isAppRunning: return if isinstance(icon, basestring): if not os.path.exists(icon): color = color or studioqt.Color(255, 255, 255, 20) icon = studiolibrary.resource.icon("image", color=color) else: icon = QtGui.QIcon(icon) if isinstance(column, basestring): self._icon[column] = icon else: self._pixmap[column] = None QtWidgets.QTreeWidgetItem.setIcon(self, column, icon) self.updateIcon()
def textWidth(self, column): text = self.text(column) font = self.font(column) metrics = QtGui.QFontMetricsF(font) textWidth = metrics.width(text) return textWidth
def __init__(self, *args, **kwargs): """ Using a custom load widget to support nicer blending. """ super(PoseLoadWidget, self).__init__(*args, **kwargs) self.ui.blendFrame = QtWidgets.QFrame(self) layout = QtWidgets.QHBoxLayout(self) self.ui.blendFrame.setLayout(layout) self.ui.blendSlider = QtWidgets.QSlider(self) self.ui.blendSlider.setObjectName("blendSlider") self.ui.blendSlider.setMinimum(-30) self.ui.blendSlider.setMaximum(130) self.ui.blendSlider.setOrientation(QtCore.Qt.Horizontal) self.ui.blendSlider.sliderMoved.connect(self.sliderMoved) self.ui.blendSlider.sliderReleased.connect(self.sliderReleased) self.ui.blendEdit = QtWidgets.QLineEdit(self) self.ui.blendEdit.setObjectName("blendEdit") self.ui.blendEdit.setText("0") self.ui.blendEdit.editingFinished.connect(self._blendEditChanged) validator = QtGui.QIntValidator(-200, 200, self) self.ui.blendEdit.setValidator(validator) layout.addWidget(self.ui.blendSlider) layout.addWidget(self.ui.blendEdit) self.setCustomWidget(self.ui.blendFrame) self.item().sliderChanged.connect(self.setSliderValue)
def setItem(self, item): """ Set the item to be created. :type item: studiolibrarymaya.BaseItem """ self._item = item self.ui.titleLabel.setText(item.MenuName) self.ui.titleIcon.setPixmap(QtGui.QPixmap(item.TypeIconPath)) schema = item.saveSchema() if os.path.exists(item.imageSequencePath()): self.setThumbnailPath(item.imageSequencePath()) elif not item.isDefaultThumbnailPath(): self.setThumbnailPath(item.thumbnailPath()) if schema: formWidget = studiolibrary.widgets.FormWidget(self) formWidget.setSchema(schema) formWidget.setValidator(item.saveValidator) formWidget.setValues({"name": item.name()}) self.ui.optionsFrame.layout().addWidget(formWidget) self._formWidget = formWidget formWidget.validate() else: self.ui.optionsFrame.setVisible(False)
def wrapped(*args, **kwargs): cursor = QtGui.QCursor(QtCore.Qt.ArrowCursor) QtWidgets.QApplication.setOverrideCursor(cursor) try: return fn(*args, **kwargs) finally: QtWidgets.QApplication.restoreOverrideCursor()
def backgroundHoverColor(self): """ Return the background color when the mouse is over the item. :rtype: QtWidgets.QtColor """ return QtGui.QColor(0, 0, 0, 0)
def backgroundColor(self): """ Return the background color for the item. :rtype: QtWidgets.QtColor """ return QtGui.QColor(0, 0, 0, 0)
def example(): """ Example: import studiolibrary.widgets.colorpicker reload(studiolibrary.widgets.colorpicker) studiolibrary.widgets.colorpicker.example() """ def _colorChanged(color): print("colorChanged:", color) style = """ #colorButton { margin: 5px; min-width: 100px; min-height: 100px; } #browseColorButton { margin: 5px; font-size: 45px; min-width: 100px; min-height: 100px; } """ colors = [ "rgb(230, 60, 60, 255)", "rgb(255, 90, 40)", "rgb(255, 125, 100, 255)", "rgb(250, 200, 0, 255)", "rgb(80, 200, 140, 255)", "rgb(50, 180, 240, 255)", "rgb(110, 110, 240, 255)", ] browserColors = [] browserColors_ = [ # Top row, Bottom row (230, 60, 60), (250, 80, 130), (255, 90, 40), (240, 100, 170), (255, 125, 100), (240, 200, 150), (250, 200, 0), (225, 200, 40), (80, 200, 140), (80, 225, 120), (50, 180, 240), (100, 200, 245), (130, 110, 240), (180, 160, 255), (180, 110, 240), (210, 110, 255) ] for colorR, colorG, colorB in browserColors_: for i in range(0, 3): color = QtGui.QColor(colorR, colorG, colorB) browserColors.append(color) picker = ColorPickerWidget() picker.setColors(colors) picker.setStyleSheet(style) picker.setBrowserColors(browserColors) picker.colorChanged.connect(_colorChanged) picker.show()
def defaultThumbnailIcon(self): """ Get the default thumbnail icon. :rtype: QtGui.QIcon """ return QtGui.QIcon(self.defaultThumbnailPath())
def currentIcon(self): """ Returns the current frame as a QIcon. :rtype: QtGui.QIcon """ return QtGui.QIcon(self.currentFilename())
def setItem(self, item): """ Set the item to be created. :type item: studiolibrarymaya.BaseItem """ self._item = item self.ui.titleLabel.setText(item.NAME) self.ui.titleIcon.setPixmap(QtGui.QPixmap(item.typeIconPath())) if os.path.exists(item.imageSequencePath()): self.setThumbnailPath(item.imageSequencePath()) elif not item.isTHUMBNAIL_PATH(): self.setThumbnailPath(item.thumbnailPath()) schema = item.saveSchema() if schema: formWidget = studiolibrary.widgets.FormWidget(self) formWidget.setSchema(schema) formWidget.setValidator(item.saveValidator) # Used when overriding the item name = os.path.basename(item.path()) formWidget.setValues({"name": name}) self.ui.optionsFrame.layout().addWidget(formWidget) self._formWidget = formWidget formWidget.validate() else: self.ui.optionsFrame.setVisible(False)
def currentPixmap(self): """ Return the current frame as a QPixmap. :rtype: QtGui.QPixmap """ return QtGui.QPixmap(self.currentFilename())
def __init__(self, *args): QtWidgets.QListView.__init__(self, *args) ItemViewMixin.__init__(self) self._treeWidget = None self._rubberBand = None self._rubberBandStartPos = None self._rubberBandColor = QtGui.QColor(QtCore.Qt.white) self._customSortOrder = [] self._drag = None self._dragStartPos = None self._dragStartIndex = None self._dropEnabled = True self.setSpacing(5) self.setMouseTracking(True) self.setSelectionRectVisible(True) self.setViewMode(QtWidgets.QListView.IconMode) self.setResizeMode(QtWidgets.QListView.Adjust) self.setSelectionMode(QtWidgets.QListWidget.ExtendedSelection) self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.setAcceptDrops(True) self.setDragEnabled(True) self.setDragDropMode(QtWidgets.QAbstractItemView.DragDrop) self.clicked.connect(self._indexClicked) self.doubleClicked.connect(self._indexDoubleClicked)
def backgroundSelectedColor(self): """ Return the background color when the item is selected. :rtype: QtWidgets.QtColor """ return QtGui.QColor(0, 0, 0, 0)
def __init__(self, item, parent=None): """ :type item: studiolibrarymaya.BaseItem :type parent: QtWidgets.QWidget or None """ QtWidgets.QWidget.__init__(self, parent) self.setObjectName("studioLibraryBaseLoadWidget") self.setWindowTitle("Load Item") self.loadUi() self._item = item self._iconPath = "" self._scriptJob = None self._formWidget = None self._infoFormWidget = None self.ui.titleLabel.setText(item.Name) self.ui.titleIcon.setPixmap(QtGui.QPixmap(item.typeIconPath())) # Create the icon group box groupBox = studiolibrary.widgets.GroupBoxWidget( "Icon", self.ui.iconFrame) groupBox.setObjectName("iconGroupBoxWidget") groupBox.setPersistent(True) self.ui.iconTitleFrame.layout().addWidget(groupBox) # Create the thumbnail widget and set the image self.ui.thumbnailButton = studiolibrary.widgets.ImageSequenceWidget( self) self.ui.thumbnailButton.setObjectName("thumbnailButton") self.ui.thumbnailFrame.layout().insertWidget(0, self.ui.thumbnailButton) if os.path.exists(item.imageSequencePath()): self.ui.thumbnailButton.setPath(item.imageSequencePath()) elif os.path.exists(item.thumbnailPath()): self.ui.thumbnailButton.setPath(item.thumbnailPath()) # Create the load widget and set the load schema self._formWidget = studiolibrary.widgets.FormWidget(self) self._formWidget.setObjectName(item.__class__.__name__ + "Form") self._formWidget.setSchema(item.loadSchema()) self._formWidget.setValidator(item.loadValidator) self._formWidget.validate() self.ui.formFrame.layout().addWidget(self._formWidget) try: self.selectionChanged() self.setScriptJobEnabled(True) except NameError as error: logger.exception(error) self.updateThumbnailSize() self._item.loadValueChanged.connect(self._itemValueChanged) self.ui.acceptButton.clicked.connect(self.accept) self.ui.selectionSetButton.clicked.connect(self.showSelectionSetsMenu)
def setBackgroundSelectedColor(self, color): """ Set the background color when an item is selected. :type color: QtWidgets.QtColor """ self._backgroundSelectedColor = color self._listView.setRubberBandColor(QtGui.QColor(200, 200, 200, 255))
def run(self): """The starting point for the thread.""" try: if self._path: image = QtGui.QImage(unicode(self._path)) self.signals.triggered.emit(image) except Exception as error: logger.exception("Cannot load thumbnail image.")
def createPixmap(self, path, color): """ Create a new Pixmap from the given path. :type path: str :type color: str or QtCore.QColor :rtype: QtCore.QPixmap """ dpi = self.treeWidget().dpi() key = path + color + "DPI-" + str(dpi) pixmap = self.PIXMAP_CACHE.get(key) if not pixmap: width = 20 * dpi height = 18 * dpi if "/" not in path and "\\" not in path: path = studiolibrary.resource.get("icons", path) if not os.path.exists(path): path = self.defaultIconPath() pixmap2 = studioqt.Pixmap(path) pixmap2.setColor(color) pixmap2 = pixmap2.scaled( 16 * dpi, 16 * dpi, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation ) x = (width - pixmap2.width()) / 2 y = (height - pixmap2.height()) / 2 pixmap = QtGui.QPixmap(QtCore.QSize(width, height)) pixmap.fill(QtCore.Qt.transparent) painter = QtGui.QPainter(pixmap) painter.drawPixmap(x, y, pixmap2) painter.end() self.PIXMAP_CACHE[key] = pixmap return pixmap
def setValue(self, value): """ Set the path on disc for the image. :type value: str """ self._value = value self._pixmap = QtGui.QPixmap(value) self.update()
def __init__(self, *args, **kwargs): super(IntFieldWidget, self).__init__(*args, **kwargs) validator = QtGui.QIntValidator(-50000000, 50000000, self) widget = QtWidgets.QLineEdit(self) widget.setValidator(validator) widget.textChanged.connect(self.emitValueChanged) self.setWidget(widget)