src/eric7/WebBrowser/Feeds/FeedsManager.py

branch
eric7
changeset 9221
bf71ee032bb4
parent 9209
b99e7fd55fd3
child 9413
80c06d472826
equal deleted inserted replaced
9220:e9e7eca7efee 9221:bf71ee032bb4
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 """
204 res = EricMessageBox.yesNo( 208 res = EricMessageBox.yesNo(
205 self, 209 self,
206 self.tr("Delete Feed"), 210 self.tr("Delete Feed"),
207 self.tr( 211 self.tr(
208 """<p>Do you really want to delete the feed""" 212 """<p>Do you really want to delete the feed"""
209 """ <b>{0}</b>?</p>""".format(title))) 213 """ <b>{0}</b>?</p>""".format(title)
214 ),
215 )
210 if res: 216 if res:
211 urlString = itm.data(0, FeedsManager.UrlStringRole) 217 urlString = itm.data(0, FeedsManager.UrlStringRole)
212 if urlString: 218 if urlString:
213 feedToDelete = None 219 feedToDelete = None
214 for feed in self.__feeds: 220 for feed in self.__feeds:
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
432 @type bool 435 @type bool
433 """ 436 """
434 itm = self.feedsTree.currentItem() 437 itm = self.feedsTree.currentItem()
435 if itm is None: 438 if itm is None:
436 return 439 return
437 440
438 urlString = itm.data(0, FeedsManager.UrlStringRole) 441 urlString = itm.data(0, FeedsManager.UrlStringRole)
439 if urlString: 442 if urlString:
440 title = itm.text(0) 443 title = itm.text(0)
441 444
442 if newTab: 445 if newTab:
443 if background: 446 if background:
444 self.newBackgroundTab.emit(QUrl(urlString), title) 447 self.newBackgroundTab.emit(QUrl(urlString), title)
445 else: 448 else:
446 self.newTab.emit(QUrl(urlString), title) 449 self.newTab.emit(QUrl(urlString), title)
453 self.openUrl.emit(QUrl(urlString), title) 456 self.openUrl.emit(QUrl(urlString), title)
454 else: 457 else:
455 errorString = itm.data(0, FeedsManager.ErrorDataRole) 458 errorString = itm.data(0, FeedsManager.ErrorDataRole)
456 if errorString: 459 if errorString:
457 self.__showError() 460 self.__showError()
458 461
459 def __copyUrlToClipboard(self): 462 def __copyUrlToClipboard(self):
460 """ 463 """
461 Private slot to copy the URL of the selected item to the clipboard. 464 Private slot to copy the URL of the selected item to the clipboard.
462 """ 465 """
463 itm = self.feedsTree.currentItem() 466 itm = self.feedsTree.currentItem()
464 if itm is None: 467 if itm is None:
465 return 468 return
466 469
467 if self.feedsTree.indexOfTopLevelItem(itm) != -1: 470 if self.feedsTree.indexOfTopLevelItem(itm) != -1:
468 return 471 return
469 472
470 urlString = itm.data(0, FeedsManager.UrlStringRole) 473 urlString = itm.data(0, FeedsManager.UrlStringRole)
471 if urlString: 474 if urlString:
472 QApplication.clipboard().setText(urlString) 475 QApplication.clipboard().setText(urlString)
473 476
474 def __showError(self): 477 def __showError(self):
475 """ 478 """
476 Private slot to show error info for a failed load operation. 479 Private slot to show error info for a failed load operation.
477 """ 480 """
478 itm = self.feedsTree.currentItem() 481 itm = self.feedsTree.currentItem()
479 if itm is None: 482 if itm is None:
480 return 483 return
481 484
482 errorStr = itm.data(0, FeedsManager.ErrorDataRole) 485 errorStr = itm.data(0, FeedsManager.ErrorDataRole)
483 if errorStr: 486 if errorStr:
484 EricMessageBox.critical( 487 EricMessageBox.critical(
485 self, 488 self, self.tr("Error loading feed"), "{0}".format(errorStr)
486 self.tr("Error loading feed"), 489 )
487 "{0}".format(errorStr))

eric ide

mercurial