diff --git a/code/apps/app-wget.lua b/code/apps/app-wget.lua index b80b56f..99b73fd 100644 --- a/code/apps/app-wget.lua +++ b/code/apps/app-wget.lua @@ -8,55 +8,75 @@ local primaryINet = neo.requireAccess("c.internet", "internet access").list()() -- Enter URL dialog local running = true +local sRunning = true -- useful to perform a system update local url = "http://20kdc.duckdns.org/neo/inst.lua" -local w = neoux.create(25, 3, nil, neoux.tcwindow(25, 3, { - neoux.tcrawview(1, 1, {"URL to download?"}), - neoux.tcfield(1, 2, 25, function (t) - url = t or url - return url - end), - neoux.tcbutton(16, 3, "Confirm", function (w) - local nurl = url - local fd = neoux.fileDialog(true) - if not fd then return end - -- download! - local req, err = primaryINet.request(nurl) - if not req then - neoux.startDialog("failed request:\n" .. tostring(err)) - end - -- OpenComputers#535 - req.finishConnect() - while true do - local n, n2 = req.read(neo.readBufSize) - if not n then - req.close() - fd.close() - if n2 then - neoux.startDialog("failed download:\n" .. tostring(n2)) - return - else - break - end - else - if n == "" then - yielder() - else - local o, r = fd.write(n) - if not o then - req.close() - fd.close() - neoux.startDialog("failed write:\n" .. tostring(r)) +local function doWorking() + return 25, 1, nil, neoux.tcwindow(25, 1, { + neoux.tcrawview(1, 1, {"Downloading now..."}), + }, function (w) + sRunning = false + end, 0xFFFFFF, 0) +end +local function doMainWin() + return 25, 3, nil, neoux.tcwindow(25, 3, { + neoux.tcrawview(1, 1, {"URL to download?"}), + neoux.tcfield(1, 2, 25, function (t) + url = t or url + return url + end), + neoux.tcbutton(16, 3, "Confirm", function (w) + sRunning = true + w.reset(doWorking()) + local nurl = url + local fd = neoux.fileDialog(true) + if not fd then return end + -- download! + local req, err = primaryINet.request(nurl) + if not req then + neoux.startDialog("failed request:\n" .. tostring(err)) + w.reset(doMainWin()) + return + end + -- OpenComputers#535 + req.finishConnect() + while sRunning do + local n, n2 = req.read(neo.readBufSize) + if not n then + req.close() + fd.close() + if n2 then + neoux.startDialog("failed download:\n" .. tostring(n2)) + w.reset(doMainWin()) return + else + break + end + else + if n == "" then + event.sleepTo(os.uptime() + 0.05) + else + local o, r = fd.write(n) + if not o then + req.close() + fd.close() + neoux.startDialog("failed write:\n" .. tostring(r)) + w.reset(doMainWin()) + return + end end end end - end - end) -}, function (w) - w.close() - running = false -end, 0xFFFFFF, 0)) + pcall(req.close) + pcall(fd.close) + w.reset(doMainWin()) + end) + }, function (w) + w.close() + running = false + end, 0xFFFFFF, 0) +end +local w = neoux.create(doMainWin) while running do event.pull() diff --git a/code/libs/fmttext.lua b/code/libs/fmttext.lua index eece183..294218e 100644 --- a/code/libs/fmttext.lua +++ b/code/libs/fmttext.lua @@ -3,7 +3,7 @@ local fmt fmt = { - pad = function (t, len, centre, cut) + pad = function (t, len, centre, cut, ra) local l = unicode.len(t) local add = len - l if add > 0 then @@ -14,7 +14,11 @@ fmt = { end end if cut then - t = unicode.sub(t, 1, len) + local i = 0 + if ra then + i = -math.min(0, add) + end + t = unicode.sub(t, i + 1, len + i) end return t end, diff --git a/code/libs/neoux.lua b/code/libs/neoux.lua index 499831f..abb7cbd 100644 --- a/code/libs/neoux.lua +++ b/code/libs/neoux.lua @@ -378,9 +378,7 @@ newNeoux = function (event, neo) bg = fg1 end local text = unicode.safeTextFormat(textprop()) - local txl = unicode.len(text) - local start = math.max(1, (txl - (w - 2)) + 1) - text = "[" .. neoux.pad(unicode.sub(text, start, start + (w - 3)), w - 2, false, true) .. "]" + text = "[" .. neoux.pad(text, w - 2, false, true, true) .. "]" window.span(x, y, text, bg, fg) end } diff --git a/code/libs/sys-filedialog.lua b/code/libs/sys-filedialog.lua index d423eda..a34f463 100644 --- a/code/libs/sys-filedialog.lua +++ b/code/libs/sys-filedialog.lua @@ -45,27 +45,26 @@ local function prepareNodeI(node) -- local function format(a) if a <= 1 then - return true, true, node.name + return false, fmt.pad(unicode.safeTextFormat(node.name), w, true, true) end local camY = math.max(1, selection - 3) local idx = a + camY - 2 - if node.unknownAvailable then - if idx == #l + 1 then - return selection == #l + 1, false, ":" .. unknownTx - end + local utx = (" "):rep(w) + if node.unknownAvailable and idx == #l + 1 then + utx = "[" .. fmt.pad(unicode.safeTextFormat(unknownTx), w - 6, false, true, true) .. "]" end if l[idx] then - return selection == idx, false, l[idx][1] + utx = "<" .. fmt.pad(unicode.safeTextFormat(l[idx][1]), w - 2, false, true) .. ">" end - return true, true, "~~~" + return selection == idx, utx end local function updateLine(wnd, a) local colA, colB = 0xFFFFFF, 0 - local sel, cen, text = format(a) + local sel, text = format(a) if sel then colB, colA = 0xFFFFFF, 0 end - wnd.span(1, a, fmt.pad(unicode.safeTextFormat(text), w, cen, true), colA, colB) + wnd.span(1, a, text, colA, colB) end local function flush(wnd) for i = 1, h do @@ -84,7 +83,7 @@ local function prepareNodeI(node) elseif kc == 208 then h = h + 1 elseif kc == 203 then - w = math.max(1, w - 1) + w = math.max(6, w - 1) elseif kc == 205 then w = w + 1 else @@ -156,7 +155,7 @@ local function prepareNodeI(node) if node.unknownAvailable then max = max + 1 end - if ns == selection and selection ~= #l + 1 then + if ns == selection and ((selection ~= #l + 1) or (a <= 4)) then key(wnd, 13, 0, true) else selection = math.min(math.max(1, ns), max) diff --git a/repository/apps/app-nbox2018.lua b/repository/apps/app-nbox2018.lua index afa3a18..045f2a4 100644 --- a/repository/apps/app-nbox2018.lua +++ b/repository/apps/app-nbox2018.lua @@ -78,10 +78,7 @@ local fstatSwap = false local workingOnBox = nil local function runField(tx, l, r) - local fieldContent = unicode.safeTextFormat(tx) - fieldContent = fmttext.pad(fieldContent, 31, false, false) - fieldContent = unicode.sub(fieldContent, math.max(1, unicode.len(fieldContent) - 30)) - return l .. fieldContent .. r + return l .. fmttext.pad(unicode.safeTextFormat(tx), 31, false, true, true) .. r end local function actField(tx, ka, kc) if kc == 211 or ka == 8 then diff --git a/repository/docs/ul-fmttx b/repository/docs/ul-fmttx index 7e77916..11f602d 100644 --- a/repository/docs/ul-fmttx +++ b/repository/docs/ul-fmttx @@ -20,7 +20,8 @@ Essentially, it's job is to take some into a column of a given width. It has two functions for this task: - pad(text, len[, centre[, cut]]): + pad(text, len[, centre + [, cut[, ra]]]): Pads the given safeTextFormat'd string to a given width, returning the resulting string. @@ -33,6 +34,11 @@ It has two functions for this task: be reduced in size if necessary. Otherwise, text that is too long is not reduced. + If ra is true, the text is "semi- + right-aligned" - it's left-aligned + as normal *if it can be*, but if + it exceeds the width, it becomes + right-aligned. fmtText(text, width): Formats the given safeTextFormat'd