Added in cut, copy and paste to the context menu. Also removed find pattern, as that's no longer a valid command. Also made it so commands only show up if their predicates are valid.

This commit is contained in:
Adam Harrison 2021-11-23 21:03:38 -05:00
parent d7b6fe3d42
commit 64f66e5d1e
5 changed files with 42 additions and 23 deletions

View File

@ -41,6 +41,9 @@ function command.get_all_valid()
return res return res
end end
function command.is_valid(name, ...)
return command.map[name] and command.map[name].predicate(...)
end
local function perform(name, ...) local function perform(name, ...)
local cmd = command.map[name] local cmd = command.map[name]

View File

@ -92,6 +92,21 @@ local function set_cursor(x, y, snap_type)
core.blink_reset() core.blink_reset()
end end
local selection_commands = {
["doc:cut"] = function()
cut_or_copy(true)
end,
["doc:copy"] = function()
cut_or_copy(false)
end,
["doc:select-none"] = function()
local line, col = doc():get_selection()
doc():set_selection(line, col)
end
}
local commands = { local commands = {
["doc:undo"] = function() ["doc:undo"] = function()
doc():undo() doc():undo()
@ -101,14 +116,6 @@ local commands = {
doc():redo() doc():redo()
end, end,
["doc:cut"] = function()
cut_or_copy(true)
end,
["doc:copy"] = function()
cut_or_copy(false)
end,
["doc:paste"] = function() ["doc:paste"] = function()
local clipboard = system.get_clipboard() local clipboard = system.get_clipboard()
-- If the clipboard has changed since our last look, use that instead -- If the clipboard has changed since our last look, use that instead
@ -173,11 +180,6 @@ local commands = {
doc():set_selection(1, 1, math.huge, math.huge) doc():set_selection(1, 1, math.huge, math.huge)
end, end,
["doc:select-none"] = function()
local line, col = doc():get_selection()
doc():set_selection(line, col)
end,
["doc:select-lines"] = function() ["doc:select-lines"] = function()
for idx, line1, _, line2 in doc():get_selections(true) do for idx, line1, _, line2 in doc():get_selections(true) do
append_line_if_last_line(line2) append_line_if_last_line(line2)
@ -481,3 +483,6 @@ commands["doc:move-to-next-char"] = function()
end end
command.add("core.docview", commands) command.add("core.docview", commands)
command.add(function()
return core.active_view:is(DocView) and core.active_view.doc:has_any_selection()
end ,selection_commands)

View File

@ -66,12 +66,16 @@ function ContextMenu:show(x, y)
for _, items in ipairs(self.itemset) do for _, items in ipairs(self.itemset) do
if items.predicate(x, y) then if items.predicate(x, y) then
items_list.width = math.max(items_list.width, items.items.width) items_list.width = math.max(items_list.width, items.items.width)
items_list.height = items_list.height + items.items.height items_list.height = items_list.height
for _, subitems in ipairs(items.items) do for _, subitems in ipairs(items.items) do
if not subitems.command or command.is_valid(subitems.command) then
local lw, lh = get_item_size(subitems)
items_list.height = items_list.height + lh
table.insert(items_list, subitems) table.insert(items_list, subitems)
end end
end end
end end
end
if #items_list > 0 then if #items_list > 0 then
self.items = items_list self.items = items_list

View File

@ -149,6 +149,13 @@ function Doc:has_selection()
return line1 ~= line2 or col1 ~= col2 return line1 ~= line2 or col1 ~= col2
end end
function Doc:has_any_selection()
for idx, line1, col1, line2, col2 in self:get_selections() do
if line1 ~= line2 or col1 ~= col2 then return true end
end
return false
end
function Doc:sanitize_selection() function Doc:sanitize_selection()
for idx, line1, col1, line2, col2 in self:get_selections() do for idx, line1, col1, line2, col2 in self:get_selections() do
self:set_selections(idx, line1, col1, line2, col2) self:set_selections(idx, line1, col1, line2, col2)

View File

@ -62,15 +62,15 @@ menu:register("core.logview", {
if require("plugins.scale") then if require("plugins.scale") then
menu:register("core.docview", { 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:increase" },
{ text = "Font -", command = "scale:decrease" }, { text = "Font -", command = "scale:decrease" },
{ text = "Font Reset", command = "scale:reset" }, { text = "Font Reset", command = "scale:reset" },
ContextMenu.DIVIDER, ContextMenu.DIVIDER,
{ text = "Find", command = "find-replace:find" }, { text = "Find", command = "find-replace:find" },
{ text = "Replace", command = "find-replace:replace" }, { text = "Replace", command = "find-replace:replace" }
ContextMenu.DIVIDER,
{ text = "Find Pattern", command = "find-replace:find-pattern" },
{ text = "Replace Pattern", command = "find-replace:replace-pattern" },
}) })
end end