packages feed

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

{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE RecursiveDo     #-}

module Potato.Flow.Vty.OpenWindow where

import           Relude

import           Potato.Flow
import           Potato.Flow.Vty.Attrs
import           Potato.Flow.Vty.Common
import           Potato.Flow.Vty.PotatoReader
import           Potato.Reflex.Vty.Helpers
import           Potato.Reflex.Vty.Widget.FileExplorer
import           Potato.Reflex.Vty.Widget.Popup


import           Control.Monad.Fix
import           Control.Monad.NodeId
import           Data.Align
import           Data.Char                             (isNumber)
import           Data.Dependent.Sum                    (DSum ((:=>)))
import qualified Data.IntMap                           as IM
import qualified Data.List.Extra                       as L
import qualified Data.Maybe
import qualified Data.Sequence                         as Seq
import qualified Data.Text                             as T
import qualified Data.Text.Zipper                      as TZ
import           Data.These
import           Data.Tuple.Extra

import qualified Graphics.Vty                          as V
import           Reflex
import           Reflex.Network
import           Reflex.Potato.Helpers
import           Reflex.Vty

import qualified System.Directory                      as FP
import qualified System.FilePath                       as FP

data OpenWindowConfig t = OpenWindowConfig {
  _openWindowConfig_open :: Event t FP.FilePath -- ^ Event to launch the popup window to open file starting in the given directory
}

popupOpenWindow :: forall t m. (MonadWidget t m, HasPotato t m)
  => OpenWindowConfig t
  -> m (Event t FP.FilePath, Dynamic t Bool) -- ^ (file to open, popup state)
popupOpenWindow OpenWindowConfig {..} = do

  potatostylebeh <- fmap _potatoConfig_style askPotato

  let

    popupOpenEv = ffor _openWindowConfig_open $ \d0 -> mdo
      boxTitle (constant def) "Open" $ do
        initManager_ $ col $ mdo
          fewidget <- (tile . stretch) 3 $ holdFileExplorerWidget $ FileExplorerWidgetConfig {
              _fileExplorerWidgetConfig_fileFilter = \fp -> FP.takeExtension fp == kTinyToolsFileExtension
              , _fileExplorerWidgetConfig_initialFile = d0
              , _fileExplorerWidgetConfig_clickDownStyle = fmap _potatoStyle_layers_softSelected potatostylebeh
            }
          (cancelEv, openButtonEv) <- (tile . fixed) 3 $ row $ do
            cancelEv' <- (tile . stretch) 10 $ textButton def "cancel"

            -- TODO grey out if filename is empty
            openEv' <- (tile . stretch) 10 $ textButton def "open"

            return (cancelEv', openEv')

          let
            -- do we really want to allow open on pressing enter?
            openEv'' = leftmost [_fileExplorerWidget_returnOnfilename fewidget, _fileExplorerWidget_doubleClick fewidget, openButtonEv]
            openEv' = tag (_fileExplorerWidget_fullfilename fewidget) openEv''
            openEv = fmap addTinyToolsFileExtensionIfNecessary openEv'

          return (cancelEv, openEv)
    fmapfn w = \escEv clickOutsideEv -> fmap (\(cancelEv, outputEv) -> (leftmost [escEv, cancelEv, void outputEv], outputEv)) w

  localTheme (const $ fmap _potatoStyle_normal potatostylebeh) $ do
    popupPane def $ (fmap fmapfn popupOpenEv)