packages feed

coin-1.0: src/Coin/UI/AccountsComboBox.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.AccountsComboBox (
    accountsComboBoxNew,
    accountsComboBoxSelect
) where

import qualified Graphics.UI.Gtk as Gtk
import Graphics.UI.Gtk ( AttrOp(..) )

import qualified Data.Text as T
import Control.Monad

import Database.Persist

import Coin.DB.Tables
import Coin.UI.Utils.Observable
import Coin.UI.MainState

accountsComboBoxNew :: MainState -> IO Gtk.ComboBox
accountsComboBoxNew mainState = do
    c <- Gtk.comboBoxNewWithEntry

    void $ Gtk.comboBoxSetModelText c
    (Just entry) <- Gtk.binGetChild c
    Gtk.set (Gtk.castToEntry entry) [Gtk.entryEditable := False]

    observableRegister (mainStateAccountsUpdated mainState) $ accountsComboBoxUpdate' c

    Gtk.widgetSetSizeRequest c 240 28
    return c

accountsComboBoxSelect :: MainState -> IO [Entity AccountsTable]
accountsComboBoxSelect mainState = do
    accountIDs <- accountsOptionsTableRead
    entities <- filterEntities <$> accountsTableSelectAll

    let rs = filter (\(Entity entityID _) -> entityID `notElem` accountIDs) entities

    let hs' = [z | x <- accountIDs, z@(Entity y _) <- entities, x == y ]

    return $ hs' ++ rs
  where
    filterEntities = filter $ \(Entity _ item) ->
                         accountsTableName item /= mainStateIncomeName mainState && accountsTableName item /= mainStateOutcomeName mainState

accountsComboBoxUpdate' :: Gtk.ComboBox -> [Entity AccountsTable] -> IO ()
accountsComboBoxUpdate' combo entities = do
    boxModel <- Gtk.comboBoxGetModelText combo

    let accountsList = fmap (\(Entity _ account) -> T.pack $ accountsTableName account) entities

    Gtk.listStoreClear boxModel
    forM_ accountsList $ Gtk.listStoreAppend boxModel
    Gtk.comboBoxSetActive combo 0