From cf817a62d08c1e530ca66cc4242c2279b8005dd6 Mon Sep 17 00:00:00 2001 From: JOhn Date: Wed, 13 May 2026 10:57:06 -0400 Subject: [PATCH] fixed x11 and wayland popup display --- gui/__main__.py | 72 +++++++++++++++++++++++++++++++------------------ 1 file changed, 46 insertions(+), 26 deletions(-) diff --git a/gui/__main__.py b/gui/__main__.py index 777f9ce..47df0fc 100755 --- a/gui/__main__.py +++ b/gui/__main__.py @@ -1,5 +1,5 @@ from PyQt6.QtWidgets import QComboBox, QButtonGroup, QLineEdit, QMainWindow, QLabel, QWidget, QStackedWidget, QApplication, QPushButton, QTextEdit, QFrame, QHBoxLayout, QVBoxLayout, QScrollArea, QSystemTrayIcon, QMessageBox, QGraphicsDropShadowEffect, QGridLayout, QCheckBox, QStackedLayout, QGroupBox, QDialog, QPlainTextEdit, QListWidget, QListWidgetItem -from PyQt6.QtGui import QIcon, QPixmap, QTransform, QPainter, QColor, QFont, QFontDatabase +from PyQt6.QtGui import QIcon, QPixmap, QTransform, QPainter, QColor, QFont, QFontDatabase, QGuiApplication from PyQt6 import QtGui from PyQt6 import QtCore from PyQt6.QtCore import Qt, QSize, QThread, pyqtSignal, QTimer, QPointF, QRect, QMutex, QMutexLocker, QObject @@ -8966,19 +8966,23 @@ class ConfirmationPopup(QWidget): self.oldPos = event.globalPosition().toPoint() -class TicketDataLossPopup(QWidget): - finished = pyqtSignal() - +class TicketDataLossPopup(QDialog): def __init__(self, parent=None, ticket_number="", billing_code=""): super().__init__(parent) self.parent_window = parent + self._use_parent_local_geometry = QGuiApplication.platformName().lower().startswith("wayland") self.ticket_number = str(ticket_number) self.billing_code = str(billing_code) self.initUI() def initUI(self): self.setFixedSize(640, 380) - self.setWindowFlags(Qt.WindowType.FramelessWindowHint) + if self._use_parent_local_geometry: + if self.parent_window is not None: + self.setParent(self.parent_window) + self.setWindowFlags(Qt.WindowType.Widget) + else: + self.setWindowFlags(Qt.WindowType.Dialog | Qt.WindowType.FramelessWindowHint) self.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground) outer = QVBoxLayout(self) @@ -9116,11 +9120,11 @@ class TicketDataLossPopup(QWidget): button_row.addStretch() content.addLayout(button_row) - self.setWindowModality(Qt.WindowModality.ApplicationModal) + if not self._use_parent_local_geometry: + self.setWindowModality(Qt.WindowModality.ApplicationModal) def _on_acknowledge(self): - self.finished.emit() - self.close() + self.accept() def _on_copy_billing_code(self): QApplication.clipboard().setText(self.billing_code) @@ -9132,35 +9136,51 @@ class TicketDataLossPopup(QWidget): self.copy_button.setText("Copy Billing Code") self.copy_button.setStyleSheet(self._copy_button_default_style) + def show(self): + self._center_on_parent() + super().show() + def showEvent(self, event): super().showEvent(event) self._center_on_parent() + QTimer.singleShot(0, self._center_on_parent) def _center_on_parent(self): parent = self.parent_window if parent is None: return try: - self.adjustSize() - parent_geom = parent.frameGeometry() if hasattr(parent, 'frameGeometry') else None - if parent_geom is None or parent_geom.isEmpty(): + if not hasattr(parent, 'mapToGlobal') or not hasattr(parent, 'rect'): return - my_rect = self.frameGeometry() - my_rect.moveCenter(parent_geom.center()) - target = my_rect.topLeft() - screen = None - if hasattr(parent, 'screen'): - try: - screen = parent.screen() - except Exception: - screen = None - if screen is not None: - avail = screen.availableGeometry() - tx = max(avail.left(), min(target.x(), avail.right() - my_rect.width())) - ty = max(avail.top(), min(target.y(), avail.bottom() - my_rect.height())) - self.move(tx, ty) + parent_local_rect = parent.rect() + if parent_local_rect.isEmpty(): + return + my_size = self.size() + if my_size.isEmpty() or my_size.width() <= 0 or my_size.height() <= 0: + my_size = self.sizeHint() + if self._use_parent_local_geometry: + target_x = parent_local_rect.x() + (parent_local_rect.width() - my_size.width()) // 2 + target_y = parent_local_rect.y() + (parent_local_rect.height() - my_size.height()) // 2 + target_x = max(parent_local_rect.left(), min(target_x, parent_local_rect.right() - my_size.width() + 1)) + target_y = max(parent_local_rect.top(), min(target_y, parent_local_rect.bottom() - my_size.height() + 1)) else: - self.move(target) + parent_center = parent.mapToGlobal(parent_local_rect.center()) + target_x = parent_center.x() - my_size.width() // 2 + target_y = parent_center.y() - my_size.height() // 2 + screen = None + if hasattr(parent, 'screen'): + try: + screen = parent.screen() + except Exception: + screen = None + if screen is not None: + avail = screen.availableGeometry() + target_x = max(avail.left(), min(target_x, avail.right() - my_size.width())) + target_y = max(avail.top(), min(target_y, avail.bottom() - my_size.height())) + self.setGeometry(target_x, target_y, my_size.width(), my_size.height()) + if self._use_parent_local_geometry: + self.raise_() + self.setFocus(Qt.FocusReason.PopupFocusReason) except Exception: pass