diff options
| author | Julian Hurst <julian.hurst92@gmail.com> | 2022-05-05 23:10:04 +0200 |
|---|---|---|
| committer | Julian Hurst <julian.hurst92@gmail.com> | 2022-05-05 23:10:04 +0200 |
| commit | 1aece8326ee62e242f308c3dbeb5f2bb5e2d53b9 (patch) | |
| tree | fa650c989ddc4e3c7dd7d1d0343d183369fdd14e /main.ha | |
| parent | 6aa1de7118b0b813cdbff631a22e04d8944dc951 (diff) | |
| download | ilhare-1aece8326ee62e242f308c3dbeb5f2bb5e2d53b9.tar.gz | |
Improve docs and search (forwards/backwards search)
Diffstat (limited to 'main.ha')
| -rw-r--r-- | main.ha | 65 |
1 files changed, 55 insertions, 10 deletions
@@ -7,10 +7,13 @@ use os; use strings; use unix::tty; use unix::signal; +use bufio; -//let l: list::listwidget = list::listwidget {...}; let u: mainUI = mainUI {...}; +let searchterm: str = ""; +let searchforward: bool = true; + type mainUI = struct { list: *list::listwidget, }; @@ -24,8 +27,6 @@ fn globalrunehandler(ui: *libui::ttyui, r: rune) bool = { fn runehandler(l: *list::listwidget, r: rune) bool = { switch (r) { - case 'f' => - fmt::fprintln(os::stderr, "f in chat")!; case 'j' => list::down(l); case 'k' => @@ -38,17 +39,60 @@ fn runehandler(l: *list::listwidget, r: rune) bool = { return true; case 'g' => list::top(l); - //l.cursor = 0; case 'G' => list::bottom(l); - //l.cursor = len(l.items) - 1; - case '/' => - // TODO add commandline support - fmt::fprintln(os::stderr, "searching")!; + case 'n' => + if (searchforward) { + list::search(l, searchterm); + } else { + list::rsearch(l, searchterm); + }; + case 'N' => + if (searchforward) { + list::rsearch(l, searchterm); + } else { + list::search(l, searchterm); + }; + case '?' => + // TODO add commandline support maybe + libui::suspend(&l.ui); + fmt::fprint(l.ui.f, '?')!; + let line = match (bufio::scanline(l.ui.f)) { + case let s: []u8 => + yield s; + case io::EOF => + fmt::fprintln(os::stderr, "EOF")!; + return true; + case let e: io::error => + fmt::fprintln(os::stderr, io::strerror(e))!; + return true; + }; + //defer free(line); + searchterm = strings::fromutf8(line); + searchforward = false; let c = l.cursor; - if (list::search(l, "workspace") != c) { - fmt::fprintln(os::stderr, "changed")!; + list::rsearch(l, searchterm); + libui::resume(&l.ui); + case '/' => + // TODO add commandline support maybe + libui::suspend(&l.ui); + fmt::fprint(l.ui.f, '/')!; + let line = match (bufio::scanline(l.ui.f)) { + case let s: []u8 => + yield s; + case io::EOF => + fmt::fprintln(os::stderr, "EOF")!; + return true; + case let e: io::error => + fmt::fprintln(os::stderr, io::strerror(e))!; + return true; }; + //defer free(line); + searchterm = strings::fromutf8(line); + searchforward = true; + let c = l.cursor; + list::search(l, searchterm); + libui::resume(&l.ui); case '\n' => // For some reason enter doesn't send r == '\n' fmt::fprintln(os::stderr, "This is not detected")!; @@ -107,6 +151,7 @@ export fn main() void = { let l = list::newlist(ui, items...); libui::addlistener(&ui, &globalrunehandler); list::addlistener(&l, &runehandler); + defer free(searchterm); libui::clear(l.ui); match (list::print(&l)) { case void => |
