#--------------------------------------------------------------------
#
#   PyGUI - Menu utilities - Win32
#
#--------------------------------------------------------------------

from weakref import WeakKeyDictionary, WeakValueDictionary
import win32con as wc, win32ui as ui
from GUI import application

win_command_map = {}
win_command_list = []

def win_command_to_id(name, index = None):
    if index is not None:
        key = (name, index)
    else:
        key = name
    id = win_command_map.get(key)
    if not id:
        id = len(win_command_list) + 1
        win_command_map[key] = id
        win_command_list.append(key)
        application()._win_app.HookCommandUpdate(win_command_update, id)
    return id

def win_command_update(cmd):
    win_menu = cmd.m_pMenu
    if win_menu:
        menu = win_get_menu_for_hmenu(win_menu.GetHandle())
        if menu:
            item = menu._get_flat_item(cmd.m_nIndex)
            cmd.Enable(item.enabled)
            cmd.SetCheck(bool(item.checked))

def win_id_to_command(id):
    if 1 <= id <= len(win_command_list):
        return win_command_list[id - 1]

win_hmenu_to_menubar = WeakValueDictionary()

def win_get_menu_for_hmenu(hmenu):
    menubar = win_hmenu_to_menubar.get(hmenu)
    if menubar:
        return menubar.hmenu_to_menu.get(hmenu)

#--------------------------------------------------------------------

class MenuBar(object):
    #  Wrapper around a PyCMenu
    
    def __init__(self):
        self.win_menu = ui.CreateMenu()
        self.hmenu_to_menu = {}
    
    def append_menu(self, menu):
        win_menu = menu._win_create_menu()
        hmenu = win_menu.Detach()
        self.win_menu.AppendMenu(wc.MF_POPUP | wc.MF_STRING, hmenu, menu.title)
        win_hmenu_to_menubar[hmenu] = self
        self.hmenu_to_menu[hmenu] = menu
    
