"""
summary: add custom menus to IDA

description:
  It is possible to add custom menus to IDA, either at the
  toplevel (i.e., into the menubar), or as submenus of existing
  menus.

  Notes:

    * the same action can be present in more than 1 menu
    * this example does not deal with context menus

keywords: actions

level: beginner
"""

import ida_kernwin

# Create custom menus
ida_kernwin.create_menu("MyToplevelMenu", "&Custom menu", "View")
ida_kernwin.create_menu("MySubMenu", "Custom s&ubmenu", "View/Print internal flags")

# Create some actions
class greeter_t(ida_kernwin.action_handler_t):
    def __init__(self, greetings):
        ida_kernwin.action_handler_t.__init__(self)
        self.greetings = greetings

    def activate(self, ctx):
        print(self.greetings)

    def update(self, ctx):
        return ida_kernwin.AST_ENABLE_ALWAYS

ACTION_NAME_0 = "my_action_0"
ACTION_NAME_1 = "my_action_1"
for action_name, greetings in [
        (ACTION_NAME_0, "Hello, world"),
        (ACTION_NAME_1, "Hi there"),
]:
    desc = ida_kernwin.action_desc_t(
        action_name, "Say \"%s\"" % greetings, greeter_t(greetings))
    if ida_kernwin.register_action(desc):
        print("Registered action \"%s\"" % action_name)


# Then, let's attach some actions to them - both core actions
# and custom ones is allowed (also, any action can be attached
# to multiple menus.)
for action_name, path in [
        (ACTION_NAME_0, "Custom menu"),
        (ACTION_NAME_0, "View/Custom submenu/"),
        (ACTION_NAME_1, "Custom menu"),
        (ACTION_NAME_1, "View/Custom submenu/"),
        ("About", "Custom menu"),
        ("About", "View/Custom submenu/"),
]:
    ida_kernwin.attach_action_to_menu(
        path,
        action_name,
        ida_kernwin.SETMENU_INS)
