Files
ProgressionMods/font_and_colors_update.py
2026-04-14 13:18:27 -04:00

187 lines
6.5 KiB
Python

# Updated font loading and color scheme for Progression Loader
# Steam Collections page inspired design:
# - Dark blue theme matching Steam's signature colors
# - Steam blue (#66c0f4) for highlights and accents
# - Dark blue backgrounds (#1b2838, #2a475e) for depth
# - Light blue-gray text (#c7d5e0) for readability
# - Card-based layouts with rounded corners
# - Subtle shadows and glows for depth
import os
import sys
from pathlib import Path
def get_resource_path(relative_path):
"""Get absolute path to resource, works for dev and for PyInstaller"""
try:
# PyInstaller creates a temp folder and stores path in _MEIPASS
base_path = sys._MEIPASS
except Exception:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
# Steam Collections inspired color constants
COLORS = {
'bg_primary': '#1b2838', # Steam dark blue background
'bg_secondary': '#2a475e', # Steam medium blue background
'bg_tertiary': '#1e2328', # Steam darker background for cards
'bg_card': '#16202d', # Steam card background
'bg_hover': '#2a475e', # Steam hover state
'text_primary': '#c7d5e0', # Steam primary text (light blue-gray)
'text_highlight': '#66c0f4', # Steam blue highlight color
'text_body': '#8f98a0', # Steam body text (muted blue-gray)
'text_secondary': '#acb2b8', # Steam secondary text
'text_muted': '#67707b', # Steam muted text
'accent_green': '#5ba32b', # Steam success green
'accent_red': '#cd5c5c', # Steam error red
'accent_yellow': '#ffa500', # Steam warning orange
'accent_blue': '#66c0f4', # Steam signature blue
'border_light': '#3c4043', # Steam light border
'border_dark': '#0e141b', # Steam dark border
}
def load_all_georgia_fonts():
"""Load all Georgia font variants using Windows AddFontResourceEx with private flag"""
custom_font_available = False
custom_font_family = None
# List of Georgia font files to load
georgia_fonts = [
"georgia.ttf", # Regular
"georgiab.ttf", # Bold
"georgiai.ttf", # Italic
"georgiaz.ttf" # Bold Italic
]
fonts_loaded = 0
try:
for font_file in georgia_fonts:
font_path = get_resource_path(os.path.join("art", font_file))
if os.path.exists(font_path):
abs_font_path = os.path.abspath(font_path)
# Use the Stack Overflow method with AddFontResourceEx
success = _load_font_private(abs_font_path)
if success:
fonts_loaded += 1
print(f"Successfully loaded font: {font_file}")
else:
print(f"Failed to load font: {font_file}")
else:
print(f"Font file not found: {font_path}")
if fonts_loaded > 0:
custom_font_available = True
custom_font_family = "Georgia"
print(f"Successfully loaded {fonts_loaded} Georgia font variants")
else:
print("No Georgia fonts could be loaded, using system fallback")
except Exception as e:
print(f"Error loading fonts: {e}")
custom_font_available = False
custom_font_family = None
return custom_font_available, custom_font_family
def _load_font_private(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 numFontsAdded > 0
except Exception as e:
print(f"Error in _load_font_private: {e}")
return False
def apply_steam_styling():
"""Apply Steam Collections page inspired styling to UI components"""
return {
'button_style': {
'relief': 'flat',
'borderwidth': 0,
'highlightthickness': 0,
'font': ('Georgia', 10, 'bold'),
'cursor': 'hand2'
},
'entry_style': {
'relief': 'flat',
'borderwidth': 2,
'highlightthickness': 0,
'font': ('Georgia', 9),
'insertbackground': COLORS['text_primary']
},
'label_style': {
'font': ('Georgia', 9),
'anchor': 'w'
},
'title_style': {
'font': ('Georgia', 14, 'bold'),
'anchor': 'center'
},
'card_style': {
'relief': 'flat',
'borderwidth': 1,
'highlightthickness': 0
}
}
def get_steam_button_colors(button_type='default'):
"""Get Steam-inspired button color schemes"""
button_colors = {
'default': {
'bg': COLORS['bg_secondary'],
'fg': COLORS['text_primary'],
'activebackground': COLORS['bg_hover'],
'activeforeground': COLORS['text_highlight']
},
'primary': {
'bg': COLORS['accent_blue'],
'fg': COLORS['bg_primary'],
'activebackground': COLORS['text_highlight'],
'activeforeground': COLORS['bg_primary']
},
'success': {
'bg': COLORS['accent_green'],
'fg': COLORS['text_primary'],
'activebackground': '#6bb33f',
'activeforeground': COLORS['text_primary']
},
'warning': {
'bg': COLORS['accent_yellow'],
'fg': COLORS['bg_primary'],
'activebackground': '#ffb733',
'activeforeground': COLORS['bg_primary']
},
'danger': {
'bg': COLORS['accent_red'],
'fg': COLORS['text_primary'],
'activebackground': '#d66f6f',
'activeforeground': COLORS['text_primary']
}
}
return button_colors.get(button_type, button_colors['default'])