From 9c83082ce89ee77ca1543dc5c6a354d816ddaf71 Mon Sep 17 00:00:00 2001 From: Francesco Abbate Date: Tue, 18 May 2021 12:58:54 +0200 Subject: [PATCH] Add first commands to load/save projects --- data/core/common.lua | 10 +++++++ data/core/init.lua | 2 +- data/plugins/workspace.lua | 59 +++++++++++++++++++++++++++----------- 3 files changed, 54 insertions(+), 17 deletions(-) diff --git a/data/core/common.lua b/data/core/common.lua index d76a1756..410f4630 100644 --- a/data/core/common.lua +++ b/data/core/common.lua @@ -193,6 +193,16 @@ function common.serialize(val) end +function common.path_join(...) + local n = select('#', ...) + local accu = select(1, ...) + for i = 2, n do + accu = accu .. PATHSEP .. select(i, ...) + end + return accu +end + + function common.basename(path) -- a path should never end by / or \ except if it is '/' (unix root) or -- 'X:\' (windows drive) diff --git a/data/core/init.lua b/data/core/init.lua index a0ea9632..c479122a 100644 --- a/data/core/init.lua +++ b/data/core/init.lua @@ -251,7 +251,7 @@ local function create_user_directory() error("cannot create directory: \"" .. dirname_create .. "\"") end end - for _, modname in ipairs {'plugins', 'colors', 'fonts'} do + for _, modname in ipairs {'plugins', 'projects', 'colors', 'fonts'} do local subdirname = dirname_create .. '/' .. modname if not system.mkdir(subdirname) then error("cannot create directory: \"" .. subdirname .. "\"") diff --git a/data/plugins/workspace.lua b/data/plugins/workspace.lua index ac700c66..0f00c610 100644 --- a/data/plugins/workspace.lua +++ b/data/plugins/workspace.lua @@ -1,15 +1,10 @@ -- mod-version:1 -- lite-xl 1.16 local core = require "core" +local command = require "core.command" local common = require "core.common" local DocView = require "core.docview" -local function load_workspace_file() - local load_f = loadfile(USERDIR .. PATHSEP .. "workspace.lua") - return load_f and load_f() -end - - local function has_no_locked_children(node) if node.locked then return false end if node.type == "leaf" then return true end @@ -115,15 +110,13 @@ local function load_node(node, t) end -local function save_workspace() +local function save_workspace(filename) local root = get_unlocked_root(core.root_view.root_node) - local workspace_filename = USERDIR .. PATHSEP .. "workspace.lua" - local fp = io.open(workspace_filename, "w") + local fp = io.open(filename, "w") if fp then local node_text = common.serialize(save_node(root)) local topdir_entries = {} - for i = 1, #core.project_entries do - local entry = core.project_entries[i] + for _, entry in ipairs(core.project_entries) do if entry.item.topdir then table.insert(topdir_entries, {path = entry.name, type = entry.item.type}) end @@ -135,8 +128,9 @@ local function save_workspace() end -local function load_workspace() - local workspace = load_workspace_file() +local function load_workspace(filename) + local load = loadfile(filename) + local workspace = load and load() if workspace then local root = get_unlocked_root(core.root_view.root_node) local active_view = load_node(root, workspace.documents) @@ -160,21 +154,54 @@ local run = core.run function core.run(...) if #core.docs == 0 then - core.try(load_workspace) + core.try(load_workspace, USERDIR .. PATHSEP .. "workspace.lua") local on_quit_project = core.on_quit_project function core.on_quit_project() - core.try(save_workspace) + local filename = USERDIR .. PATHSEP .. "workspace.lua" + core.try(save_workspace, filename) on_quit_project() end local on_enter_project = core.on_enter_project function core.on_enter_project(new_dir) on_enter_project(new_dir) - core.try(load_workspace) + core.try(load_workspace, USERDIR .. PATHSEP .. "workspace.lua") end end core.run = run return core.run(...) end + +command.add(nil, { + ["project:save-as"] = function() + local entry = core.project_entries[1] + if entry then + core.command_view:set_text(entry.item.filename) + end + core.command_view:enter("Save Project As", function(text) + -- FIXME: add sanity check of project name. + core.project_name = text + local filename = common.path_join(USERDIR, "projects", text .. ".lua") + save_workspace(filename) + core.log("Saved project %s.", core.project_name) + end) + end, + ["project:save"] = function() + local filename = common.path_join(USERDIR, "projects", core.project_name .. ".lua") + save_workspace(filename) + core.log("Saved project %s.", core.project_name) + end, + ["project:load"] = function() + core.command_view:enter("Load Project", function(text) + -- FIXME: add sanity check of project name. + core.project_name = text + local filename = common.path_join(USERDIR, "projects", text .. ".lua") + load_workspace(filename) + core.log("Loaded project %s.", core.project_name) + core.reschedule_project_scan() + end) + end, +}) +