Add windows position handling at open, fix #653

- Move offscreen windows back on screen
- Restore maximized state without impacting resored size
- Fullscreen comes back on primary screen, needs further work to support
  restore on other screens
This commit is contained in:
Andrew Senetar 2021-08-27 23:26:19 -05:00
parent 22996ee914
commit b0baa5bfd6
Signed by: arsenetar
GPG Key ID: C63300DCE48AB2F1
6 changed files with 55 additions and 9 deletions

View File

@ -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)

View File

@ -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):

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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):