From 679c95bc10fb94f8e43d7bb210e6abbf5a20a5ce Mon Sep 17 00:00:00 2001 From: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com> Date: Sat, 4 Jul 2026 16:09:48 -0700 Subject: [PATCH] ui: add title for optional modules section in the about window --- src/tagstudio/qt/mixed/about_modal.py | 74 +++++++++++++------- src/tagstudio/qt/ts_qt.py | 6 +- src/tagstudio/resources/translations/en.json | 1 + 3 files changed, 52 insertions(+), 29 deletions(-) diff --git a/src/tagstudio/qt/mixed/about_modal.py b/src/tagstudio/qt/mixed/about_modal.py index 05fd1a5b..1f2535ca 100644 --- a/src/tagstudio/qt/mixed/about_modal.py +++ b/src/tagstudio/qt/mixed/about_modal.py @@ -36,7 +36,7 @@ from tagstudio.qt.models.palette import ColorType, UiColor, get_ui_color from tagstudio.qt.resource_manager import ResourceManager from tagstudio.qt.translations import Translations from tagstudio.qt.utils.file_opener import open_file -from tagstudio.qt.views.stylesheets.stylesheets import form_content_style +from tagstudio.qt.views.stylesheets.stylesheets import form_content_style, header class AboutModal(QWidget): @@ -66,6 +66,10 @@ class AboutModal(QWidget): self.content_layout.setContentsMargins(12, 12, 12, 12) self.content_layout.setSpacing(12) + red = get_ui_color(ColorType.PRIMARY, UiColor.RED) + green = get_ui_color(ColorType.PRIMARY, UiColor.GREEN) + amber = get_ui_color(ColorType.PRIMARY, UiColor.AMBER) + # TagStudio Logo ------------------------------------------------------- self.logo_widget = QLabel() self.logo_pixmap = QPixmap.fromImage(ImageQt.ImageQt(self.rm.ts_logo_text_color)) @@ -78,7 +82,7 @@ class AboutModal(QWidget): self.logo_widget.setAlignment(Qt.AlignmentFlag.AlignCenter) # Version -------------------------------------------------------------- - self.version_label = QLabel(f"

{AboutModal.VERSION_STR}

") + self.version_label = QLabel(header(AboutModal.VERSION_STR, 3)) self.version_label.setAlignment(Qt.AlignmentFlag.AlignCenter) # Copyright ------------------------------------------------------------ @@ -94,29 +98,10 @@ class AboutModal(QWidget): self.desc_label.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) # System Info ---------------------------------------------------------- - ffmpeg_ver = FfmpegStatus.version() - ffprobe_ver = FfprobeStatus.version() - ripgrep_ver = RipgrepStatus.version() - red = get_ui_color(ColorType.PRIMARY, UiColor.RED) - green = get_ui_color(ColorType.PRIMARY, UiColor.GREEN) - amber = get_ui_color(ColorType.PRIMARY, UiColor.AMBER) - missing = Translations["generic.missing"] - found = Translations["about.module.found"] - - ffmpeg_status = f'{missing}' - if ffmpeg_ver is not None: - ffmpeg_status = f'{found} (' + ffmpeg_ver + ")" - - ffprobe_status = f'{missing}' - if ffprobe_ver is not None: - ffprobe_status = f'{found} (' + ffprobe_ver + ")" - - ripgrep_status = f'{missing}' - if ripgrep_ver is not None: - ripgrep_status = f'{found} (' + ripgrep_ver + ")" self.system_info_widget = QWidget() self.system_info_layout = QFormLayout(self.system_info_widget) + self.system_info_layout.setSpacing(4) self.system_info_layout.setLabelAlignment(Qt.AlignmentFlag.AlignRight) # Version @@ -147,6 +132,40 @@ class AboutModal(QWidget): # TODO: Add row for "App Cache Path" (currently that TagStudio.ini file) + # Optional Modules ----------------------------------------------------- + + self.parent_optional_modules_widget = QWidget() + self.parent_optional_modules_layout = QVBoxLayout(self.parent_optional_modules_widget) + self.parent_optional_modules_layout.setContentsMargins(0, 0, 0, 0) + self.parent_optional_modules_layout.setSpacing(0) + + # Subtitle + self.optional_modules_label = QLabel(header(Translations["about.modules.title"], 4)) + + self.optional_modules_widget = QWidget() + self.optional_modules_layout = QFormLayout(self.optional_modules_widget) + self.optional_modules_layout.setSpacing(4) + self.optional_modules_layout.setLabelAlignment(Qt.AlignmentFlag.AlignRight) + + ffmpeg_ver = FfmpegStatus.version() + ffprobe_ver = FfprobeStatus.version() + ripgrep_ver = RipgrepStatus.version() + + missing = Translations["generic.missing"] + found = Translations["about.module.found"] + + ffmpeg_status = f'{missing}' + if ffmpeg_ver is not None: + ffmpeg_status = f'{found} (' + ffmpeg_ver + ")" + + ffprobe_status = f'{missing}' + if ffprobe_ver is not None: + ffprobe_status = f'{found} (' + ffprobe_ver + ")" + + ripgrep_status = f'{missing}' + if ripgrep_ver is not None: + ripgrep_status = f'{found} (' + ripgrep_ver + ")" + # FFmpeg Status ffmpeg_path_title = QLabel("FFmpeg") ffmpeg_path_content = ClickableLabel(f"{ffmpeg_status}") @@ -157,7 +176,7 @@ class AboutModal(QWidget): ) ffmpeg_path_content.setCursor(Qt.CursorShape.PointingHandCursor) ffmpeg_path_content.setStyleSheet(form_content_style()) - self.system_info_layout.addRow(ffmpeg_path_title, ffmpeg_path_content) + self.optional_modules_layout.addRow(ffmpeg_path_title, ffmpeg_path_content) ffmpeg_path_content.setMaximumWidth(ffmpeg_path_content.sizeHint().width()) # FFprobe Status @@ -170,11 +189,10 @@ class AboutModal(QWidget): ) ffprobe_path_content.setCursor(Qt.CursorShape.PointingHandCursor) ffprobe_path_content.setStyleSheet(form_content_style()) - self.system_info_layout.addRow(ffprobe_path_title, ffprobe_path_content) + self.optional_modules_layout.addRow(ffprobe_path_title, ffprobe_path_content) ffprobe_path_content.setMaximumWidth(ffprobe_path_content.sizeHint().width()) # ripgrep Status - # TODO: Add a central class to find ripgrep info, similar to ffmpeg ripgrep_path_title = QLabel("ripgrep") # NOTE: Don't localize ripgrep_path_content = ClickableLabel() ripgrep_path_content.setText(f"{ripgrep_status}") # TODO: Pass in constructor after #1386 @@ -186,7 +204,10 @@ class AboutModal(QWidget): ripgrep_path_content.setCursor(Qt.CursorShape.PointingHandCursor) ripgrep_path_content.setStyleSheet(form_content_style()) ripgrep_path_content.setMaximumWidth(ripgrep_path_content.sizeHint().width()) - self.system_info_layout.addRow(ripgrep_path_title, ripgrep_path_content) + self.optional_modules_layout.addRow(ripgrep_path_title, ripgrep_path_content) + + self.parent_optional_modules_layout.addWidget(self.optional_modules_label) + self.parent_optional_modules_layout.addWidget(self.optional_modules_widget) # Links ---------------------------------------------------------------- @@ -215,6 +236,7 @@ class AboutModal(QWidget): self.content_layout.addWidget(self.version_label) self.content_layout.addWidget(self.desc_label) self.content_layout.addWidget(self.system_info_widget) + self.content_layout.addWidget(self.parent_optional_modules_widget) self.content_layout.addStretch(1) self.content_layout.addWidget(self.links_label) self.content_layout.addWidget(self.copyright_label) diff --git a/src/tagstudio/qt/ts_qt.py b/src/tagstudio/qt/ts_qt.py index b51c65b6..8f36f9cd 100644 --- a/src/tagstudio/qt/ts_qt.py +++ b/src/tagstudio/qt/ts_qt.py @@ -1767,7 +1767,7 @@ class QtDriver(DriverMixin, QObject): if FfmpegStatus.which(): logger.info( "[QtDriver] FFmpeg found", - bin_location=FfmpegStatus.which(), + which=FfmpegStatus.which(), version=FfmpegStatus.version(), ) else: @@ -1776,7 +1776,7 @@ class QtDriver(DriverMixin, QObject): if FfprobeStatus.which(): logger.info( "[QtDriver] FFprobe found", - bin_location=FfprobeStatus.which(), + which=FfprobeStatus.which(), version=FfprobeStatus.version(), ) else: @@ -1785,7 +1785,7 @@ class QtDriver(DriverMixin, QObject): if RipgrepStatus.which(): logger.info( "[QtDriver] ripgrep found", - bin_location=RipgrepStatus.which(), + which=RipgrepStatus.which(), version=RipgrepStatus.version(), ) else: diff --git a/src/tagstudio/resources/translations/en.json b/src/tagstudio/resources/translations/en.json index 51e37e2a..4a8001e4 100644 --- a/src/tagstudio/resources/translations/en.json +++ b/src/tagstudio/resources/translations/en.json @@ -4,6 +4,7 @@ "about.description": "TagStudio is a photo and file organization application with an underlying tag-based system that focuses on giving freedom and flexibility to the user. No proprietary programs or formats, no sea of sidecar files, and no complete upheaval of your filesystem structure.", "about.documentation": "Documentation", "about.module.found": "Found", + "about.modules.title": "Optional Modules", "about.title": "About TagStudio", "about.version": "Version", "about.version.latest": "{built_version} (Latest Release: {latest_version})",