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