Исходный код EJIO.ctk_extender.windows.popup.factory

## /ctk_extender/windows/popup/factory.py

import datetime
from collections.abc import Callable
from pathlib import Path
from typing import Any
from EJIO.utils import Color, _
from tkinter import filedialog

from .info import InfoPopup
from .warning import WarningPopup
from .confirm import ConfirmPopup
from .image import ImagePopup
from .color import ColorPickerPopup
from .date import DatePickerPopup

__all__ = [
    'popup_info',
    'popup_warning',
    'popup_confirm',
    'popup_image',
    'popup_color',
    'popup_date',
    'popup_directory',
    'popup_file',
]

def _get_active_master() -> Any:
    """
    Внутренний хелпер: безопасно достает истинный корневой ctk.CTk объект приложения,
    защищая окна от метаклассовых и иерархических коллизий.
    """
    try:
        from ...app.base import Application
        app = Application()
        # Извлекаем имя главного окна, которое было передано при старте Application("main_window")
        main_win_name = app._main_window_name

        # Получаем объект окна через контроллер и вытаскиваем его ctk_instance
        from ...window.controller import WindowController
        window_obj = WindowController.get_active(main_win_name)

        if window_obj is not None:
            # Получаем ctk_instance (который является CTkFrame в нашей композиции)
            instance = window_obj.ctk_instance
            if instance is not None:
                return instance.winfo_toplevel()

        return None
    except Exception:
        # Резервный откат, если приложение еще не запущено
        return None

# =====================================================================
# 🚀 ГЛОБАЛЬНЫЕ ФУНКЦИИ-ШОРТКАТЫ (Свобода от вызова через класс)
# =====================================================================