Files
PortProtonQt/portprotonqt/system_overlay.py
Boris Yumankulov 9373aa1329
All checks were successful
Code and build check / Check code (push) Successful in 1m29s
Code and build check / Build with uv (push) Successful in 48s
feat: added "Return to Desktop" button to overlay
Signed-off-by: Boris Yumankulov <boria138@altlinux.org>
2025-06-09 19:54:11 +05:00

110 lines
4.3 KiB
Python

import subprocess
from PySide6.QtWidgets import QDialog, QVBoxLayout, QPushButton, QMessageBox
from PySide6.QtWidgets import QApplication
from PySide6.QtCore import Qt
from portprotonqt.logger import get_logger
import os
from portprotonqt.localization import _
logger = get_logger(__name__)
class SystemOverlay(QDialog):
"""Overlay dialog for system actions like reboot, sleep, shutdown, suspend, and exit."""
def __init__(self, parent, theme):
super().__init__(parent)
self.theme = theme
self.setWindowTitle(_("System Overlay"))
self.setModal(True)
self.setFixedSize(400, 300)
layout = QVBoxLayout(self)
layout.setContentsMargins(20, 20, 20, 20)
layout.setSpacing(10)
# Reboot button
reboot_button = QPushButton(_("Reboot"))
reboot_button.setStyleSheet(self.theme.OVERLAY_BUTTON_STYLE)
reboot_button.setFocusPolicy(Qt.FocusPolicy.StrongFocus)
reboot_button.clicked.connect(self.reboot)
layout.addWidget(reboot_button)
# Shutdown button
shutdown_button = QPushButton(_("Shutdown"))
shutdown_button.setStyleSheet(self.theme.OVERLAY_BUTTON_STYLE)
shutdown_button.setFocusPolicy(Qt.FocusPolicy.StrongFocus)
shutdown_button.clicked.connect(self.shutdown)
layout.addWidget(shutdown_button)
# Suspend button
suspend_button = QPushButton(_("Suspend"))
suspend_button.setStyleSheet(self.theme.OVERLAY_BUTTON_STYLE)
suspend_button.setFocusPolicy(Qt.FocusPolicy.StrongFocus)
suspend_button.clicked.connect(self.suspend)
layout.addWidget(suspend_button)
# Exit application button
exit_button = QPushButton(_("Exit Application"))
exit_button.setStyleSheet(self.theme.OVERLAY_BUTTON_STYLE)
exit_button.setFocusPolicy(Qt.FocusPolicy.StrongFocus)
exit_button.clicked.connect(self.exit_application)
layout.addWidget(exit_button)
# Return to Desktop button
desktop_button = QPushButton(_("Return to Desktop"))
desktop_button.setStyleSheet(self.theme.OVERLAY_BUTTON_STYLE)
desktop_button.setFocusPolicy(Qt.FocusPolicy.StrongFocus)
desktop_button.clicked.connect(self.return_to_desktop)
script_path = "/usr/bin/portprotonqt-session-select"
script_exists = os.path.isfile(script_path)
desktop_button.setEnabled(script_exists)
if not script_exists:
desktop_button.setToolTip(_("portprotonqt-session-select file not found at /usr/bin/"))
layout.addWidget(desktop_button)
# Cancel button
cancel_button = QPushButton(_("Cancel"))
cancel_button.setStyleSheet(self.theme.OVERLAY_BUTTON_STYLE)
cancel_button.setFocusPolicy(Qt.FocusPolicy.StrongFocus)
cancel_button.clicked.connect(self.reject)
layout.addWidget(cancel_button)
# Set focus to the first button
reboot_button.setFocus()
def reboot(self):
try:
subprocess.run(["systemctl", "reboot"], check=True)
except subprocess.CalledProcessError as e:
logger.error(f"Failed to reboot: {e}")
QMessageBox.warning(self, _("Error"), _("Failed to reboot the system"))
self.accept()
def shutdown(self):
try:
subprocess.run(["systemctl", "poweroff"], check=True)
except subprocess.CalledProcessError as e:
logger.error(f"Failed to shutdown: {e}")
QMessageBox.warning(self, _("Error"), _("Failed to shutdown the system"))
self.accept()
def suspend(self):
try:
subprocess.run(["systemctl", "suspend"], check=True)
except subprocess.CalledProcessError as e:
logger.error(f"Failed to suspend: {e}")
QMessageBox.warning(self, _("Error"), _("Failed to suspend the system"))
self.accept()
def return_to_desktop(self):
try:
script_path = os.path.join(os.path.dirname(__file__), "portprotonqt-session-select")
subprocess.run([script_path, "desktop"], check=True)
except subprocess.CalledProcessError as e:
logger.error(f"Failed to return to desktop: {e}")
QMessageBox.warning(self, _("Error"), _("Failed to return to desktop"))
self.accept()
def exit_application(self):
QApplication.quit()
self.accept()