198 lines
7.2 KiB
Python
198 lines
7.2 KiB
Python
import math
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# WARLOCK STUDIO: THEME & COLORS (PROFESSIONAL EDITION)
|
|
# -----------------------------------------------------------------------------
|
|
# Este módulo define la paleta de colores centralizada para la aplicación.
|
|
# Diseño: Dark / Gold / Professional
|
|
# -----------------------------------------------------------------------------
|
|
|
|
|
|
class WarlockColors:
|
|
"""
|
|
Definición estática de la paleta de colores.
|
|
Centraliza los códigos HEX para facilitar cambios globales.
|
|
"""
|
|
|
|
# --- BASE & FONDO ---
|
|
# Negro profundo mate. Evitamos el negro absoluto (#000) en grandes áreas,
|
|
# pero lo usamos aquí como base para superponer capas.
|
|
BACKGROUND_MAIN = "#000000"
|
|
|
|
# Gris carbón muy oscuro. Fondo para paneles laterales y tarjetas.
|
|
BACKGROUND_WIDGET = "#1A1A1A"
|
|
|
|
# Un tono ligeramente más claro para campos de entrada (Entries) y Dropdowns.
|
|
BACKGROUND_ENTRY = "#232323"
|
|
|
|
# --- IDENTIDAD & ACENTOS ---
|
|
# "Oro Metálico". Elegante, legible y define la marca Warlock.
|
|
APP_TITLE = "#FBC02D"
|
|
|
|
# "Ámbar Intenso". Color principal de interacción (Checkboxes, Switches, Sliders).
|
|
ACCENT = "#FFC107"
|
|
|
|
# Versión más oscura del acento para estados "pressed" o bordes activos.
|
|
ACCENT_DARK = "#FFB300"
|
|
|
|
# "Crema Pálido". Para resaltar texto seleccionado o búsquedas.
|
|
HIGHLIGHT = "#FFF59D"
|
|
|
|
# --- TEXTO ---
|
|
# Blanco humo ("White Smoke"). Evita la fatiga visual del blanco puro (#FFFFFF).
|
|
TEXT_PRIMARY = "#F5F5F5"
|
|
|
|
# Gris Pizarra. Para etiquetas, subtítulos y descripciones.
|
|
TEXT_SECONDARY = "#9E9E9E"
|
|
|
|
# Gris oscuro. Para texto deshabilitado o placeholders.
|
|
TEXT_DISABLED = "#616161"
|
|
|
|
# --- INTERACCIÓN (BOTONES) ---
|
|
# "Rojo Sangre/Rubí". Para Hover en botones principales o acciones destructivas.
|
|
BUTTON_HOVER = "#C62828"
|
|
|
|
# "Vino Tinto". Para botones secundarios, info o estados inactivos pero visibles.
|
|
BUTTON_SECONDARY = "#7F1500"
|
|
|
|
# Color cuando se presiona click.
|
|
BUTTON_PRESSED = "#8E0000"
|
|
|
|
# --- ESTADOS DEL SISTEMA ---
|
|
# "Naranja Quemado". Advertencias legibles sobre fondo oscuro.
|
|
STATUS_WARNING = "#FF6F00"
|
|
|
|
# Verde Esmeralda. Éxito, confirmaciones, logs positivos.
|
|
STATUS_SUCCESS = "#00C853"
|
|
|
|
# "Rojo Ladrillo". Errores críticos.
|
|
STATUS_ERROR = "#B71C1C"
|
|
|
|
# Azul informativo (para logs neutrales o información).
|
|
STATUS_INFO = "#0277BD"
|
|
|
|
# --- BORDES & SEPARADORES ---
|
|
# Gris cálido muy oscuro. Sutil para dividir secciones.
|
|
BORDER = "#2D2D2D"
|
|
|
|
# Borde activo (cuando un input tiene el foco).
|
|
BORDER_FOCUS = "#424242"
|
|
|
|
# --- SCROLLBARS ---
|
|
# Rojo Caoba translúcido/oscuro. Discreto.
|
|
SCROLLBAR_FG = "#3E2723"
|
|
SCROLLBAR_BG = "#0D0D0D" # Casi negro para el riel del scroll
|
|
|
|
|
|
class ColorUtils:
|
|
"""
|
|
Utilidades para manipular colores hexadecimales en tiempo de ejecución.
|
|
Útil para generar variaciones de colores para animaciones o estados.
|
|
"""
|
|
|
|
@staticmethod
|
|
def hex_to_rgb(hex_color: str) -> tuple:
|
|
"""Convierte '#RRGGBB' a una tupla (r, g, b)."""
|
|
hex_color = hex_color.lstrip('#')
|
|
return tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4))
|
|
|
|
@staticmethod
|
|
def rgb_to_hex(rgb: tuple) -> str:
|
|
"""Convierte una tupla (r, g, b) a '#RRGGBB'."""
|
|
return '#{:02x}{:02x}{:02x}'.format(*rgb)
|
|
|
|
@staticmethod
|
|
def adjust_brightness(hex_color: str, factor: float) -> str:
|
|
"""
|
|
Ajusta el brillo de un color.
|
|
:param factor: > 1 para aclarar, < 1 para oscurecer.
|
|
Ej: 1.2 es 20% más claro. 0.8 es 20% más oscuro.
|
|
"""
|
|
r, g, b = ColorUtils.hex_to_rgb(hex_color)
|
|
|
|
# Ajustar y asegurar que esté entre 0-255
|
|
r = min(255, max(0, int(r * factor)))
|
|
g = min(255, max(0, int(g * factor)))
|
|
b = min(255, max(0, int(b * factor)))
|
|
|
|
return ColorUtils.rgb_to_hex((r, g, b))
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# DICCIONARIO DE TEMA (EXPORTACIÓN PRINCIPAL)
|
|
# -----------------------------------------------------------------------------
|
|
# Mapea las constantes a claves semánticas que la UI puede consumir directamente.
|
|
# Se incluyen claves compatibles con CustomTkinter (fg_color, hover_color, etc).
|
|
# -----------------------------------------------------------------------------
|
|
|
|
|
|
THEME = {
|
|
# --- General ---
|
|
"bg": WarlockColors.BACKGROUND_MAIN,
|
|
"app_name": WarlockColors.APP_TITLE,
|
|
"accent": WarlockColors.ACCENT,
|
|
|
|
# --- Widgets (Frames, Cards) ---
|
|
"widget_bg": WarlockColors.BACKGROUND_WIDGET,
|
|
"widget_border": WarlockColors.BORDER,
|
|
|
|
# --- Texto ---
|
|
"text_main": WarlockColors.TEXT_PRIMARY,
|
|
"text_sec": WarlockColors.TEXT_SECONDARY,
|
|
"text_disabled": WarlockColors.TEXT_DISABLED,
|
|
|
|
# --- Botones (Estados) ---
|
|
"btn_fg": WarlockColors.BACKGROUND_WIDGET, # Color base del botón
|
|
"btn_hover": WarlockColors.BUTTON_HOVER, # Color al pasar mouse
|
|
"btn_secondary": WarlockColors.BUTTON_SECONDARY,
|
|
"btn_pressed": WarlockColors.BUTTON_PRESSED,
|
|
|
|
# --- Entradas de Texto (Inputs) ---
|
|
"entry_bg": WarlockColors.BACKGROUND_ENTRY,
|
|
"entry_border": WarlockColors.BORDER,
|
|
"entry_focus": WarlockColors.BORDER_FOCUS,
|
|
|
|
# --- Feedback / Estados ---
|
|
"success": WarlockColors.STATUS_SUCCESS,
|
|
"warning": WarlockColors.STATUS_WARNING,
|
|
"error": WarlockColors.STATUS_ERROR,
|
|
"info": WarlockColors.STATUS_INFO,
|
|
|
|
# --- Varios ---
|
|
"highlight": WarlockColors.HIGHLIGHT,
|
|
"scrollbar": WarlockColors.SCROLLBAR_FG,
|
|
|
|
# --- Compatibilidad Legacy (Mantiene compatibilidad con tu código anterior) ---
|
|
"background_color": WarlockColors.BACKGROUND_MAIN,
|
|
"app_name_color": WarlockColors.APP_TITLE,
|
|
"widget_background_color": WarlockColors.BACKGROUND_WIDGET,
|
|
"text_color": WarlockColors.TEXT_PRIMARY,
|
|
"secondary_text_color": WarlockColors.TEXT_SECONDARY,
|
|
"accent_color": WarlockColors.ACCENT,
|
|
"button_hover_color": WarlockColors.BUTTON_HOVER,
|
|
"border_color": WarlockColors.BORDER,
|
|
"info_button_color": WarlockColors.BUTTON_SECONDARY,
|
|
"warning_color": WarlockColors.STATUS_WARNING,
|
|
"success_color": WarlockColors.STATUS_SUCCESS,
|
|
"error_color": WarlockColors.STATUS_ERROR,
|
|
"highlight_color": WarlockColors.HIGHLIGHT,
|
|
"scrollbar_color": WarlockColors.SCROLLBAR_FG
|
|
}
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# VARIABLES GLOBALES DIRECTAS (OPCIONALES PARA ACCESO RÁPIDO)
|
|
# -----------------------------------------------------------------------------
|
|
BACKGROUND_COLOR = WarlockColors.BACKGROUND_MAIN
|
|
APP_NAME_COLOR = WarlockColors.APP_TITLE
|
|
WIDGET_BACKGROUND_COLOR = WarlockColors.BACKGROUND_WIDGET
|
|
TEXT_COLOR = WarlockColors.TEXT_PRIMARY
|
|
SECONDARY_TEXT_COLOR = WarlockColors.TEXT_SECONDARY
|
|
ACCENT_COLOR = WarlockColors.ACCENT
|
|
BUTTON_HOVER_COLOR = WarlockColors.BUTTON_HOVER
|
|
BORDER_COLOR = WarlockColors.BORDER
|
|
INFO_BUTTON_COLOR = WarlockColors.BUTTON_SECONDARY
|
|
WARNING_COLOR = WarlockColors.STATUS_WARNING
|
|
SUCCESS_COLOR = WarlockColors.STATUS_SUCCESS
|
|
ERROR_COLOR = WarlockColors.STATUS_ERROR
|
|
HIGHLIGHT_COLOR = WarlockColors.HIGHLIGHT
|
|
SCROLLBAR_COLOR = WarlockColors.SCROLLBAR_FG
|