1
0
mirror of https://github.com/20kdc/OC-KittenOS.git synced 2024-11-27 04:48:05 +11:00
OC-KittenOS/apps/textedit.lua
gamemanj 2ae3f9a93a Initial commit
Currently eeprog pirate-speak language is unsupported, but... oh well.
2016-10-23 13:27:16 +01:00

352 lines
5.7 KiB
Lua
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- 'Femto': Text Editor
-- Formatting proc. for
-- this file is the def.
-- size of a textedit win
local lang,
table,
unicode,
math,
proc =
A.request("lang",
"table",
"unicode",
"math",
"proc")
local lines = {
"Femto: Text Editor",
"^W : Close, ^S : Save",
"^A : Load , ^Q : New.",
"^C : Copy Line,",
"^V : Paste Line",
"^<arrows>: Resize Win",
"'^' is Control.",
"Now with wide text!",
""
}
local linesTranslated =
lang.getTable()
if linesTranslated then
lines = linesTranslated
end
local cursorX = 1
local cursorY = 1
local cFlash = true
local ctrlFlag = false
local sW, sH = 25, 8
local app = {}
local function splitCur()
local s = lines[cursorY]
local st = unicode.sub
(s, 1, cursorX - 1)
local en = unicode.sub
(s, cursorX)
return st, en
end
local function
clampCursorX()
local s = lines[cursorY]
if unicode.len(s) <
(cursorX - 1) then
cursorX =
unicode.len(s) + 1
return true
end
return false
end
-- Save/Load
local function save()
ctrlFlag = false
local txt =
A.openfile("text", "w")
if txt then
for k, v in
ipairs(lines) do
if k ~= 1 then
txt.write("\n" .. v)
else
txt.write(v)
end
end
txt.close()
end
end
local function load()
ctrlFlag = false
local txt =
A.openfile("text", "r")
if txt then
lines = {}
local lb = ""
while true do
local l = txt.read(64)
if not l then
table.insert
(lines, lb)
cursorX = 1
cursorY = 1
txt.close()
return
end
local lp =
l:find("\n")
while lp do
lb = lb .. l:sub(1,
lp - 1)
table.insert
(lines, lb)
lb = ""
l = l:sub(lp + 1)
lp = l:find("\n")
end
lb = lb .. l
end
end
end
function app.get_ch(x, y)
-- do rY first since unw
-- only requires that
-- horizontal stuff be
-- messed with...
-- ...thankfully
local rY = (y + cursorY)
- math.floor(sH / 2)
-- rX is difficult!
local rX = 1
local Xthold =
math.floor(sW / 2)
if cursorX > Xthold then
rX = rX + (cursorX -
Xthold)
end
local line = lines[rY]
if not line then return
"¬" end
local _, cursorXP =
unicode.safeTextFormat(
line, cursorX)
line, rX =
unicode.safeTextFormat(
line, rX)
-- 1-based cambias stuff
rX = rX + (x - 1)
if rX == cursorXP then
if rY == cursorY then
if cFlash then
return "_"
end
end
end
return unicode.sub(line,
rX, rX)
end
-- communicate with the
-- "lineclip" clipboard,
-- for inter-window copy
function lineclip(c, m)
for _, v in
ipairs(proc.listApps())
do
if v[2] == "lineclip"
then
return proc.sendRPC(
v[1], c, m)
end
end
local aid = A.launchApp(
"lineclip")
ctrlFlag = false
if aid then return
proc.sendRPC(aid, c, m)
end
return ""
end
-- add a single character
function putLetter(ch)
if ch == "\r" then
local a, b = splitCur()
lines[cursorY] = a
table.insert(lines,
cursorY + 1, b)
cursorY = cursorY + 1
cursorX = 1
return
end
local a, b = splitCur()
a = a .. ch
lines[cursorY] = a .. b
cursorX =
unicode.len(a) + 1
end
function app.key(ka, kc,
down)
if kc == 29 then
ctrlFlag = down
return false
end
if ctrlFlag then
if not down then
return false end
if kc == 17 -- W
then A.die() end
if kc == 200 then
sH = sH - 1
if sH == 0 then
sH = 1 end
A.resize(sW, sH)
end
if kc == 208 then
sH = sH + 1
A.resize(sW, sH)
end
if kc == 203 then
sW = sW - 1
if sW == 0 then
sW = 1 end
A.resize(sW, sH)
end
if kc == 205 then
sW = sW + 1
A.resize(sW, sH)
end
if kc == 31 -- S
then return save() end
if kc == 30 -- A
then return load() end
if kc == 16 -- Q
then lines = {""}
cursorX = 1
cursorY = 1
return true end
if kc == 46 -- C
then lineclip("copy",
lines[cursorY]) end
if kc == 47 then -- V
table.insert(lines,
cursorY,
lineclip("paste"))
return true
end
return false
end
-- action keys
if not down then
return false
end
if kc == 200
or kc == 201 then
local moveAmount = 1
if kc == 201 then
moveAmount =
math.floor(sH / 2)
end
cursorY = cursorY -
moveAmount
if cursorY < 1 then
cursorY = 1 end
clampCursorX()
return true
end
if kc == 208
or kc == 209 then
local moveAmount = 1
if kc == 209 then
moveAmount =
math.floor(sH / 2)
end
cursorY = cursorY +
moveAmount
if cursorY> #lines then
cursorY = #lines end
clampCursorX()
return true
end
if kc == 203 then
if cursorX > 1 then
cursorX = cursorX - 1
else
if cursorY > 1 then
cursorY = cursorY - 1
cursorX = unicode.len
(lines[cursorY]) + 1
else
return false
end
end
return true
end
if kc == 205 then
cursorX = cursorX + 1
if clampCursorX() then
if cursorY < #lines
then
cursorY = cursorY + 1
cursorX = 1
end
end
return true
end
if kc == 199 then
cursorX = 1
return true
end
if kc == 207 then
cursorX = unicode.len(
lines[cursorY]) + 1
return true
end
if ka == 8 then
if cursorX == 1 then
if cursorY == 1 then
return false
end
local l = table.remove
(lines, cursorY)
cursorY = cursorY - 1
cursorX = unicode.len(
lines[cursorY]) + 1
lines[cursorY] =
lines[cursorY] .. l
else
local a, b =splitCur()
a = unicode.sub(a, 1,
unicode.len(a) - 1)
lines[cursorY] = a.. b
cursorX = cursorX - 1
end
return true
end
if ka ~= 0 then
putLetter
(unicode.char(ka))
return true
end
return false
end
function app.clipboard(t)
for i = 1,
unicode.len(t) do
local c =
unicode.sub(t, i, i)
if c ~= "\r" then
if c == "\n" then
c = "\r"
end
putLetter(c)
end
end
return true
end
function app.update()
cFlash = not cFlash
A.timer(0.5)
return true
end
return app, sW, sH