Tue, 18 Oct 2022 16:06:21 +0200
Changed the eric7 import statements to include the package name (i.e. eric7) in order to not fiddle with sys.path.
8900 | 1 | # -*- coding: utf-8 -*- |
2 | ||
3 | # Copyright (c) 2022 Detlev Offenbach <detlev@die-offenbachs.de> | |
4 | # | |
5 | ||
8902 | 6 | """ |
7 | Module implementing a widget showing the list of bookmarks. | |
8 | """ | |
9 | ||
8900 | 10 | import contextlib |
8902 | 11 | import datetime |
8900 | 12 | import json |
8902 | 13 | import os |
8900 | 14 | |
15 | from PyQt6.QtCore import pyqtSignal, pyqtSlot, Qt, QPoint, QUrl | |
16 | from PyQt6.QtGui import QClipboard, QGuiApplication | |
17 | from PyQt6.QtWidgets import ( | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
18 | QAbstractItemView, |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
19 | QApplication, |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
20 | QDialog, |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
21 | QListWidget, |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
22 | QListWidgetItem, |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
23 | QMenu, |
8900 | 24 | ) |
25 | ||
9413
80c06d472826
Changed the eric7 import statements to include the package name (i.e. eric7) in order to not fiddle with sys.path.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9221
diff
changeset
|
26 | from eric7.EricWidgets import EricFileDialog, EricMessageBox |
8902 | 27 | |
9413
80c06d472826
Changed the eric7 import statements to include the package name (i.e. eric7) in order to not fiddle with sys.path.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9221
diff
changeset
|
28 | from eric7 import Preferences |
8900 | 29 | |
30 | from .HelpBookmarkPropertiesDialog import HelpBookmarkPropertiesDialog | |
31 | ||
8902 | 32 | |
8900 | 33 | class HelpBookmarksWidget(QListWidget): |
34 | """ | |
35 | Class implementing a widget showing the list of bookmarks. | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
36 | |
8900 | 37 | @signal escapePressed() emitted when the ESC key was pressed |
38 | @signal openUrl(QUrl, str) emitted to open an entry in the current tab | |
39 | @signal newTab(QUrl, str) emitted to open an entry in a new tab | |
40 | @signal newBackgroundTab(QUrl, str) emitted to open an entry in a | |
41 | new background tab | |
42 | """ | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
43 | |
8900 | 44 | escapePressed = pyqtSignal() |
45 | openUrl = pyqtSignal(QUrl) | |
46 | newTab = pyqtSignal(QUrl) | |
47 | newBackgroundTab = pyqtSignal(QUrl) | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
48 | |
8900 | 49 | UrlRole = Qt.ItemDataRole.UserRole + 1 |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
50 | |
8900 | 51 | def __init__(self, parent=None): |
52 | """ | |
53 | Constructor | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
54 | |
8900 | 55 | @param parent reference to the parent widget (defaults to None) |
56 | @type QWidget (optional) | |
57 | """ | |
58 | super().__init__(parent) | |
59 | self.setObjectName("HelpBookmarksWidget") | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
60 | |
8900 | 61 | self.__helpViewer = parent |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
62 | |
8900 | 63 | self.setAlternatingRowColors(True) |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
64 | self.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection) |
8900 | 65 | self.setSortingEnabled(True) |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
66 | |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
67 | self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu) |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
68 | self.customContextMenuRequested.connect(self.__showContextMenu) |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
69 | |
8900 | 70 | self.__bookmarks = [] |
71 | self.__loadBookmarks() | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
72 | |
8900 | 73 | self.itemDoubleClicked.connect(self.__bookmarkActivated) |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
74 | |
8900 | 75 | @pyqtSlot(QPoint) |
76 | def __showContextMenu(self, point): | |
77 | """ | |
78 | Private slot to handle the customContextMenuRequested signal of | |
79 | the viewlist. | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
80 | |
8900 | 81 | @param point position to open the menu at |
82 | @type QPoint | |
83 | """ | |
84 | selectedItemsCount = len(self.selectedItems()) | |
85 | if selectedItemsCount == 0: | |
86 | # background menu | |
87 | self.__showBackgroundMenu(point) | |
88 | elif selectedItemsCount == 1: | |
89 | # single bookmark menu | |
90 | self.__showBookmarkContextMenu(point) | |
91 | else: | |
92 | # multiple selected bookmarks | |
93 | self.__showBookmarksContextMenu(point) | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
94 | |
8900 | 95 | @pyqtSlot(QPoint) |
96 | def __showBackgroundMenu(self, point): | |
97 | """ | |
98 | Private slot to show the background menu (i.e. no selection). | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
99 | |
8900 | 100 | @param point position to open the menu at |
101 | @type QPoint | |
102 | """ | |
103 | menu = QMenu() | |
104 | openBookmarks = menu.addAction(self.tr("Open All Bookmarks")) | |
105 | menu.addSeparator() | |
106 | newBookmark = menu.addAction(self.tr("New Bookmark")) | |
107 | addBookmark = menu.addAction(self.tr("Bookmark Page")) | |
108 | menu.addSeparator() | |
8902 | 109 | deleteBookmarks = menu.addAction(self.tr("Delete All Bookmarks")) |
110 | menu.addSeparator() | |
111 | exportBookmarks = menu.addAction(self.tr("Export All Bookmarks")) | |
112 | importBookmarks = menu.addAction(self.tr("Import Bookmarks")) | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
113 | |
8900 | 114 | act = menu.exec(self.mapToGlobal(point)) |
115 | if act == openBookmarks: | |
116 | self.__openBookmarks(selected=False) | |
117 | elif act == newBookmark: | |
118 | self.__newBookmark() | |
119 | elif act == addBookmark: | |
120 | self.__bookmarkCurrentPage() | |
121 | elif act == deleteBookmarks: | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
122 | self.__deleteBookmarks([self.item(row) for row in range(self.count())]) |
8902 | 123 | elif act == exportBookmarks: |
124 | self.__exportBookmarks(selected=False) | |
125 | elif act == importBookmarks: | |
126 | self.__importBookmarks() | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
127 | |
8900 | 128 | @pyqtSlot(QPoint) |
129 | def __showBookmarkContextMenu(self, point): | |
130 | """ | |
131 | Private slot to show the context menu for a bookmark. | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
132 | |
8900 | 133 | @param point position to open the menu at |
134 | @type QPoint | |
135 | """ | |
136 | itm = self.selectedItems()[0] | |
137 | url = itm.data(self.UrlRole) | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
138 | validUrl = url is not None and not url.isEmpty() and url.isValid() |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
139 | |
8900 | 140 | menu = QMenu() |
141 | curPage = menu.addAction(self.tr("Open Link")) | |
142 | curPage.setEnabled(validUrl) | |
143 | newPage = menu.addAction(self.tr("Open Link in New Page")) | |
144 | newPage.setEnabled(validUrl) | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
145 | newBackgroundPage = menu.addAction(self.tr("Open Link in Background Page")) |
8900 | 146 | newBackgroundPage.setEnabled(validUrl) |
147 | menu.addSeparator() | |
148 | copyUrl = menu.addAction(self.tr("Copy URL to Clipboard")) | |
149 | copyUrl.setEnabled(validUrl) | |
150 | menu.addSeparator() | |
151 | newBookmark = menu.addAction(self.tr("New Bookmark")) | |
152 | addBookmark = menu.addAction(self.tr("Bookmark Page")) | |
153 | menu.addSeparator() | |
154 | editBookmark = menu.addAction(self.tr("Edit Bookmark")) | |
155 | menu.addSeparator() | |
156 | deleteBookmark = menu.addAction(self.tr("Delete Bookmark")) | |
8902 | 157 | menu.addSeparator() |
158 | exportBookmarks = menu.addAction(self.tr("Export All Bookmarks")) | |
159 | importBookmarks = menu.addAction(self.tr("Import Bookmarks")) | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
160 | |
8900 | 161 | act = menu.exec(self.mapToGlobal(point)) |
162 | if act == curPage: | |
163 | self.openUrl.emit(url) | |
164 | elif act == newPage: | |
165 | self.newTab.emit(url) | |
166 | elif act == newBackgroundPage: | |
167 | self.newBackgroundTab.emit(url) | |
168 | elif act == copyUrl: | |
169 | # copy the URL to both clipboard areas | |
170 | QGuiApplication.clipboard().setText( | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
171 | url.toString(), QClipboard.Mode.Clipboard |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
172 | ) |
8900 | 173 | QGuiApplication.clipboard().setText( |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
174 | url.toString(), QClipboard.Mode.Selection |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
175 | ) |
8900 | 176 | elif act == newBookmark: |
177 | self.__newBookmark() | |
178 | elif act == addBookmark: | |
179 | self.__bookmarkCurrentPage() | |
180 | elif act == editBookmark: | |
181 | self.__editBookmark(itm) | |
182 | elif act == deleteBookmark: | |
183 | self.__deleteBookmarks([itm]) | |
8902 | 184 | elif act == exportBookmarks: |
185 | self.__exportBookmarks(selected=False) | |
186 | elif act == importBookmarks: | |
187 | self.__importBookmarks() | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
188 | |
8900 | 189 | @pyqtSlot(QPoint) |
190 | def __showBookmarksContextMenu(self, point): | |
191 | """ | |
192 | Private slot to show the context menu for multiple bookmark. | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
193 | |
8900 | 194 | @param point position to open the menu at |
195 | @type QPoint | |
196 | """ | |
197 | menu = QMenu() | |
198 | openBookmarks = menu.addAction(self.tr("Open Selected Bookmarks")) | |
199 | menu.addSeparator() | |
200 | deleteBookmarks = menu.addAction(self.tr("Delete Selected Bookmarks")) | |
8902 | 201 | menu.addSeparator() |
202 | exportBookmarks = menu.addAction(self.tr("Export Selected Bookmarks")) | |
203 | exportAllBookmarks = menu.addAction(self.tr("Export All Bookmarks")) | |
204 | importBookmarks = menu.addAction(self.tr("Import Bookmarks")) | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
205 | |
8900 | 206 | act = menu.exec(self.mapToGlobal(point)) |
207 | if act == openBookmarks: | |
208 | self.__openBookmarks(selected=True) | |
209 | elif act == deleteBookmarks: | |
210 | self.__deleteBookmarks(self.selectedItems()) | |
8902 | 211 | elif act == exportBookmarks: |
212 | self.__exportBookmarks(selected=True) | |
213 | elif act == exportAllBookmarks: | |
214 | self.__exportBookmarks(selected=False) | |
215 | elif act == importBookmarks: | |
216 | self.__importBookmarks() | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
217 | |
8900 | 218 | @pyqtSlot(str, str) |
219 | def __addBookmark(self, title, url): | |
220 | """ | |
221 | Private slot to add a bookmark entry. | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
222 | |
8900 | 223 | @param title title for the bookmark |
224 | @type str | |
225 | @param url URL for the bookmark | |
226 | @type str | |
227 | """ | |
228 | url = url.strip() | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
229 | |
8900 | 230 | itm = QListWidgetItem(title, self) |
231 | itm.setData(self.UrlRole, QUrl(url)) | |
232 | itm.setToolTip(url) | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
233 | |
8900 | 234 | @pyqtSlot(str, QUrl) |
235 | def addBookmark(self, title, url): | |
236 | """ | |
237 | Public slot to add a bookmark with given data. | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
238 | |
8900 | 239 | @param title title for the bookmark |
240 | @type str | |
241 | @param url URL for the bookmark | |
242 | @type QUrl | |
243 | """ | |
244 | dlg = HelpBookmarkPropertiesDialog(title, url.toString(), self) | |
245 | if dlg.exec() == QDialog.DialogCode.Accepted: | |
246 | title, url = dlg.getData() | |
247 | self.__addBookmark(title, url) | |
248 | self.sortItems() | |
249 | self.__saveBookmarks() | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
250 | |
8900 | 251 | @pyqtSlot() |
252 | def __bookmarkCurrentPage(self): | |
253 | """ | |
254 | Private slot to bookmark the current page. | |
255 | """ | |
256 | currentViewer = self.__helpViewer.currentViewer() | |
257 | title = currentViewer.pageTitle() | |
258 | url = currentViewer.link() | |
259 | self.addBookmark(title, url) | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
260 | |
8900 | 261 | @pyqtSlot() |
262 | def __newBookmark(self): | |
263 | """ | |
264 | Private slot to create a new bookmark. | |
265 | """ | |
266 | dlg = HelpBookmarkPropertiesDialog(parent=self) | |
267 | if dlg.exec() == QDialog.DialogCode.Accepted: | |
268 | title, url = dlg.getData() | |
269 | self.__addBookmark(title, url) | |
270 | self.sortItems() | |
271 | self.__saveBookmarks() | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
272 | |
8900 | 273 | @pyqtSlot() |
274 | def __editBookmark(self, itm): | |
275 | """ | |
276 | Private slot to edit a bookmark. | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
277 | |
8900 | 278 | @param itm reference to the bookmark item to be edited |
279 | @type QListWidgetItem | |
280 | """ | |
281 | dlg = HelpBookmarkPropertiesDialog( | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
282 | itm.text(), itm.data(self.UrlRole).toString(), self |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
283 | ) |
8900 | 284 | if dlg.exec() == QDialog.DialogCode.Accepted: |
285 | title, url = dlg.getData() | |
286 | itm.setText(title) | |
287 | itm.setData(self.UrlRole, QUrl(url)) | |
288 | itm.setToolTip(url) | |
289 | self.sortItems() | |
290 | self.__saveBookmarks() | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
291 | |
8900 | 292 | @pyqtSlot(QListWidgetItem) |
293 | def __bookmarkActivated(self, itm): | |
294 | """ | |
295 | Private slot handling the activation of a bookmark. | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
296 | |
8900 | 297 | @param itm reference to the activated item |
298 | @type QListWidgetItem | |
299 | """ | |
300 | url = itm.data(self.UrlRole) | |
301 | if url and not url.isEmpty() and url.isValid(): | |
302 | buttons = QApplication.mouseButtons() | |
303 | modifiers = QApplication.keyboardModifiers() | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
304 | |
8900 | 305 | if buttons & Qt.MouseButton.MiddleButton: |
306 | self.newTab.emit(url) | |
307 | else: | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
308 | if modifiers & ( |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
309 | Qt.KeyboardModifier.ControlModifier |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
310 | | Qt.KeyboardModifier.ShiftModifier |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
311 | ) == ( |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
312 | Qt.KeyboardModifier.ControlModifier |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
313 | | Qt.KeyboardModifier.ShiftModifier |
8900 | 314 | ): |
315 | self.newBackgroundTab.emit(url) | |
316 | elif modifiers & Qt.KeyboardModifier.ControlModifier: | |
317 | self.newTab.emit(url) | |
318 | elif ( | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
319 | modifiers & Qt.KeyboardModifier.ShiftModifier |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
320 | and not self.__internal |
8900 | 321 | ): |
322 | self.newWindow.emit(url) | |
323 | else: | |
324 | self.openUrl.emit(url) | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
325 | |
8900 | 326 | def __openBookmarks(self, selected=False): |
327 | """ | |
328 | Private method to open all or selected bookmarks. | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
329 | |
8900 | 330 | @param selected flag indicating to open the selected bookmarks |
331 | (defaults to False) | |
332 | @type bool (optional) | |
333 | """ | |
334 | items = ( | |
335 | self.selectedItems() | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
336 | if selected |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
337 | else [self.item(row) for row in range(self.count())] |
8900 | 338 | ) |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
339 | |
8900 | 340 | for itm in items: |
341 | url = itm.data(self.UrlRole) | |
342 | if url is not None and not url.isEmpty() and url.isValid(): | |
343 | self.newTab.emit(url) | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
344 | |
8900 | 345 | def __deleteBookmarks(self, items): |
346 | """ | |
347 | Private method to delete the given bookmark items. | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
348 | |
8900 | 349 | @param items list of bookmarks to be deleted |
350 | @type list of QListWidgetItem | |
351 | """ | |
9413
80c06d472826
Changed the eric7 import statements to include the package name (i.e. eric7) in order to not fiddle with sys.path.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9221
diff
changeset
|
352 | from eric7.UI.DeleteFilesConfirmationDialog import DeleteFilesConfirmationDialog |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
353 | |
8900 | 354 | dlg = DeleteFilesConfirmationDialog( |
355 | self, | |
356 | self.tr("Delete Bookmarks"), | |
357 | self.tr("Shall these bookmarks really be deleted?"), | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
358 | [itm.text() for itm in items], |
8900 | 359 | ) |
360 | if dlg.exec() == QDialog.DialogCode.Accepted: | |
361 | for itm in items: | |
362 | self.takeItem(self.row(itm)) | |
363 | del itm | |
364 | self.__saveBookmarks() | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
365 | |
8900 | 366 | def __loadBookmarks(self): |
367 | """ | |
368 | Private method to load the defined bookmarks. | |
369 | """ | |
370 | bookmarksStr = Preferences.getHelp("Bookmarks") | |
371 | with contextlib.suppress(ValueError): | |
372 | bookmarks = json.loads(bookmarksStr) | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
373 | |
8900 | 374 | self.clear() |
375 | for bookmark in bookmarks: | |
376 | self.__addBookmark(bookmark["title"], bookmark["url"]) | |
377 | self.sortItems() | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
378 | |
8900 | 379 | def __saveBookmarks(self): |
380 | """ | |
381 | Private method to save the defined bookmarks. | |
382 | """ | |
383 | bookmarks = [] | |
384 | for row in range(self.count()): | |
385 | itm = self.item(row) | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
386 | bookmarks.append( |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
387 | { |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
388 | "title": itm.text(), |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
389 | "url": itm.data(self.UrlRole).toString(), |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
390 | } |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
391 | ) |
8900 | 392 | Preferences.setHelp("Bookmarks", json.dumps(bookmarks)) |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
393 | |
8902 | 394 | @pyqtSlot() |
395 | def __exportBookmarks(self, selected=False): | |
396 | """ | |
397 | Private slot to export the bookmarks into a JSON file. | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
398 | |
8902 | 399 | @param selected flag indicating to export the selected bookmarks |
400 | (defaults to False) | |
401 | @type bool (optional) | |
8900 | 402 | """ |
8902 | 403 | filename, selectedFilter = EricFileDialog.getSaveFileNameAndFilter( |
404 | self, | |
405 | self.tr("Export Bookmarks"), | |
406 | "", | |
407 | self.tr("eric Bookmarks Files (*.json);;All Files (*)"), | |
408 | None, | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
409 | EricFileDialog.DontConfirmOverwrite, |
8902 | 410 | ) |
411 | if filename: | |
412 | ext = os.path.splitext(filename)[1] | |
413 | if not ext: | |
414 | ex = selectedFilter.split("(*")[1].split(")")[0] | |
415 | if ex: | |
416 | filename += ex | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
417 | |
8902 | 418 | if os.path.exists(filename): |
419 | ok = EricMessageBox.yesNo( | |
420 | self, | |
421 | self.tr("Export Bookmarks"), | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
422 | self.tr( |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
423 | """The file <b>{0}</b> already exists. Do you""" |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
424 | """ want to overwrite it?""" |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
425 | ).format(filename), |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
426 | ) |
8902 | 427 | if not ok: |
428 | return | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
429 | |
8902 | 430 | bookmarksDict = { |
431 | "creator": "eric7", | |
432 | "version": 1, | |
433 | "created": datetime.datetime.now().isoformat( | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
434 | sep=" ", timespec="seconds" |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
435 | ), |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
436 | "bookmarks": [], |
8902 | 437 | } |
438 | bookmarkItems = ( | |
439 | self.selectedItems() | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
440 | if selected |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
441 | else [self.item(row) for row in range(self.count())] |
8902 | 442 | ) |
443 | for bookmarkItem in bookmarkItems: | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
444 | bookmarksDict["bookmarks"].append( |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
445 | { |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
446 | "type": "url", |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
447 | "title": bookmarkItem.text(), |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
448 | "url": bookmarkItem.data(self.UrlRole).toString(), |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
449 | } |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
450 | ) |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
451 | |
8902 | 452 | jsonStr = json.dumps(bookmarksDict, indent=2, sort_keys=True) |
453 | try: | |
454 | with open(filename, "w") as f: | |
455 | f.write(jsonStr) | |
456 | except OSError as err: | |
457 | EricMessageBox.critical( | |
458 | self, | |
459 | self.tr("Export Bookmarks"), | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
460 | self.tr( |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
461 | """<p>The bookmarks could not be exported""" |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
462 | """ to <b>{0}</b>.</p><p>Reason: {1}</p>""" |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
463 | ).format(filename, str(err)), |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
464 | ) |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
465 | |
8902 | 466 | @pyqtSlot() |
8900 | 467 | def __importBookmarks(self): |
468 | """ | |
8902 | 469 | Private slot to import bookmarks from a JSON file. |
8900 | 470 | """ |
8902 | 471 | from .HelpBookmarksImportDialog import HelpBookmarksImportDialog |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
472 | |
8902 | 473 | dlg = HelpBookmarksImportDialog(self) |
474 | if dlg.exec() == QDialog.DialogCode.Accepted: | |
475 | replace, filename = dlg.getData() | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
476 | |
8902 | 477 | try: |
478 | with open(filename, "r") as f: | |
479 | jsonStr = f.read() | |
480 | bookmarks = json.loads(jsonStr) | |
481 | except (OSError, json.JSONDecodeError) as err: | |
482 | EricMessageBox.critical( | |
483 | self, | |
484 | self.tr("Import Bookmarks"), | |
485 | self.tr( | |
486 | "<p>The bookmarks file <b>{0}</b> could not be " | |
487 | "read.</p><p>Reason: {1}</p>" | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
488 | ).format(filename, str(err)), |
8902 | 489 | ) |
490 | return | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
491 | |
8902 | 492 | if not isinstance(bookmarks, dict): |
493 | EricMessageBox.critical( | |
494 | self, | |
495 | self.tr("Import Bookmarks"), | |
496 | self.tr( | |
497 | "The bookmarks file <b>{0}</b> has invalid contents." | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
498 | ).format(filename), |
8902 | 499 | ) |
500 | return | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
501 | |
8902 | 502 | try: |
503 | if bookmarks["creator"] != "eric7": | |
504 | EricMessageBox.critical( | |
505 | self, | |
506 | self.tr("Import Bookmarks"), | |
507 | self.tr( | |
508 | "The bookmarks file <b>{0}</b> was not created" | |
509 | " with 'eric7'." | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
510 | ).format(filename), |
8902 | 511 | ) |
512 | return | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
513 | |
8902 | 514 | if bookmarks["version"] != 1: |
515 | EricMessageBox.critical( | |
516 | self, | |
517 | self.tr("Import Bookmarks"), | |
518 | self.tr( | |
519 | "The bookmarks file <b>{0}</b> has an unsupported" | |
520 | " format version." | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
521 | ).format(filename), |
8902 | 522 | ) |
523 | return | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
524 | |
8902 | 525 | if replace: |
526 | self.clear() | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
527 | |
8902 | 528 | for bookmark in bookmarks["bookmarks"]: |
529 | if bookmark["type"] == "url": | |
530 | self.__addBookmark(bookmark["title"], bookmark["url"]) | |
531 | self.sortItems() | |
532 | self.__saveBookmarks() | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
533 | |
8902 | 534 | except KeyError: |
535 | EricMessageBox.critical( | |
536 | self, | |
537 | self.tr("Import Bookmarks"), | |
538 | self.tr( | |
539 | "The bookmarks file <b>{0}</b> has invalid contents." | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
540 | ).format(filename), |
8902 | 541 | ) |