17 |
17 |
18 class BookmarksModel(QAbstractItemModel): |
18 class BookmarksModel(QAbstractItemModel): |
19 """ |
19 """ |
20 Class implementing the bookmark model. |
20 Class implementing the bookmark model. |
21 """ |
21 """ |
22 TypeRole = Qt.UserRole + 1 |
22 TypeRole = Qt.ItemDataRole.UserRole + 1 |
23 UrlRole = Qt.UserRole + 2 |
23 UrlRole = Qt.ItemDataRole.UserRole + 2 |
24 UrlStringRole = Qt.UserRole + 3 |
24 UrlStringRole = Qt.ItemDataRole.UserRole + 3 |
25 VisitCountRole = Qt.UserRole + 4 |
25 VisitCountRole = Qt.ItemDataRole.UserRole + 4 |
26 SeparatorRole = Qt.UserRole + 5 |
26 SeparatorRole = Qt.ItemDataRole.UserRole + 5 |
27 |
27 |
28 MIMETYPE = "application/bookmarks.xbel" |
28 MIMETYPE = "application/bookmarks.xbel" |
29 |
29 |
30 def __init__(self, manager, parent=None): |
30 def __init__(self, manager, parent=None): |
31 """ |
31 """ |
138 self.__bookmarksManager.undoRedoStack().endMacro() |
138 self.__bookmarksManager.undoRedoStack().endMacro() |
139 self.__endMacro = False |
139 self.__endMacro = False |
140 |
140 |
141 return True |
141 return True |
142 |
142 |
143 def headerData(self, section, orientation, role=Qt.DisplayRole): |
143 def headerData(self, section, orientation, |
|
144 role=Qt.ItemDataRole.DisplayRole): |
144 """ |
145 """ |
145 Public method to get the header data. |
146 Public method to get the header data. |
146 |
147 |
147 @param section section number (integer) |
148 @param section section number (integer) |
148 @param orientation header orientation (Qt.Orientation) |
149 @param orientation header orientation (Qt.Orientation) |
149 @param role data role (integer) |
150 @param role data role (Qt.ItemDataRole) |
150 @return header data |
151 @return header data |
151 """ |
152 """ |
152 if orientation == Qt.Horizontal and role == Qt.DisplayRole: |
153 if ( |
|
154 orientation == Qt.Orientation.Horizontal and |
|
155 role == Qt.ItemDataRole.DisplayRole |
|
156 ): |
153 try: |
157 try: |
154 return self.__headers[section] |
158 return self.__headers[section] |
155 except IndexError: |
159 except IndexError: |
156 pass |
160 pass |
157 return QAbstractItemModel.headerData(self, section, orientation, role) |
161 return QAbstractItemModel.headerData(self, section, orientation, role) |
158 |
162 |
159 def data(self, index, role=Qt.DisplayRole): |
163 def data(self, index, role=Qt.ItemDataRole.DisplayRole): |
160 """ |
164 """ |
161 Public method to get data from the model. |
165 Public method to get data from the model. |
162 |
166 |
163 @param index index of bookmark to get data for (QModelIndex) |
167 @param index index of bookmark to get data for (QModelIndex) |
164 @param role data role (integer) |
168 @param role data role (integer) |
168 return None |
172 return None |
169 |
173 |
170 from .BookmarkNode import BookmarkNode |
174 from .BookmarkNode import BookmarkNode |
171 |
175 |
172 bookmarkNode = self.node(index) |
176 bookmarkNode = self.node(index) |
173 if role in [Qt.EditRole, Qt.DisplayRole]: |
177 if role in [Qt.ItemDataRole.EditRole, Qt.ItemDataRole.DisplayRole]: |
174 if bookmarkNode.type() == BookmarkNode.Separator: |
178 if bookmarkNode.type() == BookmarkNode.Separator: |
175 if index.column() == 0: |
179 if index.column() == 0: |
176 return 50 * '\xB7' |
180 return 50 * '\xB7' |
177 elif index.column() == 1: |
181 elif index.column() == 1: |
178 return "" |
182 return "" |
195 return bookmarkNode.type() |
199 return bookmarkNode.type() |
196 |
200 |
197 elif role == BookmarksModel.SeparatorRole: |
201 elif role == BookmarksModel.SeparatorRole: |
198 return bookmarkNode.type() == BookmarkNode.Separator |
202 return bookmarkNode.type() == BookmarkNode.Separator |
199 |
203 |
200 elif role == Qt.DecorationRole: |
204 elif role == Qt.ItemDataRole.DecorationRole: |
201 if index.column() == 0: |
205 if index.column() == 0: |
202 if bookmarkNode.type() == BookmarkNode.Folder: |
206 if bookmarkNode.type() == BookmarkNode.Folder: |
203 return UI.PixmapCache.getIcon("dirOpen") |
207 return UI.PixmapCache.getIcon("dirOpen") |
204 import WebBrowser.WebBrowserWindow |
208 import WebBrowser.WebBrowserWindow |
205 return WebBrowser.WebBrowserWindow.WebBrowserWindow.icon( |
209 return WebBrowser.WebBrowserWindow.WebBrowserWindow.icon( |
317 |
321 |
318 @param index index of the node cell (QModelIndex) |
322 @param index index of the node cell (QModelIndex) |
319 @return flags (Qt.ItemFlags) |
323 @return flags (Qt.ItemFlags) |
320 """ |
324 """ |
321 if not index.isValid(): |
325 if not index.isValid(): |
322 return Qt.NoItemFlags |
326 return Qt.ItemFlag.NoItemFlags |
323 |
327 |
324 node = self.node(index) |
328 node = self.node(index) |
325 type_ = node.type() |
329 type_ = node.type() |
326 flags = Qt.ItemIsSelectable | Qt.ItemIsEnabled |
330 flags = Qt.ItemFlag.ItemIsSelectable | Qt.ItemFlag.ItemIsEnabled |
327 |
331 |
328 if self.hasChildren(index): |
332 if self.hasChildren(index): |
329 flags |= Qt.ItemIsDropEnabled |
333 flags |= Qt.ItemFlag.ItemIsDropEnabled |
330 |
334 |
331 if ( |
335 if ( |
332 node == self.__bookmarksManager.menu() or |
336 node == self.__bookmarksManager.menu() or |
333 node == self.__bookmarksManager.toolbar() |
337 node == self.__bookmarksManager.toolbar() |
334 ): |
338 ): |
335 return flags |
339 return flags |
336 |
340 |
337 flags |= Qt.ItemIsDragEnabled |
341 flags |= Qt.ItemFlag.ItemIsDragEnabled |
338 |
342 |
339 from .BookmarkNode import BookmarkNode |
343 from .BookmarkNode import BookmarkNode |
340 if ( |
344 if ( |
341 (index.column() == 0 and type_ != BookmarkNode.Separator) or |
345 (index.column() == 0 and type_ != BookmarkNode.Separator) or |
342 (index.column() == 1 and type_ == BookmarkNode.Bookmark) |
346 (index.column() == 1 and type_ == BookmarkNode.Bookmark) |
343 ): |
347 ): |
344 flags |= Qt.ItemIsEditable |
348 flags |= Qt.ItemFlag.ItemIsEditable |
345 |
349 |
346 return flags |
350 return flags |
347 |
351 |
348 def supportedDropActions(self): |
352 def supportedDropActions(self): |
349 """ |
353 """ |
350 Public method to report the supported drop actions. |
354 Public method to report the supported drop actions. |
351 |
355 |
352 @return supported drop actions (Qt.DropAction) |
356 @return supported drop actions (Qt.DropAction) |
353 """ |
357 """ |
354 return Qt.CopyAction | Qt.MoveAction |
358 return Qt.DropAction.CopyAction | Qt.DropAction.MoveAction |
355 |
359 |
356 def mimeTypes(self): |
360 def mimeTypes(self): |
357 """ |
361 """ |
358 Public method to report the supported mime types. |
362 Public method to report the supported mime types. |
359 |
363 |
369 @return mime data (QMimeData) |
373 @return mime data (QMimeData) |
370 """ |
374 """ |
371 from .XbelWriter import XbelWriter |
375 from .XbelWriter import XbelWriter |
372 |
376 |
373 data = QByteArray() |
377 data = QByteArray() |
374 stream = QDataStream(data, QIODevice.WriteOnly) |
378 stream = QDataStream(data, QIODevice.OpenModeFlag.WriteOnly) |
375 urls = [] |
379 urls = [] |
376 |
380 |
377 for index in indexes: |
381 for index in indexes: |
378 if index.column() != 0 or not index.isValid(): |
382 if index.column() != 0 or not index.isValid(): |
379 continue |
383 continue |
380 |
384 |
381 encodedData = QByteArray() |
385 encodedData = QByteArray() |
382 buffer = QBuffer(encodedData) |
386 buffer = QBuffer(encodedData) |
383 buffer.open(QIODevice.ReadWrite) |
387 buffer.open(QIODevice.OpenModeFlag.ReadWrite) |
384 writer = XbelWriter() |
388 writer = XbelWriter() |
385 parentNode = self.node(index) |
389 parentNode = self.node(index) |
386 writer.write(buffer, parentNode) |
390 writer.write(buffer, parentNode) |
387 stream << encodedData |
391 stream << encodedData |
388 urls.append(index.data(self.UrlRole)) |
392 urls.append(index.data(self.UrlRole)) |
401 @param row row number (integer) |
405 @param row row number (integer) |
402 @param column column number (integer) |
406 @param column column number (integer) |
403 @param parent index of the parent node (QModelIndex) |
407 @param parent index of the parent node (QModelIndex) |
404 @return flag indicating successful acceptance of the data (boolean) |
408 @return flag indicating successful acceptance of the data (boolean) |
405 """ |
409 """ |
406 if action == Qt.IgnoreAction: |
410 if action == Qt.DropAction.IgnoreAction: |
407 return True |
411 return True |
408 |
412 |
409 if column > 0: |
413 if column > 0: |
410 return False |
414 return False |
411 |
415 |
426 |
430 |
427 self.__bookmarksManager.addBookmark(parentNode, node, row) |
431 self.__bookmarksManager.addBookmark(parentNode, node, row) |
428 return True |
432 return True |
429 |
433 |
430 ba = data.data(self.MIMETYPE) |
434 ba = data.data(self.MIMETYPE) |
431 stream = QDataStream(ba, QIODevice.ReadOnly) |
435 stream = QDataStream(ba, QIODevice.OpenModeFlag.ReadOnly) |
432 if stream.atEnd(): |
436 if stream.atEnd(): |
433 return False |
437 return False |
434 |
438 |
435 undoStack = self.__bookmarksManager.undoRedoStack() |
439 undoStack = self.__bookmarksManager.undoRedoStack() |
436 undoStack.beginMacro("Move Bookmarks") |
440 undoStack.beginMacro("Move Bookmarks") |
438 from .XbelReader import XbelReader |
442 from .XbelReader import XbelReader |
439 while not stream.atEnd(): |
443 while not stream.atEnd(): |
440 encodedData = QByteArray() |
444 encodedData = QByteArray() |
441 stream >> encodedData |
445 stream >> encodedData |
442 buffer = QBuffer(encodedData) |
446 buffer = QBuffer(encodedData) |
443 buffer.open(QIODevice.ReadOnly) |
447 buffer.open(QIODevice.OpenModeFlag.ReadOnly) |
444 |
448 |
445 reader = XbelReader() |
449 reader = XbelReader() |
446 rootNode = reader.read(buffer) |
450 rootNode = reader.read(buffer) |
447 for bookmarkNode in rootNode.children(): |
451 for bookmarkNode in rootNode.children(): |
448 rootNode.remove(bookmarkNode) |
452 rootNode.remove(bookmarkNode) |
451 parentNode, bookmarkNode, row) |
455 parentNode, bookmarkNode, row) |
452 self.__endMacro = True |
456 self.__endMacro = True |
453 |
457 |
454 return True |
458 return True |
455 |
459 |
456 def setData(self, index, value, role=Qt.EditRole): |
460 def setData(self, index, value, role=Qt.ItemDataRole.EditRole): |
457 """ |
461 """ |
458 Public method to set the data of a node cell. |
462 Public method to set the data of a node cell. |
459 |
463 |
460 @param index index of the node cell (QModelIndex) |
464 @param index index of the node cell (QModelIndex) |
461 @param value value to be set |
465 @param value value to be set |
462 @param role role of the data (integer) |
466 @param role role of the data (integer) |
463 @return flag indicating success (boolean) |
467 @return flag indicating success (boolean) |
464 """ |
468 """ |
465 if not index.isValid() or (self.flags(index) & Qt.ItemIsEditable) == 0: |
469 if ( |
|
470 not index.isValid() or |
|
471 (self.flags(index) & Qt.ItemFlag.ItemIsEditable) == 0 |
|
472 ): |
466 return False |
473 return False |
467 |
474 |
468 item = self.node(index) |
475 item = self.node(index) |
469 |
476 |
470 if role in (Qt.EditRole, Qt.DisplayRole): |
477 if role in (Qt.ItemDataRole.EditRole, Qt.ItemDataRole.DisplayRole): |
471 if index.column() == 0: |
478 if index.column() == 0: |
472 self.__bookmarksManager.setTitle(item, value) |
479 self.__bookmarksManager.setTitle(item, value) |
473 elif index.column() == 1: |
480 elif index.column() == 1: |
474 self.__bookmarksManager.setUrl(item, value) |
481 self.__bookmarksManager.setUrl(item, value) |
475 else: |
482 else: |