aboutsummaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authormitchell <70453897+667e-11@users.noreply.github.com>2016-11-11 10:00:19 -0500
committermitchell <70453897+667e-11@users.noreply.github.com>2016-11-11 10:00:19 -0500
commitd4a5b10f1825bbe19138b17c8614ae9966e6bff1 (patch)
treef15bb7f04f2afcba546e97434bf3f376a4c9e78e /modules
parent28285f671e4c681b8eb236a981bc4024050f0f1b (diff)
downloadtextadept-d4a5b10f1825bbe19138b17c8614ae9966e6bff1.tar.gz
textadept-d4a5b10f1825bbe19138b17c8614ae9966e6bff1.zip
Be more efficient when updating menu item functions; modules/textadept/menu.lua
Updating the entire menu is overkill and seems to slow down upon `reset()`.
Diffstat (limited to 'modules')
-rw-r--r--modules/textadept/menu.lua22
1 files changed, 12 insertions, 10 deletions
diff --git a/modules/textadept/menu.lua b/modules/textadept/menu.lua
index 03dd5a49..caaaa51e 100644
--- a/modules/textadept/menu.lua
+++ b/modules/textadept/menu.lua
@@ -384,7 +384,7 @@ local default_tab_context_menu = {
-- Table of proxy tables for menus.
local proxies = {}
-local key_shortcuts, menu_actions, contextmenu_actions
+local key_shortcuts, menu_items, contextmenu_items
-- Returns the GDK integer keycode and modifier mask for a key sequence.
-- This is used for creating menu accelerators.
@@ -421,13 +421,13 @@ local function read_menu_table(menu, contextmenu)
gtkmenu[#gtkmenu + 1] = read_menu_table(menu[i], contextmenu)
else
local label, f = menu[i][1], menu[i][2]
- local menu_id = not contextmenu and #menu_actions + 1 or
- #contextmenu_actions + 1000 + 1
+ local menu_id = not contextmenu and #menu_items + 1 or
+ #contextmenu_items + 1000 + 1
local key, mods = get_gdk_key(key_shortcuts[tostring(f)])
gtkmenu[#gtkmenu + 1] = {label, menu_id, key, mods}
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
+ local menu_items = not contextmenu and menu_items or contextmenu_items
+ menu_items[menu_id < 1000 and menu_id or menu_id - 1000] = menu[i]
end
end
end
@@ -456,7 +456,9 @@ local function proxy_menu(menu, update, menubar)
end,
__newindex = function(_, k, v)
menu[k] = getmetatable(v) and getmetatable(v).menu or v
- update(menubar or menu)
+ -- After adding or removing menus or menu items, update the menubar or
+ -- context menu. When updating a menu item's function, do nothing extra.
+ if not type(v) == 'function' then update(menubar or menu) end
end,
__len = function() return #menu end,
menu = menu -- store existing menu for copying (e.g. m[#m + 1] = m[#m])
@@ -476,7 +478,7 @@ end
-- @see ui.menu
local function set_menubar(menubar)
if not menubar then ui.menubar = {} return end
- key_shortcuts, menu_actions = {}, {} -- reset
+ key_shortcuts, menu_items = {}, {} -- reset
for key, f in pairs(keys) do key_shortcuts[tostring(f)] = key end
local _menubar = {}
for i = 1, #menubar do
@@ -502,7 +504,7 @@ events.connect(events.INITIALIZED, function() set_menubar(default_menubar) end)
-- @see ui.tab_context_menu
-- @see ui.menu
local function set_contextmenus(buffer_menu, tab_menu)
- contextmenu_actions = {} -- reset
+ contextmenu_items = {} -- reset
local menu = buffer_menu or default_context_menu
ui.context_menu = ui.menu(read_menu_table(menu, true))
proxies.context_menu = proxy_menu(menu, set_contextmenus)
@@ -516,8 +518,8 @@ events.connect(events.INITIALIZED, set_contextmenus)
-- Performs the appropriate action when clicking a menu item.
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]
+ local menu_item = menu_id < 1000 and menu_items or contextmenu_items
+ local action = menu_item[menu_id < 1000 and menu_id or menu_id - 1000][2]
assert(type(action) == 'function',
_L['Unknown command:']..' '..tostring(action))
action()