Beispiel #1
0
 def subTimeOut(self):
     fontColor = self.previewSubtitle.fontColor
     fontSize = (self.previewSubtitle.fontSize + 5) / 2.5
     fontBold = self.previewSubtitle.bold
     fontItalic = self.previewSubtitle.italic
     fontShadowOffset = self.previewSubtitle.shadowOffset
     for _, srtTextItem in self.srtTextItemDict.items():
         srtTextItem.setDefaultTextColor(fontColor)
         font = QFont()
         font.setFamily("微软雅黑")
         font.setPointSize(fontSize)
         font.setBold(fontBold)
         font.setItalic(fontItalic)
         srtTextItem.setFont(font)
         srtTextShadow = QGraphicsDropShadowEffect()
         srtTextShadow.setOffset(fontShadowOffset)
         srtTextItem.setGraphicsEffect(srtTextShadow)
     try:
         selected = self.subtitle.selectionModel().selection().indexes()
         for x, i in enumerate(selected):
             if self.subtitle.item(i.row(), x):
                 txt = self.subtitle.item(i.row(), x).text()
                 if txt:
                     self.srtTextItemDict[x].setPlainText('#%s:' % (x + 1) + txt)
                     txtSize = self.srtTextItemDict[x].boundingRect().size()
                     posY = self.playerWidget.size().height() - txtSize.height() * (x + 1)
                     posX = (self.playerWidget.size().width() - txtSize.width()) / 2
                     self.srtTextItemDict[x].setPos(posX, posY)
                 else:
                     self.srtTextItemDict[x].setPlainText('')
             else:
                 self.srtTextItemDict[x].setPlainText('')
     except:
         pass
Beispiel #2
0
def css_button(qtwindow, button, color=None, shadow=True):
    ''' apply style to a button widget '''

    # default bg color is gray 80
    if color == 'red':
        bg_color = 'rgb(160, 20, 20)'  # red/white
        tx_color = 'rgb(255, 255, 255)'
    elif color == 'disabled':
        bg_color = 'rgb(80, 80, 80)'  # gray/gray
        tx_color = 'rgb(180, 180, 180)'
    elif color == 'blue':
        bg_color = 'rgb(46, 134, 193)'  # blue arcane/white
        tx_color = 'rgb(230, 230, 230)'
    else:
        bg_color = 'rgb(80, 80, 80)'  # gray
        tx_color = 'rgb(230, 230, 230)'

    css = "border-radius:3px;color:{};background:{};font-size:12px;font-family:Segoe UI;".format(
        tx_color, bg_color)
    button.setStyleSheet(css)

    if shadow:
        shadow = QGraphicsDropShadowEffect(qtwindow)
        shadow.setBlurRadius(6)
        shadow.setOffset(4)
        shadow.setColor(QColor(20, 20, 20, 200))
        button.setGraphicsEffect(shadow)
Beispiel #3
0
    def overlay_text(
        self,
        message: str,
        color: int,
        size: int,
        x: int,
        y: int,
        timeout: int,
        font_name: str,
        centered: bool,
        shadow: bool,
    ):
        gfx = QGraphicsTextItem(message)
        gfx.setDefaultTextColor(decode_color(color))

        font = QFont(font_name, min(50, size))
        font.setStyleHint(QFont.SansSerif)
        gfx.setFont(font)

        if shadow:
            effect = QGraphicsDropShadowEffect(gfx)
            effect.setBlurRadius(0)
            effect.setColor(Qt.GlobalColor.black)
            effect.setOffset(1, 1)
            gfx.setGraphicsEffect(effect)

        if centered:
            # The provided x, y is at the center of the text
            bound = gfx.boundingRect()
            gfx.setPos(x - (bound.width() / 2), y - (bound.height() / 2))
        else:
            gfx.setPos(x, y)

        self._finalize_gfx(gfx, timeout)
Beispiel #4
0
 def activate(self):
     """Adds items to scene and setup graphics effect.
     Called in the constructor and when re-adding the item to the project in the context of undo/redo.
     """
     scene = self._toolbox.ui.graphicsView.scene()
     scene.addItem(self)
     shadow_effect = QGraphicsDropShadowEffect()
     shadow_effect.setOffset(1)
     shadow_effect.setEnabled(False)
     self.setGraphicsEffect(shadow_effect)
    def __init__(self, toolbox, x, y, w, h, project_item, icon_file,
                 icon_color, background_color):
        """Base class for project item icons drawn in Design View.

        Args:
            toolbox (ToolBoxUI): QMainWindow instance
            x (float): Icon x coordinate
            y (float): Icon y coordinate
            w (float): Icon width
            h (float): Icon height
            project_item (ProjectItem): Item
            icon_file (str): Path to icon resource
            icon_color (QColor): Icon's color
            background_color (QColor): Background color
        """
        super().__init__()
        self._toolbox = toolbox
        self._project_item = project_item
        self._moved_on_scene = False
        self.renderer = QSvgRenderer()
        self.svg_item = QGraphicsSvgItem()
        self.colorizer = QGraphicsColorizeEffect()
        self.setRect(QRectF(x, y, w, h))  # Set ellipse coordinates and size
        self.text_font_size = 10  # point size
        # Make item name graphics item.
        name = project_item.name if project_item else ""
        self.name_item = QGraphicsSimpleTextItem(name)
        shadow_effect = QGraphicsDropShadowEffect()
        shadow_effect.setOffset(1)
        shadow_effect.setEnabled(False)
        self.setGraphicsEffect(shadow_effect)
        self.set_name_attributes()  # Set font, size, position, etc.
        # Make connector buttons
        self.connectors = dict(
            bottom=ConnectorButton(self, toolbox, position="bottom"),
            left=ConnectorButton(self, toolbox, position="left"),
            right=ConnectorButton(self, toolbox, position="right"),
        )
        # Make exclamation and rank icons
        self.exclamation_icon = ExclamationIcon(self)
        self.rank_icon = RankIcon(self)
        # Group the drawn items together by setting the background rectangle as the parent of other QGraphicsItems
        # NOTE: setting the parent item moves the items as one!
        self.name_item.setParentItem(self)
        for conn in self.connectors.values():
            conn.setParentItem(self)
        self.svg_item.setParentItem(self)
        self.exclamation_icon.setParentItem(self)
        self.rank_icon.setParentItem(self)
        brush = QBrush(background_color)
        self._setup(brush, icon_file, icon_color)
        # Add items to scene
        scene = self._toolbox.ui.graphicsView.scene()
        scene.addItem(self)
Beispiel #6
0
    def __init__(self, text: str, object_name: str = "blue"):
        super().__init__(text)

        self.setCursor(Qt.PointingHandCursor)

        if object_name:
            self.setObjectName(object_name)

        effect = QGraphicsDropShadowEffect(self)
        effect.setColor(QColor(0, 0, 0, 0.25 * 255))
        effect.setOffset(2, 4)
        effect.setBlurRadius(4)
        self.setGraphicsEffect(effect)
 def add_window_drop_shadow() -> None:
     """Adds a drop-shadow behind the window"""
     if self.__use_shadow:
         self.layout().setMargin(self.__style.window.SHADOW_RADIUS_PX)
         drop_shadow_effect = QGraphicsDropShadowEffect(self)
         drop_shadow_effect.setEnabled(True)
         drop_shadow_effect.setBlurRadius(
             self.__style.window.SHADOW_RADIUS_PX)
         color = QColor(self.__style.window.SHADOW_COLOR_RGB)
         color.setAlpha(self.__style.window.SHADOW_OPACITY_HEX)
         drop_shadow_effect.setColor(color)
         drop_shadow_effect.setOffset(0)
         self.setGraphicsEffect(drop_shadow_effect)
Beispiel #8
0
 def __init__(self, toolbox, icon_file, icon_color, background_color):
     """
     Args:
         toolbox (ToolboxUI): QMainWindow instance
         icon_file (str): Path to icon resource
         icon_color (QColor): Icon's color
         background_color (QColor): Background color
     """
     super().__init__()
     self._toolbox = toolbox
     self.icon_file = icon_file
     self._moved_on_scene = False
     self.previous_pos = QPointF()
     self.current_pos = QPointF()
     self.icon_group = {self}
     self.renderer = QSvgRenderer()
     self.svg_item = QGraphicsSvgItem(self)
     self.colorizer = QGraphicsColorizeEffect()
     self.setRect(
         QRectF(-self.ITEM_EXTENT / 2, -self.ITEM_EXTENT / 2,
                self.ITEM_EXTENT, self.ITEM_EXTENT))
     self.text_font_size = 10  # point size
     # Make item name graphics item.
     self._name = ""
     self.name_item = QGraphicsSimpleTextItem(self._name, self)
     self.set_name_attributes()  # Set font, size, position, etc.
     # Make connector buttons
     self.connectors = dict(
         bottom=ConnectorButton(self, toolbox, position="bottom"),
         left=ConnectorButton(self, toolbox, position="left"),
         right=ConnectorButton(self, toolbox, position="right"),
     )
     # Make exclamation and rank icons
     self.exclamation_icon = ExclamationIcon(self)
     self.execution_icon = ExecutionIcon(self)
     self.rank_icon = RankIcon(self)
     brush = QBrush(background_color)
     self._setup(brush, icon_file, icon_color)
     shadow_effect = QGraphicsDropShadowEffect()
     shadow_effect.setOffset(1)
     shadow_effect.setEnabled(False)
     self.setGraphicsEffect(shadow_effect)
Beispiel #9
0
def set_shadow(QtWindow, button):
    shadow = QGraphicsDropShadowEffect(QtWindow)
    shadow.setBlurRadius(6)
    shadow.setOffset(3)
    shadow.setColor(QColor(0, 0, 0, 160))
    button.setGraphicsEffect(shadow)
Beispiel #10
0
class Central(QFrame):
    '''Initializes, styles, and connects the various classes'''

    def __init__(self):
        super().__init__()
        # Objects
        self.overallLayout = QVBoxLayout(self)
        self.contentLayout = QHBoxLayout()
        self.dropShadow = QGraphicsDropShadowEffect(self)
        self.boxManager = BoxManager.BoxManager()
        self.topBar = TopBar.TopBar()
        self.selectorArea = QFrame()
        self.selectorLayout = QVBoxLayout(self.selectorArea)
        self.folderArea = QFrame()
        self.folderLayout = QHBoxLayout(self.folderArea)
        self.folderList = FolderList.FolderList()
        self.folderBar = ScrollBar.ScrollBar(self.folderList)
        self.canvas = Canvas.Canvas(self.boxManager)
        self.imageArea = QFrame()
        self.imageList = ImageList.ImageList()
        self.imageLayout = QHBoxLayout(self.imageArea)
        self.imageBar = ScrollBar.ScrollBar(self.imageList)

        # Styling
        self.setStyleSheet('Central { background: transparent; }')
        self.overallLayout.setMargin(20)
        self.overallLayout.setSpacing(0)
        self.dropShadow.setOffset(QPointF(0,4))
        self.dropShadow.setColor(QColor(0,0,0,100))
        self.dropShadow.setBlurRadius(10)
        self.setGraphicsEffect(self.dropShadow)
        self.contentLayout.setAlignment(Qt.AlignCenter)
        self.contentLayout.setMargin(0)        
        self.contentLayout.setSpacing(0)
        self.selectorLayout.setMargin(0)
        self.selectorLayout.setSpacing(0)
        self.folderLayout.setMargin(0)
        self.folderLayout.setSpacing(0)
        self.imageLayout.setMargin(0)
        self.imageLayout.setSpacing(0)
        self.folderList.setVerticalScrollBar(self.folderBar)
        self.imageList.setVerticalScrollBar(self.imageBar)
        self.selectorArea.setMaximumWidth(400)
        self.selectorArea.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)

        # Layout
        self.folderLayout.addWidget(self.folderList)
        self.folderLayout.addSpacerItem(QSpacerItem(-7, 0))
        self.folderLayout.addWidget(self.folderBar)
        self.imageLayout.addWidget(self.imageList)
        self.imageLayout.addSpacerItem(QSpacerItem(-7, 0))
        self.imageLayout.addWidget(self.imageBar)
        self.selectorLayout.addWidget(self.folderArea, 15)
        self.selectorLayout.addWidget(self.imageArea, 85)
        self.contentLayout.addWidget(self.selectorArea, 30)
        self.contentLayout.addWidget(self.canvas, 70)
        self.overallLayout.addLayout(self.contentLayout)
        self.overallLayout.insertWidget(0, self.topBar)

        # Connections
        self.folderList.selectedFolderChanged.connect(self.handleSelectedFolderChanged)
        self.imageList.selectedImageChanged.connect(self.handleSelectedImageChanged)

    def handleSelectedFolderChanged(self, folder):
        self.imageList.populate(folder)
        self.canvas.changeImage(None)
        self.canvas.setMessage('Switching Folders - {}'.format(folder.data(role=Qt.DisplayRole)))
        self.topBar.setSelectedFolder(str(folder.data(role=Qt.UserRole+1)))
        self.topBar.setSelectedImage('')

    def handleSelectedImageChanged(self, image):
        self.canvas.changeImage(image)
        self.canvas.setMessage('Switching Images - {}'.format(image.data(role=Qt.DisplayRole)))
        self.topBar.setSelectedImage(str(image.data(role=Qt.DisplayRole)))
Beispiel #11
0
class StyleWindow(QWidget):
    def __init__(self, parent=None):
        """
        基于QWidget的窗口,作为一些窗口的基类,提供一些基础的属性
        background_color_: 背景色, 目前只支持单色
        border_width_: 边框宽度, 为0表示没有边框
        border_color_:
        opacity_: 窗口透明度
        shadow_on_: 是否开启阴影
        shadow_color_:
        shadow_blur_: 阴影半径
        border_radius_: 四个角的弧度
        分别设置4个角的radius
        left_top_border_radius:
        left_bottom_border_radius_:
        right_top_border_radius_:
        right_bottom_border_radius_
        """
        QWidget.__init__(self, parent)

        self._border_width = 0
        self._border_indicator_width = 5
        self._mouse_left_button_pressed = False
        self._rt_pre_geometry = self.geometry()
        self._mouse_move_pre_pos = QPoint()
        self._background_color = Qt.white
        self._border_color = Qt.transparent
        self._border_width = 0
        self._border_radius = 0
        self._opacity = 1.0
        self._shadow = None
        self._main_v_layout_ = None
        self._cursor_calc_type = MousePosition.CenterPos
        # border
        self._left_top_border_radius = 0
        self._left_bottom_border_radius = 0
        self._right_top_border_radius = 0
        self._right_bottom_border_radius = 0
        self._enabled_drag = False
        self.setMouseTracking(True)
        # self.setAttribute(Qt.WA_TranslucentBackground)
        self._init_default_layout()

    def paint_style_widget(self, painter):
        style_opt = QStyleOption()
        style_opt.init(self)
        self.style().drawPrimitive(QStyle.PE_Widget, style_opt, painter)

    def paintEvent(self, event):
        """ paintEvent(self, event:PySide2.QtGui.QPaintEvent) """
        painter = QPainter(self)
        self.paint_border_background(painter)

    def border_width(self):
        return self._border_width

    def set_border_width(self, width):
        self._border_width = parse_pix_width(width)
        if self._main_v_layout_ is not None:
            self._main_v_layout_.setContentsMargins(self._border_width,
                                                    self._border_width,
                                                    self._border_width,
                                                    self._border_width)

    border_width_ = Property(str, fget=border_width, fset=set_border_width)

    def border_indicator_width(self):
        return self._border_indicator_width

    def set_border_indicator_width(self, width):
        self._border_indicator_width = parse_pix_width(width)

    border_indicator_width_ = Property(str,
                                       fget=border_indicator_width,
                                       fset=set_border_indicator_width)

    def mouseMoveEvent(self, event):
        """ mouseMoveEvent(self, event:PySide2.QtGui.QMouseEvent) """
        if self._enabled_drag:
            if self.isMaximized() is not True and self.isFullScreen(
            ) is not True:
                self._set_cursor_shape(
                    self._calc_cursor_pos(event.pos(),
                                          self._calc_cursor_col(event.pos())))
            if self._mouse_left_button_pressed and MousePosition.CenterPos != self._cursor_calc_type:
                self._drag_resize()
        super(StyleWindow, self).mouseMoveEvent(event)

    def _set_cursor_shape(self, pos):
        """setCurSorShape(self, pos:StyleWindow.MousePosition)"""
        cursor_shape = Qt.ArrowCursor
        if MousePosition.TopLeftPos == pos or MousePosition.BottomRightPos == pos:
            cursor_shape = Qt.SizeFDiagCursor
        elif MousePosition.LeftPos == pos or MousePosition.RightPos == pos:
            cursor_shape = Qt.SizeHorCursor
        elif MousePosition.BottomLeftPos == pos or MousePosition.TopRightPos == pos:
            cursor_shape = Qt.SizeBDiagCursor
        elif MousePosition.BottomPos == pos or MousePosition.TopPos == pos:
            cursor_shape = Qt.SizeVerCursor
        self.setCursor(cursor_shape)

    def _calc_cursor_col(self, pt):
        """calCursorCol(self, pt:PySide2.QtCore.QPoint)"""
        res = 3
        x = pt.x()
        if x < self.border_indicator_width():
            res = 1
        elif x < self.width() - self.border_indicator_width():
            res = 2
        return res

    def _calc_cursor_pos(self, pt, bit):
        """calCursorCol(self, pt:PySide2.QtCore.QPoint, bit)"""
        result = bit
        y = pt.y()
        if y < self.border_indicator_width():
            result += 10
        elif y > self.height() - self.border_indicator_width():
            result += 30
        else:
            result += 20

        return result

    def mousePressEvent(self, event):
        """ mousePressEvent(self, event:PySide2.QtGui.QMouseEvent) """
        if self._enabled_drag:
            self.set_calc_mouse_type(
                self._calc_cursor_pos(event.pos(),
                                      self._calc_cursor_col(event.pos())))
            if Qt.LeftButton == event.button(
            ) and MousePosition.CenterPos != self._cursor_calc_type:
                self._mouse_left_button_pressed = True
            self._rt_pre_geometry = self.geometry()
            self._mouse_move_pre_pos = event.globalPos()
        super(StyleWindow, self).mousePressEvent(event)

    def mouseReleaseEvent(self, event):
        """ mousePressEvent(self, event:PySide2.QtGui.QMouseEvent) """
        self._mouse_left_button_pressed = False
        QApplication.restoreOverrideCursor()
        super(StyleWindow, self).mouseReleaseEvent(event)

    def _drag_resize(self):
        mouse_cur_pos = QCursor.pos()
        move_pos = mouse_cur_pos - self._mouse_move_pre_pos
        after_resize_geometry = self._rt_pre_geometry
        if MousePosition.TopLeftPos == self._cursor_calc_type:
            after_resize_geometry.setTopLeft(self._rt_pre_geometry.topLeft() +
                                             move_pos)
        elif MousePosition.LeftPos == self._cursor_calc_type:
            after_resize_geometry.setLeft(self._rt_pre_geometry.left() +
                                          move_pos.x())
        elif MousePosition.BottomLeftPos == self._cursor_calc_type:
            after_resize_geometry.setBottomLeft(
                self._rt_pre_geometry.bottomLeft() + move_pos)
        elif MousePosition.BottomPos == self._cursor_calc_type:
            after_resize_geometry.setBottom(self._rt_pre_geometry.bottom() +
                                            move_pos.y())
        elif MousePosition.BottomRightPos == self._cursor_calc_type:
            after_resize_geometry.setBottomRight(
                self._rt_pre_geometry.bottomRight() + move_pos)
        elif MousePosition.RightPos == self._cursor_calc_type:
            after_resize_geometry.setRight(self._rt_pre_geometry.right() +
                                           move_pos.x())
        elif MousePosition.TopRightPos == self._cursor_calc_type:
            after_resize_geometry.setTopRight(
                self._rt_pre_geometry.topRight() + move_pos)
        elif MousePosition.TopPos == self._cursor_calc_type:
            after_resize_geometry.setTop(self._rt_pre_geometry.top() +
                                         move_pos.y())

        self.setGeometry(after_resize_geometry)
        self._mouse_move_pre_pos = mouse_cur_pos
        self._rt_pre_geometry = after_resize_geometry

    def background_color(self):
        return self._background_color

    def set_background_color(self, clr):
        self._background_color = clr

    background_color_ = Property(QColor,
                                 fget=background_color,
                                 fset=set_background_color)

    def border_color(self):
        return self._border_color

    def set_border_color(self, clr):
        self._border_color = clr

    border_color_ = Property(QColor, fget=border_color, fset=set_border_color)

    def border_radius(self):
        return self._border_radius

    def set_border_radius(self, radius):
        self._border_radius = parse_pix_width(radius)

    border_radius_ = Property(str, fget=border_radius, fset=set_border_radius)

    def paint_border_background(self, painter):
        """paint_border_background(self, painter:PySide2.QtGui.QPainter)"""
        painter.save()
        pen = QPen()
        pen.setColor(self.border_color())
        pen.setWidth(self.border_width())
        painter.setPen(pen)
        brush = QBrush(self.background_color())
        painter.setBrush(brush)
        painter.setOpacity(self.opacity())
        # painter.setRenderHint(QPainter.Antialiasing)
        rc = self.rect()
        paint_path = QPainterPath()
        # adjust shadow
        if self._shadow is not None:
            rc.adjust(self.shadow_blur(), self.shadow_blur(),
                      -self.shadow_blur(), -self.shadow_blur())

        # self._calc_background_path(rc, paint_path)
        if self._calc_background_path(rc, paint_path):
            painter.setRenderHint(QPainter.Antialiasing)

        if self.border_width() > 0:
            painter.drawPath(paint_path)
        else:
            painter.fillPath(paint_path, brush)

        painter.restore()

    def set_opacity(self, opacity):
        self._opacity = opacity

    def opacity(self) -> float:
        return self._opacity

    opacity_ = Property(float, fget=opacity, fset=set_opacity)

    def resizeEvent(self, event):
        super(StyleWindow, self).resizeEvent(event)
        # self.setGeometry(5, 5, self.width() - 5, self.height() - 5)

    def set_shadow(self, on):
        if on:
            self._shadow = QGraphicsDropShadowEffect(self)
            self._shadow.setOffset(0.0, 0.0)
            self._shadow.color()
            self.setGraphicsEffect(self._shadow)
            self.setGeometry(5, 5, self.width() - 5, self.height() - 5)

    def shadow(self):
        return self._shadow

    shadow_on_ = Property(bool, fget=shadow, fset=set_shadow)

    def shadow_color(self):
        if self._shadow is not None:
            return self._shadow.color()

    def set_shadow_color(self, color):
        if self._shadow is not None:
            self._shadow.setColor(color)

    shadow_color_ = Property(QColor, fget=shadow_color, fset=set_shadow_color)

    def shadow_blur(self):
        if self._shadow is not None:
            return self._shadow.blurRadius()
        return 0

    def set_shadow_blur(self, pix_blur):
        if self._shadow is not None:
            blur = parse_pix_width(pix_blur)
            self._shadow.setBlurRadius(blur)
            self.set_border_indicator_width(blur +
                                            self.border_indicator_width())
            if self._main_v_layout_ is not None:
                self._main_v_layout_.setContentsMargins(
                    blur + self.border_width(), blur + self.border_width(),
                    blur - 1 + self.border_width(), blur + self.border_width())

    shadow_blur_ = Property(str, fget=shadow_blur, fset=set_shadow_blur)

    def _init_default_layout(self):
        """setting a default QVBoxLayout"""
        self._main_v_layout_ = QVBoxLayout(self)
        self._main_v_layout_.setContentsMargins(0, 0, 0, 0)
        self.setLayout(self._main_v_layout_)

    def set_left_top_border_radius(self, radius):
        self._left_top_border_radius = parse_pix_width(radius)

    def left_top_border_radius(self):
        if self._left_top_border_radius:
            return self._left_top_border_radius
        return self.border_radius()

    left_top_border_radius_ = Property(str,
                                       fget=left_top_border_radius,
                                       fset=set_left_top_border_radius)

    def set_left_bottom_border_radius(self, radius):
        self._left_bottom_border_radius = parse_pix_width(radius)

    def left_bottom_border_radius(self):
        if self._left_bottom_border_radius:
            return self._left_bottom_border_radius
        return self.border_radius()

    left_bottom_border_radius_ = Property(str,
                                          fget=left_bottom_border_radius,
                                          fset=set_left_bottom_border_radius)

    def set_right_top_border_radius(self, radius):
        self._right_top_border_radius = parse_pix_width(radius)

    def right_top_border_radius(self):
        if self._right_top_border_radius:
            return self._right_top_border_radius
        return self.border_radius()

    right_top_border_radius_ = Property(str,
                                        fget=right_top_border_radius,
                                        fset=set_right_top_border_radius)

    def set_right_bottom_border_radius(self, radius):
        self._right_bottom_border_radius = parse_pix_width(radius)

    def right_bottom_border_radius(self):
        if self._right_bottom_border_radius:
            return self._right_bottom_border_radius
        return self.border_radius()

    right_bottom_border_radius_ = Property(str,
                                           fget=right_bottom_border_radius,
                                           fset=set_right_bottom_border_radius)

    def _calc_background_path(self, rc, painter_path):

        render_hint = False
        if self.border_radius():
            painter_path.addRoundedRect(rc, self.border_radius(),
                                        self.border_radius())
            render_hint = True
        else:
            if self.left_top_border_radius() or self.left_bottom_border_radius() \
                    or self.right_top_border_radius() or self.right_bottom_border_radius():
                # add radius
                render_hint = True
            radius_angle = 90.0
            rotate_angle = 90.0
            painter_path.moveTo(rc.left(), rc.top())
            painter_path.arcTo(rc.left(), rc.top(),
                               self.left_top_border_radius(),
                               self.left_top_border_radius(), rotate_angle,
                               radius_angle)
            painter_path.lineTo(
                rc.left(),
                rc.bottom() - self.left_bottom_border_radius() / 2)
            painter_path.arcTo(rc.left(),
                               rc.bottom() - self.left_bottom_border_radius(),
                               self.left_bottom_border_radius(),
                               self.left_bottom_border_radius(),
                               rotate_angle * 2, radius_angle)
            painter_path.lineTo(
                rc.right() - self.right_bottom_border_radius() / 2,
                rc.bottom())
            painter_path.arcTo(rc.right() - self.right_bottom_border_radius(),
                               rc.bottom() - self.right_bottom_border_radius(),
                               self.right_bottom_border_radius(),
                               self.right_bottom_border_radius(),
                               rotate_angle * 3, radius_angle)
            painter_path.lineTo(rc.right(),
                                rc.top() - self.right_top_border_radius() / 2)
            painter_path.arcTo(rc.right() - self.right_top_border_radius(),
                               rc.top(), self.right_top_border_radius(),
                               self.right_top_border_radius(),
                               rotate_angle * 4 % rotate_angle, radius_angle)
            painter_path.lineTo(rc.left() + self.left_top_border_radius() / 2,
                                rc.top())

        return render_hint

    def set_layout(self, layout):
        if self._main_v_layout_ is not None:
            self._main_v_layout_.addLayout(layout)

    @property
    def mouse_drag_enabled(self):
        return self._enabled_drag

    @mouse_drag_enabled.setter
    def mouse_drag_enabled(self, drag):
        self._enabled_drag = drag

    def _mouse_drag_is_center_type(self):
        if self._cursor_calc_type == MousePosition.CenterPos:
            return True
        return False

    def set_calc_mouse_type(self, mouse_type: MousePosition):
        self._cursor_calc_type = mouse_type
Beispiel #12
0
class PreferencesGUI(App):
    '''
    Main class for the Preferences Window
    '''
    keys = list()
    finished = Signal()

    def __init__(self, appctxt, windowInst):
        super().__init__()
        self.appctxt = appctxt
        self.initUI(windowInst)

        # self.windowInst.setWindowFlags(QtCore.Qt.WindowTitleHint | QtCore.Qt.FramelessWindowHint)

        # self.windowInst.setAttribute(QtCore.Qt.WA_DeleteOnClose)

        self.settings = QSettings(self.COMPANY_NAME, self.APPLICATION_NAME)

        self.receiversInst = Receivers(self.ui)
        self.receiversInst.confirmSignal.connect(self.handleExit)
        self.connectReceivers()

        self.guiHelper = GuiHelper()

        self.loadKeys()

        self.loadSettings()

    def terminate(self):
        self.storeSettings()
        del self.settings

    def initUI(self, windowInst):
        # self.app = QtWidgets.QApplication(sys.argv)
        self.ui = Ui_PreferencesDialog()
        self.ui.windowInst = windowInst
        self.ui.windowInst.hide()
        self.ui.setupUi(self.ui.windowInst)

        windowInst.setAttribute(Qt.WA_TranslucentBackground)
        self.backgroundEffect = QGraphicsDropShadowEffect(windowInst)
        self.backgroundEffect.setBlurRadius(30)
        self.backgroundEffect.setOffset(0, 0)
        self.backgroundEffect.setEnabled(True)

        self.ui.centralwidget.setGraphicsEffect(self.backgroundEffect)

        self.ui.comboBoxAutosaveMode.addItem("Don't Autosave")
        self.ui.comboBoxAutosaveMode.addItem("5 min Autosave")
        self.ui.comboBoxAutosaveMode.addItem("10 min Autosave")
        self.ui.comboBoxAutosaveMode.addItem("15 min Autosave")
        self.ui.comboBoxAutosaveMode.addItem("20 min Autosave")

        self.ui.comboBoxThemeSelect.addItem("Dark Theme")
        self.ui.comboBoxThemeSelect.addItem("Light Theme")
        # self.ui.comboBoxThemeSelect.addItem("Ambient Theme")

    def run(self):
        '''
        Starts the Preferences Window
        '''
        self.loadSettings()
        self.ui.windowInst.show()

    @Slot(bool)
    def handleExit(self, confirmed):
        if confirmed:
            self.storeLooseEntries()
            self.storeSettings()

            print('Settings saved')
        else:
            self.loadSettings()

            print('Settings discarded')

        self.finished.emit()

    def connectReceivers(self):
        '''
        Connects all the buttons to the right receivers
        '''
        self.ui.radioButtonAffectsPDF.clicked.connect(
            self.receiversInst.setRadioButtonAffectsPDF)
        self.ui.comboBoxThemeSelect.currentIndexChanged.connect(
            self.receiversInst.setComboBoxThemeSelect)

        self.ui.radioButtonSmoothLines.clicked.connect(
            self.receiversInst.setradioButtonSmoothLines)

        self.ui.radioButtonSaveOnExit.clicked.connect(
            self.receiversInst.setRadioButtonSaveOnExit)
        self.ui.comboBoxAutosaveMode.currentIndexChanged.connect(
            self.receiversInst.setComboBoxAutosaveMode)

        self.ui.pushButtonOk.clicked.connect(
            lambda: self.receiversInst.confirmReceiver())
        self.ui.pushButtonCancel.clicked.connect(
            lambda: self.receiversInst.rejectReceiver())

        self.receiversInst.confirmSignal.connect(self.onClose)

    def loadKeys(self):
        '''
        Load the preferences keys
        '''

        scriptPath = os.path.dirname(os.path.abspath(__file__)) + '\\'
        # absKeysFilePath = os.path.normpath(scriptPath + KEYSFILEPATH)
        absKeysFilePath = self.appctxt.get_resource('preferences.keys')

        keysFileContent = readFile(absKeysFilePath)

        for key in keysFileContent['lines']:
            self.keys.append(key.replace('\n', ''))

    def storeSettings(self):
        '''
        Store the settings from the gui to the local dict and then to the settings instance
        '''
        for key in self.keys:
            self.settings.setValue(key, str(Preferences.data[key]))

        self.settings.sync()

    def storeLooseEntries(self):
        '''
        Saves all entries, which have been entered without explicit confirmation
        '''
        Preferences.updateKeyValue(
            "radioButtonAffectsPDF",
            str(self.ui.radioButtonAffectsPDF.isChecked()))
        Preferences.updateKeyValue(
            "comboBoxThemeSelect",
            str(self.ui.comboBoxThemeSelect.currentIndex()))

        Preferences.updateKeyValue(
            "radioButtonSmoothLines",
            str(self.ui.radioButtonSmoothLines.isChecked()))
        Preferences.updateKeyValue(
            "radioButtonUsePenAsDefault",
            str(self.ui.radioButtonSmoothLines.isChecked()))

        Preferences.updateKeyValue(
            "radioButtonSaveOnExit",
            int(self.ui.radioButtonSaveOnExit.isChecked()))
        Preferences.updateKeyValue(
            "comboBoxAutosaveMode",
            int(self.ui.comboBoxAutosaveMode.currentIndex()))

        Preferences.updateKeyValue(
            "radioButtonNoInteractionWhileEditing",
            str(self.ui.radioButtonNoInteractionWhileEditing.isChecked()))

    @Slot(bool)
    def onClose(self, store):
        if store:
            self.saveSettings()
        else:
            self.discardSettings()

    def saveSettings(self):
        self.storeLooseEntries()
        self.storeSettings()

    def discardSettings(self):
        self.loadSettings()

    def loadSettings(self):
        '''
        Load the settings from the settings instance to the local dict
        '''
        for key in self.keys:
            Preferences.updateKeyValue(
                key, self.settings.value(key, defaultValue=None, type=str))

        self.ensureValidData()

        self.ui.radioButtonAffectsPDF.setChecked(
            toBool(Preferences.data["radioButtonAffectsPDF"]))
        self.ui.comboBoxThemeSelect.setCurrentIndex(
            int(Preferences.data["comboBoxThemeSelect"]))
        self.receiversInst.setComboBoxThemeSelect(
            int(Preferences.data["comboBoxThemeSelect"]))

        self.ui.radioButtonUsePenAsDefault.setChecked(
            toBool(Preferences.data["radioButtonUsePenAsDefault"]))
        self.ui.radioButtonSmoothLines.setChecked(
            toBool(Preferences.data["radioButtonSmoothLines"]))

        self.ui.radioButtonSaveOnExit.setChecked(
            toBool(Preferences.data["radioButtonSaveOnExit"]))
        self.ui.comboBoxAutosaveMode.setCurrentIndex(
            int(Preferences.data["comboBoxAutosaveMode"]))

        self.ui.radioButtonNoInteractionWhileEditing.setChecked(
            toBool(Preferences.data["radioButtonNoInteractionWhileEditing"]))

    def ensureValidData(self):
        # Apply all default preferences if necessary

        if Preferences.data['radioButtonAffectsPDF'] == "":
            Preferences.updateKeyValue('radioButtonAffectsPDF', str(True))
        if Preferences.data['comboBoxThemeSelect'] == "":
            Preferences.updateKeyValue('comboBoxThemeSelect', 1)

        if Preferences.data['radioButtonSmoothLines'] == "":
            Preferences.updateKeyValue('radioButtonSmoothLines', str(True))
        if Preferences.data['radioButtonUsePenAsDefault'] == "":
            Preferences.updateKeyValue('radioButtonUsePenAsDefault', str(True))
        if Preferences.data['comboBoxDrawingMode'] == "":
            Preferences.updateKeyValue('comboBoxDrawingMode', 0)

        if Preferences.data['radioButtonSaveOnExit'] == "":
            Preferences.updateKeyValue('radioButtonSaveOnExit', str(True))
        if Preferences.data['comboBoxAutosaveMode'] == "":
            Preferences.updateKeyValue('comboBoxAutosaveMode', 0)

        if Preferences.data['radioButtonNoInteractionWhileEditing'] == "":
            Preferences.updateKeyValue('radioButtonNoInteractionWhileEditing',
                                       str(True))

        if Preferences.data['textSize'] == "":
            Preferences.updateKeyValue('textSize', "('0', '0', '0')")
        if Preferences.data['markerSize'] == "":
            Preferences.updateKeyValue('markerSize', "70")
        if Preferences.data['markerColor'] == "":
            Preferences.updateKeyValue('markerColor', "('0', '0', '0')")
        if Preferences.data['freehandSize'] == "":
            Preferences.updateKeyValue('freehandSize', "70")
        if Preferences.data['freehandColor'] == "":
            Preferences.updateKeyValue('freehandColor', "('0', '0', '0')")
        if Preferences.data['formSize'] == "":
            Preferences.updateKeyValue('formSize', "70")
        if Preferences.data['formColor'] == "":
            Preferences.updateKeyValue('formColor', "('0', '0', '0')")