From 634543eea6fd4e21cc99d7f5df605201568b06f9 Mon Sep 17 00:00:00 2001 From: HRiggs Date: Fri, 23 Jan 2026 22:13:07 -0500 Subject: [PATCH] pre animation --- steam_workshop_gui.py | 147 +++++++++++++++--------------------------- 1 file changed, 53 insertions(+), 94 deletions(-) diff --git a/steam_workshop_gui.py b/steam_workshop_gui.py index e84193c..f8b960e 100644 --- a/steam_workshop_gui.py +++ b/steam_workshop_gui.py @@ -12,14 +12,6 @@ from dotenv import load_dotenv # Load environment variables load_dotenv() -# Try to import pyglet for font loading -try: - import pyglet - PYGLET_AVAILABLE = True -except ImportError: - PYGLET_AVAILABLE = False - print("pyglet not available - custom fonts may not work properly") - class SteamWorkshopGUI: def __init__(self, root): self.root = root @@ -54,108 +46,75 @@ class SteamWorkshopGUI: self.create_output_section(right_frame) def load_custom_font(self): - """Load the RimWorld font using pyglet""" + """Load the RimWorld font using Windows AddFontResourceEx with private flag""" try: font_path = os.path.join("art", "RimWordFont4.ttf") if os.path.exists(font_path): abs_font_path = os.path.abspath(font_path) - print(f"Font file found: {abs_font_path}") - if PYGLET_AVAILABLE: - try: - # Use pyglet to add the font - pyglet.font.add_file(abs_font_path) - - # Try to get the font family name from pyglet - # Load the font to get its actual family name - pyglet_font = pyglet.font.load(None, 12, bold=False, italic=False) - - # Common RimWorld font family names to try - possible_names = [ - "RimWorld", - "RimWorldFont", - "RimWordFont4", - "Calibri", - "Arial" - ] - - # Test each possible font name - for font_name in possible_names: - try: - test_font = font.Font(family=font_name, size=10) - # If we get here, the font worked - self.custom_font_family = font_name - self.custom_font_available = True - print(f"Successfully loaded font with pyglet: {font_name}") - return - except Exception as e: - continue - - print("pyglet loaded font but couldn't find working family name") - self.custom_font_available = False - - except Exception as e: - print(f"pyglet font loading failed: {e}") - self.custom_font_available = False + # Use the Stack Overflow method with AddFontResourceEx + success = self._load_font_private(abs_font_path) + + if success: + # Use the actual font family name from the TTF file + self.custom_font_family = "RimWordFont" + self.custom_font_available = True + return + else: - print("pyglet not available, trying Windows registration...") - # Fall back to Windows registration method - try: - import ctypes - from ctypes import wintypes - - # Add font resource to Windows - gdi32 = ctypes.windll.gdi32 - result = gdi32.AddFontResourceW(abs_font_path) - - if result > 0: - print(f"Successfully registered font with Windows") - - # Notify Windows that fonts have changed - try: - HWND_BROADCAST = 0xFFFF - WM_FONTCHANGE = 0x001D - ctypes.windll.user32.SendMessageW(HWND_BROADCAST, WM_FONTCHANGE, 0, 0) - print("Sent font change notification to Windows") - except Exception as notify_error: - print(f"Could not send font change notification: {notify_error}") - - # For Windows registration, let's try using the actual font file name - # Sometimes the family name is different from what we expect - self.custom_font_family = "RimWorld" # Default assumption - self.custom_font_available = True - print(f"Using Windows-registered font: {self.custom_font_family}") - else: - print("Failed to register font with Windows") - self.custom_font_available = False - - except Exception as e: - print(f"Windows font registration error: {e}") - self.custom_font_available = False + self.custom_font_available = False else: - print(f"Font file not found: {font_path}") self.custom_font_available = False except Exception as e: - print(f"Error loading custom font: {e}") self.custom_font_available = False + + # Initialize fallback values if font loading failed + if not hasattr(self, 'custom_font_available'): + self.custom_font_available = False + if not hasattr(self, 'custom_font_family'): + self.custom_font_family = None + + def _load_font_private(self, fontpath): + """ + Load font privately using AddFontResourceEx + Based on Stack Overflow solution by Felipe + """ + try: + from ctypes import windll, byref, create_unicode_buffer + + # Constants for AddFontResourceEx + FR_PRIVATE = 0x10 # Font is private to this process + FR_NOT_ENUM = 0x20 # Font won't appear in font enumeration + + # Create unicode buffer for the font path + pathbuf = create_unicode_buffer(fontpath) + + # Use AddFontResourceExW for Unicode strings + AddFontResourceEx = windll.gdi32.AddFontResourceExW + + # Set flags: private (unloaded when process dies) and not enumerable + flags = FR_PRIVATE | FR_NOT_ENUM + + # Add the font resource + numFontsAdded = AddFontResourceEx(byref(pathbuf), flags, 0) + + return bool(numFontsAdded) + + except Exception: + return False def get_font(self, size=10, weight='normal'): """Get font tuple for UI elements""" - if self.custom_font_available: + if self.custom_font_available and self.custom_font_family: try: - # Use the registered font family name - font_obj = font.Font(family=self.custom_font_family, size=size, weight=weight) - print(f"Created font: {self.custom_font_family}, size={size}, weight={weight}") - return font_obj - except Exception as e: - print(f"Error using custom font: {e}") - # Fall back to a distinctive font so we can see the difference - return font.Font(family='Courier New', size=size, weight=weight) - else: - print(f"Using fallback font: Courier New, size={size}") - return font.Font(family='Courier New', size=size, weight=weight) + return font.Font(family=self.custom_font_family, size=size, weight=weight) + except Exception: + pass + + # Fall back to system font + return font.Font(family='Arial', size=size, weight=weight) def setup_dark_theme(self): """Configure dark theme colors"""