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, QFrame |
14 from PyQt5.QtWidgets import QWidget, QVBoxLayout, QToolButton, QFrame, QMenu |
15 |
15 |
16 import UI.PixmapCache |
16 import UI.PixmapCache |
17 |
17 |
18 from . import MarkupProviders |
18 from . import MarkupProviders |
19 |
19 |
58 """ |
58 """ |
59 Private slot to create the various tool buttons. |
59 Private slot to create the various tool buttons. |
60 """ |
60 """ |
61 self.__buttons = {} |
61 self.__buttons = {} |
62 self.__separators = [] |
62 self.__separators = [] |
|
63 self.__headerMenu = QMenu() |
63 |
64 |
64 self.__addButton("bold", "formatTextBold.png") |
65 self.__addButton("bold", "formatTextBold.png") |
65 self.__addButton("italic", "formatTextItalic.png") |
66 self.__addButton("italic", "formatTextItalic.png") |
66 self.__addButton("strikethrough", "formatTextStrikethrough.png") |
67 self.__addButton("strikethrough", "formatTextStrikethrough.png") |
67 self.__addSeparator() |
68 self.__addSeparator() |
68 self.__addButton("header1", "formatTextHeader1.png") |
69 self.__addButton("header1", "formatTextHeader1.png") |
69 self.__addButton("header2", "formatTextHeader2.png") |
70 self.__addButton("header2", "formatTextHeader2.png") |
70 self.__addButton("header3", "formatTextHeader3.png") |
71 self.__addButton("header3", "formatTextHeader3.png") |
71 button = self.__addButton("header", "formatTextHeader.png") |
72 button = self.__addButton("header", "formatTextHeader.png") |
72 button.setPopupMode(QToolButton.InstantPopup) |
73 button.setPopupMode(QToolButton.InstantPopup) |
|
74 button.setMenu(self.__headerMenu) |
|
75 self.__addSeparator() |
|
76 self.__addButton("code", "formatTextInlineCode.png") |
|
77 |
|
78 self.__headerMenu.triggered.connect(self.__headerMenuTriggered) |
73 |
79 |
74 def __addButton(self, format, iconName): |
80 def __addButton(self, format, iconName): |
75 """ |
81 """ |
76 Private method to add a format button. |
82 Private method to add a format button. |
77 |
83 |
117 |
123 |
118 self.__buttons["bold"].setEnabled(self.__provider.hasBold()) |
124 self.__buttons["bold"].setEnabled(self.__provider.hasBold()) |
119 self.__buttons["italic"].setEnabled(self.__provider.hasItalic()) |
125 self.__buttons["italic"].setEnabled(self.__provider.hasItalic()) |
120 self.__buttons["strikethrough"].setEnabled( |
126 self.__buttons["strikethrough"].setEnabled( |
121 self.__provider.hasStrikethrough()) |
127 self.__provider.hasStrikethrough()) |
|
128 |
122 headerLevels = self.__provider.headerLevels() |
129 headerLevels = self.__provider.headerLevels() |
123 self.__buttons["header1"].setEnabled(headerLevels >= 1) |
130 self.__buttons["header1"].setEnabled(headerLevels >= 1) |
124 self.__buttons["header2"].setEnabled(headerLevels >= 2) |
131 self.__buttons["header2"].setEnabled(headerLevels >= 2) |
125 self.__buttons["header3"].setEnabled(headerLevels >= 3) |
132 self.__buttons["header3"].setEnabled(headerLevels >= 3) |
126 self.__buttons["header"].setEnabled(headerLevels > 3) |
133 self.__buttons["header"].setEnabled(headerLevels > 3) |
127 # TODO: create header button menu |
134 self.__headerMenu.clear() |
|
135 for level in range(1, headerLevels + 1): |
|
136 act = self.__headerMenu.addAction( |
|
137 self.tr("Level {0}").format(level)) |
|
138 act.setData("header{0}".format(level)) |
|
139 |
|
140 self.__buttons["code"].setEnabled(self.__provider.hasCode()) |
|
141 |
|
142 # TODO: make this configurable |
|
143 self.setVisible(self.__provider.kind() != "none") |
128 |
144 |
129 def __formatClicked(self, format): |
145 def __formatClicked(self, format): |
130 """ |
146 """ |
131 Private slot to handle a format button being clicked. |
147 Private slot to handle a format button being clicked. |
132 |
148 |
142 elif format.startswith("header"): |
158 elif format.startswith("header"): |
143 try: |
159 try: |
144 level = int(format[-1]) |
160 level = int(format[-1]) |
145 self.__provider.header(self.__editor, level) |
161 self.__provider.header(self.__editor, level) |
146 except ValueError: |
162 except ValueError: |
147 # TODO: implement this |
|
148 pass |
163 pass |
|
164 elif format == "code": |
|
165 self.__provider.code(self.__editor) |
|
166 |
|
167 def __headerMenuTriggered(self, act): |
|
168 """ |
|
169 Private method handling the selection of a header menu entry. |
|
170 |
|
171 @param act action of the headers menu that was triggered |
|
172 @type QAction |
|
173 """ |
|
174 format = act.data() |
|
175 self.__formatClicked(format) |