def _setup_toolbar(self): """ Internal function that setups script editor toolbar """ toolbar = QToolBar('Script Editor ToolBar', parent=self) toolbar.setIconSize(QSize(16, 16)) execute_btn = buttons.BaseToolButton(parent=self) execute_btn.setToolButtonStyle(Qt.ToolButtonTextUnderIcon) execute_selected_btn = buttons.BaseToolButton(parent=self) execute_selected_btn.setToolButtonStyle(Qt.ToolButtonTextUnderIcon) clear_output_btn = buttons.BaseToolButton(parent=self) clear_output_btn.setToolButtonStyle(Qt.ToolButtonTextUnderIcon) toolbar.addWidget(execute_btn) toolbar.addWidget(execute_selected_btn) toolbar.addWidget(clear_output_btn) execute_btn.setDefaultAction(self._execute_all_action) execute_selected_btn.setDefaultAction(self._execute_selected_action) clear_output_btn.setDefaultAction(self._clear_output_action) return toolbar
class ImageSequenceWidget(QToolButton, object): DEFAULT_PLAYHEAD_COLOR = QColor(255, 255, 255, 220) DEFAULT_PLAYHEAD_HEIGHT = 4 def __init__(self, *args): super(ImageSequenceWidget, self).__init__(*args) self.setMouseTracking(True) self._image_sequence = image.ImageSequence('') self._image_sequence.frameChanged.connect(self._on_frame_changed) self._toolbar = QToolBar(self) animation.fade_out_widget(self._toolbar, duration=0) spacer = QWidget() spacer.setMaximumWidth(4) spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred) self._toolbar.addWidget(spacer) spacer1 = QWidget() spacer1.setMaximumWidth(4) spacer1.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred) self._first_spacer = self._toolbar.addWidget(spacer1) self.set_size(150, 150) # ================================================================================================================= # OVERRIDES # ================================================================================================================= def addAction(self, path, text, tip, callback): """ Overrides base QToolButton addAction function Adds aan action to the toolbar :param path: str :param text: str :param tip: str :param callback: fn :return: QAction """ action_icon = icon.Icon.state_icon( path, color='rgb(250,250,250,160)', color_active='rgb(250,250,250,250)', color_disabled='rgb(0,0,0,20)' ) action = QAction(action_icon, text, self._toolbar) action.setToolTip(tip) self._toolbar.insertAction(self._first_spacer, action) action.triggered.connect(callback) return action def actions(self): """ Overrides base QToolButton actions function Returns all the actions that are a child of the toolbar :return: list(QAction) """ actions = list() for child in self._toolbar.children(): if isinstance(child, QAction): actions.append(child) return actions def resizeEvent(self, event): """ Overrides base QToolButton resizeEvent function Called when the widget is resized :param event: QResizeEvent """ self.update_toolbar() def enterEvent(self, event): """ Overrides base QToolButton enterEvent function Starts playing the image sequence when the mouse enters the widget :param event: QEvent """ self._image_sequence.start() animation.fade_in_widget(self._toolbar, duration=300) def leaveEvent(self, event): """ Overrides base QToolButton leaveEvent function Stops playing the image sequence when the mouse leaves the widget :param event: QEvent """ self._image_sequence.pause() animation.fade_out_widget(self._toolbar, duration=300) def mouseMoveEvent(self, event): """ Overrides base QToolButton mouseMoveEvent function :param event: QEvent """ if qtutils.is_control_modifier() and self._image_sequence.frame_count() > 1: percent = 1.0 - (float(self.width() - event.pos().x()) / float(self.width())) frame = int(self._image_sequence.frame_count() * percent) self._image_sequence.jump_to_frame(frame) frame_icon = self._image_sequence.current_icon() self.setIcon(frame_icon) def paintEvent(self, event): """ Overrides base QToolButton paintEvent function Triggered on frame changed :param event: QEvent """ super(ImageSequenceWidget, self).paintEvent(event) painter = QPainter() painter.begin(self) if self.current_filename() and self._image_sequence.frame_count() > 1: r = event.rect() playhead_height = self.playhead_height() playhead_pos = self._image_sequence.percent() * r.width() - 1 x = r.x() y = self.height() - playhead_height painter.seten(Qt.NoPen) painter.setBrush(QBrush(self.DEFAULT_PLAYHEAD_COLOR)) painter.drawRect(x, y, playhead_pos, playhead_height) painter.end() # ================================================================================================================= # BASE # ================================================================================================================= def is_sequence(self): """ Returns whether or not the image sequence has more than one frame :return: bool """ return bool(self._image_sequence.frame_count() > 1) def dirname(self): """ Returns the directory where the image sequence is located on disk :return: str """ return self._image_sequence.dirname() def has_frames(self): """ Returns whether or not image sequences has any frames :return: bool """ return bool(self.first_frame()) def first_frame(self): """ Returns first frame path in the image sequence :return: str """ return self._image_sequence.first_frame() def set_path(self, path): """ Sets a single frame image sequence :param path: str """ self._image_sequence.set_path(path) self.update_icon() def set_dirname(self, dirname): """ Sets the location of the image sequence :param dirname: str """ self._image_sequence.set_dirname(dirname) self.update_icon() def current_filename(self): """ Returns the current image location :return: str """ return self._image_sequence.current_filename() def playhead_height(self): """ Returns the height of the playhead :return: int """ return self.DEFAULT_PLAYHEAD_COLOR def set_size(self, w, h): """ Set the size of the widget and updates icon size at the same time :param w: int :param h: int """ self._size = QSize(w, h) self.setIconSize(self._size) self.setFixedSize(self._size) def update_icon(self): """ Updates the icon for the current frame """ if self._image_sequence.frames(): frame_icon = self._image_sequence.current_icon() self.setIcon(frame_icon) def update_toolbar(self): """ Updates the toolbar size depending on the number of actions """ self._toolbar.setIconSize(QSize(16, 16)) count = len(self.actions()) - 3 width = 26 * count self._toolbar.setGeometry(0, 0, width, 25) x = self.rect().center().x() - (self._toolbar.width() * 0.5) y = self.height() - self._toolbar.height() - 12 self._toolbar.setGeometry(x, y, self._toolbar.width(), self._toolbar.height()) # ================================================================================================================= # CALLBACKS # ================================================================================================================= def _on_frame_changed(self, frame=None): """ Internal callback function triggered when the image sequence changes frame :param frame: int or None """ if not qtutils.is_control_modifier(): frame_icon = self._image_sequence.current_icon() self.setIcon(frame_icon)