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)