about summary refs log tree commit diff stats
path: root/browse-slack/environment.mu
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2021-08-13 09:00:13 -0700
committerKartik K. Agaram <vc@akkartik.com>2021-08-13 09:02:41 -0700
commit6e086794f9652e4002560e48bb522616251991ba (patch)
tree1974e2f8429ead98355175ef619dfa62f14492c9 /browse-slack/environment.mu
parent388ad74cf16f59a5d97bb398737fa3a499a774ce (diff)
downloadmu-6e086794f9652e4002560e48bb522616251991ba.tar.gz
.
Create space for multiple screens and the future possibility of
navigating back in history. I'm calling them 'tabs' for now, which might
not be less confusing than calling them screens.
Diffstat (limited to 'browse-slack/environment.mu')
-rw-r--r--browse-slack/environment.mu74
1 files changed, 59 insertions, 15 deletions
diff --git a/browse-slack/environment.mu b/browse-slack/environment.mu
index 6a05afaf..a0d9f88e 100644
--- a/browse-slack/environment.mu
+++ b/browse-slack/environment.mu
@@ -1,5 +1,11 @@
 type environment {
-  item-index: int
+  tabs: (handle array tab)
+  current-tab-index: int  # index into tabs
+}
+
+type tab {
+  item-index: int  # what item in the corresponding list we start rendering
+                   # the current page at
 }
 
 # static buffer sizes in this file:
@@ -20,9 +26,14 @@ fn initialize-environment _self: (addr environment), _items: (addr item-list) {
   var self/esi: (addr environment) <- copy _self
   var items/eax: (addr item-list) <- copy _items
   var items-data-first-free-a/eax: (addr int) <- get items, data-first-free
-  var final-item/eax: int <- copy *items-data-first-free-a
+  var final-item/edx: int <- copy *items-data-first-free-a
   final-item <- decrement
-  var dest/edi: (addr int) <- get self, item-index
+  var tabs-ah/ecx: (addr handle array tab) <- get self, tabs
+  populate tabs-ah, 0x10
+  # current-tab-index implicitly set to 0
+  var tabs/eax: (addr array tab) <- lookup *tabs-ah
+  var first-tab/eax: (addr tab) <- index tabs, 0/current-tab-index
+  var dest/edi: (addr int) <- get first-tab, item-index
   copy-to *dest, final-item
 }
 
@@ -72,7 +83,14 @@ fn render-item-list screen: (addr screen), _env: (addr environment), _items: (ad
   #
   var y/ecx: int <- copy 2/search-space-ver
   y <- add 1/item-padding-ver
-  var newest-item/eax: (addr int) <- get env, item-index
+  var tabs-ah/eax: (addr handle array tab) <- get env, tabs
+  var _tabs/eax: (addr array tab) <- lookup *tabs-ah
+  var tabs/edx: (addr array tab) <- copy _tabs
+  var current-tab-index-a/eax: (addr int) <- get env, current-tab-index
+  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
+  var newest-item/eax: (addr int) <- get current-tab, item-index
   var i/ebx: int <- copy *newest-item
   var items/esi: (addr item-list) <- copy _items
   var items-data-ah/eax: (addr handle array item) <- get items, data
@@ -427,7 +445,14 @@ fn update-environment env: (addr environment), key: byte, items: (addr item-list
 
 fn next-item _env: (addr environment), _items: (addr item-list) {
   var env/edi: (addr environment) <- copy _env
-  var dest/eax: (addr int) <- get env, item-index
+  var tabs-ah/eax: (addr handle array tab) <- get env, tabs
+  var _tabs/eax: (addr array tab) <- lookup *tabs-ah
+  var tabs/edx: (addr array tab) <- copy _tabs
+  var current-tab-index-a/eax: (addr int) <- get env, current-tab-index
+  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
+  var dest/eax: (addr int) <- get current-tab, item-index
   compare *dest, 0
   break-if-<=
   decrement *dest
@@ -439,7 +464,14 @@ fn previous-item _env: (addr environment), _items: (addr item-list) {
   var items-data-first-free-a/ecx: (addr int) <- get items, data-first-free
   var final-item-index/ecx: int <- copy *items-data-first-free-a
   final-item-index <- decrement
-  var dest/eax: (addr int) <- get env, item-index
+  var tabs-ah/eax: (addr handle array tab) <- get env, tabs
+  var _tabs/eax: (addr array tab) <- lookup *tabs-ah
+  var tabs/edx: (addr array tab) <- copy _tabs
+  var current-tab-index-a/eax: (addr int) <- get env, current-tab-index
+  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
+  var dest/eax: (addr int) <- get current-tab, item-index
   compare *dest, final-item-index
   break-if->=
   increment *dest
@@ -451,8 +483,15 @@ fn page-down _env: (addr environment), _items: (addr item-list) {
   var items-data-ah/eax: (addr handle array item) <- get items, data
   var _items-data/eax: (addr array item) <- lookup *items-data-ah
   var items-data/ebx: (addr array item) <- copy _items-data
-  var src/eax: (addr int) <- get env, item-index
-  var new-item-index/ecx: int <- copy *src
+  var tabs-ah/eax: (addr handle array tab) <- get env, tabs
+  var _tabs/eax: (addr array tab) <- lookup *tabs-ah
+  var tabs/ecx: (addr array tab) <- copy _tabs
+  var current-tab-index-a/eax: (addr int) <- get env, current-tab-index
+  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/eax: (addr tab) <- index tabs, current-tab-offset
+  var current-tab-item-index-addr/edi: (addr int) <- get current-tab, item-index
+  var new-item-index/ecx: int <- copy *current-tab-item-index-addr
   var y/edx: int <- copy 2
   {
     compare new-item-index, 0
@@ -471,20 +510,19 @@ fn page-down _env: (addr environment), _items: (addr item-list) {
     loop
   }
   new-item-index <- increment
-  var dest/eax: (addr int) <- get env, item-index
   {
     # HACK: make sure we make forward progress even if a single post takes up
     # the whole screen.
     # We can't see the rest of that single post at the moment. But at least we
     # can go past it.
-    compare new-item-index, *dest
+    compare new-item-index, *current-tab-item-index-addr
     break-if-!=
     # Don't make "forward progress" past post 0.
     compare new-item-index, 0
     break-if-=
     new-item-index <- decrement
   }
-  copy-to *dest, new-item-index
+  copy-to *current-tab-item-index-addr, new-item-index
 }
 
 fn page-up _env: (addr environment), _items: (addr item-list) {
@@ -496,8 +534,15 @@ fn page-up _env: (addr environment), _items: (addr item-list) {
   var items-data-first-free-a/eax: (addr int) <- get items, data-first-free
   var final-item-index/esi: int <- copy *items-data-first-free-a
   final-item-index <- decrement
-  var src/eax: (addr int) <- get env, item-index
-  var new-item-index/ecx: int <- copy *src
+  var tabs-ah/eax: (addr handle array tab) <- get env, tabs
+  var _tabs/eax: (addr array tab) <- lookup *tabs-ah
+  var tabs/ecx: (addr array tab) <- copy _tabs
+  var current-tab-index-a/eax: (addr int) <- get env, current-tab-index
+  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/eax: (addr tab) <- index tabs, current-tab-offset
+  var current-tab-item-index-addr/edi: (addr int) <- get current-tab, item-index
+  var new-item-index/ecx: int <- copy *current-tab-item-index-addr
   var y/edx: int <- copy 2
   {
     compare new-item-index, final-item-index
@@ -516,8 +561,7 @@ fn page-up _env: (addr environment), _items: (addr item-list) {
     loop
   }
   new-item-index <- decrement
-  var dest/eax: (addr int) <- get env, item-index
-  copy-to *dest, new-item-index
+  copy-to *current-tab-item-index-addr, new-item-index
 }
 
 # keep sync'd with render-item