diff options
Diffstat (limited to 'modules')
-rw-r--r-- | modules/textadept/menu.lua | 62 |
1 files changed, 33 insertions, 29 deletions
diff --git a/modules/textadept/menu.lua b/modules/textadept/menu.lua index e26a2ec4..d022d47e 100644 --- a/modules/textadept/menu.lua +++ b/modules/textadept/menu.lua @@ -238,18 +238,25 @@ local contextmenu_actions = {} -- Creates a menu suitable for gui.gtkmenu from the menu table format. -- Also assigns key commands. -- @param menu The menu to create a gtkmenu from. +-- @param contextmenu Flag indicating whether or not the menu is a context menu. +-- If so, menu_id offset is 1000. Defaults to false. -- @return gtkmenu that can be passed to gui.gtkmenu. -local function read_menu_table(menu) +local function read_menu_table(menu, contextmenu) local gtkmenu = {} gtkmenu.title = menu.title for _, menuitem in ipairs(menu) do if menuitem.title then - gtkmenu[#gtkmenu + 1] = read_menu_table(menuitem) + gtkmenu[#gtkmenu + 1] = read_menu_table(menuitem, contextmenu) else - local label, f, menu_id = menuitem[1], menuitem[2], #menu_actions + 1 + local label, f = menuitem[1], menuitem[2] + local menu_id = not contextmenu and #menu_actions + 1 or + #contextmenu_actions + 1000 + 1 local key, mods = keys.get_gdk_key(key_shortcuts[get_id(f)]) gtkmenu[#gtkmenu + 1] = { label, menu_id, key, mods } - if f then menu_actions[menu_id] = f end + if f then + local actions = not contextmenu and menu_actions or contextmenu_actions + actions[menu_id < 1000 and menu_id or menu_id - 1000] = f + end end end return gtkmenu @@ -276,6 +283,7 @@ function set_menubar(menubar) end gui.menubar = _menubar end +set_menubar(menubar) --- -- Sets gui.context_menu from the given menu table. @@ -283,34 +291,12 @@ end -- entry is either a submenu or menu text and a function or action table. -- @see set_menubar function set_contextmenu(menu_table) - context_actions = {} - local context_menu = {} - for menu_id, menuitem in ipairs(menu_table) do - context_menu[#context_menu + 1] = { menuitem[1], menu_id + 1000 } - if menuitem[2] then context_actions[menu_id] = menuitem[2] end - end - gui.context_menu = gui.gtkmenu(context_menu) + contextmenu_actions = {} + gui.context_menu = gui.gtkmenu(read_menu_table(menu_table, true)) end - -set_menubar(menubar) set_contextmenu(context_menu) -events.connect(events.MENU_CLICKED, function(menu_id) - local action, action_type - if menu_id > 1000 then - action = context_actions[menu_id - 1000] - else - action = menu_actions[menu_id] - end - action_type = type(action) - if action_type ~= 'function' and action_type ~= 'table' then - error(L('Unknown command:')..' '..tostring(action)) - end - keys.run_command(action, action_type) -end) - local items, commands -local columns = { L('Command'), L('Key Command') } -- Builds the item and commands tables for the filteredlist dialog. -- @param menu The menu to read from. @@ -331,6 +317,7 @@ local function build_command_tables(menu, title, items, commands) end end +local columns = { L('Command'), L('Key Command') } --- -- Prompts the user with a filteredlist to run menu commands. function select_command() @@ -345,5 +332,22 @@ function rebuild_command_tables() items, commands = {}, {} build_command_tables(menubar, nil, items, commands) end - rebuild_command_tables() + +events.connect(events.MENU_CLICKED, function(menu_id) + local actions = menu_id < 1000 and menu_actions or contextmenu_actions + local action = actions[menu_id < 1000 and menu_id or menu_id - 1000] + if type(action) ~= 'function' and type(action) ~= 'table' then + error(L('Unknown command:')..' '..tostring(action)) + end + keys.run_command(action, type(action)) +end) + +-- Set a language-specific context menu or the default one. +local function set_lang_contextmenu() + local lang = buffer:get_lexer() + set_contextmenu(_m[lang] and _m[lang].context_menu or context_menu) +end +events.connect(events.LANGUAGE_MODULE_LOADED, set_lang_contextmenu) +events.connect(events.BUFFER_AFTER_SWITCH, set_lang_contextmenu) +events.connect(events.BUFFER_NEW, set_lang_contextmenu) |