packages feed

lhae-0.0.3: src/Controller/Menu/Table/Add.hs

module Controller.Menu.Table.Add (columnEventHandler,rowEventHandler)
    where

import Data.List (intercalate)
import Controller (Controller,onView)
import Controller.Grid (addRows,addColumns,addNRows,addNColumns)
import View.Dialog.Complex (Layout (..),Widget (..),Modifier (..)
                           ,showSimpleDialog,cancelButton)
import Util (breakAt)
import I18n (__)

data AddBy = N | Labels
data Parameters = Parameters { addBy :: AddBy
                             , n :: Int
                             , labels :: [String]}

columnEventHandler :: Controller ()
columnEventHandler = do
  result <- onView $ showSimpleDialog (__ "Add columns")
            (dialog $ __ "Add columns by") $ Parameters N 0 []
  case result of
    Nothing -> return ()
    Just (Parameters {addBy=N, n=n}) -> addNColumns n
    Just (Parameters {addBy=Labels, labels=labels}) -> addColumns labels

rowEventHandler :: Controller ()
rowEventHandler = do
  result <- onView $ showSimpleDialog (__ "Add rows")
            (dialog $ __ "Add rows by") $ Parameters N 0 []
  case result of
    Nothing -> return ()
    Just (Parameters {addBy=N, n=n}) -> addNRows n
    Just (Parameters {addBy=Labels, labels=labels}) -> addRows labels

dialog :: String -> Layout Parameters ()
dialog radioBoxCaption =
    let setLabels p labels = p {labels = breakAt ',' labels}
        getLabels = intercalate "," . labels
        setAddBy p 0 = p {addBy = N}
        setAddBy p 1 = p {addBy = Labels}
        getAddBy p = case addBy p of N -> 0; Labels -> 1
        setN p n = p {n = n}
    in
      Modifier Margin $ Column
        [ Row [ Widget $ RadioBox radioBoxCaption 
                  [__ "Number \"n\"",__ "Labels \"label1[,label2,...]\""] 
                  getAddBy setAddBy
              , Column [ Widget $ Spinner 0 maxBound n setN
                       , Widget $ TextEntry getLabels setLabels]]
        , Modifier Center $ Row [ Widget $ DefaultButton (__ "&Add") ()
                                , cancelButton]]