aboutsummaryrefslogtreecommitdiffstats
path: root/examples/webenginewidgets/tabbedbrowser/bookmarkwidget.py
diff options
context:
space:
mode:
Diffstat (limited to 'examples/webenginewidgets/tabbedbrowser/bookmarkwidget.py')
-rw-r--r--examples/webenginewidgets/tabbedbrowser/bookmarkwidget.py276
1 files changed, 0 insertions, 276 deletions
diff --git a/examples/webenginewidgets/tabbedbrowser/bookmarkwidget.py b/examples/webenginewidgets/tabbedbrowser/bookmarkwidget.py
deleted file mode 100644
index 7a76e8a7c..000000000
--- a/examples/webenginewidgets/tabbedbrowser/bookmarkwidget.py
+++ /dev/null
@@ -1,276 +0,0 @@
-#############################################################################
-##
-## Copyright (C) 2018 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-import json
-import os
-import warnings
-
-from PySide6 import QtCore
-from PySide6.QtCore import QDir, QFileInfo, QStandardPaths, Qt, QUrl
-from PySide6.QtGui import QIcon, QStandardItem, QStandardItemModel
-from PySide6.QtWidgets import QMenu, QMessageBox, QTreeView
-
-_url_role = Qt.UserRole + 1
-
-# Default bookmarks as an array of arrays which is the form
-# used to read from/write to a .json bookmarks file
-_default_bookmarks = [
- ['Tool Bar'],
- ['http://qt.io', 'Qt', ':/qt-project.org/qmessagebox/images/qtlogo-64.png'],
- ['https://download.qt.io/snapshots/ci/pyside/', 'Downloads'],
- ['https://doc.qt.io/qtforpython/', 'Documentation'],
- ['https://bugreports.qt.io/projects/PYSIDE/', 'Bug Reports'],
- ['https://www.python.org/', 'Python', None],
- ['https://wiki.qt.io/PySide6', 'Qt for Python', None],
- ['Other Bookmarks']
-]
-
-
-def _config_dir():
- location = QStandardPaths.writableLocation(QStandardPaths.ConfigLocation)
- return f'{location}/QtForPythonBrowser'
-
-
-_bookmark_file = 'bookmarks.json'
-
-
-def _create_folder_item(title):
- result = QStandardItem(title)
- result.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
- return result
-
-
-def _create_item(url, title, icon):
- result = QStandardItem(title)
- result.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
- result.setData(url, _url_role)
- if icon is not None:
- result.setIcon(icon)
- return result
-
-
-# Create the model from an array of arrays
-def _create_model(parent, serialized_bookmarks):
- result = QStandardItemModel(0, 1, parent)
- last_folder_item = None
- for entry in serialized_bookmarks:
- if len(entry) == 1:
- last_folder_item = _create_folder_item(entry[0])
- result.appendRow(last_folder_item)
- else:
- url = QUrl.fromUserInput(entry[0])
- title = entry[1]
- icon = QIcon(entry[2]) if len(entry) > 2 and entry[2] else None
- last_folder_item.appendRow(_create_item(url, title, icon))
- return result
-
-
-# Serialize model into an array of arrays, writing out the icons
-# into .png files under directory in the process
-def _serialize_model(model, directory):
- result = []
- folder_count = model.rowCount()
- for f in range(0, folder_count):
- folder_item = model.item(f)
- result.append([folder_item.text()])
- item_count = folder_item.rowCount()
- for i in range(0, item_count):
- item = folder_item.child(i)
- entry = [item.data(_url_role).toString(), item.text()]
- icon = item.icon()
- if not icon.isNull():
- icon_sizes = icon.availableSizes()
- largest_size = icon_sizes[len(icon_sizes) - 1]
- w = largest_size.width()
- icon_file_name = f'{directory}/icon{f:02}_{i:02}_{w}.png'
- icon.pixmap(largest_size).save(icon_file_name, 'PNG')
- entry.append(icon_file_name)
- result.append(entry)
- return result
-
-
-# Bookmarks as a tree view to be used in a dock widget with
-# functionality to persist and populate tool bars and menus.
-class BookmarkWidget(QTreeView):
- """Provides a tree view to manage the bookmarks."""
-
- open_bookmark = QtCore.Signal(QUrl)
- open_bookmark_in_new_tab = QtCore.Signal(QUrl)
- changed = QtCore.Signal()
-
- def __init__(self):
- super().__init__()
- self.setRootIsDecorated(False)
- self.setUniformRowHeights(True)
- self.setHeaderHidden(True)
- self._model = _create_model(self, self._read_bookmarks())
- self.setModel(self._model)
- self.expandAll()
- self.activated.connect(self._activated)
- self._model.rowsInserted.connect(self._changed)
- self._model.rowsRemoved.connect(self._changed)
- self._model.dataChanged.connect(self._changed)
- self._modified = False
-
- def _changed(self):
- self._modified = True
- self.changed.emit()
-
- def _activated(self, index):
- item = self._model.itemFromIndex(index)
- self.open_bookmark.emit(item.data(_url_role))
-
- def _action_activated(self, index):
- action = self.sender()
- self.open_bookmark.emit(action.data())
-
- def _tool_bar_item(self):
- return self._model.item(0, 0)
-
- def _other_item(self):
- return self._model.item(1, 0)
-
- def add_bookmark(self, url, title, icon):
- self._other_item().appendRow(_create_item(url, title, icon))
-
- def add_tool_bar_bookmark(self, url, title, icon):
- self._tool_bar_item().appendRow(_create_item(url, title, icon))
-
- # Synchronize the bookmarks under parent_item to a target_object
- # like QMenu/QToolBar, which has a list of actions. Update
- # the existing actions, append new ones if needed or hide
- # superfluous ones
- def _populate_actions(self, parent_item, target_object, first_action):
- existing_actions = target_object.actions()
- existing_action_count = len(existing_actions)
- a = first_action
- row_count = parent_item.rowCount()
- for r in range(0, row_count):
- item = parent_item.child(r)
- title = item.text()
- icon = item.icon()
- url = item.data(_url_role)
- if a < existing_action_count:
- action = existing_actions[a]
- if (title != action.toolTip()):
- action.setText(BookmarkWidget.short_title(title))
- action.setIcon(icon)
- action.setToolTip(title)
- action.setData(url)
- action.setVisible(True)
- else:
- short_title = BookmarkWidget.short_title(title)
- action = target_object.addAction(icon, short_title)
- action.setToolTip(title)
- action.setData(url)
- action.triggered.connect(self._action_activated)
- a = a + 1
- while a < existing_action_count:
- existing_actions[a].setVisible(False)
- a = a + 1
-
- def populate_tool_bar(self, tool_bar):
- self._populate_actions(self._tool_bar_item(), tool_bar, 0)
-
- def populate_other(self, menu, first_action):
- self._populate_actions(self._other_item(), menu, first_action)
-
- def _current_item(self):
- index = self.currentIndex()
- if index.isValid():
- item = self._model.itemFromIndex(index)
- if item.parent(): # exclude top level items
- return item
- return None
-
- def context_menu_event(self, event):
- context_menu = QMenu()
- open_in_new_tab_action = context_menu.addAction("Open in New Tab")
- remove_action = context_menu.addAction("Remove...")
- current_item = self._current_item()
- open_in_new_tab_action.setEnabled(current_item is not None)
- remove_action.setEnabled(current_item is not None)
- chosen_action = context_menu.exec(event.globalPos())
- if chosen_action == open_in_new_tab_action:
- self.open_bookmarkInNewTab.emit(current_item.data(_url_role))
- elif chosen_action == remove_action:
- self._remove_item(current_item)
-
- def _remove_item(self, item):
- message = f"Would you like to remove \"{item.text()}\"?"
- button = QMessageBox.question(self, "Remove", message,
- QMessageBox.Yes | QMessageBox.No)
- if button == QMessageBox.Yes:
- item.parent().removeRow(item.row())
-
- def write_bookmarks(self):
- if not self._modified:
- return
- dir_path = _config_dir()
- native_dir_path = QDir.toNativeSeparators(dir_path)
- directory = QFileInfo(dir_path)
- if not directory.isDir():
- print(f'Creating {native_dir_path}...')
- if not QDir(directory.absolutePath()).mkpath(directory.fileName()):
- warnings.warn(f'Cannot create {native_dir_path}.',
- RuntimeWarning)
- return
- serialized_model = _serialize_model(self._model, dir_path)
- bookmark_file_name = os.path.join(native_dir_path, _bookmark_file)
- print(f'Writing {bookmark_file_name}...')
- with open(bookmark_file_name, 'w') as bookmark_file:
- json.dump(serialized_model, bookmark_file, indent=4)
-
- def _read_bookmarks(self):
- bookmark_file_name = os.path.join(QDir.toNativeSeparators(_config_dir()),
- _bookmark_file)
- if os.path.exists(bookmark_file_name):
- print(f'Reading {bookmark_file_name}...')
- return json.load(open(bookmark_file_name))
- return _default_bookmarks
-
- # Return a short title for a bookmark action,
- # "Qt | Cross Platform.." -> "Qt"
- @staticmethod
- def short_title(t):
- i = t.find(' | ')
- if i == -1:
- i = t.find(' - ')
- return t[0:i] if i != -1 else t