{-# LANGUAGE ExistentialQuantification #-}
-- | Lens-based Gtk interface
module GUI.MLens.Gtk.Interface
    ( I (..)
    , ListLayout (..)
    ) where

import Control.Monad.Free

import Data.MLens.Ref

-- | Interface description parametrized by a monad
data I m
    = Label (Free m String)     -- ^ label
    | Button { label_  :: Free m String
             , action_ :: Free m (Maybe (m ()))     -- ^ when the @Maybe@ value is @Nothing@, the button is inactive
             }  -- ^ button
    | Checkbox (Ref m Bool)         -- ^ checkbox
    | Combobox [String] (Ref m Int) -- ^ combo box
    | Entry (Ref m String)          -- ^ entry field
    | List ListLayout [I m]         -- ^ group interfaces into row or column
    | Notebook [(String, I m)]      -- ^ tabs
    | forall a . Eq a 
    => Cell { remember_content_   :: Bool       -- ^ remember the content or not? (info for the renderer)
            , underlying_value_   :: m a
            , dynamic_interface_  :: a -> I m
            }     -- ^ dynamic interface
    | Action (m (I m))              -- ^ do an action before giving the interface

data ListLayout
    = Horizontal | Vertical