lhae-0.0.2: src/Controller/Menu/Table/Add.hs
module Controller.Menu.Table.Add (columnEventHandler,rowEventHandler
,addRow,addColumn)
where
import Control.Monad (forM_)
import Data.Char (chr,ord)
import Data.List (intercalate)
import Controller (Controller,onView,onGridModel,onGridView)
import Controller.Cell (updateInView)
import qualified Model.Grid as GridM
import qualified View.Component.Grid as GridV
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}) ->
forM_ [1..n] $ \_ -> addColumn Nothing
Just (Parameters {addBy=Labels, labels=labels}) ->
forM_ labels $ addColumn . Just
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}) ->
forM_ [1..n] $ \_ -> addRow Nothing
Just (Parameters {addBy=Labels, labels=labels}) ->
forM_ labels $ addRow . Just
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]]
{- Reihenfolge wichtig:
1. zu View hinzufügen
2. zu Model hinzufügen
-}
addRow,addColumn :: Maybe String -> Controller ()
addRow caption = do
rows <- onGridView GridV.numDataRows
let name = maybe (autoRowName rows) id caption
onGridView $ GridV.addRow name
onGridModel (GridM.addRow name) >>= updateInView
where autoRowName i = show $ i+1
addColumn caption = do
cols <- onGridView GridV.numDataColumns
let name = maybe (autoColumnName cols) id caption
onGridView $ GridV.addColumn name
onGridModel (GridM.addColumn name) >>= updateInView
where autoColumnName i =
let number = (i `div` 26) + 1
in
replicate number $ chr $ (i `mod` 26) + ord 'A'