From 02343fd965f7a553e28634bce201f608b51b5f8d Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 27 Dec 2019 09:21:25 +0530 Subject: [PATCH] Possible fix for offscreen dialogs on windows See https://bugreports.qt.io/browse/QTBUG-77385 --- src/calibre/customize/__init__.py | 3 ++- src/calibre/gui2/__init__.py | 13 +++++++++++++ src/calibre/gui2/convert/bulk.py | 4 ++-- src/calibre/gui2/convert/regex_builder.py | 4 ++-- src/calibre/gui2/convert/single.py | 4 ++-- src/calibre/gui2/cover_flow.py | 10 +++++----- src/calibre/gui2/covers.py | 4 ++-- src/calibre/gui2/dialogs/authors_edit.py | 2 +- src/calibre/gui2/dialogs/book_info.py | 4 ++-- src/calibre/gui2/dialogs/catalog.py | 4 ++-- src/calibre/gui2/dialogs/comments_dialog.py | 4 ++-- src/calibre/gui2/dialogs/duplicates.py | 2 +- src/calibre/gui2/dialogs/edit_authors_dialog.py | 2 +- src/calibre/gui2/dialogs/match_books.py | 2 +- src/calibre/gui2/dialogs/message_box.py | 2 +- src/calibre/gui2/dialogs/metadata_bulk.py | 2 +- src/calibre/gui2/dialogs/plugin_updater.py | 4 ++-- src/calibre/gui2/dialogs/quickview.py | 2 +- src/calibre/gui2/dialogs/scheduler.py | 5 ++--- src/calibre/gui2/dialogs/tag_editor.py | 4 ++-- src/calibre/gui2/dialogs/tag_list_editor.py | 4 ++-- src/calibre/gui2/dialogs/trim_image.py | 2 +- src/calibre/gui2/image_popup.py | 2 +- src/calibre/gui2/jobs.py | 2 +- src/calibre/gui2/metadata/diff.py | 2 +- src/calibre/gui2/metadata/single.py | 8 ++++---- src/calibre/gui2/metadata/single_download.py | 4 ++-- src/calibre/gui2/preferences/__init__.py | 4 ++-- src/calibre/gui2/preferences/main.py | 2 +- src/calibre/gui2/store/search/search.py | 6 +++--- .../gui2/store/stores/mobileread/store_dialog.py | 4 ++-- src/calibre/gui2/store/web_store.py | 4 ++-- src/calibre/gui2/toc/main.py | 4 ++-- src/calibre/gui2/tweak_book/preferences.py | 4 ++-- src/calibre/gui2/tweak_book/toc.py | 2 +- src/calibre/gui2/tweak_book/ui.py | 2 +- src/calibre/gui2/ui.py | 2 +- src/calibre/gui2/viewer/ui.py | 2 +- src/calibre/gui2/widgets2.py | 2 +- 39 files changed, 78 insertions(+), 65 deletions(-) diff --git a/src/calibre/customize/__init__.py b/src/calibre/customize/__init__.py index c5fa7d841c..8878fb8a69 100644 --- a/src/calibre/customize/__init__.py +++ b/src/calibre/customize/__init__.py @@ -147,7 +147,8 @@ class Plugin(object): # {{{ if geom is None: config_dialog.resize(config_dialog.sizeHint()) else: - config_dialog.restoreGeometry(geom) + from PyQt5.Qt import QApplication + QApplication.instance().safe_restore_geometry(config_dialog, geom) button_box.accepted.connect(config_dialog.accept) button_box.rejected.connect(config_dialog.reject) diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py index 26b52a76b8..2785fd730a 100644 --- a/src/calibre/gui2/__init__.py +++ b/src/calibre/gui2/__init__.py @@ -973,6 +973,19 @@ class Application(QApplication): if cft >= 0: self.setCursorFlashTime(int(cft)) + def safe_restore_geometry(self, widget, geom): + # See https://bugreports.qt.io/browse/QTBUG-77385 + if not geom: + return + restored = widget.restoreGeometry(geom) + screen_rect = self.desktop().availableGeometry(widget) + if not widget.geometry().intersects(screen_rect): + w = min(widget.width(), screen_rect.width() - 10) + h = min(widget.height(), screen_rect.height() - 10) + widget.resize(w, h) + widget.move((screen_rect.width() - w) // 2, (screen_rect.height() - h) // 2) + return restored + def setup_ui_font(self): f = QFont(QApplication.font()) q = (f.family(), f.pointSize()) diff --git a/src/calibre/gui2/convert/bulk.py b/src/calibre/gui2/convert/bulk.py index 8d02c60ace..be9641e4c5 100644 --- a/src/calibre/gui2/convert/bulk.py +++ b/src/calibre/gui2/convert/bulk.py @@ -7,7 +7,7 @@ __docformat__ = 'restructuredtext en' import shutil -from PyQt5.Qt import QModelIndex, QDialog +from PyQt5.Qt import QModelIndex, QDialog, QApplication from calibre.gui2.convert.single import Config, GroupModel, gprefs from calibre.gui2.convert.look_and_feel import LookAndFeelWidget @@ -63,7 +63,7 @@ class BulkConfig(Config): geom = gprefs.get('convert_bulk_dialog_geom', None) if geom: - self.restoreGeometry(geom) + QApplication.instance().safe_restore_geometry(self, geom) else: self.resize(self.sizeHint()) diff --git a/src/calibre/gui2/convert/regex_builder.py b/src/calibre/gui2/convert/regex_builder.py index 7e5874e358..9ac5385dbd 100644 --- a/src/calibre/gui2/convert/regex_builder.py +++ b/src/calibre/gui2/convert/regex_builder.py @@ -7,7 +7,7 @@ __docformat__ = 'restructuredtext en' import os -from PyQt5.Qt import (QDialog, QWidget, QDialogButtonBox, +from PyQt5.Qt import (QDialog, QWidget, QDialogButtonBox, QApplication, QBrush, QTextCursor, QTextEdit, QByteArray, Qt, pyqtSignal) from calibre.gui2.convert.regex_builder_ui import Ui_RegexBuilder @@ -52,7 +52,7 @@ class RegexBuilder(QDialog, Ui_RegexBuilder): self.match_locs = [] geom = gprefs.get('regex_builder_geometry', None) if geom is not None: - self.restoreGeometry(QByteArray(geom)) + QApplication.instance().safe_restore_geometry(self, QByteArray(geom)) self.finished.connect(self.save_state) def save_state(self, result): diff --git a/src/calibre/gui2/convert/single.py b/src/calibre/gui2/convert/single.py index 4f053cce3b..89575180e6 100644 --- a/src/calibre/gui2/convert/single.py +++ b/src/calibre/gui2/convert/single.py @@ -10,7 +10,7 @@ from PyQt5.Qt import ( QAbstractListModel, QCheckBox, QComboBox, QCoreApplication, QDialog, QDialogButtonBox, QFont, QFrame, QGridLayout, QHBoxLayout, QIcon, QLabel, QListView, QModelIndex, QScrollArea, QSize, QSizePolicy, QSpacerItem, - Qt, QTextEdit, QWidget + Qt, QTextEdit, QWidget, QApplication ) from calibre.customize.conversion import OptionRecommendation @@ -94,7 +94,7 @@ class Config(QDialog): self.groups.setMouseTracking(True) geom = gprefs.get('convert_single_dialog_geom', None) if geom: - self.restoreGeometry(geom) + QApplication.instance().safe_restore_geometry(self, geom) else: self.resize(self.sizeHint()) diff --git a/src/calibre/gui2/cover_flow.py b/src/calibre/gui2/cover_flow.py index a482b3e3a3..50d320ad3d 100644 --- a/src/calibre/gui2/cover_flow.py +++ b/src/calibre/gui2/cover_flow.py @@ -12,7 +12,7 @@ Module to implement the Cover Flow feature import sys, os, time from PyQt5.Qt import (QImage, QSizePolicy, QTimer, QDialog, Qt, QSize, QAction, - QStackedLayout, QLabel, pyqtSignal, QKeySequence, QFont) + QStackedLayout, QLabel, pyqtSignal, QKeySequence, QFont, QApplication) from calibre import plugins from calibre.ebooks.metadata import rating_to_stars @@ -243,7 +243,7 @@ class CBDialog(QDialog): self.layout().addWidget(cover_flow) geom = gprefs.get('cover_browser_dialog_geometry', None) - if not geom or not self.restoreGeometry(geom): + if not geom or not QApplication.instance().safe_restore_geometry(self, geom): h, w = available_height()-60, int(available_width()/1.5) self.resize(w, h) self.action_fs_toggle = a = QAction(self) @@ -279,7 +279,7 @@ class CBDialog(QDialog): def show_normal(self): self.showNormal() if self.pre_fs_geom is not None: - self.restoreGeometry(self.pre_fs_geom) + QApplication.instance().safe_restore_geometry(self, self.pre_fs_geom) self.pre_fs_geom = None def show_fullscreen(self): @@ -454,7 +454,7 @@ class CoverFlowMixin(object): def test(): - from PyQt5.Qt import QApplication, QMainWindow + from PyQt5.Qt import QMainWindow app = QApplication([]) w = QMainWindow() cf = CoverFlow() @@ -475,7 +475,7 @@ def main(args=sys.argv): if __name__ == '__main__': - from PyQt5.Qt import QApplication, QMainWindow + from PyQt5.Qt import QMainWindow app = QApplication([]) w = QMainWindow() cf = CoverFlow() diff --git a/src/calibre/gui2/covers.py b/src/calibre/gui2/covers.py index 47a36249b3..7495f1049e 100644 --- a/src/calibre/gui2/covers.py +++ b/src/calibre/gui2/covers.py @@ -10,7 +10,7 @@ from collections import OrderedDict from PyQt5.Qt import ( QWidget, QHBoxLayout, QTabWidget, QLabel, QSizePolicy, QSize, QFormLayout, QSpinBox, pyqtSignal, QPixmap, QDialog, QVBoxLayout, QDialogButtonBox, - QListWidget, QListWidgetItem, Qt, QGridLayout, QPushButton, QIcon, + QListWidget, QListWidgetItem, Qt, QGridLayout, QPushButton, QIcon, QApplication, QColorDialog, QToolButton, QLineEdit, QColor, QFrame, QTimer, QCheckBox) from calibre.ebooks.covers import all_styles, cprefs, generate_cover, override_prefs, default_color_themes @@ -530,7 +530,7 @@ class CoverSettingsDialog(QDialog): self.resize(self.sizeHint()) geom = gprefs.get('cover_settings_dialog_geom', None) if geom is not None: - self.restoreGeometry(geom) + QApplication.instance().safe_restore_geometry(self, geom) self.prefs_for_rendering = None def restore_defaults(self): diff --git a/src/calibre/gui2/dialogs/authors_edit.py b/src/calibre/gui2/dialogs/authors_edit.py index 38d09de441..1aecf58b94 100644 --- a/src/calibre/gui2/dialogs/authors_edit.py +++ b/src/calibre/gui2/dialogs/authors_edit.py @@ -159,7 +159,7 @@ class AuthorsEdit(QDialog): self.resize(self.sizeHint() + QSize(150, 100)) geom = gprefs.get('authors-edit-geometry', None) if geom is not None: - self.restoreGeometry(geom) + QApplication.instance().safe_restore_geometry(self, geom) self.author.setFocus(Qt.OtherFocusReason) def save_geometry(self): diff --git a/src/calibre/gui2/dialogs/book_info.py b/src/calibre/gui2/dialogs/book_info.py index b08395f698..8ee43c5fd5 100644 --- a/src/calibre/gui2/dialogs/book_info.py +++ b/src/calibre/gui2/dialogs/book_info.py @@ -8,7 +8,7 @@ from PyQt5.Qt import ( QBrush, QCheckBox, QCoreApplication, QDialog, QGridLayout, QHBoxLayout, QIcon, QKeySequence, QLabel, QListView, QModelIndex, QPalette, QPixmap, QPushButton, QShortcut, QSize, QSplitter, Qt, QTimer, QToolButton, QVBoxLayout, QWidget, - pyqtSignal + pyqtSignal, QApplication ) from calibre import fit_image @@ -192,7 +192,7 @@ class BookInfo(QDialog): saved_layout = gprefs.get('book_info_dialog_layout', None) if saved_layout is not None: try: - self.restoreGeometry(saved_layout[0]) + QApplication.instance().safe_restore_geometry(self, saved_layout[0]) self.splitter.restoreState(saved_layout[1]) except Exception: pass diff --git a/src/calibre/gui2/dialogs/catalog.py b/src/calibre/gui2/dialogs/catalog.py index 6230b0b4c8..f4701ea6cf 100644 --- a/src/calibre/gui2/dialogs/catalog.py +++ b/src/calibre/gui2/dialogs/catalog.py @@ -8,7 +8,7 @@ __docformat__ = 'restructuredtext en' import os, sys, importlib, weakref -from PyQt5.Qt import QDialog, QCoreApplication, QSize, QScrollArea +from PyQt5.Qt import QDialog, QCoreApplication, QSize, QScrollArea, QApplication from calibre.customize.ui import config from calibre.gui2.dialogs.catalog_ui import Ui_Dialog @@ -130,7 +130,7 @@ class Catalog(QDialog, Ui_Dialog): geom = dynamic.get('catalog_window_geom', None) if geom is not None: - self.restoreGeometry(bytes(geom)) + QApplication.instance().safe_restore_geometry(self, bytes(geom)) else: self.resize(self.sizeHint()) d = QCoreApplication.instance().desktop() diff --git a/src/calibre/gui2/dialogs/comments_dialog.py b/src/calibre/gui2/dialogs/comments_dialog.py index 2588b8b7b6..13c4d72b8a 100644 --- a/src/calibre/gui2/dialogs/comments_dialog.py +++ b/src/calibre/gui2/dialogs/comments_dialog.py @@ -5,7 +5,7 @@ __copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' __docformat__ = 'restructuredtext en' __license__ = 'GPL v3' -from PyQt5.Qt import Qt, QDialog, QDialogButtonBox, QVBoxLayout, QPlainTextEdit, QSize +from PyQt5.Qt import Qt, QDialog, QDialogButtonBox, QVBoxLayout, QPlainTextEdit, QSize, QApplication from calibre.gui2 import gprefs, Application from calibre.gui2.dialogs.comments_dialog_ui import Ui_CommentsDialog @@ -35,7 +35,7 @@ class CommentsDialog(QDialog, Ui_CommentsDialog): geom = gprefs.get('comments_dialog_geom', None) if geom is not None: - self.restoreGeometry(geom) + QApplication.instance().safe_restore_geometry(self, geom) def save_geometry(self): gprefs.set('comments_dialog_geom', bytearray(self.saveGeometry())) diff --git a/src/calibre/gui2/dialogs/duplicates.py b/src/calibre/gui2/dialogs/duplicates.py index 961d6977fc..edf4a1f0a8 100644 --- a/src/calibre/gui2/dialogs/duplicates.py +++ b/src/calibre/gui2/dialogs/duplicates.py @@ -63,7 +63,7 @@ class DuplicatesQuestion(QDialog): self.resize(self.sizeHint()) geom = gprefs.get('duplicates-question-dialog-geometry', None) if geom is not None: - self.restoreGeometry(geom) + QApplication.instance().safe_restore_geometry(self, geom) self.exec_() def copy_to_clipboard(self): diff --git a/src/calibre/gui2/dialogs/edit_authors_dialog.py b/src/calibre/gui2/dialogs/edit_authors_dialog.py index b520bef2cb..df9ed83903 100644 --- a/src/calibre/gui2/dialogs/edit_authors_dialog.py +++ b/src/calibre/gui2/dialogs/edit_authors_dialog.py @@ -41,7 +41,7 @@ class EditAuthorsDialog(QDialog, Ui_EditAuthorsDialog): gprefs.get('manage_authors_table_widths', None) geom = gprefs.get('manage_authors_dialog_geometry', None) if geom: - self.restoreGeometry(QByteArray(geom)) + QApplication.instance().safe_restore_geometry(self, QByteArray(geom)) except Exception: pass diff --git a/src/calibre/gui2/dialogs/match_books.py b/src/calibre/gui2/dialogs/match_books.py index d1148c0f0b..184aa18c78 100644 --- a/src/calibre/gui2/dialogs/match_books.py +++ b/src/calibre/gui2/dialogs/match_books.py @@ -60,7 +60,7 @@ class MatchBooks(QDialog, Ui_MatchBooks): gprefs.get('match_books_dialog_books_table_widths', None) geom = gprefs.get('match_books_dialog_geometry', None) if geom: - self.restoreGeometry(QByteArray(geom)) + QApplication.instance().safe_restore_geometry(self, QByteArray(geom)) except: pass diff --git a/src/calibre/gui2/dialogs/message_box.py b/src/calibre/gui2/dialogs/message_box.py index 58a4d89edb..463bdf43b3 100644 --- a/src/calibre/gui2/dialogs/message_box.py +++ b/src/calibre/gui2/dialogs/message_box.py @@ -217,7 +217,7 @@ class ViewLog(QDialog): # {{{ self.resize(QSize(700, 500)) geom = gprefs.get(self.unique_name, None) if geom is not None: - self.restoreGeometry(geom) + QApplication.instance().safe_restore_geometry(self, geom) self.setModal(False) self.setWindowTitle(title) diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index b45b59bc5d..24d73f465e 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -552,7 +552,7 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog): self.central_widget.setCurrentIndex(tab) geom = gprefs.get('bulk_metadata_window_geometry', None) if geom is not None: - self.restoreGeometry(bytes(geom)) + QApplication.instance().safe_restore_geometry(self, bytes(geom)) else: self.resize(self.sizeHint()) ct = gprefs.get('bulk_metadata_window_tab', 0) diff --git a/src/calibre/gui2/dialogs/plugin_updater.py b/src/calibre/gui2/dialogs/plugin_updater.py index fe16c4a5d3..7e333cb87a 100644 --- a/src/calibre/gui2/dialogs/plugin_updater.py +++ b/src/calibre/gui2/dialogs/plugin_updater.py @@ -10,7 +10,7 @@ import re, datetime, traceback from lxml import html from PyQt5.Qt import (Qt, QUrl, QFrame, QVBoxLayout, QLabel, QBrush, QTextEdit, QComboBox, QAbstractItemView, QHBoxLayout, QDialogButtonBox, - QAbstractTableModel, QTableView, QModelIndex, + QAbstractTableModel, QTableView, QModelIndex, QApplication, QSortFilterProxyModel, QAction, QIcon, QDialog, QFont, QPixmap, QSize, QLineEdit) @@ -156,7 +156,7 @@ class SizePersistedDialog(QDialog): if self.geom is None: self.resize(self.sizeHint()+self.initial_extra_size) else: - self.restoreGeometry(self.geom) + QApplication.instance().safe_restore_geometry(self, self.geom) def dialog_closing(self, result): geom = bytearray(self.saveGeometry()) diff --git a/src/calibre/gui2/dialogs/quickview.py b/src/calibre/gui2/dialogs/quickview.py index d4e51817b7..d2328ea0c3 100644 --- a/src/calibre/gui2/dialogs/quickview.py +++ b/src/calibre/gui2/dialogs/quickview.py @@ -157,7 +157,7 @@ class Quickview(QDialog, Ui_Quickview): if not self.is_pane: geom = gprefs.get('quickview_dialog_geometry', None) if geom: - self.restoreGeometry(QByteArray(geom)) + QApplication.instance().safe_restore_geometry(self, QByteArray(geom)) except: pass diff --git a/src/calibre/gui2/dialogs/scheduler.py b/src/calibre/gui2/dialogs/scheduler.py index a1f1c1f605..05c8deb691 100644 --- a/src/calibre/gui2/dialogs/scheduler.py +++ b/src/calibre/gui2/dialogs/scheduler.py @@ -13,7 +13,7 @@ import calendar, textwrap from collections import OrderedDict from PyQt5.Qt import ( - QDialog, Qt, QTime, QObject, QMenu, QHBoxLayout, QAction, QIcon, QMutex, + QDialog, Qt, QTime, QObject, QMenu, QHBoxLayout, QAction, QIcon, QMutex, QApplication, QTimer, pyqtSignal, QWidget, QGridLayout, QCheckBox, QTimeEdit, QLabel, QLineEdit, QDoubleSpinBox, QSize, QTreeView, QSizePolicy, QToolButton, QScrollArea, QFrame, QVBoxLayout, QTabWidget, QSpacerItem, QGroupBox, @@ -373,7 +373,7 @@ class SchedulerDialog(QDialog): geom = gprefs.get('scheduler_dialog_geometry') if geom is not None: - self.restoreGeometry(geom) + QApplication.instance().safe_restore_geometry(self, geom) def sizeHint(self): return QSize(800, 600) @@ -729,7 +729,6 @@ class Scheduler(QObject): if __name__ == '__main__': - from PyQt5.Qt import QApplication app = QApplication([]) d = SchedulerDialog(RecipeModel()) d.exec_() diff --git a/src/calibre/gui2/dialogs/tag_editor.py b/src/calibre/gui2/dialogs/tag_editor.py index b801a37b73..d3b4c51195 100644 --- a/src/calibre/gui2/dialogs/tag_editor.py +++ b/src/calibre/gui2/dialogs/tag_editor.py @@ -3,7 +3,7 @@ from __future__ import absolute_import, division, print_function, unicode_litera __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -from PyQt5.Qt import Qt, QDialog, QAbstractItemView +from PyQt5.Qt import Qt, QDialog, QAbstractItemView, QApplication from calibre.gui2.dialogs.tag_editor_ui import Ui_TagEditor from calibre.gui2 import question_dialog, error_dialog, gprefs @@ -92,7 +92,7 @@ class TagEditor(QDialog, Ui_TagEditor): geom = gprefs.get('tag_editor_geometry', None) if geom is not None: - self.restoreGeometry(geom) + QApplication.instance().safe_restore_geometry(self, geom) def edit_box_changed(self, which): gprefs['tag_editor_last_filter'] = which diff --git a/src/calibre/gui2/dialogs/tag_list_editor.py b/src/calibre/gui2/dialogs/tag_list_editor.py index eaeaa62916..8d581f7924 100644 --- a/src/calibre/gui2/dialogs/tag_list_editor.py +++ b/src/calibre/gui2/dialogs/tag_list_editor.py @@ -4,7 +4,7 @@ from __future__ import absolute_import, division, print_function, unicode_literals from PyQt5.Qt import (Qt, QDialog, QTableWidgetItem, QIcon, QByteArray, QSize, - QDialogButtonBox, QTableWidget, QItemDelegate) + QDialogButtonBox, QTableWidget, QItemDelegate, QApplication) from calibre.gui2.dialogs.tag_list_editor_ui import Ui_TagListEditor from calibre.gui2.dialogs.confirm_delete import confirm @@ -169,7 +169,7 @@ class TagListEditor(QDialog, Ui_TagListEditor): try: geom = gprefs.get('tag_list_editor_dialog_geometry', None) if geom is not None: - self.restoreGeometry(QByteArray(geom)) + QApplication.instance().safe_restore_geometry(self, QByteArray(geom)) else: self.resize(self.sizeHint()+QSize(150, 100)) except: diff --git a/src/calibre/gui2/dialogs/trim_image.py b/src/calibre/gui2/dialogs/trim_image.py index 383636a95f..3dcd54e172 100644 --- a/src/calibre/gui2/dialogs/trim_image.py +++ b/src/calibre/gui2/dialogs/trim_image.py @@ -62,7 +62,7 @@ class TrimImage(QDialog): self.resize(QSize(900, 600)) geom = gprefs.get('image-trim-dialog-geometry', None) if geom is not None: - self.restoreGeometry(geom) + QApplication.instance().safe_restore_geometry(self, geom) self.setWindowIcon(self.trim_action.icon()) self.image_data = None diff --git a/src/calibre/gui2/image_popup.py b/src/calibre/gui2/image_popup.py index 325d6e0d15..d9a65f8c5e 100644 --- a/src/calibre/gui2/image_popup.py +++ b/src/calibre/gui2/image_popup.py @@ -164,7 +164,7 @@ class ImageView(QDialog): self.resize(QSize(int(geom.width()/2.5), geom.height()-50)) geom = gprefs.get(self.geom_name, None) if geom is not None: - self.restoreGeometry(geom) + QApplication.instance().safe_restore_geometry(self, geom) try: self.current_image_name = unicode_type(self.current_url.toString(NO_URL_FORMATTING)).rpartition('/')[-1] except AttributeError: diff --git a/src/calibre/gui2/jobs.py b/src/calibre/gui2/jobs.py index 66bf974c94..9e0f3f6a70 100644 --- a/src/calibre/gui2/jobs.py +++ b/src/calibre/gui2/jobs.py @@ -645,7 +645,7 @@ class JobsDialog(QDialog, Ui_JobsDialog): try: geom = gprefs.get('jobs_dialog_geometry', None) if geom: - self.restoreGeometry(QByteArray(geom)) + QApplication.instance().safe_restore_geometry(self, QByteArray(geom)) state = gprefs.get('jobs view column layout3', None) if state is not None: self.jobs_view.horizontalHeader().restoreState(QByteArray(state)) diff --git a/src/calibre/gui2/metadata/diff.py b/src/calibre/gui2/metadata/diff.py index 389dbc7cb1..1c54071ad6 100644 --- a/src/calibre/gui2/metadata/diff.py +++ b/src/calibre/gui2/metadata/diff.py @@ -608,7 +608,7 @@ class CompareMany(QDialog): self.resize(QSize(width, height)) geom = gprefs.get('diff_dialog_geom', None) if geom is not None: - self.restoreGeometry(geom) + QApplication.instance().safe_restore_geometry(self, geom) b.setFocus(Qt.OtherFocusReason) self.next_called = False diff --git a/src/calibre/gui2/metadata/single.py b/src/calibre/gui2/metadata/single.py index 132f81fa42..fefbb6bca7 100644 --- a/src/calibre/gui2/metadata/single.py +++ b/src/calibre/gui2/metadata/single.py @@ -10,7 +10,7 @@ import os, errno from datetime import datetime from functools import partial -from PyQt5.Qt import (Qt, QVBoxLayout, QHBoxLayout, QWidget, QPushButton, +from PyQt5.Qt import (Qt, QVBoxLayout, QHBoxLayout, QWidget, QPushButton, QApplication, QGridLayout, pyqtSignal, QDialogButtonBox, QScrollArea, QFont, QCoreApplication, QTabWidget, QIcon, QToolButton, QSplitter, QGroupBox, QSpacerItem, QInputDialog, QSizePolicy, QFrame, QSize, QKeySequence, QMenu, QShortcut, QDialog) @@ -120,7 +120,7 @@ class MetadataSingleDialogBase(QDialog): self.do_layout() geom = gprefs.get('metasingle_window_geometry3', None) if geom is not None: - self.restoreGeometry(bytes(geom)) + QApplication.instance().safe_restore_geometry(self, bytes(geom)) else: self.resize(self.sizeHint()) self.restore_widget_settings() @@ -1219,8 +1219,8 @@ def edit_metadata(db, row_list, current_row, parent=None, view_slot=None, edit_s if __name__ == '__main__': - from calibre.gui2 import Application as QApplication - app = QApplication([]) + from calibre.gui2 import Application + app = Application([]) from calibre.library import db db = db() row_list = list(range(len(db.data))) diff --git a/src/calibre/gui2/metadata/single_download.py b/src/calibre/gui2/metadata/single_download.py index 5f71d94ae4..01cd0b3b09 100644 --- a/src/calibre/gui2/metadata/single_download.py +++ b/src/calibre/gui2/metadata/single_download.py @@ -1066,7 +1066,7 @@ class FullFetch(QDialog): # {{{ self.resize(850, 600) geom = gprefs.get('metadata_single_gui_geom', None) if geom is not None and geom: - self.restoreGeometry(geom) + QApplication.instance().safe_restore_geometry(self, geom) self.finished.connect(self.cleanup) @@ -1168,7 +1168,7 @@ class CoverFetch(QDialog): # {{{ geom = gprefs.get('single-cover-fetch-dialog-geometry', None) if geom is not None: - self.restoreGeometry(geom) + QApplication.instance().safe_restore_geometry(self, geom) def cleanup(self): self.covers_widget.cleanup() diff --git a/src/calibre/gui2/preferences/__init__.py b/src/calibre/gui2/preferences/__init__.py index 746e1d67eb..79f4eb2517 100644 --- a/src/calibre/gui2/preferences/__init__.py +++ b/src/calibre/gui2/preferences/__init__.py @@ -8,7 +8,7 @@ __docformat__ = 'restructuredtext en' import textwrap -from PyQt5.Qt import (QWidget, pyqtSignal, QCheckBox, QAbstractSpinBox, +from PyQt5.Qt import (QWidget, pyqtSignal, QCheckBox, QAbstractSpinBox, QApplication, QLineEdit, QComboBox, Qt, QIcon, QDialog, QVBoxLayout, QDialogButtonBox) @@ -382,7 +382,7 @@ def show_config_widget(category, name, gui=None, show_restart_msg=False, w.genesis(gui) w.initialize() if geom is not None: - d.restoreGeometry(geom) + QApplication.instance().safe_restore_geometry(d, geom) d.exec_() geom = bytearray(d.saveGeometry()) gprefs[conf_name] = geom diff --git a/src/calibre/gui2/preferences/main.py b/src/calibre/gui2/preferences/main.py index 9da2fb0e96..d5473646e5 100644 --- a/src/calibre/gui2/preferences/main.py +++ b/src/calibre/gui2/preferences/main.py @@ -224,7 +224,7 @@ class Preferences(QDialog): geom = gprefs.get('preferences dialog geometry', None) if geom is not None: - self.restoreGeometry(geom) + QApplication.instance().safe_restore_geometry(self, geom) # Center if islinux: diff --git a/src/calibre/gui2/store/search/search.py b/src/calibre/gui2/store/search/search.py index 111b69dc27..b4a09d610a 100644 --- a/src/calibre/gui2/store/search/search.py +++ b/src/calibre/gui2/store/search/search.py @@ -10,7 +10,7 @@ import re from random import shuffle from PyQt5.Qt import (Qt, QDialog, QDialogButtonBox, QTimer, QCheckBox, QLabel, - QVBoxLayout, QIcon, QWidget, QTabWidget, QGridLayout) + QVBoxLayout, QIcon, QWidget, QTabWidget, QGridLayout, QApplication) from calibre.gui2 import JSONConfig, info_dialog, error_dialog from calibre.gui2.dialogs.choose_format import ChooseFormatDialog @@ -264,7 +264,7 @@ class SearchDialog(QDialog, Ui_Dialog): def restore_state(self): geometry = self.config.get('geometry', None) if geometry: - self.restoreGeometry(geometry) + QApplication.instance().safe_restore_geometry(self, geometry) splitter_state = self.config.get('store_splitter_state', None) if splitter_state: @@ -333,7 +333,7 @@ class SearchDialog(QDialog, Ui_Dialog): # Restore dialog state. geometry = self.config.get('config_dialog_geometry', None) if geometry: - d.restoreGeometry(geometry) + QApplication.instance().safe_restore_geometry(d, geometry) else: d.resize(800, 600) tab_index = self.config.get('config_dialog_tab_index', 0) diff --git a/src/calibre/gui2/store/stores/mobileread/store_dialog.py b/src/calibre/gui2/store/stores/mobileread/store_dialog.py index 3bd4e67304..5b6133bd29 100644 --- a/src/calibre/gui2/store/stores/mobileread/store_dialog.py +++ b/src/calibre/gui2/store/stores/mobileread/store_dialog.py @@ -7,7 +7,7 @@ __copyright__ = '2011, John Schember ' __docformat__ = 'restructuredtext en' -from PyQt5.Qt import (Qt, QDialog, QIcon, QComboBox) +from PyQt5.Qt import (Qt, QDialog, QIcon, QComboBox, QApplication) from calibre.gui2.store.stores.mobileread.adv_search_builder import AdvSearchBuilderDialog from calibre.gui2.store.stores.mobileread.models import BooksModel @@ -58,7 +58,7 @@ class MobileReadStoreDialog(QDialog, Ui_Dialog): def restore_state(self): geometry = self.plugin.config.get('dialog_geometry', None) if geometry: - self.restoreGeometry(geometry) + QApplication.instance().safe_restore_geometry(self, geometry) results_cwidth = self.plugin.config.get('dialog_results_view_column_width') if results_cwidth: diff --git a/src/calibre/gui2/store/web_store.py b/src/calibre/gui2/store/web_store.py index 46b3e722f5..5f2ff6b29a 100644 --- a/src/calibre/gui2/store/web_store.py +++ b/src/calibre/gui2/store/web_store.py @@ -10,7 +10,7 @@ import shutil from PyQt5.Qt import ( QHBoxLayout, QIcon, QLabel, QProgressBar, QPushButton, QSize, QUrl, QVBoxLayout, - QWidget, pyqtSignal + QWidget, pyqtSignal, QApplication ) from PyQt5.QtWebEngineWidgets import QWebEngineProfile, QWebEngineView @@ -140,7 +140,7 @@ class Main(MainWindow): self.setCentralWidget(c) geometry = gprefs.get('store_dialog_main_window_geometry') if geometry is not None: - self.restoreGeometry(geometry) + QApplication.instance().safe_restore_geometry(self, geometry) self.go_to(data['detail_url'] or None) def sizeHint(self): diff --git a/src/calibre/gui2/toc/main.py b/src/calibre/gui2/toc/main.py index b779ec4524..45ae431dd3 100644 --- a/src/calibre/gui2/toc/main.py +++ b/src/calibre/gui2/toc/main.py @@ -11,7 +11,7 @@ from functools import partial from threading import Thread from PyQt5.Qt import ( - QCheckBox, QCursor, QDialog, QDialogButtonBox, QFrame, QGridLayout, QIcon, + QCheckBox, QCursor, QDialog, QDialogButtonBox, QFrame, QGridLayout, QIcon, QApplication, QInputDialog, QItemSelectionModel, QKeySequence, QLabel, QMenu, QPushButton, QSize, QSizePolicy, QStackedWidget, Qt, QToolButton, QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget, pyqtSignal @@ -1031,7 +1031,7 @@ class TOCEditor(QDialog): # {{{ self.resize(950, 630) geom = self.prefs.get('toc_editor_window_geom', None) if geom is not None: - self.restoreGeometry(bytes(geom)) + QApplication.instance().safe_restore_geometry(self, bytes(geom)) self.stacks.currentChanged.connect(self.update_history_buttons) self.update_history_buttons() diff --git a/src/calibre/gui2/tweak_book/preferences.py b/src/calibre/gui2/tweak_book/preferences.py index 48d04903c4..db588177dd 100644 --- a/src/calibre/gui2/tweak_book/preferences.py +++ b/src/calibre/gui2/tweak_book/preferences.py @@ -17,7 +17,7 @@ from copy import copy, deepcopy from PyQt5.Qt import ( QDialog, QGridLayout, QStackedWidget, QDialogButtonBox, QListWidget, QListWidgetItem, QIcon, QWidget, QSize, QFormLayout, Qt, QSpinBox, - QCheckBox, pyqtSignal, QDoubleSpinBox, QComboBox, QLabel, QFont, + QCheckBox, pyqtSignal, QDoubleSpinBox, QComboBox, QLabel, QFont, QApplication, QFontComboBox, QPushButton, QSizePolicy, QHBoxLayout, QGroupBox, QToolButton, QVBoxLayout, QSpacerItem, QTimer) from PyQt5.QtWebEngineWidgets import QWebEngineSettings @@ -710,7 +710,7 @@ class Preferences(QDialog): self.resize(800, 600) geom = tprefs.get('preferences_geom', None) if geom is not None: - self.restoreGeometry(geom) + QApplication.instance().safe_restore_geometry(self, geom) self.keyboard_panel = ShortcutConfig(self) self.keyboard_panel.initialize(gui.keyboard) diff --git a/src/calibre/gui2/tweak_book/toc.py b/src/calibre/gui2/tweak_book/toc.py index e1506cbde2..98677c11cc 100644 --- a/src/calibre/gui2/tweak_book/toc.py +++ b/src/calibre/gui2/tweak_book/toc.py @@ -56,7 +56,7 @@ class TOCEditor(QDialog): self.resize(950, 630) geom = tprefs.get('toc_editor_window_geom', None) if geom is not None: - self.restoreGeometry(bytes(geom)) + QApplication.instance().safe_restore_geometry(self, bytes(geom)) def add_new_item(self, item, where): self.item_edit(item, where) diff --git a/src/calibre/gui2/tweak_book/ui.py b/src/calibre/gui2/tweak_book/ui.py index c6a10045e8..0ce8f2f59c 100644 --- a/src/calibre/gui2/tweak_book/ui.py +++ b/src/calibre/gui2/tweak_book/ui.py @@ -800,7 +800,7 @@ class Main(MainWindow): def restore_state(self): geom = tprefs.get('main_window_geometry', None) if geom is not None: - self.restoreGeometry(geom) + QApplication.instance().safe_restore_geometry(self, geom) state = tprefs.get('main_window_state', None) if state is not None: self.restoreState(state, self.STATE_VERSION) diff --git a/src/calibre/gui2/ui.py b/src/calibre/gui2/ui.py index 05abe44673..a217adcf1a 100644 --- a/src/calibre/gui2/ui.py +++ b/src/calibre/gui2/ui.py @@ -911,7 +911,7 @@ class Main(MainWindow, MainWindowMixin, DeviceMixin, EmailMixin, # {{{ def read_settings(self): geometry = config['main_window_geometry'] if geometry is not None: - self.restoreGeometry(geometry) + QApplication.instance().safe_restore_geometry(self, geometry) self.read_layout_settings() def write_settings(self): diff --git a/src/calibre/gui2/viewer/ui.py b/src/calibre/gui2/viewer/ui.py index 179a67f4cb..a3ba6eaf5a 100644 --- a/src/calibre/gui2/viewer/ui.py +++ b/src/calibre/gui2/viewer/ui.py @@ -509,7 +509,7 @@ class EbookViewer(MainWindow): state = vprefs['main_window_state'] geom = vprefs['main_window_geometry'] if geom and get_session_pref('remember_window_geometry', default=False): - self.restoreGeometry(geom) + QApplication.instance().safe_restore_geometry(self, geom) if state: self.restoreState(state, self.MAIN_WINDOW_STATE_VERSION) self.inspector_dock.setVisible(False) diff --git a/src/calibre/gui2/widgets2.py b/src/calibre/gui2/widgets2.py index 336e896bae..e794eef6f9 100644 --- a/src/calibre/gui2/widgets2.py +++ b/src/calibre/gui2/widgets2.py @@ -174,7 +174,7 @@ class Dialog(QDialog): self.resize(self.sizeHint()) geom = self.prefs_for_persistence.get(name + '-geometry', None) if geom is not None: - self.restoreGeometry(geom) + QApplication.instance().safe_restore_geometry(self, geom) if hasattr(self, 'splitter'): state = self.prefs_for_persistence.get(name + '-splitter-state', None) if state is not None: