2020from app .utils .paths import resource_path
2121from app .ui .main_window import MainWindow
2222from app .translations import t
23- from app .modules .image_utils import init_heif_support
23+ from app .utils .image_utils import init_heif_support
2424
2525logger = logging .getLogger (__name__ )
2626
@@ -60,16 +60,24 @@ def __init__(self):
6060 # Actualizar para asegurar que la geometria se aplique antes de maximizar
6161 self .update ()
6262
63- # Maximizar ventana al iniciar (Windows/Linux)
64- try :
65- # Windows y algunos WM
66- self .state ('zoomed' )
67- except Exception :
63+ # Maximizar ventana al iniciar
64+ if sys .platform == 'darwin' :
65+ self .update_idletasks ()
66+ w = self .winfo_screenwidth ()
67+ h = self .winfo_screenheight ()
68+ self .geometry (f'{ w } x{ h } +0+0' )
69+ elif sys .platform == 'win32' :
70+ try :
71+ self .state ('zoomed' )
72+ except Exception :
73+ self .update_idletasks ()
74+ w = self .winfo_screenwidth ()
75+ h = self .winfo_screenheight ()
76+ self .geometry (f'{ w } x{ h } +0+0' )
77+ else :
6878 try :
69- # Linux (algunos window managers)
7079 self .attributes ('-zoomed' , True )
7180 except Exception :
72- # Fallback: usar tamaño de pantalla
7381 self .update_idletasks ()
7482 w = self .winfo_screenwidth ()
7583 h = self .winfo_screenheight ()
@@ -78,42 +86,60 @@ def __init__(self):
7886 # Establecer tamano minimo de la ventana
7987 self .minsize (900 , 600 )
8088
89+ # En macOS, restaurar la ventana al hacer click en el icono del Dock
90+ if sys .platform == 'darwin' :
91+ self ._setup_dock_reopen ()
92+
8193 # Configurar icono de la ventana segun plataforma
8294 self ._setup_icon ()
8395
8496 # Crear ventana principal con sidebar y area de contenido
8597 self .main_window = MainWindow (self )
8698 self .main_window .pack (fill = 'both' , expand = True )
8799
100+ def _setup_dock_reopen (self ):
101+ """Registra el handler para restaurar la ventana desde el Dock en macOS."""
102+ try :
103+ self .createcommand ('tk::mac::ReopenApplication' , self ._on_dock_click )
104+ except Exception as e :
105+ logger .debug ("No se pudo registrar ReopenApplication: %s" , e )
106+
107+ def _on_dock_click (self ):
108+ """Restaura la ventana cuando el usuario hace click en el icono del Dock."""
109+ self .deiconify ()
110+ self .lift ()
111+ self .focus_force ()
112+
88113 def _setup_icon (self ):
89114 """
90115 Configura el icono de la ventana segun la plataforma.
91116
92- En Windows usa icon.ico, en otras plataformas usa icon.png.
93- Registra warnings si los iconos no se encuentran.
117+ Windows: icon.ico | macOS: icon.png (icon.icns para bundle) | Linux: icon.png
94118 """
95- # Rutas de los archivos de icono
96119 icon_ico = resource_path ('assets/icon.ico' )
120+ icon_icns = resource_path ('assets/icon.icns' )
97121 icon_png = resource_path ('assets/icon.png' )
98122
99- # Configuracion especifica para Windows
100123 if sys .platform == 'win32' :
101- # Usar .ico en Windows (formato nativo)
102124 if icon_ico .exists ():
103125 self .iconbitmap (str (icon_ico ))
104- # Fallback a PNG si .ico no existe
105126 elif icon_png .exists ():
106127 self ._setup_icon_png (icon_png )
107128 else :
108- # Registrar warning si no hay icono disponible
129+ logger .warning ("Icono no encontrado en assets/" )
130+ elif sys .platform == 'darwin' :
131+ if icon_png .exists ():
132+ self ._setup_icon_png (icon_png )
133+ elif icon_icns .exists ():
134+ try :
135+ self .iconbitmap (str (icon_icns ))
136+ except Exception as e :
137+ logger .warning (f'No se pudo aplicar icon.icns: { e } ' )
138+ else :
109139 logger .warning ("Icono no encontrado en assets/" )
110140 else :
111- # En otras plataformas solo usar PNG
112141 if icon_png .exists ():
113142 self ._setup_icon_png (icon_png )
114- elif icon_ico .exists ():
115- # .ico no es compatible con macOS/Linux
116- logger .warning ("icon.ico no es compatible con esta plataforma" )
117143 else :
118144 logger .warning ("Icono no encontrado en assets/" )
119145
0 commit comments