fix: ui: scroll selection to middle on first entry, also

The viewport doesn't exist until after first render, and scrollSelectionToMiddle didn't need it; viewportScroll queues up events for it.
https://github.com/jtdaugherty/brick/issues/349
This commit is contained in:
Simon Michael 2021-11-20 15:33:28 -10:00
parent 3c889cb565
commit c11d19a893
2 changed files with 8 additions and 11 deletions

View File

@ -372,7 +372,6 @@ asHandle ui0@UIState{
asHandle _ _ = error "event handler called with wrong screen type, should not happen" -- PARTIAL: asHandle _ _ = error "event handler called with wrong screen type, should not happen" -- PARTIAL:
asEnterRegister d selacct ui = do asEnterRegister d selacct ui = do
-- TODO center selection after entering register screen; neither of these works till second time entering; easy strictifications didn't help
rsCenterAndContinue $ rsCenterAndContinue $
-- flip rsHandle (VtyEvent (EvKey (KChar 'l') [MCtrl])) $ -- flip rsHandle (VtyEvent (EvKey (KChar 'l') [MCtrl])) $
screenEnter d regscr ui screenEnter d regscr ui

View File

@ -42,7 +42,7 @@ import Data.List
import qualified Data.Text as T import qualified Data.Text as T
import Data.Time (Day, addDays) import Data.Time (Day, addDays)
import Graphics.Vty import Graphics.Vty
(Event(..),Key(..),Modifier(..),Vty(..),Color,Attr,currentAttr,refresh (Event(..),Key(..),Modifier(..),Vty(..),Color,Attr,currentAttr,refresh, displayBounds
-- ,Output(displayBounds,mkDisplayContext),DisplayContext(..) -- ,Output(displayBounds,mkDisplayContext),DisplayContext(..)
) )
import Lens.Micro.Platform import Lens.Micro.Platform
@ -321,18 +321,16 @@ withBorderAttr attr = updateAttrMap (applyAttrMappings [("border", attr)])
-- middle of the display area. -- middle of the display area.
scrollSelectionToMiddle :: List Name e -> EventM Name () scrollSelectionToMiddle :: List Name e -> EventM Name ()
scrollSelectionToMiddle list = do scrollSelectionToMiddle list = do
let mselectedrow = list^.listSelectedL case list^.listSelectedL of
vpname = list^.listNameL Nothing -> return ()
mvp <- lookupViewport vpname Just selectedrow -> do
case (mselectedrow, mvp) of Vty{outputIface} <- getVtyHandle
(Just selectedrow, Just vp) -> do pageheight <- dbg4 "pageheight" . snd <$> liftIO (displayBounds outputIface)
let let
itemheight = dbg4 "itemheight" $ list^.listItemHeightL itemheight = dbg4 "itemheight" $ list^.listItemHeightL
vpheight = dbg4 "vpheight" $ vp^.vpSize._2 itemsperpage = dbg4 "itemsperpage" $ pageheight `div` itemheight
itemsperpage = dbg4 "itemsperpage" $ vpheight `div` itemheight
toprow = dbg4 "toprow" $ max 0 (selectedrow - (itemsperpage `div` 2)) -- assuming ViewportScroll's row offset is measured in list items not screen rows toprow = dbg4 "toprow" $ max 0 (selectedrow - (itemsperpage `div` 2)) -- assuming ViewportScroll's row offset is measured in list items not screen rows
setTop (viewportScroll vpname) toprow setTop (viewportScroll $ list^.listNameL) toprow
_ -> return ()
-- arrow keys vi keys emacs keys -- arrow keys vi keys emacs keys
moveUpEvents = [EvKey KUp [] , EvKey (KChar 'k') [], EvKey (KChar 'p') [MCtrl]] moveUpEvents = [EvKey KUp [] , EvKey (KChar 'k') [], EvKey (KChar 'p') [MCtrl]]