packages feed

tinytools-vty-0.1.0.0: src/Potato/Flow/Vty/AppKbCmd.hs

module Potato.Flow.Vty.AppKbCmd where

import           Relude

import           Potato.Reflex.Vty.Helpers

import           Reflex
import           Reflex.Vty
import qualified Graphics.Vty.Input.Events         as V

data AppKbCmd t = AppKbCmd {
  _appKbCmd_save :: Event t ()
  , _appKbCmd_open :: Event t ()
  , _appKbCmd_print :: Event t ()
  , _appKbCmd_quit :: Event t ()
  , _appKbCmd_forceQuit :: Event t ()
  , _appKbCmd_new :: Event t ()
  , _appKbCmd_capturedInput :: Event t ()
}

holdAppKbCmd :: (MonadWidget t m) => m (AppKbCmd t)
holdAppKbCmd = do
  inp <- input

  let
    captureKeyWithCtrl c = fforMaybe inp $ \i -> case i of
      V.EvKey (V.KChar c') [V.MCtrl] | c' == c -> Just ()
      _ -> Nothing
    saveEv = captureKeyWithCtrl 's'
    openEv = captureKeyWithCtrl 'o'
    printEv = captureKeyWithCtrl 'p'
    quitEv = captureKeyWithCtrl 'q'
    newEv = captureKeyWithCtrl 'n'

    -- TODO this doesn't seem to work, prob cuz vty isn't handling shift correctly on mac
    forceQuitEv = fforMaybe inp $ \i -> case i of
      V.EvKey (V.KChar 'q') [V.MCtrl, V.MShift] -> Just ()
      V.EvKey (V.KChar 'q') [V.MShift, V.MCtrl] -> Just ()
      _ -> Nothing

    captureEv = leftmost [saveEv, openEv, quitEv, newEv, forceQuitEv]

  return $ AppKbCmd {
      _appKbCmd_save = saveEv
      , _appKbCmd_open = openEv
      , _appKbCmd_print = printEv
      , _appKbCmd_quit = quitEv
      , _appKbCmd_forceQuit = forceQuitEv
      , _appKbCmd_new = newEv
      , _appKbCmd_capturedInput = captureEv
    }