class GTextToolbar(QToolBar): """A toolbar for the Editor UI instanciated in a window. """ def __init__(self, parent): super().__init__(parent) self.editor: GTextEditor = None self.setIconSize(QSize(16, 16)) self._fonts = QFontComboBox(self) self.addWidget(self._fonts) self._ttype = QComboBox(self) self._ttype.addItems([item.comment for item in Format]) self.addWidget(self._ttype) self._mtype = QComboBox(self) self._mtype.addItems(["LaTex", "MathML", "Ignore"]) self.addWidget(self._mtype) self._fsize = QComboBox(self) self._fsize.addItems(["7", "8", "9", "10", "11", "12", "13", "14", "18", "24", "36", "48", "64"]) self.addWidget(self._fsize) self.addSeparator() self._bold = QAction(QIcon(f"{IMG_PATH}/bold.png"), "Bold", self) self._bold.setShortcut(QKeySequence.Bold) self._bold.setCheckable(True) self.addAction(self._bold) self._italic = QAction(QIcon(f"{IMG_PATH}/italic.png"), "Italic", self) self._italic.setShortcut(QKeySequence.Italic) self._italic.setCheckable(True) self.addAction(self._italic) self._underline = QAction(QIcon(f"{IMG_PATH}/underline.png"), "Underline", self) self._underline.setShortcut(QKeySequence.Underline) self._underline.setCheckable(True) self.addAction(self._underline) self.addSeparator() self._alignl = QAction(QIcon(f"{IMG_PATH}/alignment.png"), "Align left", self) self._alignl.setCheckable(True) self.addAction(self._alignl) self._alignc = QAction(QIcon(f"{IMG_PATH}/align_center.png"), "Align center", self) self._alignc.setCheckable(True) self.addAction(self._alignc) self._alignr = QAction(QIcon(f"{IMG_PATH}/align_right.png"), "Align right", self) self._alignr.setCheckable(True) self.addAction(self._alignr) self._alignj = QAction(QIcon(f"{IMG_PATH}/align_justify.png"), "Justify", self) self._alignj.setCheckable(True) self.addAction(self._alignj) format_group = QActionGroup(self) format_group.setExclusive(True) format_group.addAction(self._alignl) format_group.addAction(self._alignc) format_group.addAction(self._alignr) format_group.addAction(self._alignj) self._wrap = QAction(QIcon(f"{IMG_PATH}/wrap.png"), "Wrap text to window", self) self._wrap.setStatusTip("Toggle wrap text to window") self._wrap.setCheckable(True) self._wrap.setChecked(True) self.addAction(self._wrap) self.addSeparator() self._html = QAction(QIcon(f"{IMG_PATH}/html.png"), "Selected text as HTML", self) self._html.setCheckable(False) self._html.triggered.connect(self.__to_html) self.addAction(self._html) # Format-related widgets/actions, used to disable/enable signals. self._format_actions = [self._fonts, self._fsize, self._bold, self._underline, self._italic] # No need to disable signals for alignment, as they are paragraph-wide. self.setFocusPolicy(Qt.ClickFocus) self.setDisabled(True) def __align_left(self): self.editor.setAlignment(Qt.AlignLeft) def __align_center(self): self.editor.setAlignment(Qt.AlignCenter) def __align_right(self): self.editor.setAlignment(Qt.AlignRight) def __align_justf(self): self.editor.setAlignment(Qt.AlignJustify) def __wrap_text(self): self.editor.setLineWrapMode(int(self.editor.lineWrapMode() == 0)) def __to_html(self): text = self.editor.textCursor().selectedText() self.editor.textCursor().insertHtml(text) def hasFocus(self) -> bool: # pylint: disable=C0103 """_summary_ Returns: bool: _description_ """ return super().hasFocus() or self._fonts.hasFocus() or \ self._fsize.hasFocus() or self._mtype.hasFocus() or \ self._ttype.hasFocus() def update_editor(self, text_editor: GTextEditor) -> None: """Update the font format toolbar/actions when a new text selection is made. This is neccessary to keep toolbars/etc. in sync with the current edit state. """ self.setDisabled(text_editor is None) if text_editor == self.editor: return if self.editor is not None: self._ttype.currentIndexChanged.disconnect() self._fonts.currentFontChanged.disconnect() self._fsize.currentIndexChanged[str].disconnect() self._bold.toggled.disconnect() self._underline.toggled.disconnect() self._italic.toggled.disconnect() self._alignl.triggered.disconnect() self._alignc.triggered.disconnect() self._alignr.triggered.disconnect() self._alignj.triggered.disconnect() self._wrap.triggered.disconnect() self.editor = text_editor if self.editor is not None: for _obj in self._format_actions: _obj.blockSignals(True) self._fonts.setCurrentFont(self.editor.currentFont()) self._fsize.setCurrentText(str(int(self.editor.fontPointSize()))) self._italic.setChecked(self.editor.fontItalic()) self._underline.setChecked(self.editor.fontUnderline()) self._bold.setChecked(self.editor.fontWeight() == QFont.Bold) self._alignl.setChecked(self.editor.alignment() == Qt.AlignLeft) self._alignc.setChecked(self.editor.alignment() == Qt.AlignCenter) self._alignr.setChecked(self.editor.alignment() == Qt.AlignRight) self._alignj.setChecked(self.editor.alignment() == Qt.AlignJustify) self._ttype.setCurrentText(self.editor.get_formatting()) #self._mtype for _obj in self._format_actions: _obj.blockSignals(False) self._ttype.currentIndexChanged.connect(self.editor.update_fmt) self._fonts.currentFontChanged.connect(self.editor.setCurrentFont) self._underline.toggled.connect(self.editor.setFontUnderline) self._italic.toggled.connect(self.editor.setFontItalic) self._fsize.currentIndexChanged[str].connect( lambda s: self.editor.setFontPointSize(float(s))) self._bold.toggled.connect(lambda x: self.editor.setFontWeight( QFont.Bold if x else QFont.Normal)) self._alignl.triggered.connect(self.__align_left) self._alignc.triggered.connect(self.__align_center) self._alignr.triggered.connect(self.__align_right) self._alignj.triggered.connect(self.__align_justf) self._wrap.triggered.connect(self.__wrap_text)