diff --git a/qt/details_dialog.py b/qt/details_dialog.py index efb7dfd7..28f5ab21 100644 --- a/qt/details_dialog.py +++ b/qt/details_dialog.py @@ -9,6 +9,7 @@ from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QDockWidget, QWidget +from qtlib.util import move_to_screen_center from .details_table import DetailsModel from hscommon.plat import ISLINUX @@ -73,3 +74,9 @@ class DetailsDialog(QDockWidget): def refresh(self): self.tableModel.beginResetModel() self.tableModel.endResetModel() + + def showEvent(self, event): + if self._wasDocked is False: + # have to do this here as the frameGeometry is not correct until shown + move_to_screen_center(self) + super().showEvent(event) diff --git a/qt/preferences_dialog.py b/qt/preferences_dialog.py index 066c6553..9f010bd9 100644 --- a/qt/preferences_dialog.py +++ b/qt/preferences_dialog.py @@ -32,7 +32,7 @@ from PyQt5.QtGui import QPixmap, QIcon from hscommon.trans import trget from hscommon.plat import ISLINUX -from qtlib.util import horizontal_wrap +from qtlib.util import horizontal_wrap, move_to_screen_center from qtlib.preferences import get_langnames from enum import Flag, auto @@ -369,6 +369,11 @@ use the modifier key to drag the floating window around" section_to_update = Sections.DISPLAY self.resetToDefaults(section_to_update) + def showEvent(self, event): + # have to do this here as the frameGeometry is not correct until shown + move_to_screen_center(self) + super().showEvent(event) + class ColorPickerButton(QPushButton): def __init__(self, parent): diff --git a/qt/problem_dialog.py b/qt/problem_dialog.py index 1452a7a5..8cbe155d 100644 --- a/qt/problem_dialog.py +++ b/qt/problem_dialog.py @@ -19,6 +19,7 @@ from PyQt5.QtWidgets import ( QAbstractItemView, ) +from qtlib.util import move_to_screen_center from hscommon.trans import trget from .problem_table import ProblemTable @@ -70,3 +71,8 @@ class ProblemDialog(QDialog): self.closeButton.setDefault(True) self.horizontalLayout.addWidget(self.closeButton) self.verticalLayout.addLayout(self.horizontalLayout) + + def showEvent(self, event): + # have to do this here as the frameGeometry is not correct until shown + move_to_screen_center(self) + super().showEvent(event) diff --git a/qt/tabbed_window.py b/qt/tabbed_window.py index 11231719..2c6e2958 100644 --- a/qt/tabbed_window.py +++ b/qt/tabbed_window.py @@ -2,7 +2,7 @@ # which should be included with this package. The terms are also available at # http://www.gnu.org/licenses/gpl-3.0.html -from PyQt5.QtCore import QRect, pyqtSlot, Qt +from PyQt5.QtCore import QRect, pyqtSlot, Qt, QEvent from PyQt5.QtWidgets import ( QWidget, QVBoxLayout, @@ -77,8 +77,8 @@ class TabWindow(QMainWindow): def restoreGeometry(self): if self.app.prefs.mainWindowRect is not None: self.setGeometry(self.app.prefs.mainWindowRect) - else: - move_to_screen_center(self) + if self.app.prefs.mainWindowIsMaximized: + self.showMaximized() def _setupMenu(self): """Setup the menubar boiler plates which will be filled by the underlying @@ -211,7 +211,19 @@ class TabWindow(QMainWindow): # QTabWidget will assign its geometry after restoring it prefs = self.app.prefs prefs.mainWindowIsMaximized = self.isMaximized() - prefs.mainWindowRect = self.geometry() + if not self.isMaximized(): + prefs.mainWindowRect = self.geometry() + + def showEvent(self, event): + if not self.isMaximized(): + # have to do this here as the frameGeometry is not correct until shown + move_to_screen_center(self) + super().showEvent(event) + + def changeEvent(self, event): + if event.type() == QEvent.Type.WindowStateChange and not self.isMaximized(): + move_to_screen_center(self) + super().changeEvent(event) def closeEvent(self, close_event): # Force closing of our tabbed widgets in reverse order so that the diff --git a/qtlib/about_box.py b/qtlib/about_box.py index e1ff08e9..d9bf7163 100644 --- a/qtlib/about_box.py +++ b/qtlib/about_box.py @@ -18,6 +18,7 @@ from PyQt5.QtWidgets import ( QApplication, ) +from qtlib.util import move_to_screen_center from hscommon.trans import trget tr = trget("qtlib") @@ -71,6 +72,11 @@ class AboutBox(QDialog): self.verticalLayout.addWidget(self.buttonBox) self.horizontalLayout.addLayout(self.verticalLayout) + def showEvent(self, event): + # have to do this here as the frameGeometry is not correct until shown + move_to_screen_center(self) + super().showEvent(event) + if __name__ == "__main__": import sys diff --git a/qtlib/util.py b/qtlib/util.py index da8de798..1b8057ad 100644 --- a/qtlib/util.py +++ b/qtlib/util.py @@ -16,9 +16,8 @@ from core.util import executable_folder from hscommon.util import first from PyQt5.QtCore import QStandardPaths -from PyQt5.QtGui import QPixmap, QIcon +from PyQt5.QtGui import QPixmap, QIcon, QGuiApplication from PyQt5.QtWidgets import ( - QDesktopWidget, QSpacerItem, QSizePolicy, QAction, @@ -28,8 +27,19 @@ from PyQt5.QtWidgets import ( def move_to_screen_center(widget): frame = widget.frameGeometry() - frame.moveCenter(QDesktopWidget().availableGeometry().center()) - widget.move(frame.topLeft()) + if QGuiApplication.screenAt(frame.center()) is None: + # if center not on any screen use default screen + screen = QGuiApplication.screens()[0].availableGeometry() + else: + screen = QGuiApplication.screenAt(frame.center()).availableGeometry() + # moves to center of screen if partially off screen + if screen.contains(frame) is False: + # make sure the frame is not larger than screen + # resize does not seem to take frame size into account (move does) + widget.resize(frame.size().boundedTo(screen.size() - (frame.size() - widget.size()))) + frame = widget.frameGeometry() + frame.moveCenter(screen.center()) + widget.move(frame.topLeft()) def vertical_spacer(size=None):