packages feed

hum-0.1.0.0: src/Hum/Modes/PromptMode.hs

-- |

module Hum.Modes.PromptMode where

import           Brick.Widgets.Edit      hiding ( decodeUtf8 )
import           Brick.Types
import           Brick.Main
import           Hum.Types
import           Hum.Utils
import           Graphics.Vty.Input.Events
import qualified Data.Text.Zipper              as Z
                                         hiding ( textZipper )
import           Control.Lens
import qualified Network.MPD                   as MPD
import qualified Data.Vector                   as V
import Brick.Widgets.List


handlePromptEvent
    :: HState -> BrickEvent Name HumEvent -> EventM Name (Next HState)
handlePromptEvent s e = case s ^. promptsL . currentPromptL of
  PlSelectPrompt -> handlePlSelectPromptEvent s e
  TextPrompt -> handleTextPromptEvent s e
  YNPrompt -> handleYNPromptEvent s e

handlePlSelectPromptEvent
    :: HState -> BrickEvent Name HumEvent -> EventM Name (Next HState)
handlePlSelectPromptEvent s e = case e of
  VtyEvent vtye -> case vtye of
    EvKey KEsc [] -> continue $ s & modeL .~ NormalMode
    EvKey (KChar 'q') [] -> continue $ s & modeL .~ NormalMode
    EvKey (KChar 'j') [] -> do
      continue $ s & promptsL . plSelectPromptL %~ listMoveDown
    EvKey (KChar 'k') [] -> do
      continue $ s & promptsL . plSelectPromptL %~ listMoveUp
    EvKey (KChar 'l') [] -> do
      let songs = s ^. queueL & getHighlighted <&> fst & listElements
      case s ^. promptsL . plSelectPromptL & listSelectedElement <&> snd & join of
        Nothing -> continue $ s & promptsL . currentPromptL .~ TextPrompt
                                & promptsL . exitPromptL .~ songBulkAddtoNewPl songs
        Just plname -> continue =<< songBulkAddtoPl (MPD.toString plname) songs s
    EvKey KEnter [] -> do -- HACK find a way to unduplucate this
      let songs = s ^. queueL & getHighlighted <&> fst & listElements
      case s ^. promptsL . plSelectPromptL & listSelectedElement <&> snd & join of
        Nothing -> continue $ s & promptsL . currentPromptL .~ TextPrompt
                                & promptsL . exitPromptL .~ songBulkAddtoNewPl songs
        Just plname -> continue =<< songBulkAddtoPl (MPD.toString plname) songs s
    _ -> continue s
  _ -> continue s

songBulkAddtoNewPl :: V.Vector MPD.Song -> HState -> EventM n HState
songBulkAddtoNewPl songs st = songBulkAddtoPl
  (toString $ st ^. promptsL . textPromptL . editContentsL & Z.currentLine)
  songs
  st

handleTextPromptEvent
  :: HState -> BrickEvent Name HumEvent -> EventM Name (Next HState)
handleTextPromptEvent s e = case e of
  VtyEvent (EvKey KEsc []) -> continue (s & modeL .~ NormalMode)
  VtyEvent (EvKey KEnter []) ->
    continue =<< (s ^. promptsL . exitPromptL) (s & modeL .~ NormalMode)
  VtyEvent vtye ->
    continue
      =<< handleEventLensed s (promptsL . textPromptL) handleEditorEvent vtye
  _ -> continue s

handleYNPromptEvent
  :: HState -> BrickEvent Name HumEvent -> EventM Name (Next HState)
handleYNPromptEvent s e = case e of
  VtyEvent (EvKey KEsc []) -> continue (s & modeL .~ NormalMode)
  VtyEvent (EvKey (KChar 'y') []) ->
    continue =<< (s ^. promptsL . exitPromptL) (s & modeL .~ NormalMode)
  VtyEvent (EvKey (KChar 'n') []) -> continue (s & modeL .~ NormalMode)
  VtyEvent (EvKey (KChar 'q') []) -> continue (s & modeL .~ NormalMode)
  _                               -> continue s