packages feed

lhae-0.0.3: src/Controller/Canonical.hs

module Controller.Canonical (getRowInput,getColumnInput
                            ,addRowInput,addColumnInput
                            ,addRowExpr,addColumnExpr
                            ,writeRowInput,writeColumnInput
                            ,writeRowExpr,writeColumnExpr)
    where

import Control.Monad (forM)
import Controller (Controller,onGridView) 
import Controller.Cell (getInput)     
import qualified Controller.Grid as Grid
import View.Component.Grid (numDataRows,numDataColumns,getColumnLabel
                           ,getRowLabel)
import Model.CellContent (CellExpr)
import CellCoordinate (CellCoord,coordRange)

getRowInput :: Int -> Controller (String,[String])
getRowInput row = do
  label <- onGridView $ getRowLabel row
  cells <- do cols <- onGridView numDataColumns
              forM [0..cols-1] $ \c -> getInput (row,c)
  return (label,cells)

getColumnInput :: Int -> Controller (String,[String])
getColumnInput col = do
  label <- onGridView $ getColumnLabel col
  cells <- do rows <- onGridView numDataRows
              forM [0..rows-1] $ \r -> getInput (r,col)
  return (label,cells)

addRowInput,addColumnInput :: Maybe String -> [String] -> Controller ()
addRowInput label cells = do
  index <- onGridView numDataRows
  maybe (Grid.addNRows 1) (\l -> Grid.addRows [l]) label
  writeRowInput index cells

addColumnInput label cells = do
  index <- onGridView numDataColumns
  maybe (Grid.addNColumns 1) (\l -> Grid.addColumns [l]) label
  writeColumnInput index cells

addRowExpr,addColumnExpr :: Maybe String -> [CellExpr] -> Controller ()
addRowExpr label cells = do
  index <- onGridView numDataRows
  maybe (Grid.addNRows 1) (\l -> Grid.addRows [l]) label
  writeRowExpr index cells

addColumnExpr label cells = do
  index <- onGridView numDataColumns
  maybe (Grid.addNColumns 1) (\l -> Grid.addColumns [l]) label
  writeColumnExpr index cells

writeRowInput,writeColumnInput :: Int -> [String] -> Controller ()
writeRowInput = writeRow Grid.writeCellInput
writeColumnInput = writeColumn Grid.writeCellInput

writeRowExpr,writeColumnExpr :: Int -> [CellExpr] -> Controller ()
writeRowExpr = writeRow Grid.writeCellExpr
writeColumnExpr = writeColumn Grid.writeCellExpr

writeRow,writeColumn :: ([(CellCoord,a)] -> Controller ()) -> Int 
                     -> [a] -> Controller ()
writeRow write index rowData = do
  colsInView <- onGridView numDataColumns
  let range = let numCols = max colsInView $ length rowData
              in coordRange ((index,0),(index,numCols-1))
  write $ zip range rowData

writeColumn write index columnData = do
  rowsInView <- onGridView numDataRows
  let range = let numRows = max rowsInView $ length columnData
              in coordRange ((0,index),(numRows-1,index))
  write $ zip range columnData