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