Possible fix for offscreen dialogs on windows

See https://bugreports.qt.io/browse/QTBUG-77385
This commit is contained in:
Kovid Goyal 2019-12-27 09:21:25 +05:30
parent 55dc27c9fa
commit 02343fd965
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
39 changed files with 78 additions and 65 deletions

View File

@ -147,7 +147,8 @@ class Plugin(object): # {{{
if geom is None: if geom is None:
config_dialog.resize(config_dialog.sizeHint()) config_dialog.resize(config_dialog.sizeHint())
else: 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.accepted.connect(config_dialog.accept)
button_box.rejected.connect(config_dialog.reject) button_box.rejected.connect(config_dialog.reject)

View File

@ -973,6 +973,19 @@ class Application(QApplication):
if cft >= 0: if cft >= 0:
self.setCursorFlashTime(int(cft)) 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): def setup_ui_font(self):
f = QFont(QApplication.font()) f = QFont(QApplication.font())
q = (f.family(), f.pointSize()) q = (f.family(), f.pointSize())

View File

@ -7,7 +7,7 @@ __docformat__ = 'restructuredtext en'
import shutil 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.single import Config, GroupModel, gprefs
from calibre.gui2.convert.look_and_feel import LookAndFeelWidget from calibre.gui2.convert.look_and_feel import LookAndFeelWidget
@ -63,7 +63,7 @@ class BulkConfig(Config):
geom = gprefs.get('convert_bulk_dialog_geom', None) geom = gprefs.get('convert_bulk_dialog_geom', None)
if geom: if geom:
self.restoreGeometry(geom) QApplication.instance().safe_restore_geometry(self, geom)
else: else:
self.resize(self.sizeHint()) self.resize(self.sizeHint())

View File

@ -7,7 +7,7 @@ __docformat__ = 'restructuredtext en'
import os import os
from PyQt5.Qt import (QDialog, QWidget, QDialogButtonBox, from PyQt5.Qt import (QDialog, QWidget, QDialogButtonBox, QApplication,
QBrush, QTextCursor, QTextEdit, QByteArray, Qt, pyqtSignal) QBrush, QTextCursor, QTextEdit, QByteArray, Qt, pyqtSignal)
from calibre.gui2.convert.regex_builder_ui import Ui_RegexBuilder from calibre.gui2.convert.regex_builder_ui import Ui_RegexBuilder
@ -52,7 +52,7 @@ class RegexBuilder(QDialog, Ui_RegexBuilder):
self.match_locs = [] self.match_locs = []
geom = gprefs.get('regex_builder_geometry', None) geom = gprefs.get('regex_builder_geometry', None)
if geom is not None: if geom is not None:
self.restoreGeometry(QByteArray(geom)) QApplication.instance().safe_restore_geometry(self, QByteArray(geom))
self.finished.connect(self.save_state) self.finished.connect(self.save_state)
def save_state(self, result): def save_state(self, result):

View File

@ -10,7 +10,7 @@ from PyQt5.Qt import (
QAbstractListModel, QCheckBox, QComboBox, QCoreApplication, QDialog, QAbstractListModel, QCheckBox, QComboBox, QCoreApplication, QDialog,
QDialogButtonBox, QFont, QFrame, QGridLayout, QHBoxLayout, QIcon, QLabel, QDialogButtonBox, QFont, QFrame, QGridLayout, QHBoxLayout, QIcon, QLabel,
QListView, QModelIndex, QScrollArea, QSize, QSizePolicy, QSpacerItem, QListView, QModelIndex, QScrollArea, QSize, QSizePolicy, QSpacerItem,
Qt, QTextEdit, QWidget Qt, QTextEdit, QWidget, QApplication
) )
from calibre.customize.conversion import OptionRecommendation from calibre.customize.conversion import OptionRecommendation
@ -94,7 +94,7 @@ class Config(QDialog):
self.groups.setMouseTracking(True) self.groups.setMouseTracking(True)
geom = gprefs.get('convert_single_dialog_geom', None) geom = gprefs.get('convert_single_dialog_geom', None)
if geom: if geom:
self.restoreGeometry(geom) QApplication.instance().safe_restore_geometry(self, geom)
else: else:
self.resize(self.sizeHint()) self.resize(self.sizeHint())

View File

@ -12,7 +12,7 @@ Module to implement the Cover Flow feature
import sys, os, time import sys, os, time
from PyQt5.Qt import (QImage, QSizePolicy, QTimer, QDialog, Qt, QSize, QAction, 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 import plugins
from calibre.ebooks.metadata import rating_to_stars from calibre.ebooks.metadata import rating_to_stars
@ -243,7 +243,7 @@ class CBDialog(QDialog):
self.layout().addWidget(cover_flow) self.layout().addWidget(cover_flow)
geom = gprefs.get('cover_browser_dialog_geometry', None) 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) h, w = available_height()-60, int(available_width()/1.5)
self.resize(w, h) self.resize(w, h)
self.action_fs_toggle = a = QAction(self) self.action_fs_toggle = a = QAction(self)
@ -279,7 +279,7 @@ class CBDialog(QDialog):
def show_normal(self): def show_normal(self):
self.showNormal() self.showNormal()
if self.pre_fs_geom is not None: 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 self.pre_fs_geom = None
def show_fullscreen(self): def show_fullscreen(self):
@ -454,7 +454,7 @@ class CoverFlowMixin(object):
def test(): def test():
from PyQt5.Qt import QApplication, QMainWindow from PyQt5.Qt import QMainWindow
app = QApplication([]) app = QApplication([])
w = QMainWindow() w = QMainWindow()
cf = CoverFlow() cf = CoverFlow()
@ -475,7 +475,7 @@ def main(args=sys.argv):
if __name__ == '__main__': if __name__ == '__main__':
from PyQt5.Qt import QApplication, QMainWindow from PyQt5.Qt import QMainWindow
app = QApplication([]) app = QApplication([])
w = QMainWindow() w = QMainWindow()
cf = CoverFlow() cf = CoverFlow()

View File

@ -10,7 +10,7 @@ from collections import OrderedDict
from PyQt5.Qt import ( from PyQt5.Qt import (
QWidget, QHBoxLayout, QTabWidget, QLabel, QSizePolicy, QSize, QFormLayout, QWidget, QHBoxLayout, QTabWidget, QLabel, QSizePolicy, QSize, QFormLayout,
QSpinBox, pyqtSignal, QPixmap, QDialog, QVBoxLayout, QDialogButtonBox, 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) QColorDialog, QToolButton, QLineEdit, QColor, QFrame, QTimer, QCheckBox)
from calibre.ebooks.covers import all_styles, cprefs, generate_cover, override_prefs, default_color_themes 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()) self.resize(self.sizeHint())
geom = gprefs.get('cover_settings_dialog_geom', None) geom = gprefs.get('cover_settings_dialog_geom', None)
if geom is not None: if geom is not None:
self.restoreGeometry(geom) QApplication.instance().safe_restore_geometry(self, geom)
self.prefs_for_rendering = None self.prefs_for_rendering = None
def restore_defaults(self): def restore_defaults(self):

View File

@ -159,7 +159,7 @@ class AuthorsEdit(QDialog):
self.resize(self.sizeHint() + QSize(150, 100)) self.resize(self.sizeHint() + QSize(150, 100))
geom = gprefs.get('authors-edit-geometry', None) geom = gprefs.get('authors-edit-geometry', None)
if geom is not None: if geom is not None:
self.restoreGeometry(geom) QApplication.instance().safe_restore_geometry(self, geom)
self.author.setFocus(Qt.OtherFocusReason) self.author.setFocus(Qt.OtherFocusReason)
def save_geometry(self): def save_geometry(self):

View File

@ -8,7 +8,7 @@ from PyQt5.Qt import (
QBrush, QCheckBox, QCoreApplication, QDialog, QGridLayout, QHBoxLayout, QIcon, QBrush, QCheckBox, QCoreApplication, QDialog, QGridLayout, QHBoxLayout, QIcon,
QKeySequence, QLabel, QListView, QModelIndex, QPalette, QPixmap, QPushButton, QKeySequence, QLabel, QListView, QModelIndex, QPalette, QPixmap, QPushButton,
QShortcut, QSize, QSplitter, Qt, QTimer, QToolButton, QVBoxLayout, QWidget, QShortcut, QSize, QSplitter, Qt, QTimer, QToolButton, QVBoxLayout, QWidget,
pyqtSignal pyqtSignal, QApplication
) )
from calibre import fit_image from calibre import fit_image
@ -192,7 +192,7 @@ class BookInfo(QDialog):
saved_layout = gprefs.get('book_info_dialog_layout', None) saved_layout = gprefs.get('book_info_dialog_layout', None)
if saved_layout is not None: if saved_layout is not None:
try: try:
self.restoreGeometry(saved_layout[0]) QApplication.instance().safe_restore_geometry(self, saved_layout[0])
self.splitter.restoreState(saved_layout[1]) self.splitter.restoreState(saved_layout[1])
except Exception: except Exception:
pass pass

View File

@ -8,7 +8,7 @@ __docformat__ = 'restructuredtext en'
import os, sys, importlib, weakref 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.customize.ui import config
from calibre.gui2.dialogs.catalog_ui import Ui_Dialog 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) geom = dynamic.get('catalog_window_geom', None)
if geom is not None: if geom is not None:
self.restoreGeometry(bytes(geom)) QApplication.instance().safe_restore_geometry(self, bytes(geom))
else: else:
self.resize(self.sizeHint()) self.resize(self.sizeHint())
d = QCoreApplication.instance().desktop() d = QCoreApplication.instance().desktop()

View File

@ -5,7 +5,7 @@ __copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
__docformat__ = 'restructuredtext en' __docformat__ = 'restructuredtext en'
__license__ = 'GPL v3' __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 import gprefs, Application
from calibre.gui2.dialogs.comments_dialog_ui import Ui_CommentsDialog 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) geom = gprefs.get('comments_dialog_geom', None)
if geom is not None: if geom is not None:
self.restoreGeometry(geom) QApplication.instance().safe_restore_geometry(self, geom)
def save_geometry(self): def save_geometry(self):
gprefs.set('comments_dialog_geom', bytearray(self.saveGeometry())) gprefs.set('comments_dialog_geom', bytearray(self.saveGeometry()))

View File

@ -63,7 +63,7 @@ class DuplicatesQuestion(QDialog):
self.resize(self.sizeHint()) self.resize(self.sizeHint())
geom = gprefs.get('duplicates-question-dialog-geometry', None) geom = gprefs.get('duplicates-question-dialog-geometry', None)
if geom is not None: if geom is not None:
self.restoreGeometry(geom) QApplication.instance().safe_restore_geometry(self, geom)
self.exec_() self.exec_()
def copy_to_clipboard(self): def copy_to_clipboard(self):

View File

@ -41,7 +41,7 @@ class EditAuthorsDialog(QDialog, Ui_EditAuthorsDialog):
gprefs.get('manage_authors_table_widths', None) gprefs.get('manage_authors_table_widths', None)
geom = gprefs.get('manage_authors_dialog_geometry', None) geom = gprefs.get('manage_authors_dialog_geometry', None)
if geom: if geom:
self.restoreGeometry(QByteArray(geom)) QApplication.instance().safe_restore_geometry(self, QByteArray(geom))
except Exception: except Exception:
pass pass

View File

@ -60,7 +60,7 @@ class MatchBooks(QDialog, Ui_MatchBooks):
gprefs.get('match_books_dialog_books_table_widths', None) gprefs.get('match_books_dialog_books_table_widths', None)
geom = gprefs.get('match_books_dialog_geometry', None) geom = gprefs.get('match_books_dialog_geometry', None)
if geom: if geom:
self.restoreGeometry(QByteArray(geom)) QApplication.instance().safe_restore_geometry(self, QByteArray(geom))
except: except:
pass pass

View File

@ -217,7 +217,7 @@ class ViewLog(QDialog): # {{{
self.resize(QSize(700, 500)) self.resize(QSize(700, 500))
geom = gprefs.get(self.unique_name, None) geom = gprefs.get(self.unique_name, None)
if geom is not None: if geom is not None:
self.restoreGeometry(geom) QApplication.instance().safe_restore_geometry(self, geom)
self.setModal(False) self.setModal(False)
self.setWindowTitle(title) self.setWindowTitle(title)

View File

@ -552,7 +552,7 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog):
self.central_widget.setCurrentIndex(tab) self.central_widget.setCurrentIndex(tab)
geom = gprefs.get('bulk_metadata_window_geometry', None) geom = gprefs.get('bulk_metadata_window_geometry', None)
if geom is not None: if geom is not None:
self.restoreGeometry(bytes(geom)) QApplication.instance().safe_restore_geometry(self, bytes(geom))
else: else:
self.resize(self.sizeHint()) self.resize(self.sizeHint())
ct = gprefs.get('bulk_metadata_window_tab', 0) ct = gprefs.get('bulk_metadata_window_tab', 0)

View File

@ -10,7 +10,7 @@ import re, datetime, traceback
from lxml import html from lxml import html
from PyQt5.Qt import (Qt, QUrl, QFrame, QVBoxLayout, QLabel, QBrush, QTextEdit, from PyQt5.Qt import (Qt, QUrl, QFrame, QVBoxLayout, QLabel, QBrush, QTextEdit,
QComboBox, QAbstractItemView, QHBoxLayout, QDialogButtonBox, QComboBox, QAbstractItemView, QHBoxLayout, QDialogButtonBox,
QAbstractTableModel, QTableView, QModelIndex, QAbstractTableModel, QTableView, QModelIndex, QApplication,
QSortFilterProxyModel, QAction, QIcon, QDialog, QSortFilterProxyModel, QAction, QIcon, QDialog,
QFont, QPixmap, QSize, QLineEdit) QFont, QPixmap, QSize, QLineEdit)
@ -156,7 +156,7 @@ class SizePersistedDialog(QDialog):
if self.geom is None: if self.geom is None:
self.resize(self.sizeHint()+self.initial_extra_size) self.resize(self.sizeHint()+self.initial_extra_size)
else: else:
self.restoreGeometry(self.geom) QApplication.instance().safe_restore_geometry(self, self.geom)
def dialog_closing(self, result): def dialog_closing(self, result):
geom = bytearray(self.saveGeometry()) geom = bytearray(self.saveGeometry())

View File

@ -157,7 +157,7 @@ class Quickview(QDialog, Ui_Quickview):
if not self.is_pane: if not self.is_pane:
geom = gprefs.get('quickview_dialog_geometry', None) geom = gprefs.get('quickview_dialog_geometry', None)
if geom: if geom:
self.restoreGeometry(QByteArray(geom)) QApplication.instance().safe_restore_geometry(self, QByteArray(geom))
except: except:
pass pass

View File

@ -13,7 +13,7 @@ import calendar, textwrap
from collections import OrderedDict from collections import OrderedDict
from PyQt5.Qt import ( 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, QTimer, pyqtSignal, QWidget, QGridLayout, QCheckBox, QTimeEdit, QLabel,
QLineEdit, QDoubleSpinBox, QSize, QTreeView, QSizePolicy, QToolButton, QLineEdit, QDoubleSpinBox, QSize, QTreeView, QSizePolicy, QToolButton,
QScrollArea, QFrame, QVBoxLayout, QTabWidget, QSpacerItem, QGroupBox, QScrollArea, QFrame, QVBoxLayout, QTabWidget, QSpacerItem, QGroupBox,
@ -373,7 +373,7 @@ class SchedulerDialog(QDialog):
geom = gprefs.get('scheduler_dialog_geometry') geom = gprefs.get('scheduler_dialog_geometry')
if geom is not None: if geom is not None:
self.restoreGeometry(geom) QApplication.instance().safe_restore_geometry(self, geom)
def sizeHint(self): def sizeHint(self):
return QSize(800, 600) return QSize(800, 600)
@ -729,7 +729,6 @@ class Scheduler(QObject):
if __name__ == '__main__': if __name__ == '__main__':
from PyQt5.Qt import QApplication
app = QApplication([]) app = QApplication([])
d = SchedulerDialog(RecipeModel()) d = SchedulerDialog(RecipeModel())
d.exec_() d.exec_()

View File

@ -3,7 +3,7 @@ from __future__ import absolute_import, division, print_function, unicode_litera
__license__ = 'GPL v3' __license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>' __copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
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.dialogs.tag_editor_ui import Ui_TagEditor
from calibre.gui2 import question_dialog, error_dialog, gprefs 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) geom = gprefs.get('tag_editor_geometry', None)
if geom is not None: if geom is not None:
self.restoreGeometry(geom) QApplication.instance().safe_restore_geometry(self, geom)
def edit_box_changed(self, which): def edit_box_changed(self, which):
gprefs['tag_editor_last_filter'] = which gprefs['tag_editor_last_filter'] = which

View File

@ -4,7 +4,7 @@
from __future__ import absolute_import, division, print_function, unicode_literals from __future__ import absolute_import, division, print_function, unicode_literals
from PyQt5.Qt import (Qt, QDialog, QTableWidgetItem, QIcon, QByteArray, QSize, 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.tag_list_editor_ui import Ui_TagListEditor
from calibre.gui2.dialogs.confirm_delete import confirm from calibre.gui2.dialogs.confirm_delete import confirm
@ -169,7 +169,7 @@ class TagListEditor(QDialog, Ui_TagListEditor):
try: try:
geom = gprefs.get('tag_list_editor_dialog_geometry', None) geom = gprefs.get('tag_list_editor_dialog_geometry', None)
if geom is not None: if geom is not None:
self.restoreGeometry(QByteArray(geom)) QApplication.instance().safe_restore_geometry(self, QByteArray(geom))
else: else:
self.resize(self.sizeHint()+QSize(150, 100)) self.resize(self.sizeHint()+QSize(150, 100))
except: except:

View File

@ -62,7 +62,7 @@ class TrimImage(QDialog):
self.resize(QSize(900, 600)) self.resize(QSize(900, 600))
geom = gprefs.get('image-trim-dialog-geometry', None) geom = gprefs.get('image-trim-dialog-geometry', None)
if geom is not None: if geom is not None:
self.restoreGeometry(geom) QApplication.instance().safe_restore_geometry(self, geom)
self.setWindowIcon(self.trim_action.icon()) self.setWindowIcon(self.trim_action.icon())
self.image_data = None self.image_data = None

View File

@ -164,7 +164,7 @@ class ImageView(QDialog):
self.resize(QSize(int(geom.width()/2.5), geom.height()-50)) self.resize(QSize(int(geom.width()/2.5), geom.height()-50))
geom = gprefs.get(self.geom_name, None) geom = gprefs.get(self.geom_name, None)
if geom is not None: if geom is not None:
self.restoreGeometry(geom) QApplication.instance().safe_restore_geometry(self, geom)
try: try:
self.current_image_name = unicode_type(self.current_url.toString(NO_URL_FORMATTING)).rpartition('/')[-1] self.current_image_name = unicode_type(self.current_url.toString(NO_URL_FORMATTING)).rpartition('/')[-1]
except AttributeError: except AttributeError:

View File

@ -645,7 +645,7 @@ class JobsDialog(QDialog, Ui_JobsDialog):
try: try:
geom = gprefs.get('jobs_dialog_geometry', None) geom = gprefs.get('jobs_dialog_geometry', None)
if geom: if geom:
self.restoreGeometry(QByteArray(geom)) QApplication.instance().safe_restore_geometry(self, QByteArray(geom))
state = gprefs.get('jobs view column layout3', None) state = gprefs.get('jobs view column layout3', None)
if state is not None: if state is not None:
self.jobs_view.horizontalHeader().restoreState(QByteArray(state)) self.jobs_view.horizontalHeader().restoreState(QByteArray(state))

View File

@ -608,7 +608,7 @@ class CompareMany(QDialog):
self.resize(QSize(width, height)) self.resize(QSize(width, height))
geom = gprefs.get('diff_dialog_geom', None) geom = gprefs.get('diff_dialog_geom', None)
if geom is not None: if geom is not None:
self.restoreGeometry(geom) QApplication.instance().safe_restore_geometry(self, geom)
b.setFocus(Qt.OtherFocusReason) b.setFocus(Qt.OtherFocusReason)
self.next_called = False self.next_called = False

View File

@ -10,7 +10,7 @@ import os, errno
from datetime import datetime from datetime import datetime
from functools import partial 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, QGridLayout, pyqtSignal, QDialogButtonBox, QScrollArea, QFont, QCoreApplication,
QTabWidget, QIcon, QToolButton, QSplitter, QGroupBox, QSpacerItem, QInputDialog, QTabWidget, QIcon, QToolButton, QSplitter, QGroupBox, QSpacerItem, QInputDialog,
QSizePolicy, QFrame, QSize, QKeySequence, QMenu, QShortcut, QDialog) QSizePolicy, QFrame, QSize, QKeySequence, QMenu, QShortcut, QDialog)
@ -120,7 +120,7 @@ class MetadataSingleDialogBase(QDialog):
self.do_layout() self.do_layout()
geom = gprefs.get('metasingle_window_geometry3', None) geom = gprefs.get('metasingle_window_geometry3', None)
if geom is not None: if geom is not None:
self.restoreGeometry(bytes(geom)) QApplication.instance().safe_restore_geometry(self, bytes(geom))
else: else:
self.resize(self.sizeHint()) self.resize(self.sizeHint())
self.restore_widget_settings() 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__': if __name__ == '__main__':
from calibre.gui2 import Application as QApplication from calibre.gui2 import Application
app = QApplication([]) app = Application([])
from calibre.library import db from calibre.library import db
db = db() db = db()
row_list = list(range(len(db.data))) row_list = list(range(len(db.data)))

View File

@ -1066,7 +1066,7 @@ class FullFetch(QDialog): # {{{
self.resize(850, 600) self.resize(850, 600)
geom = gprefs.get('metadata_single_gui_geom', None) geom = gprefs.get('metadata_single_gui_geom', None)
if geom is not None and geom: if geom is not None and geom:
self.restoreGeometry(geom) QApplication.instance().safe_restore_geometry(self, geom)
self.finished.connect(self.cleanup) self.finished.connect(self.cleanup)
@ -1168,7 +1168,7 @@ class CoverFetch(QDialog): # {{{
geom = gprefs.get('single-cover-fetch-dialog-geometry', None) geom = gprefs.get('single-cover-fetch-dialog-geometry', None)
if geom is not None: if geom is not None:
self.restoreGeometry(geom) QApplication.instance().safe_restore_geometry(self, geom)
def cleanup(self): def cleanup(self):
self.covers_widget.cleanup() self.covers_widget.cleanup()

View File

@ -8,7 +8,7 @@ __docformat__ = 'restructuredtext en'
import textwrap 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, QLineEdit, QComboBox, Qt, QIcon, QDialog, QVBoxLayout,
QDialogButtonBox) QDialogButtonBox)
@ -382,7 +382,7 @@ def show_config_widget(category, name, gui=None, show_restart_msg=False,
w.genesis(gui) w.genesis(gui)
w.initialize() w.initialize()
if geom is not None: if geom is not None:
d.restoreGeometry(geom) QApplication.instance().safe_restore_geometry(d, geom)
d.exec_() d.exec_()
geom = bytearray(d.saveGeometry()) geom = bytearray(d.saveGeometry())
gprefs[conf_name] = geom gprefs[conf_name] = geom

View File

@ -224,7 +224,7 @@ class Preferences(QDialog):
geom = gprefs.get('preferences dialog geometry', None) geom = gprefs.get('preferences dialog geometry', None)
if geom is not None: if geom is not None:
self.restoreGeometry(geom) QApplication.instance().safe_restore_geometry(self, geom)
# Center # Center
if islinux: if islinux:

View File

@ -10,7 +10,7 @@ import re
from random import shuffle from random import shuffle
from PyQt5.Qt import (Qt, QDialog, QDialogButtonBox, QTimer, QCheckBox, QLabel, 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 import JSONConfig, info_dialog, error_dialog
from calibre.gui2.dialogs.choose_format import ChooseFormatDialog from calibre.gui2.dialogs.choose_format import ChooseFormatDialog
@ -264,7 +264,7 @@ class SearchDialog(QDialog, Ui_Dialog):
def restore_state(self): def restore_state(self):
geometry = self.config.get('geometry', None) geometry = self.config.get('geometry', None)
if geometry: if geometry:
self.restoreGeometry(geometry) QApplication.instance().safe_restore_geometry(self, geometry)
splitter_state = self.config.get('store_splitter_state', None) splitter_state = self.config.get('store_splitter_state', None)
if splitter_state: if splitter_state:
@ -333,7 +333,7 @@ class SearchDialog(QDialog, Ui_Dialog):
# Restore dialog state. # Restore dialog state.
geometry = self.config.get('config_dialog_geometry', None) geometry = self.config.get('config_dialog_geometry', None)
if geometry: if geometry:
d.restoreGeometry(geometry) QApplication.instance().safe_restore_geometry(d, geometry)
else: else:
d.resize(800, 600) d.resize(800, 600)
tab_index = self.config.get('config_dialog_tab_index', 0) tab_index = self.config.get('config_dialog_tab_index', 0)

View File

@ -7,7 +7,7 @@ __copyright__ = '2011, John Schember <john@nachtimwald.com>'
__docformat__ = 'restructuredtext en' __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.adv_search_builder import AdvSearchBuilderDialog
from calibre.gui2.store.stores.mobileread.models import BooksModel from calibre.gui2.store.stores.mobileread.models import BooksModel
@ -58,7 +58,7 @@ class MobileReadStoreDialog(QDialog, Ui_Dialog):
def restore_state(self): def restore_state(self):
geometry = self.plugin.config.get('dialog_geometry', None) geometry = self.plugin.config.get('dialog_geometry', None)
if geometry: if geometry:
self.restoreGeometry(geometry) QApplication.instance().safe_restore_geometry(self, geometry)
results_cwidth = self.plugin.config.get('dialog_results_view_column_width') results_cwidth = self.plugin.config.get('dialog_results_view_column_width')
if results_cwidth: if results_cwidth:

View File

@ -10,7 +10,7 @@ import shutil
from PyQt5.Qt import ( from PyQt5.Qt import (
QHBoxLayout, QIcon, QLabel, QProgressBar, QPushButton, QSize, QUrl, QVBoxLayout, QHBoxLayout, QIcon, QLabel, QProgressBar, QPushButton, QSize, QUrl, QVBoxLayout,
QWidget, pyqtSignal QWidget, pyqtSignal, QApplication
) )
from PyQt5.QtWebEngineWidgets import QWebEngineProfile, QWebEngineView from PyQt5.QtWebEngineWidgets import QWebEngineProfile, QWebEngineView
@ -140,7 +140,7 @@ class Main(MainWindow):
self.setCentralWidget(c) self.setCentralWidget(c)
geometry = gprefs.get('store_dialog_main_window_geometry') geometry = gprefs.get('store_dialog_main_window_geometry')
if geometry is not None: if geometry is not None:
self.restoreGeometry(geometry) QApplication.instance().safe_restore_geometry(self, geometry)
self.go_to(data['detail_url'] or None) self.go_to(data['detail_url'] or None)
def sizeHint(self): def sizeHint(self):

View File

@ -11,7 +11,7 @@ from functools import partial
from threading import Thread from threading import Thread
from PyQt5.Qt import ( 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, QInputDialog, QItemSelectionModel, QKeySequence, QLabel, QMenu, QPushButton,
QSize, QSizePolicy, QStackedWidget, Qt, QToolButton, QTreeWidget, QSize, QSizePolicy, QStackedWidget, Qt, QToolButton, QTreeWidget,
QTreeWidgetItem, QVBoxLayout, QWidget, pyqtSignal QTreeWidgetItem, QVBoxLayout, QWidget, pyqtSignal
@ -1031,7 +1031,7 @@ class TOCEditor(QDialog): # {{{
self.resize(950, 630) self.resize(950, 630)
geom = self.prefs.get('toc_editor_window_geom', None) geom = self.prefs.get('toc_editor_window_geom', None)
if geom is not 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.stacks.currentChanged.connect(self.update_history_buttons)
self.update_history_buttons() self.update_history_buttons()

View File

@ -17,7 +17,7 @@ from copy import copy, deepcopy
from PyQt5.Qt import ( from PyQt5.Qt import (
QDialog, QGridLayout, QStackedWidget, QDialogButtonBox, QListWidget, QDialog, QGridLayout, QStackedWidget, QDialogButtonBox, QListWidget,
QListWidgetItem, QIcon, QWidget, QSize, QFormLayout, Qt, QSpinBox, 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, QFontComboBox, QPushButton, QSizePolicy, QHBoxLayout, QGroupBox,
QToolButton, QVBoxLayout, QSpacerItem, QTimer) QToolButton, QVBoxLayout, QSpacerItem, QTimer)
from PyQt5.QtWebEngineWidgets import QWebEngineSettings from PyQt5.QtWebEngineWidgets import QWebEngineSettings
@ -710,7 +710,7 @@ class Preferences(QDialog):
self.resize(800, 600) self.resize(800, 600)
geom = tprefs.get('preferences_geom', None) geom = tprefs.get('preferences_geom', None)
if geom is not None: if geom is not None:
self.restoreGeometry(geom) QApplication.instance().safe_restore_geometry(self, geom)
self.keyboard_panel = ShortcutConfig(self) self.keyboard_panel = ShortcutConfig(self)
self.keyboard_panel.initialize(gui.keyboard) self.keyboard_panel.initialize(gui.keyboard)

View File

@ -56,7 +56,7 @@ class TOCEditor(QDialog):
self.resize(950, 630) self.resize(950, 630)
geom = tprefs.get('toc_editor_window_geom', None) geom = tprefs.get('toc_editor_window_geom', None)
if geom is not 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): def add_new_item(self, item, where):
self.item_edit(item, where) self.item_edit(item, where)

View File

@ -800,7 +800,7 @@ class Main(MainWindow):
def restore_state(self): def restore_state(self):
geom = tprefs.get('main_window_geometry', None) geom = tprefs.get('main_window_geometry', None)
if geom is not None: if geom is not None:
self.restoreGeometry(geom) QApplication.instance().safe_restore_geometry(self, geom)
state = tprefs.get('main_window_state', None) state = tprefs.get('main_window_state', None)
if state is not None: if state is not None:
self.restoreState(state, self.STATE_VERSION) self.restoreState(state, self.STATE_VERSION)

View File

@ -911,7 +911,7 @@ class Main(MainWindow, MainWindowMixin, DeviceMixin, EmailMixin, # {{{
def read_settings(self): def read_settings(self):
geometry = config['main_window_geometry'] geometry = config['main_window_geometry']
if geometry is not None: if geometry is not None:
self.restoreGeometry(geometry) QApplication.instance().safe_restore_geometry(self, geometry)
self.read_layout_settings() self.read_layout_settings()
def write_settings(self): def write_settings(self):

View File

@ -509,7 +509,7 @@ class EbookViewer(MainWindow):
state = vprefs['main_window_state'] state = vprefs['main_window_state']
geom = vprefs['main_window_geometry'] geom = vprefs['main_window_geometry']
if geom and get_session_pref('remember_window_geometry', default=False): if geom and get_session_pref('remember_window_geometry', default=False):
self.restoreGeometry(geom) QApplication.instance().safe_restore_geometry(self, geom)
if state: if state:
self.restoreState(state, self.MAIN_WINDOW_STATE_VERSION) self.restoreState(state, self.MAIN_WINDOW_STATE_VERSION)
self.inspector_dock.setVisible(False) self.inspector_dock.setVisible(False)

View File

@ -174,7 +174,7 @@ class Dialog(QDialog):
self.resize(self.sizeHint()) self.resize(self.sizeHint())
geom = self.prefs_for_persistence.get(name + '-geometry', None) geom = self.prefs_for_persistence.get(name + '-geometry', None)
if geom is not None: if geom is not None:
self.restoreGeometry(geom) QApplication.instance().safe_restore_geometry(self, geom)
if hasattr(self, 'splitter'): if hasattr(self, 'splitter'):
state = self.prefs_for_persistence.get(name + '-splitter-state', None) state = self.prefs_for_persistence.get(name + '-splitter-state', None)
if state is not None: if state is not None: