21 |
21 |
22 |
22 |
23 class FeedsManager(QDialog, Ui_FeedsManager): |
23 class FeedsManager(QDialog, Ui_FeedsManager): |
24 """ |
24 """ |
25 Class implementing a RSS feeds manager dialog. |
25 Class implementing a RSS feeds manager dialog. |
26 |
26 |
27 @signal openUrl(QUrl, str) emitted to open a URL in the current tab |
27 @signal openUrl(QUrl, str) emitted to open a URL in the current tab |
28 @signal newTab(QUrl, str) emitted to open a URL in a new tab |
28 @signal newTab(QUrl, str) emitted to open a URL in a new tab |
29 @signal newBackgroundTab(QUrl, str) emitted to open a URL in a new |
29 @signal newBackgroundTab(QUrl, str) emitted to open a URL in a new |
30 background tab |
30 background tab |
31 @signal newWindow(QUrl, str) emitted to open a URL in a new window |
31 @signal newWindow(QUrl, str) emitted to open a URL in a new window |
32 @signal newPrivateWindow(QUrl, str) emitted to open a URL in a new |
32 @signal newPrivateWindow(QUrl, str) emitted to open a URL in a new |
33 private window |
33 private window |
34 """ |
34 """ |
|
35 |
35 openUrl = pyqtSignal(QUrl, str) |
36 openUrl = pyqtSignal(QUrl, str) |
36 newTab = pyqtSignal(QUrl, str) |
37 newTab = pyqtSignal(QUrl, str) |
37 newBackgroundTab = pyqtSignal(QUrl, str) |
38 newBackgroundTab = pyqtSignal(QUrl, str) |
38 newWindow = pyqtSignal(QUrl, str) |
39 newWindow = pyqtSignal(QUrl, str) |
39 newPrivateWindow = pyqtSignal(QUrl, str) |
40 newPrivateWindow = pyqtSignal(QUrl, str) |
40 |
41 |
41 UrlStringRole = Qt.ItemDataRole.UserRole |
42 UrlStringRole = Qt.ItemDataRole.UserRole |
42 ErrorDataRole = Qt.ItemDataRole.UserRole + 1 |
43 ErrorDataRole = Qt.ItemDataRole.UserRole + 1 |
43 |
44 |
44 def __init__(self, parent=None): |
45 def __init__(self, parent=None): |
45 """ |
46 """ |
46 Constructor |
47 Constructor |
47 |
48 |
48 @param parent reference to the parent widget (QWidget) |
49 @param parent reference to the parent widget (QWidget) |
49 """ |
50 """ |
50 super().__init__(parent) |
51 super().__init__(parent) |
51 self.setupUi(self) |
52 self.setupUi(self) |
52 self.setWindowFlags(Qt.WindowType.Window) |
53 self.setWindowFlags(Qt.WindowType.Window) |
53 |
54 |
54 self.__wasShown = False |
55 self.__wasShown = False |
55 self.__loaded = False |
56 self.__loaded = False |
56 self.__feeds = [] |
57 self.__feeds = [] |
57 self.__replies = {} |
58 self.__replies = {} |
58 # dict key is the id of the request object |
59 # dict key is the id of the request object |
59 # dict value is a tuple of request and tree item |
60 # dict value is a tuple of request and tree item |
60 |
61 |
61 self.feedsTree.setContextMenuPolicy( |
62 self.feedsTree.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu) |
62 Qt.ContextMenuPolicy.CustomContextMenu) |
|
63 self.feedsTree.customContextMenuRequested.connect( |
63 self.feedsTree.customContextMenuRequested.connect( |
64 self.__customContextMenuRequested) |
64 self.__customContextMenuRequested |
|
65 ) |
65 self.feedsTree.itemActivated.connect(self.__itemActivated) |
66 self.feedsTree.itemActivated.connect(self.__itemActivated) |
66 |
67 |
67 def show(self): |
68 def show(self): |
68 """ |
69 """ |
69 Public slot to show the feeds manager dialog. |
70 Public slot to show the feeds manager dialog. |
70 """ |
71 """ |
71 super().show() |
72 super().show() |
72 |
73 |
73 if not self.__wasShown: |
74 if not self.__wasShown: |
74 self.__enableButtons() |
75 self.__enableButtons() |
75 self.on_reloadAllButton_clicked() |
76 self.on_reloadAllButton_clicked() |
76 self.__wasShown = True |
77 self.__wasShown = True |
77 |
78 |
78 def addFeed(self, urlString, title, icon): |
79 def addFeed(self, urlString, title, icon): |
79 """ |
80 """ |
80 Public method to add a feed. |
81 Public method to add a feed. |
81 |
82 |
82 @param urlString URL of the feed (string) |
83 @param urlString URL of the feed (string) |
83 @param title title of the feed (string) |
84 @param title title of the feed (string) |
84 @param icon icon for the feed (QIcon) |
85 @param icon icon for the feed (QIcon) |
85 @return flag indicating a successful addition of the feed (boolean) |
86 @return flag indicating a successful addition of the feed (boolean) |
86 """ |
87 """ |
87 if urlString == "": |
88 if urlString == "": |
88 return False |
89 return False |
89 |
90 |
90 if not self.__loaded: |
91 if not self.__loaded: |
91 self.__load() |
92 self.__load() |
92 |
93 |
93 # step 1: check, if feed was already added |
94 # step 1: check, if feed was already added |
94 if any(feed[0] == urlString for feed in self.__feeds): |
95 if any(feed[0] == urlString for feed in self.__feeds): |
95 return False |
96 return False |
96 |
97 |
97 # step 2: add the feed |
98 # step 2: add the feed |
98 if icon.isNull(): |
99 if icon.isNull(): |
99 icon = UI.PixmapCache.getIcon("rss16") |
100 icon = UI.PixmapCache.getIcon("rss16") |
100 feed = (urlString, title, icon) |
101 feed = (urlString, title, icon) |
101 self.__feeds.append(feed) |
102 self.__feeds.append(feed) |
102 self.__addFeedItem(feed) |
103 self.__addFeedItem(feed) |
103 self.__save() |
104 self.__save() |
104 |
105 |
105 return True |
106 return True |
106 |
107 |
107 def __addFeedItem(self, feed): |
108 def __addFeedItem(self, feed): |
108 """ |
109 """ |
109 Private slot to add a top level feed item. |
110 Private slot to add a top level feed item. |
110 |
111 |
111 @param feed tuple containing feed info (URL, title, icon) |
112 @param feed tuple containing feed info (URL, title, icon) |
112 (string, string, QIcon) |
113 (string, string, QIcon) |
113 """ |
114 """ |
114 itm = QTreeWidgetItem(self.feedsTree, [feed[1]]) |
115 itm = QTreeWidgetItem(self.feedsTree, [feed[1]]) |
115 itm.setIcon(0, feed[2]) |
116 itm.setIcon(0, feed[2]) |
116 itm.setData(0, FeedsManager.UrlStringRole, feed[0]) |
117 itm.setData(0, FeedsManager.UrlStringRole, feed[0]) |
117 |
118 |
118 def __load(self): |
119 def __load(self): |
119 """ |
120 """ |
120 Private method to load the feeds data. |
121 Private method to load the feeds data. |
121 """ |
122 """ |
122 self.__feeds = Preferences.getWebBrowser("RssFeeds") |
123 self.__feeds = Preferences.getWebBrowser("RssFeeds") |
123 self.__loaded = True |
124 self.__loaded = True |
124 |
125 |
125 # populate the feeds tree top level with the feeds |
126 # populate the feeds tree top level with the feeds |
126 self.feedsTree.clear() |
127 self.feedsTree.clear() |
127 for feed in self.__feeds: |
128 for feed in self.__feeds: |
128 self.__addFeedItem(feed) |
129 self.__addFeedItem(feed) |
129 |
130 |
130 def __save(self): |
131 def __save(self): |
131 """ |
132 """ |
132 Private method to store the feeds data. |
133 Private method to store the feeds data. |
133 """ |
134 """ |
134 if not self.__loaded: |
135 if not self.__loaded: |
135 self.__load() |
136 self.__load() |
136 |
137 |
137 Preferences.setWebBrowser("RssFeeds", self.__feeds) |
138 Preferences.setWebBrowser("RssFeeds", self.__feeds) |
138 |
139 |
139 @pyqtSlot() |
140 @pyqtSlot() |
140 def on_reloadAllButton_clicked(self): |
141 def on_reloadAllButton_clicked(self): |
141 """ |
142 """ |
142 Private slot to reload all feeds. |
143 Private slot to reload all feeds. |
143 """ |
144 """ |
144 if not self.__loaded: |
145 if not self.__loaded: |
145 self.__load() |
146 self.__load() |
146 |
147 |
147 for index in range(self.feedsTree.topLevelItemCount()): |
148 for index in range(self.feedsTree.topLevelItemCount()): |
148 itm = self.feedsTree.topLevelItem(index) |
149 itm = self.feedsTree.topLevelItem(index) |
149 self.__reloadFeed(itm) |
150 self.__reloadFeed(itm) |
150 |
151 |
151 @pyqtSlot() |
152 @pyqtSlot() |
152 def on_reloadButton_clicked(self): |
153 def on_reloadButton_clicked(self): |
153 """ |
154 """ |
154 Private slot to reload the selected feed. |
155 Private slot to reload the selected feed. |
155 """ |
156 """ |
156 itm = self.feedsTree.selectedItems()[0] |
157 itm = self.feedsTree.selectedItems()[0] |
157 self.__reloadFeed(itm) |
158 self.__reloadFeed(itm) |
158 |
159 |
159 @pyqtSlot() |
160 @pyqtSlot() |
160 def on_editButton_clicked(self): |
161 def on_editButton_clicked(self): |
161 """ |
162 """ |
162 Private slot to edit the selected feed. |
163 Private slot to edit the selected feed. |
163 """ |
164 """ |
164 itm = self.feedsTree.selectedItems()[0] |
165 itm = self.feedsTree.selectedItems()[0] |
165 origTitle = itm.text(0) |
166 origTitle = itm.text(0) |
166 origUrlString = itm.data(0, FeedsManager.UrlStringRole) |
167 origUrlString = itm.data(0, FeedsManager.UrlStringRole) |
167 |
168 |
168 feedToChange = None |
169 feedToChange = None |
169 for feed in self.__feeds: |
170 for feed in self.__feeds: |
170 if feed[0] == origUrlString: |
171 if feed[0] == origUrlString: |
171 feedToChange = feed |
172 feedToChange = feed |
172 break |
173 break |
173 if feedToChange: |
174 if feedToChange: |
174 feedIndex = self.__feeds.index(feedToChange) |
175 feedIndex = self.__feeds.index(feedToChange) |
175 |
176 |
176 from .FeedEditDialog import FeedEditDialog |
177 from .FeedEditDialog import FeedEditDialog |
|
178 |
177 dlg = FeedEditDialog(origUrlString, origTitle) |
179 dlg = FeedEditDialog(origUrlString, origTitle) |
178 if dlg.exec() == QDialog.DialogCode.Accepted: |
180 if dlg.exec() == QDialog.DialogCode.Accepted: |
179 urlString, title = dlg.getData() |
181 urlString, title = dlg.getData() |
180 for feed in self.__feeds: |
182 for feed in self.__feeds: |
181 if feed[0] == urlString: |
183 if feed[0] == urlString: |
182 EricMessageBox.critical( |
184 EricMessageBox.critical( |
183 self, |
185 self, |
184 self.tr("Duplicate Feed URL"), |
186 self.tr("Duplicate Feed URL"), |
185 self.tr( |
187 self.tr( |
186 """A feed with the URL {0} exists already.""" |
188 """A feed with the URL {0} exists already.""" |
187 """ Aborting...""".format(urlString))) |
189 """ Aborting...""".format(urlString) |
|
190 ), |
|
191 ) |
188 return |
192 return |
189 |
193 |
190 self.__feeds[feedIndex] = (urlString, title, feedToChange[2]) |
194 self.__feeds[feedIndex] = (urlString, title, feedToChange[2]) |
191 self.__save() |
195 self.__save() |
192 |
196 |
193 itm.setText(0, title) |
197 itm.setText(0, title) |
194 itm.setData(0, FeedsManager.UrlStringRole, urlString) |
198 itm.setData(0, FeedsManager.UrlStringRole, urlString) |
195 self.__reloadFeed(itm) |
199 self.__reloadFeed(itm) |
196 |
200 |
197 @pyqtSlot() |
201 @pyqtSlot() |
198 def on_deleteButton_clicked(self): |
202 def on_deleteButton_clicked(self): |
199 """ |
203 """ |
200 Private slot to delete the selected feed. |
204 Private slot to delete the selected feed. |
201 """ |
205 """ |
216 feedToDelete = feed |
222 feedToDelete = feed |
217 break |
223 break |
218 if feedToDelete: |
224 if feedToDelete: |
219 self.__feeds.remove(feedToDelete) |
225 self.__feeds.remove(feedToDelete) |
220 self.__save() |
226 self.__save() |
221 |
227 |
222 index = self.feedsTree.indexOfTopLevelItem(itm) |
228 index = self.feedsTree.indexOfTopLevelItem(itm) |
223 if index != -1: |
229 if index != -1: |
224 self.feedsTree.takeTopLevelItem(index) |
230 self.feedsTree.takeTopLevelItem(index) |
225 del itm |
231 del itm |
226 |
232 |
227 @pyqtSlot() |
233 @pyqtSlot() |
228 def on_feedsTree_itemSelectionChanged(self): |
234 def on_feedsTree_itemSelectionChanged(self): |
229 """ |
235 """ |
230 Private slot to enable the various buttons depending on the selection. |
236 Private slot to enable the various buttons depending on the selection. |
231 """ |
237 """ |
232 self.__enableButtons() |
238 self.__enableButtons() |
233 |
239 |
234 def __enableButtons(self): |
240 def __enableButtons(self): |
235 """ |
241 """ |
236 Private slot to disable/enable various buttons. |
242 Private slot to disable/enable various buttons. |
237 """ |
243 """ |
238 selItems = self.feedsTree.selectedItems() |
244 selItems = self.feedsTree.selectedItems() |
239 enable = (len(selItems) == 1 and |
245 enable = ( |
240 self.feedsTree.indexOfTopLevelItem(selItems[0]) != -1) |
246 len(selItems) == 1 and self.feedsTree.indexOfTopLevelItem(selItems[0]) != -1 |
241 |
247 ) |
|
248 |
242 self.reloadButton.setEnabled(enable) |
249 self.reloadButton.setEnabled(enable) |
243 self.editButton.setEnabled(enable) |
250 self.editButton.setEnabled(enable) |
244 self.deleteButton.setEnabled(enable) |
251 self.deleteButton.setEnabled(enable) |
245 |
252 |
246 def __reloadFeed(self, itm): |
253 def __reloadFeed(self, itm): |
247 """ |
254 """ |
248 Private method to reload the given feed. |
255 Private method to reload the given feed. |
249 |
256 |
250 @param itm feed item to be reloaded (QTreeWidgetItem) |
257 @param itm feed item to be reloaded (QTreeWidgetItem) |
251 """ |
258 """ |
252 urlString = itm.data(0, FeedsManager.UrlStringRole) |
259 urlString = itm.data(0, FeedsManager.UrlStringRole) |
253 if urlString == "": |
260 if urlString == "": |
254 return |
261 return |
255 |
262 |
256 for child in itm.takeChildren(): |
263 for child in itm.takeChildren(): |
257 del child |
264 del child |
258 |
265 |
259 from WebBrowser.WebBrowserWindow import WebBrowserWindow |
266 from WebBrowser.WebBrowserWindow import WebBrowserWindow |
|
267 |
260 request = QNetworkRequest(QUrl(urlString)) |
268 request = QNetworkRequest(QUrl(urlString)) |
261 reply = WebBrowserWindow.networkManager().get(request) |
269 reply = WebBrowserWindow.networkManager().get(request) |
262 reply.finished.connect(lambda: self.__feedLoaded(reply)) |
270 reply.finished.connect(lambda: self.__feedLoaded(reply)) |
263 self.__replies[id(reply)] = (reply, itm) |
271 self.__replies[id(reply)] = (reply, itm) |
264 |
272 |
265 def __feedLoaded(self, reply): |
273 def __feedLoaded(self, reply): |
266 """ |
274 """ |
267 Private slot to extract the loaded feed data. |
275 Private slot to extract the loaded feed data. |
268 |
276 |
269 @param reply reference to the network reply |
277 @param reply reference to the network reply |
270 @type QNetworkReply |
278 @type QNetworkReply |
271 """ |
279 """ |
272 if id(reply) not in self.__replies: |
280 if id(reply) not in self.__replies: |
273 return |
281 return |
274 |
282 |
275 topItem = self.__replies[id(reply)][1] |
283 topItem = self.__replies[id(reply)][1] |
276 del self.__replies[id(reply)] |
284 del self.__replies[id(reply)] |
277 |
285 |
278 if reply.error() == QNetworkReply.NetworkError.NoError: |
286 if reply.error() == QNetworkReply.NetworkError.NoError: |
279 linkString = "" |
287 linkString = "" |
280 titleString = "" |
288 titleString = "" |
281 |
289 |
282 xml = QXmlStreamReader() |
290 xml = QXmlStreamReader() |
283 xmlData = reply.readAll() |
291 xmlData = reply.readAll() |
284 xml.addData(xmlData) |
292 xml.addData(xmlData) |
285 |
293 |
286 while not xml.atEnd(): |
294 while not xml.atEnd(): |
287 xml.readNext() |
295 xml.readNext() |
288 if xml.isStartElement(): |
296 if xml.isStartElement(): |
289 if xml.name() == "item": |
297 if xml.name() == "item": |
290 linkString = xml.attributes().value("rss:about") |
298 linkString = xml.attributes().value("rss:about") |
295 if xml.name() in ["item", "entry"]: |
303 if xml.name() in ["item", "entry"]: |
296 itm = QTreeWidgetItem(topItem) |
304 itm = QTreeWidgetItem(topItem) |
297 itm.setText(0, titleString) |
305 itm.setText(0, titleString) |
298 itm.setData(0, FeedsManager.UrlStringRole, linkString) |
306 itm.setData(0, FeedsManager.UrlStringRole, linkString) |
299 itm.setIcon(0, UI.PixmapCache.getIcon("rss16")) |
307 itm.setIcon(0, UI.PixmapCache.getIcon("rss16")) |
300 |
308 |
301 linkString = "" |
309 linkString = "" |
302 titleString = "" |
310 titleString = "" |
303 elif xml.isCharacters() and not xml.isWhitespace(): |
311 elif xml.isCharacters() and not xml.isWhitespace(): |
304 if currentTag == "title": |
312 if currentTag == "title": |
305 titleString = xml.text() |
313 titleString = xml.text() |
306 elif currentTag == "link": |
314 elif currentTag == "link": |
307 linkString += xml.text() |
315 linkString += xml.text() |
308 |
316 |
309 if topItem.childCount() == 0: |
317 if topItem.childCount() == 0: |
310 itm = QTreeWidgetItem(topItem) |
318 itm = QTreeWidgetItem(topItem) |
311 itm.setText(0, self.tr("Error fetching feed")) |
319 itm.setText(0, self.tr("Error fetching feed")) |
312 itm.setData(0, FeedsManager.UrlStringRole, "") |
320 itm.setData(0, FeedsManager.UrlStringRole, "") |
313 itm.setData(0, FeedsManager.ErrorDataRole, |
321 itm.setData( |
314 str(xmlData, encoding="utf-8")) |
322 0, FeedsManager.ErrorDataRole, str(xmlData, encoding="utf-8") |
315 |
323 ) |
|
324 |
316 topItem.setExpanded(True) |
325 topItem.setExpanded(True) |
317 else: |
326 else: |
318 linkString = "" |
327 linkString = "" |
319 titleString = reply.errorString() |
328 titleString = reply.errorString() |
320 itm = QTreeWidgetItem(topItem) |
329 itm = QTreeWidgetItem(topItem) |
321 itm.setText(0, titleString) |
330 itm.setText(0, titleString) |
322 itm.setData(0, FeedsManager.UrlStringRole, linkString) |
331 itm.setData(0, FeedsManager.UrlStringRole, linkString) |
323 topItem.setExpanded(True) |
332 topItem.setExpanded(True) |
324 |
333 |
325 def __customContextMenuRequested(self, pos): |
334 def __customContextMenuRequested(self, pos): |
326 """ |
335 """ |
327 Private slot to handle the context menu request for the feeds tree. |
336 Private slot to handle the context menu request for the feeds tree. |
328 |
337 |
329 @param pos position the context menu was requested (QPoint) |
338 @param pos position the context menu was requested (QPoint) |
330 """ |
339 """ |
331 itm = self.feedsTree.currentItem() |
340 itm = self.feedsTree.currentItem() |
332 if itm is None: |
341 if itm is None: |
333 return |
342 return |
334 |
343 |
335 if self.feedsTree.indexOfTopLevelItem(itm) != -1: |
344 if self.feedsTree.indexOfTopLevelItem(itm) != -1: |
336 return |
345 return |
337 |
346 |
338 urlString = itm.data(0, FeedsManager.UrlStringRole) |
347 urlString = itm.data(0, FeedsManager.UrlStringRole) |
339 if urlString: |
348 if urlString: |
340 menu = QMenu() |
349 menu = QMenu() |
341 menu.addAction( |
350 menu.addAction(self.tr("&Open"), self.__openMessageInCurrentTab) |
342 self.tr("&Open"), self.__openMessageInCurrentTab) |
351 menu.addAction(self.tr("Open in New &Tab"), self.__openMessageInNewTab) |
343 menu.addAction( |
|
344 self.tr("Open in New &Tab"), self.__openMessageInNewTab) |
|
345 menu.addAction( |
352 menu.addAction( |
346 self.tr("Open in New &Background Tab"), |
353 self.tr("Open in New &Background Tab"), |
347 self.__openMessageInNewBackgroundTab) |
354 self.__openMessageInNewBackgroundTab, |
|
355 ) |
348 menu.addAction( |
356 menu.addAction( |
349 self.tr("Open in New &Window"), self.__openMessageInNewWindow) |
357 self.tr("Open in New &Window"), self.__openMessageInNewWindow |
|
358 ) |
350 menu.addAction( |
359 menu.addAction( |
351 self.tr("Open in New Pri&vate Window"), |
360 self.tr("Open in New Pri&vate Window"), |
352 self.__openMessageInPrivateWindow) |
361 self.__openMessageInPrivateWindow, |
|
362 ) |
353 menu.addSeparator() |
363 menu.addSeparator() |
354 menu.addAction(self.tr("&Copy URL to Clipboard"), |
364 menu.addAction(self.tr("&Copy URL to Clipboard"), self.__copyUrlToClipboard) |
355 self.__copyUrlToClipboard) |
|
356 menu.exec(QCursor.pos()) |
365 menu.exec(QCursor.pos()) |
357 else: |
366 else: |
358 errorString = itm.data(0, FeedsManager.ErrorDataRole) |
367 errorString = itm.data(0, FeedsManager.ErrorDataRole) |
359 if errorString: |
368 if errorString: |
360 menu = QMenu() |
369 menu = QMenu() |
361 menu.addAction( |
370 menu.addAction(self.tr("&Show error data"), self.__showError) |
362 self.tr("&Show error data"), self.__showError) |
|
363 menu.exec(QCursor.pos()) |
371 menu.exec(QCursor.pos()) |
364 |
372 |
365 def __itemActivated(self, itm, column): |
373 def __itemActivated(self, itm, column): |
366 """ |
374 """ |
367 Private slot to handle the activation of an item. |
375 Private slot to handle the activation of an item. |
368 |
376 |
369 @param itm reference to the activated item (QTreeWidgetItem) |
377 @param itm reference to the activated item (QTreeWidgetItem) |
370 @param column column of the activation (integer) |
378 @param column column of the activation (integer) |
371 """ |
379 """ |
372 if self.feedsTree.indexOfTopLevelItem(itm) != -1: |
380 if self.feedsTree.indexOfTopLevelItem(itm) != -1: |
373 return |
381 return |
374 |
382 |
375 if ( |
383 if QApplication.keyboardModifiers() & Qt.KeyboardModifier.ControlModifier: |
376 QApplication.keyboardModifiers() & |
|
377 Qt.KeyboardModifier.ControlModifier |
|
378 ): |
|
379 self.__openMessageInNewTab() |
384 self.__openMessageInNewTab() |
380 elif ( |
385 elif QApplication.keyboardModifiers() & Qt.KeyboardModifier.ShiftModifier: |
381 QApplication.keyboardModifiers() & |
|
382 Qt.KeyboardModifier.ShiftModifier |
|
383 ): |
|
384 self.__openMessageInNewWindow() |
386 self.__openMessageInNewWindow() |
385 else: |
387 else: |
386 self.__openMessageInCurrentTab() |
388 self.__openMessageInCurrentTab() |
387 |
389 |
388 def __openMessageInCurrentTab(self): |
390 def __openMessageInCurrentTab(self): |
389 """ |
391 """ |
390 Private slot to open a feed message in the current browser tab. |
392 Private slot to open a feed message in the current browser tab. |
391 """ |
393 """ |
392 self.__openMessage() |
394 self.__openMessage() |
393 |
395 |
394 def __openMessageInNewTab(self): |
396 def __openMessageInNewTab(self): |
395 """ |
397 """ |
396 Private slot to open a feed message in a new browser tab. |
398 Private slot to open a feed message in a new browser tab. |
397 """ |
399 """ |
398 self.__openMessage(newTab=True) |
400 self.__openMessage(newTab=True) |
399 |
401 |
400 def __openMessageInNewBackgroundTab(self): |
402 def __openMessageInNewBackgroundTab(self): |
401 """ |
403 """ |
402 Private slot to open a feed message in a new background tab. |
404 Private slot to open a feed message in a new background tab. |
403 """ |
405 """ |
404 self.__openMessage(newTab=True, background=True) |
406 self.__openMessage(newTab=True, background=True) |
405 |
407 |
406 def __openMessageInNewWindow(self): |
408 def __openMessageInNewWindow(self): |
407 """ |
409 """ |
408 Private slot to open a feed message in a new browser window. |
410 Private slot to open a feed message in a new browser window. |
409 """ |
411 """ |
410 self.__openMessage(newWindow=True) |
412 self.__openMessage(newWindow=True) |
411 |
413 |
412 def __openMessageInPrivateWindow(self): |
414 def __openMessageInPrivateWindow(self): |
413 """ |
415 """ |
414 Private slot to open a feed message in a new private browser window. |
416 Private slot to open a feed message in a new private browser window. |
415 """ |
417 """ |
416 self.__openMessage(newWindow=True, privateWindow=True) |
418 self.__openMessage(newWindow=True, privateWindow=True) |
417 |
419 |
418 def __openMessage(self, newTab=False, background=False, |
420 def __openMessage( |
419 newWindow=False, privateWindow=False): |
421 self, newTab=False, background=False, newWindow=False, privateWindow=False |
|
422 ): |
420 """ |
423 """ |
421 Private method to open a feed message. |
424 Private method to open a feed message. |
422 |
425 |
423 @param newTab flag indicating to open the feed message in a new tab |
426 @param newTab flag indicating to open the feed message in a new tab |
424 @type bool |
427 @type bool |
425 @param background flag indicating to open the bookmark in a new |
428 @param background flag indicating to open the bookmark in a new |
426 background tab |
429 background tab |
427 @type bool |
430 @type bool |