ui: register: scrolling pushes selection, like accounts screen
This commit is contained in:
parent
3a57814402
commit
731a416b8c
@ -3,6 +3,7 @@
|
||||
{-# LANGUAGE FlexibleContexts #-}
|
||||
{-# LANGUAGE OverloadedStrings #-}
|
||||
{-# LANGUAGE RecordWildCards #-}
|
||||
{-# LANGUAGE NamedFieldPuns #-}
|
||||
|
||||
module Hledger.UI.RegisterScreen
|
||||
(registerScreen
|
||||
@ -22,7 +23,7 @@ import qualified Data.Vector as V
|
||||
import Graphics.Vty (Event(..),Key(..),Modifier(..), Button (BLeft, BScrollDown, BScrollUp))
|
||||
import Brick
|
||||
import Brick.Widgets.List
|
||||
(handleListEvent, list, listElementsL, listMoveDown, listMoveTo, listNameL, listSelectedElement, listSelectedL, renderList, listElements)
|
||||
(handleListEvent, list, listElementsL, listMoveDown, listMoveTo, listNameL, listSelectedElement, listSelectedL, renderList, listElements, listSelected, listMoveUp)
|
||||
import Brick.Widgets.Edit
|
||||
import Lens.Micro.Platform
|
||||
import Safe
|
||||
@ -378,9 +379,31 @@ rsHandle ui@UIState{
|
||||
where mnextelement = listSelectedElement $ listMoveDown rsList
|
||||
|
||||
-- mouse scroll wheel scrolls the viewport up or down to its maximum extent,
|
||||
-- TODO moving the selection when necessary to allow the scroll.
|
||||
MouseDown _n BScrollDown _mods _loc -> vScrollBy (viewportScroll $ rsList ^. listNameL) 1 >> continue ui
|
||||
MouseDown _n BScrollUp _mods _loc -> vScrollBy (viewportScroll $ rsList ^. listNameL) (-1) >> continue ui
|
||||
-- The selection will be moved when necessary to keep it visible and allow the scroll.
|
||||
MouseDown name BScrollDown _mods _loc -> do
|
||||
mvp <- lookupViewport name
|
||||
let mselidx = listSelected rsList
|
||||
case (mvp, mselidx) of
|
||||
(Just VP{_vpTop}, Just selidx) -> do
|
||||
let
|
||||
pushsel | selidx <= _vpTop && selidx < (listheight-1) = listMoveDown
|
||||
| otherwise = id
|
||||
where listheight = rsListSize rsList
|
||||
viewportScroll name `vScrollBy` 1
|
||||
continue ui{aScreen=s{rsList=pushsel rsList}}
|
||||
_ -> continue ui
|
||||
|
||||
MouseDown name BScrollUp _mods _loc -> do
|
||||
mvp <- lookupViewport name
|
||||
let mselidx = listSelected rsList
|
||||
case (mvp, mselidx) of
|
||||
(Just VP{_vpTop, _vpSize=(_,vpheight)}, Just selidx) -> do
|
||||
let
|
||||
pushsel | selidx >= _vpTop + vpheight - 1 && selidx > 0 = listMoveUp
|
||||
| otherwise = id
|
||||
viewportScroll name `vScrollBy` (-1)
|
||||
continue ui{aScreen=s{rsList=pushsel rsList}}
|
||||
_ -> continue ui
|
||||
|
||||
-- if page down or end leads to a blank padding item, stop at last non-blank
|
||||
VtyEvent e@(EvKey k []) | k `elem` [KPageDown, KEnd] -> do
|
||||
@ -410,3 +433,5 @@ isBlankElement mel = ((rsItemDate . snd) <$> mel) == Just ""
|
||||
rsCenterAndContinue ui = do
|
||||
scrollSelectionToMiddle $ rsList $ aScreen ui
|
||||
continue ui
|
||||
|
||||
rsListSize = V.length . V.takeWhile ((/="").rsItemDate) . listElements
|
||||
Loading…
Reference in New Issue
Block a user