From 86fca5e201db59d1908b386941b2163eddf8250b Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 19 Jun 2022 19:52:06 +0530 Subject: [PATCH] Use only a single BusyCursor class --- src/calibre/gui2/actions/author_mapper.py | 2 +- src/calibre/gui2/actions/tag_mapper.py | 2 +- src/calibre/gui2/actions/view.py | 12 ++---------- src/calibre/gui2/device.py | 16 ++++------------ src/calibre/gui2/fts/scan.py | 2 +- src/calibre/gui2/fts/search.py | 2 +- src/calibre/gui2/init.py | 2 +- src/calibre/gui2/library/annotations.py | 12 ++---------- src/calibre/gui2/metadata/basic_widgets.py | 2 +- src/calibre/gui2/preferences/look_feel.py | 12 ++---------- src/calibre/gui2/tts/linux_config.py | 2 +- src/calibre/gui2/tts/macos_config.py | 2 +- src/calibre/gui2/tts/windows_config.py | 2 +- src/calibre/gui2/tweak_book/boss.py | 3 ++- src/calibre/gui2/tweak_book/char_select.py | 3 ++- src/calibre/gui2/tweak_book/check.py | 2 +- src/calibre/gui2/tweak_book/diff/view.py | 12 ++---------- .../gui2/tweak_book/editor/syntax/base.py | 2 +- src/calibre/gui2/tweak_book/manage_fonts.py | 3 ++- src/calibre/gui2/tweak_book/search.py | 2 +- src/calibre/gui2/tweak_book/text_search.py | 2 +- src/calibre/gui2/tweak_book/widgets.py | 11 +---------- src/calibre/gui2/viewer/ui.py | 2 +- src/calibre/gui2/widgets.py | 10 ++++++++++ 24 files changed, 43 insertions(+), 79 deletions(-) diff --git a/src/calibre/gui2/actions/author_mapper.py b/src/calibre/gui2/actions/author_mapper.py index 55e9f50201..efa842b4a8 100644 --- a/src/calibre/gui2/actions/author_mapper.py +++ b/src/calibre/gui2/actions/author_mapper.py @@ -29,7 +29,7 @@ class AuthorMapAction(InterfaceAction): def do_map(self, book_ids, selected): from calibre.ebooks.metadata.author_mapper import map_authors, compile_rules from calibre.gui2.author_mapper import RulesDialog - from calibre.gui2.device import BusyCursor + from calibre.gui2.widgets import BusyCursor d = RulesDialog(self.gui) d.setWindowTitle(ngettext( 'Map authors for one book in the library', diff --git a/src/calibre/gui2/actions/tag_mapper.py b/src/calibre/gui2/actions/tag_mapper.py index df1e31bd02..83c9ccc402 100644 --- a/src/calibre/gui2/actions/tag_mapper.py +++ b/src/calibre/gui2/actions/tag_mapper.py @@ -30,7 +30,7 @@ class TagMapAction(InterfaceAction): def do_map(self, book_ids, selected): from calibre.ebooks.metadata.tag_mapper import map_tags from calibre.gui2.tag_mapper import RulesDialog - from calibre.gui2.device import BusyCursor + from calibre.gui2.widgets import BusyCursor d = RulesDialog(self.gui) d.setWindowTitle(ngettext( 'Map tags for one book in the library', diff --git a/src/calibre/gui2/actions/view.py b/src/calibre/gui2/actions/view.py index c740554f26..fbf6d00226 100644 --- a/src/calibre/gui2/actions/view.py +++ b/src/calibre/gui2/actions/view.py @@ -9,7 +9,7 @@ import json import os import time from functools import partial -from qt.core import QAction, QIcon, Qt, pyqtSignal, QDialog, QApplication, QCursor +from qt.core import QAction, QIcon, pyqtSignal, QDialog from calibre.constants import ismacos, iswindows from calibre.gui2 import ( @@ -23,15 +23,6 @@ from calibre.utils.config import prefs, tweaks from polyglot.builtins import as_bytes -class BusyCursor: - - def __enter__(self): - QApplication.setOverrideCursor(QCursor(Qt.CursorShape.WaitCursor)) - - def __exit__(self, *args): - QApplication.restoreOverrideCursor() - - def preferred_format(formats): formats = tuple(x.upper() for x in formats if x) fmt = formats[0] @@ -168,6 +159,7 @@ class ViewAction(InterfaceAction): self._view_file(job.result) def _launch_viewer(self, name=None, viewer='ebook-viewer', internal=True, calibre_book_data=None, open_at=None): + from calibre.gui2.widgets import BusyCursor with BusyCursor(): if internal: args = [viewer] diff --git a/src/calibre/gui2/device.py b/src/calibre/gui2/device.py index 1de202374a..c44b9e6f59 100644 --- a/src/calibre/gui2/device.py +++ b/src/calibre/gui2/device.py @@ -6,9 +6,9 @@ import os, traceback, time, io, re, sys, weakref from threading import Thread, Event from qt.core import ( - QMenu, QAction, QActionGroup, QIcon, Qt, pyqtSignal, QDialog, - QObject, QVBoxLayout, QDialogButtonBox, QCursor, QCoreApplication, - QApplication, QEventLoop, QTimer) + QMenu, QAction, QActionGroup, QIcon, pyqtSignal, QDialog, + QObject, QVBoxLayout, QDialogButtonBox, QCoreApplication, + QEventLoop, QTimer) from calibre.customize.ui import (available_input_formats, available_output_formats, device_plugins, disabled_device_plugins) @@ -22,6 +22,7 @@ from calibre.devices.scanner import DeviceScanner from calibre.gui2 import (config, error_dialog, Dispatcher, dynamic, warning_dialog, info_dialog, choose_dir, FunctionDispatcher, show_restart_warning, gprefs, question_dialog) +from calibre.gui2.widgets import BusyCursor from calibre.ebooks.metadata import authors_to_string from calibre import preferred_encoding, prints, force_unicode, as_unicode, sanitize_file_name from calibre.utils.filenames import ascii_filename @@ -123,15 +124,6 @@ def device_name_for_plugboards(device_class): return device_class.__class__.__name__ -class BusyCursor: - - def __enter__(self): - QApplication.setOverrideCursor(QCursor(Qt.CursorShape.WaitCursor)) - - def __exit__(self, *args): - QApplication.restoreOverrideCursor() - - def convert_open_popup(opm, skip_key): class OPM(OpenFeedback): diff --git a/src/calibre/gui2/fts/scan.py b/src/calibre/gui2/fts/scan.py index 1c5ccf972f..01f86016f0 100644 --- a/src/calibre/gui2/fts/scan.py +++ b/src/calibre/gui2/fts/scan.py @@ -229,7 +229,7 @@ class ScanStatus(QWidget): 'This will force calibre to re-index all the books in this library, which' ' can take a long time. Are you sure?'), 'fts-reindex-confirm', self): return - from calibre.gui2.device import BusyCursor + from calibre.gui2.widgets import BusyCursor with BusyCursor(): self.db.reindex_fts() diff --git a/src/calibre/gui2/fts/search.py b/src/calibre/gui2/fts/search.py index f6ae8f14da..0bcfde6a2f 100644 --- a/src/calibre/gui2/fts/search.py +++ b/src/calibre/gui2/fts/search.py @@ -24,7 +24,7 @@ from calibre.db import FTSQueryError from calibre.ebooks.metadata import authors_to_string, fmt_sidx from calibre.gui2 import config, error_dialog, gprefs, question_dialog, safe_open_url from calibre.gui2.fts.utils import get_db -from calibre.gui2.library.annotations import BusyCursor +from calibre.gui2.widgets import BusyCursor from calibre.gui2.progress_indicator import ProgressIndicator from calibre.gui2.ui import get_gui from calibre.gui2.viewer.widgets import ResultsDelegate, SearchBox diff --git a/src/calibre/gui2/init.py b/src/calibre/gui2/init.py index 0e95fe8161..c19f4a241c 100644 --- a/src/calibre/gui2/init.py +++ b/src/calibre/gui2/init.py @@ -767,7 +767,7 @@ class LayoutMixin: # {{{ fmt), show=True) def bd_edit_book(self, book_id, fmt): - from calibre.gui2.device import BusyCursor + from calibre.gui2.widgets import BusyCursor with BusyCursor(): self.iactions['Tweak ePub'].ebook_edit_format(book_id, fmt) diff --git a/src/calibre/gui2/library/annotations.py b/src/calibre/gui2/library/annotations.py index 08af59130a..17a2b7b776 100644 --- a/src/calibre/gui2/library/annotations.py +++ b/src/calibre/gui2/library/annotations.py @@ -7,7 +7,7 @@ import os import re from functools import lru_cache, partial from qt.core import ( - QAbstractItemView, QApplication, QCheckBox, QComboBox, QCursor, QDateTime, + QAbstractItemView, QApplication, QCheckBox, QComboBox, QDateTime, QDialog, QDialogButtonBox, QFont, QFormLayout, QFrame, QHBoxLayout, QIcon, QKeySequence, QLabel, QLocale, QMenu, QPalette, QPlainTextEdit, QSize, QSplitter, Qt, QTextBrowser, QTimer, QToolButton, QTreeWidget, QTreeWidgetItem, QVBoxLayout, @@ -27,6 +27,7 @@ from calibre.gui2 import ( ) from calibre.gui2.dialogs.confirm_delete import confirm from calibre.gui2.viewer.widgets import ResultsDelegate, SearchBox +from calibre.gui2.widgets import BusyCursor from calibre.gui2.widgets2 import Dialog, RightClickButton @@ -328,15 +329,6 @@ def current_db(): return (getattr(current_db, 'ans', None) or get_gui().current_db).new_api -class BusyCursor: - - def __enter__(self): - QApplication.setOverrideCursor(QCursor(Qt.CursorShape.WaitCursor)) - - def __exit__(self, *args): - QApplication.restoreOverrideCursor() - - class ResultsList(QTreeWidget): current_result_changed = pyqtSignal(object) diff --git a/src/calibre/gui2/metadata/basic_widgets.py b/src/calibre/gui2/metadata/basic_widgets.py index 9f90268ae8..57ac27b21b 100644 --- a/src/calibre/gui2/metadata/basic_widgets.py +++ b/src/calibre/gui2/metadata/basic_widgets.py @@ -1040,7 +1040,7 @@ class FormatsManager(QWidget): self.dialog.do_view_format(item.path, item.ext) def edit_format(self, item, *args): - from calibre.gui2.device import BusyCursor + from calibre.gui2.widgets import BusyCursor with BusyCursor(): self.dialog.do_edit_format(item.path, item.ext) diff --git a/src/calibre/gui2/preferences/look_feel.py b/src/calibre/gui2/preferences/look_feel.py index 11d187458f..472184974e 100644 --- a/src/calibre/gui2/preferences/look_feel.py +++ b/src/calibre/gui2/preferences/look_feel.py @@ -11,7 +11,7 @@ from threading import Thread from qt.core import ( QApplication, QFont, QFontInfo, QFontDialog, QColorDialog, QPainter, QDialog, - QAbstractListModel, Qt, QIcon, QKeySequence, QColor, pyqtSignal, QCursor, QHeaderView, QListWidgetItem, + QAbstractListModel, Qt, QIcon, QKeySequence, QColor, pyqtSignal, QHeaderView, QListWidgetItem, QWidget, QSizePolicy, QBrush, QPixmap, QSize, QPushButton, QVBoxLayout, QItemSelectionModel, QTableWidget, QTableWidgetItem, QLabel, QFormLayout, QLineEdit, QComboBox, QDialogButtonBox ) @@ -34,21 +34,13 @@ from calibre.gui2.book_details import get_field_list from calibre.gui2.dialogs.quickview import get_qv_field_list from calibre.gui2.preferences.coloring import EditRules from calibre.gui2.library.alternate_views import auto_height, CM_TO_INCH +from calibre.gui2.widgets import BusyCursor from calibre.gui2.widgets2 import Dialog from calibre.gui2.actions.show_quickview import get_quickview_action_plugin from calibre.utils.resources import set_data from polyglot.builtins import iteritems -class BusyCursor: - - def __enter__(self): - QApplication.setOverrideCursor(QCursor(Qt.CursorShape.WaitCursor)) - - def __exit__(self, *args): - QApplication.restoreOverrideCursor() - - class DefaultAuthorLink(QWidget): # {{{ changed_signal = pyqtSignal() diff --git a/src/calibre/gui2/tts/linux_config.py b/src/calibre/gui2/tts/linux_config.py index 4d5e3e8429..e331437d68 100644 --- a/src/calibre/gui2/tts/linux_config.py +++ b/src/calibre/gui2/tts/linux_config.py @@ -8,7 +8,7 @@ from qt.core import ( QWidget ) -from calibre.gui2.preferences.look_feel import BusyCursor +from calibre.gui2.widgets import BusyCursor class VoicesModel(QAbstractTableModel): diff --git a/src/calibre/gui2/tts/macos_config.py b/src/calibre/gui2/tts/macos_config.py index 0faf4ee146..ee03c8df2a 100644 --- a/src/calibre/gui2/tts/macos_config.py +++ b/src/calibre/gui2/tts/macos_config.py @@ -7,7 +7,7 @@ from qt.core import ( QItemSelectionModel, QSlider, QSortFilterProxyModel, Qt, QTableView, QWidget ) -from calibre.gui2.preferences.look_feel import BusyCursor +from calibre.gui2.widgets import BusyCursor class VoicesModel(QAbstractTableModel): diff --git a/src/calibre/gui2/tts/windows_config.py b/src/calibre/gui2/tts/windows_config.py index 2f8a885602..c3743aacd1 100644 --- a/src/calibre/gui2/tts/windows_config.py +++ b/src/calibre/gui2/tts/windows_config.py @@ -8,7 +8,7 @@ from qt.core import ( QWidget ) -from calibre.gui2.preferences.look_feel import BusyCursor +from calibre.gui2.widgets import BusyCursor class VoicesModel(QAbstractTableModel): diff --git a/src/calibre/gui2/tweak_book/boss.py b/src/calibre/gui2/tweak_book/boss.py index d73208148b..e2bcd70b80 100644 --- a/src/calibre/gui2/tweak_book/boss.py +++ b/src/calibre/gui2/tweak_book/boss.py @@ -60,11 +60,12 @@ from calibre.gui2.tweak_book.spell import ( from calibre.gui2.tweak_book.toc import TOCEditor from calibre.gui2.tweak_book.undo import GlobalUndoHistory from calibre.gui2.tweak_book.widgets import ( - AddCover, BusyCursor, FilterCSS, ImportForeign, InsertLink, InsertSemantics, + AddCover, FilterCSS, ImportForeign, InsertLink, InsertSemantics, InsertTag, MultiSplit, QuickOpen, RationalizeFolders ) from calibre.ptempfile import PersistentTemporaryDirectory, TemporaryDirectory from calibre.utils.config import JSONConfig +from calibre.gui2.widgets import BusyCursor from calibre.utils.icu import numeric_sort_key from calibre.utils.imghdr import identify from calibre.utils.tdir_in_cache import tdir_in_cache diff --git a/src/calibre/gui2/tweak_book/char_select.py b/src/calibre/gui2/tweak_book/char_select.py index 9300805dfa..59cc8d6be7 100644 --- a/src/calibre/gui2/tweak_book/char_select.py +++ b/src/calibre/gui2/tweak_book/char_select.py @@ -16,7 +16,8 @@ from qt.core import ( ) from calibre.gui2.tweak_book import tprefs -from calibre.gui2.tweak_book.widgets import BusyCursor, Dialog +from calibre.gui2.tweak_book.widgets import Dialog +from calibre.gui2.widgets import BusyCursor from calibre.gui2.widgets2 import HistoryLineEdit2 from calibre.utils.icu import safe_chr as codepoint_to_chr from calibre.utils.unicode_names import character_name_from_code, points_for_word diff --git a/src/calibre/gui2/tweak_book/check.py b/src/calibre/gui2/tweak_book/check.py index 7682dca289..71e0883b16 100644 --- a/src/calibre/gui2/tweak_book/check.py +++ b/src/calibre/gui2/tweak_book/check.py @@ -15,7 +15,7 @@ from calibre.ebooks.oeb.polish.check.base import WARN, INFO, DEBUG, ERROR, CRITI from calibre.ebooks.oeb.polish.check.main import run_checks, fix_errors from calibre.gui2 import NO_URL_FORMATTING, safe_open_url from calibre.gui2.tweak_book import tprefs -from calibre.gui2.tweak_book.widgets import BusyCursor +from calibre.gui2.widgets import BusyCursor def icon_for_level(level): diff --git a/src/calibre/gui2/tweak_book/diff/view.py b/src/calibre/gui2/tweak_book/diff/view.py index 23edc58b12..db1d068542 100644 --- a/src/calibre/gui2/tweak_book/diff/view.py +++ b/src/calibre/gui2/tweak_book/diff/view.py @@ -10,7 +10,7 @@ from functools import partial from itertools import chain from math import ceil from qt.core import ( - QApplication, QBrush, QColor, QCursor, QEvent, QEventLoop, QFont, QHBoxLayout, + QApplication, QBrush, QColor, QEvent, QEventLoop, QFont, QHBoxLayout, QIcon, QImage, QKeySequence, QMenu, QPainter, QPainterPath, QPalette, QPen, QPixmap, QPlainTextEdit, QRect, QScrollBar, QSplitter, QSplitterHandle, Qt, QTextCharFormat, QTextCursor, QTextLayout, QTimer, QWidget, pyqtSignal @@ -25,6 +25,7 @@ from calibre.gui2.tweak_book.editor.text import ( LineNumbers, PlainTextEdit, default_font_family ) from calibre.gui2.tweak_book.editor.themes import get_theme, theme_color +from calibre.gui2.widgets import BusyCursor from calibre.utils.icu import utf16_length from calibre.utils.xml_parse import safe_xml_fromstring from polyglot.builtins import as_bytes, iteritems @@ -32,15 +33,6 @@ from polyglot.builtins import as_bytes, iteritems Change = namedtuple('Change', 'ltop lbot rtop rbot kind') -class BusyCursor: - - def __enter__(self): - QApplication.setOverrideCursor(QCursor(Qt.CursorShape.WaitCursor)) - - def __exit__(self, *args): - QApplication.restoreOverrideCursor() - - def beautify_text(raw, syntax): from lxml import etree diff --git a/src/calibre/gui2/tweak_book/editor/syntax/base.py b/src/calibre/gui2/tweak_book/editor/syntax/base.py index 150b40af9a..e7f8e87772 100644 --- a/src/calibre/gui2/tweak_book/editor/syntax/base.py +++ b/src/calibre/gui2/tweak_book/editor/syntax/base.py @@ -8,7 +8,7 @@ from collections import defaultdict, deque from qt.core import QTextCursor, QTextBlockUserData, QTextLayout, QTimer from ..themes import highlight_to_char_format -from calibre.gui2.tweak_book.widgets import BusyCursor +from calibre.gui2.widgets import BusyCursor from calibre.utils.icu import utf16_length from polyglot.builtins import iteritems diff --git a/src/calibre/gui2/tweak_book/manage_fonts.py b/src/calibre/gui2/tweak_book/manage_fonts.py index 9608c9daea..dd082c518d 100644 --- a/src/calibre/gui2/tweak_book/manage_fonts.py +++ b/src/calibre/gui2/tweak_book/manage_fonts.py @@ -16,7 +16,8 @@ from calibre.ebooks.oeb.polish.container import get_container from calibre.ebooks.oeb.polish.fonts import font_family_data, change_font from calibre.gui2 import error_dialog, info_dialog from calibre.gui2.tweak_book import current_container, set_current_container -from calibre.gui2.tweak_book.widgets import Dialog, BusyCursor +from calibre.gui2.tweak_book.widgets import Dialog +from calibre.gui2.widgets import BusyCursor from calibre.utils.icu import primary_sort_key as sort_key from calibre.utils.fonts.scanner import font_scanner, NoFonts from calibre.utils.fonts.metadata import FontMetadata, UnsupportedFont diff --git a/src/calibre/gui2/tweak_book/search.py b/src/calibre/gui2/tweak_book/search.py index 0525426541..a517eda8e0 100644 --- a/src/calibre/gui2/tweak_book/search.py +++ b/src/calibre/gui2/tweak_book/search.py @@ -33,7 +33,7 @@ from calibre.gui2.tweak_book.function_replace import ( Function, FunctionBox, FunctionEditor, functions as replace_functions, remove_function ) -from calibre.gui2.tweak_book.widgets import BusyCursor +from calibre.gui2.widgets import BusyCursor from calibre.gui2.widgets2 import FlowLayout, HistoryComboBox from calibre.utils.icu import primary_contains from polyglot.builtins import error_message, iteritems diff --git a/src/calibre/gui2/tweak_book/text_search.py b/src/calibre/gui2/tweak_book/text_search.py index ddb543e9f7..5f28212c4e 100644 --- a/src/calibre/gui2/tweak_book/text_search.py +++ b/src/calibre/gui2/tweak_book/text_search.py @@ -12,7 +12,7 @@ from calibre import prepare_string_for_xml from calibre.gui2 import error_dialog from calibre.gui2.tweak_book import tprefs, editors, current_container from calibre.gui2.tweak_book.search import get_search_regex, InvalidRegex, initialize_search_request -from calibre.gui2.tweak_book.widgets import BusyCursor +from calibre.gui2.widgets import BusyCursor from calibre.gui2.widgets2 import HistoryComboBox from polyglot.builtins import iteritems, error_message diff --git a/src/calibre/gui2/tweak_book/widgets.py b/src/calibre/gui2/tweak_book/widgets.py index 9ac314e9a6..5950773056 100644 --- a/src/calibre/gui2/tweak_book/widgets.py +++ b/src/calibre/gui2/tweak_book/widgets.py @@ -10,7 +10,7 @@ import unicodedata from collections import OrderedDict from math import ceil from qt.core import ( - QAbstractListModel, QApplication, QCheckBox, QComboBox, QCursor, QDialog, + QAbstractListModel, QApplication, QCheckBox, QComboBox, QDialog, QDialogButtonBox, QEvent, QFormLayout, QFrame, QGridLayout, QGroupBox, QHBoxLayout, QIcon, QItemSelectionModel, QLabel, QLineEdit, QListView, QMimeData, QModelIndex, QPainter, QPalette, QPixmap, QPlainTextEdit, QPoint, QRect, QSize, @@ -45,15 +45,6 @@ from polyglot.builtins import iteritems ROOT = QModelIndex() -class BusyCursor: - - def __enter__(self): - QApplication.setOverrideCursor(QCursor(Qt.CursorShape.WaitCursor)) - - def __exit__(self, *args): - QApplication.restoreOverrideCursor() - - class Dialog(BaseDialog): def __init__(self, title, name, parent=None): diff --git a/src/calibre/gui2/viewer/ui.py b/src/calibre/gui2/viewer/ui.py index 68a883522d..cc30c15be0 100644 --- a/src/calibre/gui2/viewer/ui.py +++ b/src/calibre/gui2/viewer/ui.py @@ -741,7 +741,7 @@ class EbookViewer(MainWindow): cmd = [exe] if selected_text: cmd += ['--select-text', selected_text] - from calibre.gui2.tweak_book.widgets import BusyCursor + from calibre.gui2.widgets import BusyCursor with sanitize_env_vars(): subprocess.Popen(cmd + [path, file_name]) with BusyCursor(): diff --git a/src/calibre/gui2/widgets.py b/src/calibre/gui2/widgets.py index 0a84eb9ee2..be60c4a0d2 100644 --- a/src/calibre/gui2/widgets.py +++ b/src/calibre/gui2/widgets.py @@ -1299,6 +1299,16 @@ class PaperSizes(QComboBox): # {{{ # }}} +class BusyCursor: # {{{ + + def __enter__(self): + QApplication.setOverrideCursor(QCursor(Qt.CursorShape.WaitCursor)) + + def __exit__(self, *args): + QApplication.restoreOverrideCursor() +# }}} + + if __name__ == '__main__': from qt.core import QTextEdit app = QApplication([])