223 lines
6.5 KiB
Lua
223 lines
6.5 KiB
Lua
|
|
local dirtools = require("tools.vfs.dirtools").init("worldbuilder")
|
|||
|
|
|
|||
|
|
-- --------------------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
local sapp = require("sokol_app")
|
|||
|
|
local stb = require("stb")
|
|||
|
|
local nk = sg
|
|||
|
|
|
|||
|
|
local platform = require("src.platform")
|
|||
|
|
|
|||
|
|
local ffi = require("ffi")
|
|||
|
|
|
|||
|
|
local tinsert = table.insert
|
|||
|
|
local tremove = table.remove
|
|||
|
|
|
|||
|
|
-- --------------------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
local function fuzzy_match(needle, haystack, file_mode)
|
|||
|
|
-- Convert to lowercase for case‑insensitive match
|
|||
|
|
local n = needle:lower()
|
|||
|
|
local h = haystack:lower()
|
|||
|
|
|
|||
|
|
local nlen = #n
|
|||
|
|
local hlen = #h
|
|||
|
|
|
|||
|
|
if nlen == 0 then
|
|||
|
|
return 1 -- empty needle matches with highest score
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
local score = 0
|
|||
|
|
local j = 1
|
|||
|
|
|
|||
|
|
for i = 1, nlen do
|
|||
|
|
local c = n:sub(i,i)
|
|||
|
|
local found = h:find(c, j, true)
|
|||
|
|
if not found then
|
|||
|
|
return 0 -- no match
|
|||
|
|
end
|
|||
|
|
-- reward a match early in the haystack
|
|||
|
|
if found == j then
|
|||
|
|
score = score + 1
|
|||
|
|
end
|
|||
|
|
j = found + 1
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- normalize score: divide by the haystack length (or some heuristic)
|
|||
|
|
local norm = score / hlen
|
|||
|
|
return norm
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- --------------------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
system = {
|
|||
|
|
event_queue = {}, -- Back buffer events are always collected in.
|
|||
|
|
has_focus = true,
|
|||
|
|
iconified = false,
|
|||
|
|
|
|||
|
|
keychanges = {}, -- A buffer of most recent key pressed
|
|||
|
|
mousechanges = {}, -- A buffer of most recent mouse button presses
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
-- --------------------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
system.push_event = function( ev )
|
|||
|
|
|
|||
|
|
-- print(ev.type, ev.a, ev.b, ev.c, ev.d)
|
|||
|
|
tinsert(system.event_queue, ev)
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- --------------------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
system.events_clear = function()
|
|||
|
|
for i = #system.event_queue, 1, -1 do
|
|||
|
|
if system.event_queue[i].processed == true then
|
|||
|
|
tremove(system.event_queue, i)
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- --------------------------------------------------------------------------------------
|
|||
|
|
-- This is a double buffered event queue in case events come in while processing
|
|||
|
|
system.events_buffer = function()
|
|||
|
|
local tmp = {}
|
|||
|
|
for i, ev in ipairs(system.event_queue) do
|
|||
|
|
tinsert(tmp, ev)
|
|||
|
|
ev.processed = true
|
|||
|
|
end
|
|||
|
|
system.events_clear()
|
|||
|
|
return tmp
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- --------------------------------------------------------------------------------------
|
|||
|
|
-- blocking: wait for event, simplified with coroutine or a condition var
|
|||
|
|
system.wait_event = function(timeout)
|
|||
|
|
local ticker_end = os.clock() + timeout
|
|||
|
|
while #system.event_queue == 0 and os.clock() < ticker_end do
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- --------------------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
system.set_cursor = function(cursor_name, rect)
|
|||
|
|
renderer.cursor = { name = cursor_name, rect = rect }
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- --------------------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
system.set_window_title = function(title)
|
|||
|
|
sapp.sapp_set_window_title(title)
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- --------------------------------------------------------------------------------------
|
|||
|
|
-- Set fullscreen, minimized and maximized etc
|
|||
|
|
system.set_window_mode = function(mode, width, height)
|
|||
|
|
-- sapp_is_fullscreen()
|
|||
|
|
-- sapp_toggle_fullscreen()
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- --------------------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
system.window_has_focus = function()
|
|||
|
|
return system.has_focus
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- --------------------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
system.show_confirm_dialog= function(title, message)
|
|||
|
|
return false
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- --------------------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
system.chdir = function(path)
|
|||
|
|
-- dirtools.change_dir(path)
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- --------------------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
system.list_dir = function(path)
|
|||
|
|
-- print("list_dir", path)
|
|||
|
|
return dirtools.get_dir_names(path)
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- --------------------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
system.absolute_path = function(path)
|
|||
|
|
-- print("absolute_path")
|
|||
|
|
local abspath = dirtools.get_absolute_path(path)
|
|||
|
|
return abspath
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- --------------------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
system.get_file_info = function(path)
|
|||
|
|
return dirtools.get_fileinfo(path)
|
|||
|
|
-- return { modified=0, size=0, type="file" }
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- --------------------------------------------------------------------------------------
|
|||
|
|
-- Opens native file selection dialog
|
|||
|
|
system.file_select = function(start_path)
|
|||
|
|
|
|||
|
|
local filename = win.FileSelect()
|
|||
|
|
return filename
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- --------------------------------------------------------------------------------------
|
|||
|
|
-- Opens native file selection dialog
|
|||
|
|
system.folder_select = function(start_path)
|
|||
|
|
|
|||
|
|
return win.FolderSelect()
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- --------------------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
system.get_clipboard = function()
|
|||
|
|
return ffi.string(sapp.sapp_get_clipboard_string())
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- --------------------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
system.set_clipboard = function(text)
|
|||
|
|
sapp.sapp_set_clipboard_string(ffi.string(text))
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- --------------------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
system.get_time = function()
|
|||
|
|
return os.clock()
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- --------------------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
system.sleep = function(seconds)
|
|||
|
|
win.Sleep(seconds * 1000)
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- --------------------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
system.exec = function(cmd)
|
|||
|
|
-- cmd = string.format("cmd /c \"%s 2>&1\"", cmd)
|
|||
|
|
-- print(cmd)
|
|||
|
|
local fh = io.popen(cmd, "r")
|
|||
|
|
local results = ""
|
|||
|
|
if(fh) then
|
|||
|
|
results = fh:read("*a")
|
|||
|
|
fh:close()
|
|||
|
|
end
|
|||
|
|
return results
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- --------------------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
system.fuzzy_match = function(str, pattern)
|
|||
|
|
return fuzzy_match( pattern, str, false)
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- --------------------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
-- /* gets the total number of dropped files (after an SAPP_EVENTTYPE_FILES_DROPPED event) */
|
|||
|
|
-- SOKOL_APP_API_DECL int sapp_get_num_dropped_files(void);
|
|||
|
|
-- /* gets the dropped file paths */
|
|||
|
|
-- SOKOL_APP_API_DECL const char* sapp_get_dropped_file_path(int index);
|