-- |
--
-- Copyright : (C) Keera Studios Ltd, 2013
-- License : BSD3
-- Maintainer : support@keera.co.uk
module Hails.Graphics.UI.Gtk.Simplify.Logger
(installHandlers, installHandlersUnique)
where
import Control.Arrow
import Control.Monad
import Hails.MVC.Model.ReactiveModel (Event)
import Control.Monad.Reader (liftIO)
import Data.Maybe
import Hails.MVC.GenericCombinedEnvironment
import Graphics.UI.Gtk
-- import Graphics.UI.Gtk.GenericView
import Hails.MVC.View.GtkView
import Hails.MVC.View
import System.Log as Log
import System.Log.Formatter
import System.Log.Handler
import System.Log.Logger
import Hails.MVC.Model.ProtectedModel.LoggedModel
installHandlersUnique :: (GtkGUI a, LoggedBasicModel b,
Event c, MenuItemClass d)
=> CEnv a b c
-> ViewElementAccessorIO (GtkView a) d
-> IO ()
installHandlersUnique cenv mF = void $ do
rl <- getRootLogger
let lhs = [] :: [ ListStoreLogHandler ]
let rl' = setHandlers lhs rl
saveGlobalLogger rl'
installHandlers cenv mF
installHandlers :: (GtkGUI a, LoggedBasicModel b,
Event c, MenuItemClass d)
=> CEnv a b c
-> ViewElementAccessorIO (GtkView a) d
-> IO ()
installHandlers cenv mF = void $ do
let (vw, pm) = (view &&& model) cenv
lsLogHandler <- listStoreLogHandlerNew
log' <- getLog pm
-- let nl = setHandlers [lsLogHandler] log'
let nl = addHandler lsLogHandler log'
saveGlobalLogger nl
w <- createLogWindow $ lslhStore lsLogHandler
mn <- mF vw
mn `on` menuItemActivate $ liftIO (widgetShowAll w)
createLogWindow :: ListStore String -> IO Window
createLogWindow ls = do
w <- windowNew
set w [ windowTitle := "Log" ]
windowSetDefaultSize w 400 300
s <- scrolledWindowNew Nothing Nothing
containerAdd w s
tv <- treeViewNewWithModel ls
treeViewSetHeadersVisible tv False
addTextColumn tv ls Just
containerAdd s tv
w `on` deleteEvent $ liftIO $ widgetHide w >> return True
return w -- , ls)
addTextColumn :: (TreeModelClass (model row), TypedTreeModelClass model)
=> TreeView -> model row -> (row -> Maybe String) -> IO()
addTextColumn tv st f = do
col <- treeViewColumnNew
renderer <- cellRendererTextNew
cellLayoutPackStart col renderer True
cellLayoutSetAttributes col renderer st $ map (cellText :=).maybeToList.f
_ <- treeViewAppendColumn tv col
return ()
data ListStoreLogHandler = ListStoreLogHandler
{ lslhStore :: ListStore String
, lslhLevel :: Log.Priority
, lslhFormatter :: LogFormatter ListStoreLogHandler
}
instance LogHandler ListStoreLogHandler where
getLevel = lslhLevel
setLevel x l = x { lslhLevel = l }
getFormatter = lslhFormatter
setFormatter x f = x { lslhFormatter = f }
emit x l _ = void (listStoreAppend (lslhStore x) (snd l))
close _ = return ()
listStoreLogHandlerNew :: IO ListStoreLogHandler
listStoreLogHandlerNew = do
ls <- listStoreNew []
return ListStoreLogHandler
{ lslhStore = ls
, lslhLevel = DEBUG
, lslhFormatter = nullFormatter
}