slack: ensure single cursor on screen at any time

This is worth a first test.
This commit is contained in:
Kartik K. Agaram 2021-08-14 17:20:52 -07:00
parent 6c46da31fb
commit 444da164b0
1 changed files with 34 additions and 17 deletions

View File

@ -2,6 +2,7 @@ type environment {
search-terms: (handle gap-buffer)
tabs: (handle array tab)
current-tab-index: int # index into tabs
dirty?: boolean
# search mode
cursor-in-search?: boolean
# channel mode
@ -63,10 +64,14 @@ fn initialize-environment _self: (addr environment), _items: (addr item-list) {
fn render-environment screen: (addr screen), _env: (addr environment), users: (addr array user), channels: (addr array channel), items: (addr item-list) {
var env/esi: (addr environment) <- copy _env
# don't bother repainting the screen when typing into the search bar
# (and screen isn't dirty)
{
var cursor-in-search?/eax: (addr boolean) <- get env, cursor-in-search?
compare *cursor-in-search?, 0/false
break-if-=
var dirty?/eax: (addr boolean) <- get env, dirty?
compare *dirty?, 0/false
break-if-!=
render-search-input screen, env
clear-rect screen, 0/x 0x2f/y, 0x80/x 0x30/y, 0/bg
render-search-menu screen, env
@ -77,12 +82,17 @@ fn render-environment screen: (addr screen), _env: (addr environment), users: (a
render-channels screen, env, channels
render-item-list screen, env, items, channels, users
render-menu screen, env
var dirty?/eax: (addr boolean) <- get env, dirty?
copy-to *dirty?, 0/false
}
fn render-channels screen: (addr screen), _env: (addr environment), _channels: (addr array channel) {
var env/esi: (addr environment) <- copy _env
var cursor-index/edi: int <- copy -1
{
var cursor-in-search?/eax: (addr boolean) <- get env, cursor-in-search?
compare *cursor-in-search?, 0/false
break-if-!=
var cursor-in-channels?/eax: (addr boolean) <- get env, cursor-in-channels?
compare *cursor-in-channels?, 0/false
break-if-=
@ -140,36 +150,46 @@ fn render-item-list screen: (addr screen), _env: (addr environment), items: (add
var current-tab-index/eax: int <- copy *current-tab-index-a
var current-tab-offset/eax: (offset tab) <- compute-offset tabs, current-tab-index
var current-tab/edx: (addr tab) <- index tabs, current-tab-offset
render-tab screen, current-tab, items, channels, users, screen-height
var show-cursor?: boolean
{
var cursor-in-search?/eax: (addr boolean) <- get env, cursor-in-search?
compare *cursor-in-search?, 0/false
break-if-!=
var cursor-in-channels?/eax: (addr boolean) <- get env, cursor-in-channels?
compare *cursor-in-channels?, 0/false
break-if-!=
copy-to show-cursor?, 1/true
}
render-tab screen, current-tab, show-cursor?, items, channels, users, screen-height
var top/eax: int <- copy screen-height
top <- subtract 2/menu-space-ver
clear-rect screen, 0 top, screen-width screen-height, 0/bg
}
fn render-tab screen: (addr screen), _current-tab: (addr tab), items: (addr item-list), channels: (addr array channel), users: (addr array user), screen-height: int {
fn render-tab screen: (addr screen), _current-tab: (addr tab), show-cursor?: boolean, items: (addr item-list), channels: (addr array channel), users: (addr array user), screen-height: int {
var current-tab/esi: (addr tab) <- copy _current-tab
var current-tab-type/eax: (addr int) <- get current-tab, type
compare *current-tab-type, 0/all-items
{
break-if-!=
render-all-items screen, current-tab, items, users, screen-height
render-all-items screen, current-tab, show-cursor?, items, users, screen-height
return
}
compare *current-tab-type, 1/channel
{
break-if-!=
render-channel-tab screen, current-tab, items, channels, users, screen-height
render-channel-tab screen, current-tab, show-cursor?, items, channels, users, screen-height
return
}
compare *current-tab-type, 2/search
{
break-if-!=
render-search-tab screen, current-tab, items, channels, users, screen-height
render-search-tab screen, current-tab, show-cursor?, items, channels, users, screen-height
return
}
}
fn render-all-items screen: (addr screen), _current-tab: (addr tab), _items: (addr item-list), users: (addr array user), screen-height: int {
fn render-all-items screen: (addr screen), _current-tab: (addr tab), show-cursor?: boolean, _items: (addr item-list), users: (addr array user), screen-height: int {
var current-tab/esi: (addr tab) <- copy _current-tab
var items/edi: (addr item-list) <- copy _items
var newest-item/eax: (addr int) <- get current-tab, item-index
@ -181,9 +201,6 @@ fn render-all-items screen: (addr screen), _current-tab: (addr tab), _items: (ad
var items-data/edi: (addr array item) <- copy _items-data
var y/ecx: int <- copy 2/search-space-ver
y <- add 1/item-padding-ver
# cursor always at top item
var show-cursor?: boolean
copy-to show-cursor?, 1/true
{
compare i, 0
break-if-<
@ -192,13 +209,14 @@ fn render-all-items screen: (addr screen), _current-tab: (addr tab), _items: (ad
var offset/eax: (offset item) <- compute-offset items-data, i
var curr-item/eax: (addr item) <- index items-data, offset
y <- render-item screen, curr-item, users, show-cursor?, y, screen-height
# cursor always at top item
copy-to show-cursor?, 0/false
i <- decrement
loop
}
}
fn render-channel-tab screen: (addr screen), _current-tab: (addr tab), _items: (addr item-list), _channels: (addr array channel), users: (addr array user), screen-height: int {
fn render-channel-tab screen: (addr screen), _current-tab: (addr tab), show-cursor?: boolean, _items: (addr item-list), _channels: (addr array channel), users: (addr array user), screen-height: int {
var current-tab/esi: (addr tab) <- copy _current-tab
var items/edi: (addr item-list) <- copy _items
var channels/ebx: (addr array channel) <- copy _channels
@ -220,9 +238,6 @@ fn render-channel-tab screen: (addr screen), _current-tab: (addr tab), _items: (
var items-data/edi: (addr array item) <- copy _items-data
var y/ecx: int <- copy 2/search-space-ver
y <- add 1/item-padding-ver
# cursor always at top item
var show-cursor?: boolean
copy-to show-cursor?, 1/true
{
compare i, 0
break-if-<
@ -233,13 +248,14 @@ fn render-channel-tab screen: (addr screen), _current-tab: (addr tab), _items: (
var item-offset/eax: (offset item) <- compute-offset items-data, item-index
var curr-item/eax: (addr item) <- index items-data, item-offset
y <- render-item screen, curr-item, users, show-cursor?, y, screen-height
# cursor always at top item
copy-to show-cursor?, 0/false
i <- decrement
loop
}
}
fn render-search-tab screen: (addr screen), _current-tab: (addr tab), _items: (addr item-list), channels: (addr array channel), users: (addr array user), screen-height: int {
fn render-search-tab screen: (addr screen), _current-tab: (addr tab), show-cursor?: boolean, _items: (addr item-list), channels: (addr array channel), users: (addr array user), screen-height: int {
var current-tab/esi: (addr tab) <- copy _current-tab
var items/edi: (addr item-list) <- copy _items
var current-tab-search-items-ah/eax: (addr handle array int) <- get current-tab, search-items
@ -262,9 +278,6 @@ fn render-search-tab screen: (addr screen), _current-tab: (addr tab), _items: (a
var items-data/edi: (addr array item) <- copy _items-data
var y/ecx: int <- copy 2/search-space-ver
y <- add 1/item-padding-ver
# cursor always at top item
var show-cursor?: boolean
copy-to show-cursor?, 1/true
{
compare i, 0
break-if-<
@ -275,6 +288,7 @@ fn render-search-tab screen: (addr screen), _current-tab: (addr tab), _items: (a
var item-offset/eax: (offset item) <- compute-offset items-data, item-index
var curr-item/eax: (addr item) <- index items-data, item-offset
y <- render-item screen, curr-item, users, show-cursor?, y, screen-height
# cursor always at top item
copy-to show-cursor?, 0/false
i <- decrement
loop
@ -701,6 +715,9 @@ fn update-environment _env: (addr environment), key: byte, users: (addr array us
# enter search mode
var cursor-in-search?/eax: (addr boolean) <- get env, cursor-in-search?
copy-to *cursor-in-search?, 1/true
# do one more repaint
var dirty?/eax: (addr boolean) <- get env, dirty?
copy-to *dirty?, 1/true
return
}
{