--- a/QScintilla/EditorButtonsWidget.py Mon Jan 02 12:49:28 2017 +0100 +++ b/QScintilla/EditorButtonsWidget.py Mon Jan 02 20:13:40 2017 +0100 @@ -11,7 +11,7 @@ from __future__ import unicode_literals from PyQt5.QtCore import pyqtSlot -from PyQt5.QtWidgets import QWidget, QVBoxLayout, QToolButton +from PyQt5.QtWidgets import QWidget, QVBoxLayout, QToolButton, QFrame import UI.PixmapCache @@ -34,9 +34,10 @@ """ super(EditorButtonsWidget, self).__init__(parent) + margin = 2 self.__layout = QVBoxLayout(self) - self.__layout.setContentsMargins(1, 1, 1, 1) - self.__layout.setSpacing(1) + self.__layout.setContentsMargins(margin, margin, margin, margin) + self.__layout.setSpacing(2) self.__provider = None @@ -48,7 +49,8 @@ self.__createButtons() self.__layout.addStretch() - self.setMaximumWidth(self.__buttons["bold"].sizeHint().width() + 2) + self.setMaximumWidth( + self.__buttons["bold"].sizeHint().width() + 2 * margin) self.__updateButtonStates() @@ -57,36 +59,72 @@ Private slot to create the various tool buttons. """ self.__buttons = {} + self.__separators = [] - button = QToolButton(self) - button.setIcon(UI.PixmapCache.getIcon("formatTextBold.png")) - button.clicked.connect(lambda: self.__formatClicked("bold")) - self.__layout.addWidget(button) - self.__buttons["bold"] = button + self.__addButton("bold", "formatTextBold.png") + self.__addButton("italic", "formatTextItalic.png") + self.__addButton("strikethrough", "formatTextStrikethrough.png") + self.__addSeparator() + self.__addButton("header1", "formatTextHeader1.png") + self.__addButton("header2", "formatTextHeader2.png") + self.__addButton("header3", "formatTextHeader3.png") + button = self.__addButton("header", "formatTextHeader.png") + button.setPopupMode(QToolButton.InstantPopup) + + def __addButton(self, format, iconName): + """ + Private method to add a format button. + @param format unique name of the format + @type str + @param iconName name of the icon for the button + @type str + @return generated button + @rtype QToolButton + """ button = QToolButton(self) - button.setIcon(UI.PixmapCache.getIcon("formatTextItalic.png")) - button.clicked.connect(lambda: self.__formatClicked("italic")) + button.setIcon(UI.PixmapCache.getIcon(iconName)) + button.clicked.connect(lambda: self.__formatClicked(format)) self.__layout.addWidget(button) - self.__buttons["italic"] = button + self.__buttons[format] = button - button = QToolButton(self) - button.setIcon(UI.PixmapCache.getIcon("formatTextStrikethrough.png")) - button.clicked.connect(lambda: self.__formatClicked("strikethrough")) - self.__layout.addWidget(button) - self.__buttons["strikethrough"] = button + return button + + def __addSeparator(self): + """ + Private method to add a separator line. + """ + line = QFrame(self) + line.setLineWidth(2) + if isinstance(self.__layout, QVBoxLayout): + line.setFrameShape(QFrame.HLine) + else: + line.setFrameShape(QFrame.VLine) + line.setFrameShadow(QFrame.Sunken) + + self.__layout.addWidget(line) + self.__separators.append(line) @pyqtSlot() def __updateButtonStates(self): """ - Private slot to change tzhe button states. + Private slot to change the button states. """ - self.__provider = MarkupProviders.getMarkupProvider(self.__editor) - - self.__buttons["bold"].setEnabled(self.__provider.hasBold()) - self.__buttons["italic"].setEnabled(self.__provider.hasItalic()) - self.__buttons["strikethrough"].setEnabled( - self.__provider.hasStrikethrough()) + provider = MarkupProviders.getMarkupProvider(self.__editor) + if self.__provider is None or \ + provider.kind() != self.__provider.kind(): + self.__provider = provider + + self.__buttons["bold"].setEnabled(self.__provider.hasBold()) + self.__buttons["italic"].setEnabled(self.__provider.hasItalic()) + self.__buttons["strikethrough"].setEnabled( + self.__provider.hasStrikethrough()) + headerLevels = self.__provider.headerLevels() + self.__buttons["header1"].setEnabled(headerLevels >= 1) + self.__buttons["header2"].setEnabled(headerLevels >= 2) + self.__buttons["header3"].setEnabled(headerLevels >= 3) + self.__buttons["header"].setEnabled(headerLevels > 3) + # TODO: create header button menu def __formatClicked(self, format): """ @@ -101,3 +139,10 @@ self.__provider.italic(self.__editor) elif format == "strikethrough": self.__provider.strikethrough(self.__editor) + elif format.startswith("header"): + try: + level = int(format[-1]) + self.__provider.header(self.__editor, level) + except ValueError: + # TODO: implement this + pass