--------------------------------------------------------- -- -- Module : HasloGUI -- Copyright : Bartosz Wójcik (2012) -- License : BSD3 -- -- Maintainer : bartek@sudety.it -- Stability : Unstable -- Portability : portable -- -- | Example of usage two libraries: wtk-gtk and Haslo. -- Simply loan calculator with Gtk GUI. --------------------------------------------------------- module Main where import Haslo import Data.Maybe (fromJust) import Graphics.UI.Gtk import Data.IORef import Data.Lenses import Data.List import Control.Monad.Reader import Haslo.GUI.Gtk.HasloGUIState import Haslo.GUI.Gtk.HasloGUILogic import Haslo.GUI.Gtk.HasloGUIGtk import Graphics.UI.Gtk.WtkGui import Graphics.UI.Gtk.WtkGtk -- ============ LICENCE ===================== thisVersion = "0.1" thisLicenceType = "Evaluation" thisLicenceTill = "31.12.2012" thisLicenceFor = "Public" -- ========================================== main :: IO () main = do initGUI vbox <- vBoxNew False 0 ntbk <- notebookNew st <- initState ntbk -- notebook initMyState showTable -- input page formating and packing function -- Here, in showTable everything is hidden newSt -- user state update function False -- debug off window <- windowNew set window [windowTitle := "Haslo GUI", windowDefaultWidth := 350, windowDefaultHeight := 700 ] containerAdd window vbox (vb,collection) <- showTable 0 st notebookInsertPage ntbk vb "Input" 0 widgetShowAll vb about <- actionNew "ABOUT" "About" Nothing (Just stockAbout) onActionActivate about aboutDialog -- param <- actionNew "PARAM" "Parameters" Nothing Nothing -- onActionActivate param $ paramDialog st agr <- actionGroupNew "AGR" mapM_ (\a -> actionGroupAddActionWithAccel agr a Nothing) [about -- ,param ] ui <- uiManagerNew uiManagerAddUiFromString ui uiDecl uiManagerInsertActionGroup ui agr 0 maybeMenubar <- uiManagerGetWidget ui "/ui/menubar" let menubar = case maybeMenubar of (Just x) -> x Nothing -> error "Cannot get menubar from string." boxPackStart vbox menubar PackNatural 0 maybeToolbar <- uiManagerGetWidget ui "/ui/toolbar" let toolbar = case maybeToolbar of (Just x) -> x Nothing -> error "Cannot get toolbar from string." boxPackStart vbox toolbar PackNatural 0 boxPackStart vbox ntbk PackGrow 0 widgetShowAll window onDestroy window mainQuit mainGUI uiDecl= "\ \ \ \ \ \ \ \ \ \ \ \ " olduiDecl= "\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ " aboutDialog = do dia <- aboutDialogNew -- Displayed version is a combination of ElcaGUI and elca engine versions. aboutDialogSetVersion dia $ thisVersion ++ "\non engine " ++ getVersionHaslo aboutDialogSetCopyright dia "(c) Bartosz Wojcik 2012" aboutDialogSetComments dia thisLicenceFor aboutDialogSetLicense dia (Just thisLicenceType) aboutDialogSetAuthors dia ["Bartosz Wojcik"] answer <- dialogRun dia widgetDestroy dia -- | User defined layout of the input. Each inputable widget has to have its own -- entry in the state, as 'InputField'. -- -- Following order of packing: -- window, notebook, notebook's page, vbox, scrolledWindow, table -- What is important: this function has to return vbox, so it's not necessarily -- scrolledWindow and table to be packed in. showTable :: Int -- ^ id of widget with focus -> IORef (State MyState) -- ^ state living in IO -> IO (VBox, [WidgetsCollection]) -- ^ vbox containing table of the content, list of widgets needed for grabing focus showTable nr state = do vb <- vBoxNew False 0 scrwin <- scrolledWindowNew Nothing Nothing scrolledWindowSetPolicy scrwin PolicyNever PolicyAutomatic boxPackStart vb scrwin PackGrow 0 -- H-box put into scrolled window vbFramesA <- hBoxNew False 0 scrolledWindowAddWithViewport scrwin vbFramesA st <- readIORef state -- V-box on the left hand side of vbFramesA vbFrames <- vBoxNew False 0 boxPackStart vbFramesA vbFrames PackGrow 0 -- V-box on the right hand side of vbFramesA vbFramesR <- vBoxNew False 0 boxPackStart vbFramesA vbFramesR PackGrow 0 -- showDBDetails vbFrames $ usrSt st table <- myNewTable "Loan" vbFrames 29 4 -- Loan frame and its content textToTableCellL "Type of loan" 1 0 table cb0 <- showSelection (loanAPI $ usrSt st) 2 0 nr table state >>= \x -> return $ CSL (0,x) errMsgToTable (loanAPI $ usrSt st) 2 1 table hlineToTable 1 3 table textToTableCellL "Principal" 1 2 table en1 <- showEntry (principalAPI $ usrSt st) 2 2 nr table state >>= \x -> return $ CEn (1,x) textToTableCellL "(accepting arithmetic\n statement) " 3 2 table errMsgToTable (principalAPI $ usrSt st) 2 3 table en7 <- case (balloonAPI $ usrSt st) `fetch` att_visible of True -> do let label = case fromJust $ loanS $ usrSt st of ClReversBalloon -> "Instalment amount" ClUnfoldedBalloon -> "Residual balloon" ClUnfoldedBalloonPlus -> "Residual balloon" _ -> "Balloon" textToTableCellL label 1 4 table en <- showEntry (balloonAPI $ usrSt st) 2 4 nr table state errMsgToTable (balloonAPI $ usrSt st) 2 5 table return $ CEn (7,en) False -> return Dummy textToTableCellL "Number of instalments" 1 6 table en2 <- showEntry (durationAPI $ usrSt st) 2 6 nr table state >>= \x -> return $ CEn (2,x) errMsgToTable (durationAPI $ usrSt st) 2 7 table let label3 = "Effecitve interest rate" textToTableCellL label3 1 8 table en3 <- showEntry (rateAPI $ usrSt st) 2 8 nr table state >>= \x -> return $ CEn (3,x) textToTableCellL "%" 3 8 table errMsgToTable (rateAPI $ usrSt st) 2 9 table en5 <- case (eXtDurAPI $ usrSt st) `fetch` att_visible of True -> do let label = "Max. extended duration" textToTableCellL label 1 10 table en <- showEntry (eXtDurAPI $ usrSt st) 2 10 nr table state errMsgToTable (eXtDurAPI $ usrSt st) 2 11 table return $ CEn (eXtDurId,en) False -> return Dummy textToTableCellL "1st instalment deferment" 1 12 table en4 <- showEntry (delayAPI $ usrSt st) 2 12 nr table state >>= \x -> return $ CEn (4,x) errMsgToTable (delayAPI $ usrSt st) 2 13 table hlineToTable 16 3 table bt1 <- buttonNewWithLabel "Amotization Schedule" >>= \bt -> showButton (action100API $ usrSt st) 2 25 nr table state bt openNewPageAbs >> return (CBu (8,bt)) let returnList = cb0 : en1 : en2 : en3 : en5 : en4 : bt1 : en7 : [] return (vb,returnList)