From 6e3b052ba19539d8e52c5ac98bfea80d92110495 Mon Sep 17 00:00:00 2001 From: Milan Nikolic Date: Fri, 11 Oct 2024 19:12:38 +0200 Subject: [PATCH] Remove aspect option, which and titles/snapshots bindings --- src/m64py/archive.py | 6 +-- src/m64py/core/vidext.py | 6 ++- src/m64py/frontend/glwidget.py | 9 +--- src/m64py/frontend/mainwindow.py | 85 +++++++++----------------------- src/m64py/frontend/settings.py | 10 +--- src/m64py/frontend/worker.py | 47 ------------------ src/m64py/ui/i18n/m64py_de_DE.ts | 4 +- src/m64py/ui/i18n/m64py_en.ts | 2 +- src/m64py/ui/settings.ui | 38 ++++++-------- src/m64py/utils.py | 16 ------ 10 files changed, 50 insertions(+), 173 deletions(-) diff --git a/src/m64py/archive.py b/src/m64py/archive.py index fa7f65a..ed35ad9 100644 --- a/src/m64py/archive.py +++ b/src/m64py/archive.py @@ -23,15 +23,13 @@ import tempfile from subprocess import Popen, PIPE import binascii -from m64py.utils import which - try: import rarfile HAS_RAR = True RAR_CMD = None except ImportError: HAS_RAR = False - RAR_CMD = which("rar") or which("unrar") + RAR_CMD = shutil.which("rar") or shutil.which("unrar") try: from py7zlib import Archive7z @@ -39,7 +37,7 @@ try: LZMA_CMD = None except ImportError: HAS_7Z = False - LZMA_CMD = which("7z") + LZMA_CMD = shutil.which("7z") ZIP, GZIP, BZIP, RAR, LZMA, ROM = range(6) diff --git a/src/m64py/core/vidext.py b/src/m64py/core/vidext.py index 9a86dcc..1b3417a 100644 --- a/src/m64py/core/vidext.py +++ b/src/m64py/core/vidext.py @@ -17,7 +17,7 @@ import ctypes from PyQt6.QtWidgets import QApplication -from PyQt6.QtGui import QSurfaceFormat, QGuiApplication +from PyQt6.QtGui import QSurface, QSurfaceFormat, QGuiApplication from sdl2 import SDL_WasInit, SDL_InitSubSystem, SDL_QuitSubSystem, SDL_INIT_VIDEO from sdl2 import SDL_GetNumDisplayModes, SDL_DisplayMode, SDL_GetDisplayMode @@ -73,6 +73,8 @@ class Video: if QGuiApplication.platformName() != "wayland": self.glcontext.setFormat(self.glformat) + self.widget.setSurfaceType(QSurface.SurfaceType.OpenGLSurface) + return M64ERR_SUCCESS def init_with_render_mode(self, mode): @@ -87,6 +89,8 @@ class Video: self.glcontext.moveToThread(QApplication.instance().thread()) self.glcontext = None + self.widget.destroy() + return M64ERR_SUCCESS def list_modes(self, size_array, num_sizes): diff --git a/src/m64py/frontend/glwidget.py b/src/m64py/frontend/glwidget.py index 2b39dd7..a3d4d07 100644 --- a/src/m64py/frontend/glwidget.py +++ b/src/m64py/frontend/glwidget.py @@ -20,19 +20,12 @@ from PyQt6.QtGui import QWindow, QOpenGLContext, QSurface class GLWidget(QWindow): def __init__(self, parent=None): - self.parent = parent QWindow.__init__(self, None) - - self.setSurfaceType(QSurface.SurfaceType.OpenGLSurface) + self.parent = parent self.ctx = QOpenGLContext() def context(self): return self.ctx - def resizeEvent(self, event): - size = event.size() - width, height = int(size.width() * self.devicePixelRatio()), int(size.height() * self.devicePixelRatio()) - self.resize(width, height) - def mouseDoubleClickEvent(self, event): self.parent.toggle_fs.emit() diff --git a/src/m64py/frontend/mainwindow.py b/src/m64py/frontend/mainwindow.py index 6132d29..3274cfa 100644 --- a/src/m64py/frontend/mainwindow.py +++ b/src/m64py/frontend/mainwindow.py @@ -48,7 +48,6 @@ class MainWindow(QMainWindow, Ui_MainWindow): file_opening = pyqtSignal(str) set_caption = pyqtSignal(str) state_changed = pyqtSignal(tuple) - save_image = pyqtSignal(bool) info_dialog = pyqtSignal(str) archive_dialog = pyqtSignal(list) vidext_init = pyqtSignal(QOpenGLContext) @@ -70,8 +69,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.statusbar_label.setIndent(2) self.statusbar_label.setSizePolicy(QSizePolicy.Policy.Ignored, QSizePolicy.Policy.Fixed) self.statusbar.addPermanentWidget(self.statusbar_label, 1) - self.update_status(self.tr( - "Welcome to M64Py version %s." % FRONTEND_VERSION)) + self.update_status(self.tr("M64Py version %s." % FRONTEND_VERSION)) self.sizes = { SIZE_1X: self.action1X, @@ -107,16 +105,6 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.windowState() == Qt.WindowState.WindowMaximized): self.maximized = True - def resizeEvent(self, event): - event.ignore() - size = event.size() - if self.widgets_height: - width, height = size.width(), size.height() - self.window_size_triggered((width, height)) - else: - width, height = size.width(), size.height() - self.resize(width, height) - def showEvent(self, event): if not self.widgets_height: width, height = self.settings.get_size_safe() @@ -136,49 +124,44 @@ class MainWindow(QMainWindow, Ui_MainWindow): if modifiers & Qt.KeyboardModifier.AltModifier and (key == Qt.Key.Key_Enter or key == Qt.Key.Key_Return): self.toggle_fs.emit() - elif key == Qt.Key.Key_F3: - self.worker.save_title() - elif key == Qt.Key.Key_F4: - self.worker.save_snapshot() else: - try: - sdl_key = QT2SDL2[key] - self.worker.send_sdl_keydown(sdl_key) - except KeyError: - pass + if key in QT2SDL2: + self.worker.send_sdl_keydown(QT2SDL2[key]) def keyReleaseEvent(self, event): if self.worker.state != M64EMU_RUNNING: return key = event.key() - try: - sdl_key = QT2SDL2[key] - self.worker.send_sdl_keyup(sdl_key) - except KeyError: - pass + if key in QT2SDL2: + self.worker.send_sdl_keyup(QT2SDL2[key]) + + def resizeEvent(self, event): + event.ignore() + size = event.size() + if self.widgets_height: + width, height = size.width(), size.height() + self.window_size_triggered((width, height)) + else: + width, height = size.width(), size.height() + self.resize(width, height) def window_size_triggered(self, size): - window_width, window_height = size + width, height = size if self.vidext and self.worker.core.get_handle(): - game_height = window_height - self.widgets_height - game_width = window_width - - if not sys.platform == "win32": - if bool(self.settings.get_int_safe("keep_aspect", 1)): - game_width = int((4 / 3) * window_height) - self.worker.core.config.open_section("Video-General") - self.worker.core.config.set_parameter("ScreenWidth", game_width) - self.worker.core.config.set_parameter("ScreenHeight", game_height) + self.worker.core.config.set_parameter("ScreenWidth", width) + self.worker.core.config.set_parameter("ScreenHeight", height - self.widgets_height) - video_size = (game_width << 16) + game_height + video_size = ((int(width * self.devicePixelRatio()) << 16) + + (int(height * self.devicePixelRatio()) - self.widgets_height)) if self.worker.state in (M64EMU_RUNNING, M64EMU_PAUSED): self.worker.core_state_set(M64CORE_VIDEO_SIZE, video_size) - self.set_sizes((window_width, window_height - self.widgets_height)) - self.settings.qset.setValue("size", (window_width, window_height - self.widgets_height)) - self.resize(window_width, window_height) + self.set_sizes((width, height - self.widgets_height)) + self.settings.qset.setValue("size", (width, height - self.widgets_height)) + + self.resize(width, height) def set_sizes(self, size): """Sets 'Window Size' radio buttons on resize event.""" @@ -189,21 +172,6 @@ class MainWindow(QMainWindow, Ui_MainWindow): for action in self.sizes.values(): action.setChecked(False) - def keep_aspect(self, size): - """Keeps 4:3 aspect ratio.""" - width, height = size - if self.maximized: - return width, height - fixed_ratio = 1.3333333333333333 - current_ratio = float(width)/float(height) - if fixed_ratio > current_ratio: - w = int(width) - h = int(width/fixed_ratio) - else: - h = int(height) - w = int(height*fixed_ratio) - return w, h - def center_widget(self): """Centers widget on desktop.""" size = self.size() @@ -221,7 +189,6 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.file_opening.connect(self.on_file_opening) self.set_caption.connect(self.on_set_caption) self.state_changed.connect(self.on_state_changed) - self.save_image.connect(self.on_save_image) self.info_dialog.connect(self.on_info_dialog) self.archive_dialog.connect(self.on_archive_dialog) self.toggle_fs.connect(self.on_toggle_fs) @@ -316,10 +283,6 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.update_status("Loading %s..." % ( os.path.basename(filepath))) - def on_save_image(self, title): - """Saves snapshot or title image.""" - self.worker.save_image(title) - def on_info_dialog(self, info): """Shows info dialog.""" self.settings.show_page(0) diff --git a/src/m64py/frontend/settings.py b/src/m64py/frontend/settings.py index 6dd611d..6328a47 100644 --- a/src/m64py/frontend/settings.py +++ b/src/m64py/frontend/settings.py @@ -15,7 +15,6 @@ # along with this program. If not, see . import os -import sys from PyQt6.QtCore import Qt, QSettings from PyQt6.QtWidgets import QDialog, QFileDialog, QRadioButton, QVBoxLayout @@ -250,13 +249,6 @@ class Settings(QDialog, Ui_Settings): self.checkVsync.setToolTip( self.get_parameter_help_safe("VerticalSync")) - if sys.platform == "win32": - self.checkKeepAspect.setChecked(False) - self.checkKeepAspect.setEnabled(False) - else: - keep_aspect = bool(self.get_int_safe("keep_aspect", 1)) - self.checkKeepAspect.setChecked(keep_aspect) - disable_screensaver = bool(self.get_int_safe("disable_screensaver", 1)) self.checkDisableScreenSaver.setChecked(disable_screensaver) @@ -340,7 +332,7 @@ class Settings(QDialog, Ui_Settings): self.core.config.set_parameter("ScreenHeight", int(height)) self.core.config.set_parameter("Fullscreen", self.checkFullscreen.isChecked()) self.core.config.set_parameter("VerticalSync", self.checkVsync.isChecked()) - self.qset.setValue("keep_aspect", int(self.checkKeepAspect.isChecked())) + self.qset.setValue("disable_screensaver", int(self.checkDisableScreenSaver.isChecked())) self.qset.setValue("enable_vidext", int(self.checkEnableVidExt.isChecked())) diff --git a/src/m64py/frontend/worker.py b/src/m64py/frontend/worker.py index ea1ca7e..b1920a4 100644 --- a/src/m64py/frontend/worker.py +++ b/src/m64py/frontend/worker.py @@ -205,53 +205,6 @@ class Worker(QThread): """Saves screenshot.""" self.core.take_next_screenshot() - def get_screenshot(self, path): - """Gets last saved screenshot.""" - name = self.core.rom_header.Name.decode() - rom_name = name.replace(' ', '_').lower() - screenshots = [] - for filename in os.listdir(path): - if filename.startswith(rom_name): - screenshots.append(os.path.join( - path, filename)) - if screenshots: - return sorted(screenshots)[-1] - return None - - def save_image(self, title=True): - """Saves snapshot or title image.""" - data_path = self.core.config.get_path("UserData") - capture = "title" if title else "snapshot" - dst_path = os.path.join(data_path, capture) - if not os.path.isdir(dst_path): - os.makedirs(dst_path) - screenshot = self.get_screenshot( - os.path.join(data_path, "screenshot")) - if screenshot: - image_name = "%X%X.png" % ( - sl(self.core.rom_header.CRC1), sl(self.core.rom_header.CRC2)) - try: - shutil.copyfile(screenshot, os.path.join(dst_path, image_name)) - log.info("Captured %s" % capture) - except IOError: - log.exception("couldn't save image %s" % image_name) - - def save_title(self): - """Saves title.""" - self.save_screenshot() - QTimer.singleShot(1500, self.save_title_image) - - def save_snapshot(self): - """Saves snapshot.""" - self.save_screenshot() - QTimer.singleShot(1500, self.save_snapshot_image) - - def save_title_image(self): - self.parent.save_image.emit(True) - - def save_snapshot_image(self): - self.parent.save_image.emit(False) - def state_load(self, state_path=None): """Loads state.""" self.core.state_load(state_path) diff --git a/src/m64py/ui/i18n/m64py_de_DE.ts b/src/m64py/ui/i18n/m64py_de_DE.ts index 1a9fc49..6d9fbb2 100644 --- a/src/m64py/ui/i18n/m64py_de_DE.ts +++ b/src/m64py/ui/i18n/m64py_de_DE.ts @@ -587,8 +587,8 @@ - Welcome to M64Py version %s. - Willkommen zu M64py version %s. + M64Py version %s. + M64py version %s. diff --git a/src/m64py/ui/i18n/m64py_en.ts b/src/m64py/ui/i18n/m64py_en.ts index 71dedc0..8c12f15 100644 --- a/src/m64py/ui/i18n/m64py_en.ts +++ b/src/m64py/ui/i18n/m64py_en.ts @@ -586,7 +586,7 @@ - Welcome to M64Py version %s. + M64Py version %s. diff --git a/src/m64py/ui/settings.ui b/src/m64py/ui/settings.ui index 456f55d..7abbd21 100644 --- a/src/m64py/ui/settings.ui +++ b/src/m64py/ui/settings.ui @@ -426,26 +426,6 @@ QGroupBox::title { false - - - - On Screen Display - - - true - - - - - - - Disables ScreenSaver when emulator is running - - - Disable ScreenSaver - - - @@ -459,13 +439,23 @@ QGroupBox::title { - - + + - Maintain aspect-ratio on resizing + Disables ScreenSaver when emulator is running - Keep Aspect Ratio + Disable ScreenSaver + + + + + + + On Screen Display + + + true diff --git a/src/m64py/utils.py b/src/m64py/utils.py index 2fc05e8..54704a9 100644 --- a/src/m64py/utils.py +++ b/src/m64py/utils.py @@ -13,25 +13,9 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -import os import re -def which(prog): - def is_exe(fp): - return os.path.exists(fp) and os.access(fp, os.X_OK) - fpath, fname = os.path.split(prog) - if fpath: - if is_exe(prog): - return prog - else: - for path in os.environ["PATH"].split(os.pathsep): - filename = os.path.join(path, prog) - if is_exe(filename): - return filename - return None - - def version_split(ver): return "%d.%d.%d" % ( ((ver >> 16) & 0xffff),