poc. Dirty code
This commit is contained in:
parent
371eda962f
commit
d64bb1db1e
@ -25,6 +25,7 @@ import Brick
|
|||||||
import Brick.Widgets.Border
|
import Brick.Widgets.Border
|
||||||
import Brick.Widgets.Border.Style
|
import Brick.Widgets.Border.Style
|
||||||
import Brick.Widgets.Center
|
import Brick.Widgets.Center
|
||||||
|
import Brick.Widgets.Dialog (Dialog, dialog, renderDialog, handleDialogEvent, buttonSelectedAttr, dialogSelection)
|
||||||
import Brick.Widgets.List ( listSelectedFocusedAttr
|
import Brick.Widgets.List ( listSelectedFocusedAttr
|
||||||
, listSelectedAttr
|
, listSelectedAttr
|
||||||
, listAttr
|
, listAttr
|
||||||
@ -45,7 +46,7 @@ import Data.IORef
|
|||||||
import Data.Vector ( Vector
|
import Data.Vector ( Vector
|
||||||
, (!?)
|
, (!?)
|
||||||
)
|
)
|
||||||
import Data.Versions hiding ( str )
|
import Data.Versions hiding ( str, Lens' )
|
||||||
import Haskus.Utils.Variant.Excepts
|
import Haskus.Utils.Variant.Excepts
|
||||||
import Prelude hiding ( appendFile )
|
import Prelude hiding ( appendFile )
|
||||||
import System.FilePath
|
import System.FilePath
|
||||||
@ -61,7 +62,7 @@ import qualified Graphics.Vty as Vty
|
|||||||
import qualified Data.Vector as V
|
import qualified Data.Vector as V
|
||||||
import System.Environment (getExecutablePath)
|
import System.Environment (getExecutablePath)
|
||||||
import qualified System.Posix.Process as SPP
|
import qualified System.Posix.Process as SPP
|
||||||
|
import qualified Lens.Micro as Micro
|
||||||
|
|
||||||
hiddenTools :: [Tool]
|
hiddenTools :: [Tool]
|
||||||
hiddenTools = []
|
hiddenTools = []
|
||||||
@ -76,13 +77,16 @@ data BrickSettings = BrickSettings
|
|||||||
{ showAllVersions :: Bool
|
{ showAllVersions :: Bool
|
||||||
, showAllTools :: Bool
|
, showAllTools :: Bool
|
||||||
}
|
}
|
||||||
deriving Show
|
--deriving Show
|
||||||
|
|
||||||
|
data PopUp = PopUp {isVisible :: Bool, popUpDialog :: Dialog Bool String, selectedValue :: Maybe Bool}
|
||||||
|
|
||||||
data BrickInternalState = BrickInternalState
|
data BrickInternalState = BrickInternalState
|
||||||
{ clr :: Vector ListResult
|
{ clr :: Vector ListResult
|
||||||
, ix :: Int
|
, ix :: Int
|
||||||
|
, popUp :: PopUp
|
||||||
}
|
}
|
||||||
deriving Show
|
--deriving Show
|
||||||
|
|
||||||
data BrickState = BrickState
|
data BrickState = BrickState
|
||||||
{ appData :: BrickData
|
{ appData :: BrickData
|
||||||
@ -90,7 +94,26 @@ data BrickState = BrickState
|
|||||||
, appState :: BrickInternalState
|
, appState :: BrickInternalState
|
||||||
, appKeys :: KeyBindings
|
, appKeys :: KeyBindings
|
||||||
}
|
}
|
||||||
deriving Show
|
--deriving Show
|
||||||
|
|
||||||
|
popUpL :: Micro.Lens' BrickState (Dialog Bool String)
|
||||||
|
popUpL = Micro.lens
|
||||||
|
(popUpDialog . popUp . appState)
|
||||||
|
(\(BrickState {appState = BrickInternalState {popUp = PopUp {..}, ..}, ..}) dg -> BrickState{appState = BrickInternalState{popUp = PopUp {popUpDialog=dg, ..}, ..}, ..} )
|
||||||
|
|
||||||
|
isPopUpVisible :: BrickState -> Bool
|
||||||
|
isPopUpVisible (BrickState _ _ (BrickInternalState _ _ popup) _) = isVisible popup
|
||||||
|
|
||||||
|
updateWithSelection :: BrickState -> BrickState
|
||||||
|
updateWithSelection BrickState{appState=BrickInternalState{popUp = PopUp _ d _, ..},..}
|
||||||
|
= BrickState{appState=BrickInternalState{popUp = PopUp False d (snd <$> dialogSelection d),..},..}
|
||||||
|
|
||||||
|
makePopUpVisible :: BrickState -> BrickState
|
||||||
|
makePopUpVisible BrickState{appState=BrickInternalState{popUp = PopUp _ b c, ..},..}
|
||||||
|
= BrickState{appState=BrickInternalState{popUp = PopUp True b c,..},..}
|
||||||
|
|
||||||
|
viewSelection :: BrickState -> Bool
|
||||||
|
viewSelection = fromMaybe False . selectedValue . popUp . appState
|
||||||
|
|
||||||
|
|
||||||
keyHandlers :: KeyBindings
|
keyHandlers :: KeyBindings
|
||||||
@ -101,7 +124,7 @@ keyHandlers :: KeyBindings
|
|||||||
]
|
]
|
||||||
keyHandlers KeyBindings {..} =
|
keyHandlers KeyBindings {..} =
|
||||||
[ (bQuit, const "Quit" , \_ -> halt)
|
[ (bQuit, const "Quit" , \_ -> halt)
|
||||||
, (bInstall, const "Install" , withIOAction install')
|
, (bInstall, const "Install" , \_ -> modify makePopUpVisible)
|
||||||
, (bUninstall, const "Uninstall", withIOAction del')
|
, (bUninstall, const "Uninstall", withIOAction del')
|
||||||
, (bSet, const "Set" , withIOAction set')
|
, (bSet, const "Set" , withIOAction set')
|
||||||
, (bChangelog, const "ChangeLog", withIOAction changelog')
|
, (bChangelog, const "ChangeLog", withIOAction changelog')
|
||||||
@ -131,6 +154,15 @@ showKey Vty.KUp = "↑"
|
|||||||
showKey Vty.KDown = "↓"
|
showKey Vty.KDown = "↓"
|
||||||
showKey key = tail (show key)
|
showKey key = tail (show key)
|
||||||
|
|
||||||
|
-- | This is the Dialog. It includes only the buttons, their labels, and bounded values
|
||||||
|
afterInstallPopUp :: PopUp
|
||||||
|
afterInstallPopUp = PopUp False yes_no_dialog Nothing
|
||||||
|
where yes_no_dialog = dialog Nothing (Just ("YesButton", [("Yes", "YesButton", True), ("No", "NoButton", False)])) 40
|
||||||
|
|
||||||
|
-- | This is used to render the dialog, if it exists, else, just draw nothing
|
||||||
|
renderPopUp :: PopUp -> Widget String
|
||||||
|
renderPopUp (PopUp False _ _) = emptyWidget
|
||||||
|
renderPopUp (PopUp True d _) = renderDialog d (txtWrap "Do you want to set the installed tool as the default?")
|
||||||
|
|
||||||
ui :: AttrMap -> BrickState -> Widget String
|
ui :: AttrMap -> BrickState -> Widget String
|
||||||
ui dimAttrs BrickState{ appSettings = as@BrickSettings{}, ..}
|
ui dimAttrs BrickState{ appSettings = as@BrickSettings{}, ..}
|
||||||
@ -234,7 +266,7 @@ ui dimAttrs BrickState{ appSettings = as@BrickSettings{}, ..}
|
|||||||
-> Bool
|
-> Bool
|
||||||
-> BrickInternalState
|
-> BrickInternalState
|
||||||
-> Widget String
|
-> Widget String
|
||||||
drawListElements drawElem foc is@(BrickInternalState clr _) =
|
drawListElements drawElem foc is@(BrickInternalState clr _ _) =
|
||||||
Widget Greedy Greedy $
|
Widget Greedy Greedy $
|
||||||
let
|
let
|
||||||
es = clr
|
es = clr
|
||||||
@ -263,10 +295,9 @@ ui dimAttrs BrickState{ appSettings = as@BrickSettings{}, ..}
|
|||||||
minHSize :: Int -> Widget n -> Widget n
|
minHSize :: Int -> Widget n -> Widget n
|
||||||
minHSize s' = hLimit s' . vLimit 1 . (<+> fill ' ')
|
minHSize s' = hLimit s' . vLimit 1 . (<+> fill ' ')
|
||||||
|
|
||||||
|
|
||||||
app :: AttrMap -> AttrMap -> App BrickState e String
|
app :: AttrMap -> AttrMap -> App BrickState e String
|
||||||
app attrs dimAttrs =
|
app attrs dimAttrs =
|
||||||
App { appDraw = \st -> [ui dimAttrs st]
|
App { appDraw = \st -> [renderPopUp (popUp . appState $ st), ui dimAttrs st]
|
||||||
, appHandleEvent = \be -> get >>= \s -> eventHandler s be
|
, appHandleEvent = \be -> get >>= \s -> eventHandler s be
|
||||||
, appStartEvent = return ()
|
, appStartEvent = return ()
|
||||||
, appAttrMap = const attrs
|
, appAttrMap = const attrs
|
||||||
@ -292,6 +323,7 @@ defaultAttributes no_color = attrMap
|
|||||||
, (attrName "day" , Vty.defAttr `withForeColor` Vty.blue)
|
, (attrName "day" , Vty.defAttr `withForeColor` Vty.blue)
|
||||||
, (attrName "help" , Vty.defAttr `withStyle` Vty.italic)
|
, (attrName "help" , Vty.defAttr `withStyle` Vty.italic)
|
||||||
, (attrName "hooray" , Vty.defAttr `withForeColor` Vty.brightWhite)
|
, (attrName "hooray" , Vty.defAttr `withForeColor` Vty.brightWhite)
|
||||||
|
, (buttonSelectedAttr , Vty.defAttr `withBackColor` Vty.brightWhite)
|
||||||
]
|
]
|
||||||
where
|
where
|
||||||
withForeColor | no_color = const
|
withForeColor | no_color = const
|
||||||
@ -320,6 +352,8 @@ eventHandler st@BrickState{..} ev = do
|
|||||||
put (BrickState { appState = moveCursor 1 appState Up, .. })
|
put (BrickState { appState = moveCursor 1 appState Up, .. })
|
||||||
(MouseDown _ Vty.BScrollDown _ _) ->
|
(MouseDown _ Vty.BScrollDown _ _) ->
|
||||||
put (BrickState { appState = moveCursor 1 appState Down, .. })
|
put (BrickState { appState = moveCursor 1 appState Down, .. })
|
||||||
|
(VtyEvent (Vty.EvKey Vty.KEnter [])) | isPopUpVisible st -> modify updateWithSelection >> (gets viewSelection >>= \isSet -> installAndSet isSet st)
|
||||||
|
(VtyEvent e) | isPopUpVisible st -> zoom popUpL (handleDialogEvent e)
|
||||||
(VtyEvent (Vty.EvResize _ _)) -> put st
|
(VtyEvent (Vty.EvResize _ _)) -> put st
|
||||||
(VtyEvent (Vty.EvKey Vty.KUp _)) ->
|
(VtyEvent (Vty.EvKey Vty.KUp _)) ->
|
||||||
put BrickState{ appState = moveCursor 1 appState Up, .. }
|
put BrickState{ appState = moveCursor 1 appState Up, .. }
|
||||||
@ -408,7 +442,7 @@ replaceLR filterF lr s =
|
|||||||
case oldElem >>= \(_, oldE) -> V.findIndex (toolEqual oldE) newVec of
|
case oldElem >>= \(_, oldE) -> V.findIndex (toolEqual oldE) newVec of
|
||||||
Just ix -> ix
|
Just ix -> ix
|
||||||
Nothing -> selectLatest newVec
|
Nothing -> selectLatest newVec
|
||||||
in BrickInternalState newVec newSelected
|
in BrickInternalState newVec newSelected afterInstallPopUp
|
||||||
where
|
where
|
||||||
toolEqual e1 e2 =
|
toolEqual e1 e2 =
|
||||||
lTool e1 == lTool e2 && lVer e1 == lVer e2 && lCross e1 == lCross e2
|
lTool e1 == lTool e2 && lVer e1 == lVer e2 && lCross e1 == lCross e2
|
||||||
@ -432,6 +466,12 @@ filterVisible v t e | lInstalled e = True
|
|||||||
(lTool e `notElem` hiddenTools)
|
(lTool e `notElem` hiddenTools)
|
||||||
|
|
||||||
|
|
||||||
|
installAndSet :: Bool -> BrickState -> EventM String BrickState ()
|
||||||
|
|
||||||
|
installAndSet b brickstate = do
|
||||||
|
withIOAction install' brickstate
|
||||||
|
when b (get >>= withIOAction set')
|
||||||
|
|
||||||
install' :: (MonadReader AppState m, MonadIO m, MonadThrow m, MonadFail m, MonadMask m, MonadUnliftIO m)
|
install' :: (MonadReader AppState m, MonadIO m, MonadThrow m, MonadFail m, MonadMask m, MonadUnliftIO m)
|
||||||
=> BrickState
|
=> BrickState
|
||||||
-> (Int, ListResult)
|
-> (Int, ListResult)
|
||||||
@ -618,7 +658,6 @@ settings' = unsafePerformIO $ do
|
|||||||
loggerConfig
|
loggerConfig
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
brickMain :: AppState
|
brickMain :: AppState
|
||||||
-> IO ()
|
-> IO ()
|
||||||
brickMain s = do
|
brickMain s = do
|
||||||
|
@ -352,6 +352,7 @@ executable ghcup
|
|||||||
, transformers ^>=0.5
|
, transformers ^>=0.5
|
||||||
, unix ^>=2.7
|
, unix ^>=2.7
|
||||||
, vty ^>=5.37
|
, vty ^>=5.37
|
||||||
|
, microlens ^>=0.4.13
|
||||||
|
|
||||||
if os(windows)
|
if os(windows)
|
||||||
cpp-options: -DIS_WINDOWS
|
cpp-options: -DIS_WINDOWS
|
||||||
|
Loading…
Reference in New Issue
Block a user