Exemplo n.º 1
0
class AugerToolbar(QWidget):
    sig_font_changed = pyqtSignal(str)
    sig_size_changed = pyqtSignal(int)
    sig_ao_toggle = pyqtSignal(bool)

    def __init__(self, parent, flags=Qt.WindowFlags(Qt.Widget)):
        super().__init__(parent, flags)

        font_size_tooltip = 'Font Size (in pt.)'
        ao_tooltip = 'Append / Overwrite (Default: Overwrite)'

        # Font Selector
        self._fontbox = QFontComboBox(self)
        self._fontbox.currentFontChanged.connect(self.slot_font_changed)

        # Font Size Label Hint
        self._label_size = QLabel(self)
        self._label_size_pixmap = QPixmap()
        self._label_size_pixmap.load(
            Resources().resource(Resource.ResourceToolIcon,
                                 which=ToolIcon.ToolIconFontSize), None)
        self._label_size.setFixedSize(25, 25)
        self._label_size.setPixmap(self._label_size_pixmap)
        self._label_size.setToolTip(font_size_tooltip)

        # Font Size Input
        self._fontsize = QLineEdit('8', self)
        self._fontsize.setMaxLength(3)
        self._fontsize.setInputMask('00D')
        self._fontsize.setFixedSize(36, self._fontbox.height())
        self._fontsize.setToolTip(font_size_tooltip)
        self._fontsize.textChanged.connect(self.slot_size_changed)

        # The Append / Overwrite Toggler
        self._appendtoggler = AugerAppendToggler(self)
        self._appendtoggler.setFixedSize(25, 25)
        self._appendtoggler.setToolTip(ao_tooltip)
        self._appendtoggler.clicked.connect(self.slot_append_toggle)

        # The Undo Button
        self._undobutton = QPushButton(self)
        self._undobutton.setFixedSize(25, 25)
        self._undobutton.setToolTip('Undo')
        self._undobutton.setAccessibleName('toolbutton')
        self._undobutton.setIcon(
            QIcon(Resources().resource(Resource.ResourceToolIcon,
                                       which=ToolIcon.ToolIconUndo)))
        self._undobutton.setFlat(True)
        self._undobutton.setEnabled(False)
        self._undobutton.clicked.connect(self.slot_undo_clicked)

        # The Redo Button
        self._redobutton = QPushButton(self)
        self._redobutton.setFixedSize(25, 25)
        self._redobutton.setToolTip('Redo')
        self._redobutton.setAccessibleName('toolbutton')
        self._redobutton.setIcon(
            QIcon(Resources().resource(Resource.ResourceToolIcon,
                                       which=ToolIcon.ToolIconRedo)))
        self._redobutton.setFlat(True)
        self._redobutton.setEnabled(False)
        self._redobutton.clicked.connect(self.slot_redo_clicked)

        # The Layout holding all toolbar contents
        self._layout = QHBoxLayout(self)
        self._layout.addWidget(self._fontbox)
        self._layout.addWidget(self._label_size)
        self._layout.addWidget(self._fontsize)
        self._layout.addWidget(self._appendtoggler)
        self._layout.addWidget(self._undobutton)
        self._layout.addWidget(self._redobutton)

        self.setLayout(self._layout)

        # connect slots to the command manager for undo / redo
        get_app_instance().cmd_mgr.sig_undo_stack_changed.connect(
            self.slot_undo_available)
        get_app_instance().cmd_mgr.sig_redo_stack_changed.connect(
            self.slot_redo_available)

    # Override method
    def paintEvent(self, paint_event):  # pylint: disable=invalid-name
        def border_coords():
            coords = paint_event.rect()
            return coords.x(), coords.y(), coords.width(), coords.height()

        #
        # # # # # # # # # # #
        # make coordinates for border
        draw_rect = tuple(
            map(lambda x, y: x + y, border_coords(), (1, 1, -2, -2)))

        # Prevent the painting of a border around children within the widget
        if not self.childrenRect().contains(paint_event.rect()):
            painter = QPainter(self)
            painter.setPen(QPen(QColor(130, 135, 144, 255)))
            painter.drawRect(*draw_rect)

        return super().paintEvent(paint_event)

    def set_font_properties(self, family, size):
        self._fontbox.setCurrentFont(QFont(family))
        self._fontsize.setText(str(size))

    ########### SLOTS ############## SLOTS ############# SLOTS ##############

    def slot_font_changed(self, font):
        self.sig_font_changed.emit(font.family())

    def slot_size_changed(self, str_size):
        try:
            font_size = int(str_size)
        except ValueError:
            font_size = 0

        if font_size > 0:
            self.sig_size_changed.emit(font_size)

    def slot_append_toggle(self, state):
        self.sig_ao_toggle.emit(state)

    def slot_undo_available(self, num_undos):
        if num_undos > 0:
            self._undobutton.setEnabled(True)
        else:
            self._undobutton.setEnabled(False)

    def slot_redo_available(self, num_redos):
        if num_redos > 0:
            self._redobutton.setEnabled(True)
        else:
            self._redobutton.setEnabled(False)

    def slot_undo_clicked(self):  # pylint: disable=no-self-use
        get_app_instance().cmd_mgr.undo_last_command()

    def slot_redo_clicked(self):  # pylint: disable=no-self-use
        get_app_instance().cmd_mgr.redo_last_command()