summaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorJulian Hurst <julian.hurst@digdash.com>2025-03-20 12:33:13 +0100
committerJulian Hurst <julian.hurst@digdash.com>2025-03-20 12:33:13 +0100
commitddac62a2a43ee62da4f5302e9cb2958f6ff82cea (patch)
tree1a0e7d0dd485d5a4a1879f05bdefd79b3e4bbf0b /cmd
parent6e8a2af6bd47fd05e6b22937c5da7397549e7cbb (diff)
downloadhare-tui-ddac62a2a43ee62da4f5302e9cb2958f6ff82cea.tar.gz
Add setcursor and reframe to scrolllist and flesh out il
Diffstat (limited to 'cmd')
-rw-r--r--cmd/il.ha59
1 files changed, 59 insertions, 0 deletions
diff --git a/cmd/il.ha b/cmd/il.ha
index ce4b89b..abbde84 100644
--- a/cmd/il.ha
+++ b/cmd/il.ha
@@ -5,6 +5,7 @@ use bufio;
use os;
use strings;
use fmt;
+use io;
export fn main() void = {
const scanner = bufio::newscanner(os::stdin);
@@ -28,6 +29,9 @@ export fn main() void = {
vl.layout.print(&vl);
+ let term: (str | void) = void;
+ defer if (term is str) free(term as str) else void;
+ let revsearch = false;
for (true) {
const r = tui::read(&state)!;
if (r == 'j') {
@@ -55,6 +59,61 @@ export fn main() void = {
fmt::println(li.items[li.cursor])!;
break;
};
+ if (r == '/' || r == '?') {
+ revsearch = r == '?';
+ term = search(&state, &li, r as rune);
+ if (revsearch) prevsearch(&li, term) else nextsearch(&li, term);
+ };
+ if (r == 'n') {
+ if (revsearch) prevsearch(&li, term) else nextsearch(&li, term);
+ };
+ if (r == 'N') {
+ if (!revsearch) prevsearch(&li, term) else nextsearch(&li, term);
+ };
vl.layout.print(&vl);
};
};
+
+fn search(state: *tui::tui, li: *list::scrolllist, prefix: (str | rune) = '/') (str | void) = {
+ tui::unraw(state);
+ defer tui::raw(state)!;
+ fmt::fprint(state.out, prefix)!;
+ const uline = match (bufio::read_line(state.out)!) {
+ case let u: []u8 =>
+ yield u;
+ case io::EOF =>
+ return;
+ };
+ defer free(uline);
+ return strings::dup(strings::fromutf8(uline)!);
+};
+
+fn nextsearch(li: *list::scrolllist, term: (str | void)) void = {
+ const term = match (term) {
+ case let term: str =>
+ yield term;
+ case void =>
+ return;
+ };
+ for (let i = li.cursor + 1; i < len(li.items); i += 1) {
+ if (strings::contains(li.items[i], term)) {
+ list::setcursor(li, i: u16);
+ return;
+ };
+ };
+};
+
+fn prevsearch(li: *list::scrolllist, term: (str | void)) void = {
+ const term = match (term) {
+ case let term: str =>
+ yield term;
+ case void =>
+ return;
+ };
+ for (let i: int = li.cursor: int - 1; i >= 0; i -= 1) {
+ if (strings::contains(li.items[i], term)) {
+ list::setcursor(li, i: u16);
+ return;
+ };
+ };
+};