diff --git a/Source/CeditQt/main_window.py b/Source/CeditQt/main_window.py index 62320df63..b278cd1c8 100644 --- a/Source/CeditQt/main_window.py +++ b/Source/CeditQt/main_window.py @@ -8,7 +8,7 @@ import time from PySide6.QtCore import QProcess, QSettings, QTimer, Qt, QUrl, Signal -from PySide6.QtGui import QAction, QDesktopServices, QFont, QFontDatabase, QPixmap +from PySide6.QtGui import QAction, QDesktopServices, QPixmap from PySide6.QtWidgets import ( QCheckBox, QComboBox, @@ -56,7 +56,7 @@ from tabs.mechanical_vents_tab import MechanicalVentsTab from tabs.output_tab import OutputTab from tabs.placeholder_tab import PlaceholderTab -from tabs.simulation_tab import SimulationTab +from tabs.simulation_tab import SimulationTab, fixed_width_font from tabs.targets_tab import TargetsTab from tabs.thermal_properties_tab import ThermalPropertiesTab from tabs.wall_vents_tab import WallVentsTab @@ -1893,7 +1893,7 @@ def __init__(self, parent, case_name: str, simulation_time: float): self.errors_edit.setReadOnly(True) self.errors_edit.setLineWrapMode(QPlainTextEdit.LineWrapMode.NoWrap) self.errors_edit.setMinimumHeight(120) - self.errors_edit.setFont(self.fixed_width_font()) + self.errors_edit.setFont(fixed_width_font()) self.close_button = QPushButton("Close") self.stop_button = QPushButton("Stop") @@ -1924,22 +1924,6 @@ def __init__(self, parent, case_name: str, simulation_time: float): layout.addLayout(button_layout) self.setLayout(layout) - @staticmethod - def fixed_width_font() -> QFont: - import matplotlib - - # Use the same bundled TrueType font in the UI and headless captures. - font_path = Path(matplotlib.get_data_path()) / "fonts" / "ttf" / "DejaVuSansMono.ttf" - font_id = QFontDatabase.addApplicationFont(str(font_path)) - families = QFontDatabase.applicationFontFamilies(font_id) - if not families: - raise RuntimeError(f"Could not load the monospace font {font_path}") - font = QFont(families[0], 12) - font.setStyleHint(QFont.StyleHint.Monospace) - font.setFixedPitch(True) - font.setStyleStrategy(QFont.StyleStrategy.PreferAntialias | QFont.StyleStrategy.PreferOutline) - return font - def summary_headers(self) -> list[str]: return [ "Compartment", diff --git a/Source/CeditQt/tabs/simulation_tab.py b/Source/CeditQt/tabs/simulation_tab.py index 98fa58a0f..00b9b5ce5 100644 --- a/Source/CeditQt/tabs/simulation_tab.py +++ b/Source/CeditQt/tabs/simulation_tab.py @@ -1,6 +1,9 @@ from __future__ import annotations import math +import os +import sys +from pathlib import Path from PySide6.QtCore import Qt from PySide6.QtGui import QFont, QFontDatabase, QTextCursor @@ -34,6 +37,29 @@ def format_mass_fraction(value: float | int) -> str: return f"{format_number(value)} kg/kg" +def fixed_width_font() -> QFont: + if sys.platform == "win32": + # Preserve Windows' Courier appearance without the offscreen bitmap fallback. + font_dir = Path(os.environ.get("WINDIR", r"C:\Windows")) / "Fonts" + font_path = font_dir / "cour.ttf" + font_id = QFontDatabase.addApplicationFont(str(font_path)) + families = QFontDatabase.applicationFontFamilies(font_id) + if not families: + raise RuntimeError(f"Could not load Courier New TrueType font {font_path}") + if (font_dir / "courbd.ttf").is_file(): + QFontDatabase.addApplicationFont(str(font_dir / "courbd.ttf")) + font = QFont(families[0]) + elif "Menlo" in QFontDatabase.families(): + font = QFont("Menlo") + else: + font = QFontDatabase.systemFont(QFontDatabase.SystemFont.FixedFont) + font.setPointSize(12) + font.setStyleHint(QFont.StyleHint.Monospace) + font.setFixedPitch(True) + font.setStyleStrategy(QFont.StyleStrategy.PreferAntialias | QFont.StyleStrategy.PreferOutline) + return font + + class SimulationTab(QWidget): def __init__(self, parent=None): super().__init__(parent) @@ -66,16 +92,7 @@ def __init__(self, parent=None): self.message_panel.setReadOnly(True) self.message_panel.setLineWrapMode(QPlainTextEdit.LineWrapMode.NoWrap) - fixed_font = QFontDatabase.systemFont(QFontDatabase.SystemFont.FixedFont) - - if "Menlo" in QFontDatabase.families(): - fixed_font = QFont("Menlo") - - fixed_font.setStyleHint(QFont.StyleHint.Monospace) - fixed_font.setFixedPitch(True) - fixed_font.setPointSize(12) - - self.message_panel.setFont(fixed_font) + self.message_panel.setFont(fixed_width_font()) self.message_panel.setPlainText("") self.message_panel.setMinimumHeight(140)