QScintilla/EditorButtonsWidget.py

changeset 5398
1f4509cf8f35
parent 5394
b2c6179184f6
child 5402
ce21a78a5fcf
equal deleted inserted replaced
5397:fee5485e67f4 5398:1f4509cf8f35
9 """ 9 """
10 10
11 from __future__ import unicode_literals 11 from __future__ import unicode_literals
12 12
13 from PyQt5.QtCore import pyqtSlot 13 from PyQt5.QtCore import pyqtSlot
14 from PyQt5.QtWidgets import QWidget, QVBoxLayout, QToolButton 14 from PyQt5.QtWidgets import QWidget, QVBoxLayout, QToolButton, QFrame
15 15
16 import UI.PixmapCache 16 import UI.PixmapCache
17 17
18 from . import MarkupProviders 18 from . import MarkupProviders
19 19
32 @param parent reference to the parent widget 32 @param parent reference to the parent widget
33 @type QWidget 33 @type QWidget
34 """ 34 """
35 super(EditorButtonsWidget, self).__init__(parent) 35 super(EditorButtonsWidget, self).__init__(parent)
36 36
37 margin = 2
37 self.__layout = QVBoxLayout(self) 38 self.__layout = QVBoxLayout(self)
38 self.__layout.setContentsMargins(1, 1, 1, 1) 39 self.__layout.setContentsMargins(margin, margin, margin, margin)
39 self.__layout.setSpacing(1) 40 self.__layout.setSpacing(2)
40 41
41 self.__provider = None 42 self.__provider = None
42 43
43 self.__editor = editor 44 self.__editor = editor
44 self.__editor.languageChanged.connect(self.__updateButtonStates) 45 self.__editor.languageChanged.connect(self.__updateButtonStates)
46 self.__editor.editorRenamed.connect(self.__updateButtonStates) 47 self.__editor.editorRenamed.connect(self.__updateButtonStates)
47 48
48 self.__createButtons() 49 self.__createButtons()
49 50
50 self.__layout.addStretch() 51 self.__layout.addStretch()
51 self.setMaximumWidth(self.__buttons["bold"].sizeHint().width() + 2) 52 self.setMaximumWidth(
53 self.__buttons["bold"].sizeHint().width() + 2 * margin)
52 54
53 self.__updateButtonStates() 55 self.__updateButtonStates()
54 56
55 def __createButtons(self): 57 def __createButtons(self):
56 """ 58 """
57 Private slot to create the various tool buttons. 59 Private slot to create the various tool buttons.
58 """ 60 """
59 self.__buttons = {} 61 self.__buttons = {}
62 self.__separators = []
60 63
64 self.__addButton("bold", "formatTextBold.png")
65 self.__addButton("italic", "formatTextItalic.png")
66 self.__addButton("strikethrough", "formatTextStrikethrough.png")
67 self.__addSeparator()
68 self.__addButton("header1", "formatTextHeader1.png")
69 self.__addButton("header2", "formatTextHeader2.png")
70 self.__addButton("header3", "formatTextHeader3.png")
71 button = self.__addButton("header", "formatTextHeader.png")
72 button.setPopupMode(QToolButton.InstantPopup)
73
74 def __addButton(self, format, iconName):
75 """
76 Private method to add a format button.
77
78 @param format unique name of the format
79 @type str
80 @param iconName name of the icon for the button
81 @type str
82 @return generated button
83 @rtype QToolButton
84 """
61 button = QToolButton(self) 85 button = QToolButton(self)
62 button.setIcon(UI.PixmapCache.getIcon("formatTextBold.png")) 86 button.setIcon(UI.PixmapCache.getIcon(iconName))
63 button.clicked.connect(lambda: self.__formatClicked("bold")) 87 button.clicked.connect(lambda: self.__formatClicked(format))
64 self.__layout.addWidget(button) 88 self.__layout.addWidget(button)
65 self.__buttons["bold"] = button 89 self.__buttons[format] = button
66 90
67 button = QToolButton(self) 91 return button
68 button.setIcon(UI.PixmapCache.getIcon("formatTextItalic.png")) 92
69 button.clicked.connect(lambda: self.__formatClicked("italic")) 93 def __addSeparator(self):
70 self.__layout.addWidget(button) 94 """
71 self.__buttons["italic"] = button 95 Private method to add a separator line.
96 """
97 line = QFrame(self)
98 line.setLineWidth(2)
99 if isinstance(self.__layout, QVBoxLayout):
100 line.setFrameShape(QFrame.HLine)
101 else:
102 line.setFrameShape(QFrame.VLine)
103 line.setFrameShadow(QFrame.Sunken)
72 104
73 button = QToolButton(self) 105 self.__layout.addWidget(line)
74 button.setIcon(UI.PixmapCache.getIcon("formatTextStrikethrough.png")) 106 self.__separators.append(line)
75 button.clicked.connect(lambda: self.__formatClicked("strikethrough"))
76 self.__layout.addWidget(button)
77 self.__buttons["strikethrough"] = button
78 107
79 @pyqtSlot() 108 @pyqtSlot()
80 def __updateButtonStates(self): 109 def __updateButtonStates(self):
81 """ 110 """
82 Private slot to change tzhe button states. 111 Private slot to change the button states.
83 """ 112 """
84 self.__provider = MarkupProviders.getMarkupProvider(self.__editor) 113 provider = MarkupProviders.getMarkupProvider(self.__editor)
85 114 if self.__provider is None or \
86 self.__buttons["bold"].setEnabled(self.__provider.hasBold()) 115 provider.kind() != self.__provider.kind():
87 self.__buttons["italic"].setEnabled(self.__provider.hasItalic()) 116 self.__provider = provider
88 self.__buttons["strikethrough"].setEnabled( 117
89 self.__provider.hasStrikethrough()) 118 self.__buttons["bold"].setEnabled(self.__provider.hasBold())
119 self.__buttons["italic"].setEnabled(self.__provider.hasItalic())
120 self.__buttons["strikethrough"].setEnabled(
121 self.__provider.hasStrikethrough())
122 headerLevels = self.__provider.headerLevels()
123 self.__buttons["header1"].setEnabled(headerLevels >= 1)
124 self.__buttons["header2"].setEnabled(headerLevels >= 2)
125 self.__buttons["header3"].setEnabled(headerLevels >= 3)
126 self.__buttons["header"].setEnabled(headerLevels > 3)
127 # TODO: create header button menu
90 128
91 def __formatClicked(self, format): 129 def __formatClicked(self, format):
92 """ 130 """
93 Private slot to handle a format button being clicked. 131 Private slot to handle a format button being clicked.
94 132
99 self.__provider.bold(self.__editor) 137 self.__provider.bold(self.__editor)
100 elif format == "italic": 138 elif format == "italic":
101 self.__provider.italic(self.__editor) 139 self.__provider.italic(self.__editor)
102 elif format == "strikethrough": 140 elif format == "strikethrough":
103 self.__provider.strikethrough(self.__editor) 141 self.__provider.strikethrough(self.__editor)
142 elif format.startswith("header"):
143 try:
144 level = int(format[-1])
145 self.__provider.header(self.__editor, level)
146 except ValueError:
147 # TODO: implement this
148 pass

eric ide

mercurial