packages feed

coin-1.2: src/Coin/UI/MainMultiList.hs

{-
 *  Programmer:	Piotr Borek
 *  E-mail:     piotrborek@op.pl
 *  Copyright 2015 Piotr Borek
 *
 *  Distributed under the terms of the GPL (GNU Public License)
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-}

module Coin.UI.MainMultiList (
    mainMultiListNew,
-- reexports
    MultiListWidget
) where

import Control.Monad
import Database.Persist

import Coin.DB.Tables
import Coin.Locale.Translate
import Coin.UI.MainState
import Coin.UI.Widgets.StackWidget
import Coin.UI.Widgets.MultiList
import Coin.UI.Raports.RaportHistory
import Coin.UI.Raports.RaportHistoryAll
import Coin.UI.Raports.RaportSummary

mainMultiListNew :: MainState -> StackWidget -> IO MultiListWidget
mainMultiListNew mainState stack = do
    multiList <- multiListNew

    accountsIndex <- multiListButtonNew multiList (__"Accounts")
    raportsIndex <- multiListButtonNew multiList (__"Raports")
    optionsIndex <- multiListButtonNew multiList (__"Options")

    multiListOptionAdd' multiList optionsIndex
        [ (__"Tags",     stackWidgetShow stack "tagsList")
        , (__"Accounts", stackWidgetShow stack "accountsList")
        ]

    observableRegister (mainStateAccountsUpdated mainState) $ multiListUpdateAccounts multiList accountsIndex

    multiListOptionAdd' multiList raportsIndex
        [ (__"Summary",
               do
                   stackWidgetGet stack "raportSummary" >>= raportSummaryUpdate'
                   stackWidgetShow stack "raportSummary")
        , (__"History",
               do
                   stackWidgetGet stack "raportHistory" >>= raportHistoryUpdate' mainState
                   stackWidgetShow stack "raportHistory"
          )
        , (__"History: All",
               do
                   stackWidgetGet stack "raportHistoryAll" >>= raportHistoryAllUpdate' mainState
                   stackWidgetShow stack "raportHistoryAll"
          )
        , (__"Queries", stackWidgetShow stack "raportQuery")
        ]

    return multiList

  where
    multiListUpdateAccounts multiList accountsIndex entities = do
        multiListOptionClear multiList accountsIndex
        forM_ entities $ \(Entity _ item) -> do
            let name = accountsTableName item
            multiListOptionAdd multiList accountsIndex name $ do
                observableSet (mainStateSelectedAccountName mainState) name
                stackWidgetShow stack "accounts"