diff --git a/ftl/core/preferences.ftl b/ftl/core/preferences.ftl index 10ee2b028..3266d489b 100644 --- a/ftl/core/preferences.ftl +++ b/ftl/core/preferences.ftl @@ -6,7 +6,6 @@ preferences-backupsanki-will-create-a-backup-of =

0 0 640 - 374 + 406 @@ -56,11 +56,7 @@ - - - PREFERENCES_HARDWARE_ACCELERATION_FASTER_MAY_CAUSE_DISPLAY - - + @@ -596,7 +592,7 @@ lang - hwAccel + video_driver showPlayButtons interrupt_audio pastePNG diff --git a/qt/aqt/preferences.py b/qt/aqt/preferences.py index 65cba5c3c..f747acc27 100644 --- a/qt/aqt/preferences.py +++ b/qt/aqt/preferences.py @@ -4,11 +4,26 @@ import anki.lang import aqt from aqt import AnkiQt -from aqt.profiles import RecordingDriver +from aqt.profiles import RecordingDriver, VideoDriver from aqt.qt import * from aqt.utils import TR, askUser, openHelp, showInfo, showWarning, tr +def video_driver_name_for_platform(driver: VideoDriver) -> str: + if driver == VideoDriver.ANGLE: + return tr(TR.PREFERENCES_VIDEO_DRIVER_ANGLE) + elif driver == VideoDriver.Software: + if isMac: + return tr(TR.PREFERENCES_VIDEO_DRIVER_SOFTWARE_MAC) + else: + return tr(TR.PREFERENCES_VIDEO_DRIVER_SOFTWARE_OTHER) + else: + if isMac: + return tr(TR.PREFERENCES_VIDEO_DRIVER_OPENGL_MAC) + else: + return tr(TR.PREFERENCES_VIDEO_DRIVER_OPENGL_OTHER) + + class Preferences(QDialog): def __init__(self, mw: AnkiQt): QDialog.__init__(self, mw, Qt.Window) @@ -81,10 +96,7 @@ class Preferences(QDialog): f = self.form qc = self.mw.col.conf - if isMac: - f.hwAccel.setVisible(False) - else: - f.hwAccel.setChecked(self.mw.pm.glMode() != "software") + self.setup_video_driver() f.newSpread.addItems(list(c.newCardSchedulingLabels(self.mw.col).values())) @@ -106,19 +118,28 @@ class Preferences(QDialog): f.newSched.setChecked(True) f.new_timezone.setChecked(s.new_timezone) + def setup_video_driver(self): + self.video_drivers = VideoDriver.all_for_platform() + names = [ + tr(TR.PREFERENCES_VIDEO_DRIVER, driver=video_driver_name_for_platform(d)) + for d in self.video_drivers + ] + self.form.video_driver.addItems(names) + self.form.video_driver.setCurrentIndex( + self.video_drivers.index(self.mw.pm.video_driver()) + ) + + def update_video_driver(self): + new_driver = self.video_drivers[self.form.video_driver.currentIndex()] + if new_driver != self.mw.pm.video_driver(): + self.mw.pm.set_video_driver(new_driver) + showInfo(tr(TR.PREFERENCES_CHANGES_WILL_TAKE_EFFECT_WHEN_YOU)) + def updateCollection(self): f = self.form d = self.mw.col - if not isMac: - wasAccel = self.mw.pm.glMode() != "software" - wantAccel = f.hwAccel.isChecked() - if wasAccel != wantAccel: - if wantAccel: - self.mw.pm.setGlMode("auto") - else: - self.mw.pm.setGlMode("software") - showInfo(tr(TR.PREFERENCES_CHANGES_WILL_TAKE_EFFECT_WHEN_YOU)) + self.update_video_driver() qc = d.conf qc["addToCur"] = not f.useCurrent.currentIndex() diff --git a/qt/aqt/profiles.py b/qt/aqt/profiles.py index 71ff9d0d1..e90bc9f1d 100644 --- a/qt/aqt/profiles.py +++ b/qt/aqt/profiles.py @@ -1,6 +1,8 @@ # Copyright: Ankitects Pty Ltd and contributors # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html +from __future__ import annotations + import enum import io import locale @@ -37,6 +39,40 @@ class RecordingDriver(Enum): QtAudioInput = "Qt" +class VideoDriver(Enum): + OpenGL = "auto" + ANGLE = "angle" + Software = "software" + + @staticmethod + def default_for_platform() -> VideoDriver: + if isMac: + return VideoDriver.OpenGL + else: + return VideoDriver.Software + + def constrained_to_platform(self) -> VideoDriver: + if self == VideoDriver.ANGLE and not isWin: + return VideoDriver.Software + return self + + def next(self) -> VideoDriver: + if self == VideoDriver.Software: + return VideoDriver.OpenGL + elif self == VideoDriver.OpenGL and isWin: + return VideoDriver.ANGLE + else: + return VideoDriver.Software + + @staticmethod + def all_for_platform() -> List[VideoDriver]: + all = [VideoDriver.OpenGL] + if isWin: + all.append(VideoDriver.ANGLE) + all.append(VideoDriver.Software) + return all + + metaConf = dict( ver=0, updates=True, @@ -535,41 +571,24 @@ create table if not exists profiles # OpenGL ###################################################################### - def _glPath(self) -> str: + def _gldriver_path(self) -> str: return os.path.join(self.base, "gldriver") - def glMode(self) -> str: - if isMac: - return "auto" + def video_driver(self) -> VideoDriver: + path = self._gldriver_path() + try: + with open(path) as file: + text = file.read().strip() + return VideoDriver(text).constrained_to_platform() + except (ValueError, OSError): + return VideoDriver.default_for_platform() - path = self._glPath() - if not os.path.exists(path): - return "software" + def set_video_driver(self, driver: VideoDriver) -> None: + with open(self._gldriver_path(), "w") as file: + file.write(driver.value) - with open(path, "r") as file: - mode = file.read().strip() - - if mode == "angle" and isWin: - return mode - elif mode == "software": - return mode - return "auto" - - def setGlMode(self, mode) -> None: - with open(self._glPath(), "w") as file: - file.write(mode) - - def nextGlMode(self) -> None: - mode = self.glMode() - if mode == "software": - self.setGlMode("auto") - elif mode == "auto": - if isWin: - self.setGlMode("angle") - else: - self.setGlMode("software") - elif mode == "angle": - self.setGlMode("software") + def set_next_video_driver(self) -> None: + self.set_video_driver(self.video_driver().next()) # Shared options ###################################################################### diff --git a/qt/aqt/reviewer.py b/qt/aqt/reviewer.py index a9a11ec7a..51db9da75 100644 --- a/qt/aqt/reviewer.py +++ b/qt/aqt/reviewer.py @@ -16,6 +16,7 @@ from anki import hooks from anki.cards import Card from anki.utils import stripHTML from aqt import AnkiQt, gui_hooks +from aqt.profiles import VideoDriver from aqt.qt import * from aqt.sound import av_player, play_clicked_audio, record_audio from aqt.theme import theme_manager @@ -138,7 +139,7 @@ class Reviewer: def revHtml(self) -> str: extra = self.mw.col.conf.get("reviewExtra", "") fade = "" - if self.mw.pm.glMode() == "software": + if self.mw.pm.video_driver() == VideoDriver.Software: fade = "" return """