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:
parent
3c889cb565
commit
c11d19a893
@ -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
|
||||||
|
|||||||
@ -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]]
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user