When a command is performed with parameters, those are now passed to the predicate. The predicate can then return, after the validity boolean, any other value that will then be passed to the actual command. If the predicate only returns the validity boolean, the original parameters are passed through to the actual command. This allows predicates to manipulate the received parameters, and allows them to pass the result of an expensive computation to the actual command, which won't have to recalculate it. String and table predicates will now also return `core.active_view`.
79 lines
2.2 KiB
Lua
79 lines
2.2 KiB
Lua
-- mod-version:3
|
|
local core = require "core"
|
|
local command = require "core.command"
|
|
local keymap = require "core.keymap"
|
|
local ContextMenu = require "core.contextmenu"
|
|
local RootView = require "core.rootview"
|
|
|
|
local menu = ContextMenu()
|
|
local on_view_mouse_pressed = RootView.on_view_mouse_pressed
|
|
local on_mouse_moved = RootView.on_mouse_moved
|
|
local root_view_update = RootView.update
|
|
local root_view_draw = RootView.draw
|
|
|
|
function RootView:on_mouse_moved(...)
|
|
if menu:on_mouse_moved(...) then return end
|
|
on_mouse_moved(self, ...)
|
|
end
|
|
|
|
function RootView.on_view_mouse_pressed(button, x, y, clicks)
|
|
-- We give the priority to the menu to process mouse pressed events.
|
|
local handled = menu:on_mouse_pressed(button, x, y, clicks)
|
|
return handled or on_view_mouse_pressed(button, x, y, clicks)
|
|
end
|
|
|
|
function RootView:update(...)
|
|
root_view_update(self, ...)
|
|
menu:update()
|
|
end
|
|
|
|
function RootView:draw(...)
|
|
root_view_draw(self, ...)
|
|
menu:draw()
|
|
end
|
|
|
|
command.add("core.docview!", {
|
|
["context:show"] = function(dv)
|
|
menu:show(dv.position.x, dv.position.y)
|
|
end
|
|
})
|
|
|
|
keymap.add {
|
|
["menu"] = "context:show"
|
|
}
|
|
|
|
command.add(function() return menu.show_context_menu == true end, {
|
|
["context:focus-previous"] = function()
|
|
menu:focus_previous()
|
|
end,
|
|
["context:focus-next"] = function()
|
|
menu:focus_next()
|
|
end,
|
|
["context:hide"] = function()
|
|
menu:hide()
|
|
end,
|
|
["context:on-selected"] = function()
|
|
menu:call_selected_item()
|
|
end,
|
|
})
|
|
keymap.add { ["return"] = "context:on-selected" }
|
|
keymap.add { ["up"] = "context:focus-previous" }
|
|
keymap.add { ["down"] = "context:focus-next" }
|
|
keymap.add { ["escape"] = "context:hide" }
|
|
|
|
if require("plugins.scale") then
|
|
menu:register("core.docview", {
|
|
{ text = "Cut", command = "doc:cut" },
|
|
{ text = "Copy", command = "doc:copy" },
|
|
{ text = "Paste", command = "doc:paste" },
|
|
{ text = "Font +", command = "scale:increase" },
|
|
{ text = "Font -", command = "scale:decrease" },
|
|
{ text = "Font Reset", command = "scale:reset" },
|
|
ContextMenu.DIVIDER,
|
|
{ text = "Find", command = "find-replace:find" },
|
|
{ text = "Replace", command = "find-replace:replace" }
|
|
})
|
|
end
|
|
|
|
return menu
|