packages feed

hbro-1.3.0.0: library/Hbro/Gui.hs

{-# LANGUAGE ConstraintKinds   #-}
{-# LANGUAGE FlexibleContexts  #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ViewPatterns      #-}
module Hbro.Gui (
-- * Basic
      initialize
-- * Getter
    , getMainWindow
    , canRender
    , getDOM
) where

-- {{{ Imports
import           Graphics.UI.Gtk.WebKit.Lifted.WebView    ()

import           Hbro.Error                               as Hbro
import           Hbro.Event
import           Hbro.Gui.Builder
import           Hbro.Gui.MainView                        hiding (initialize)
import qualified Hbro.Gui.MainView                        as MainView
import           Hbro.Gui.NotificationBar                 (NotificationBar)
import qualified Hbro.Gui.NotificationBar                 as NotifBar
import           Hbro.Gui.PromptBar                       (PromptBar, closedL)
import qualified Hbro.Gui.PromptBar                       as Prompt
import           Hbro.Gui.StatusBar
import           Hbro.Logger
import           Hbro.Prelude                             hiding (on)

import           Control.Lens.Getter
import           Control.Monad.Trans.Resource

import           Graphics.Rendering.Pango.Enums
import           Graphics.UI.Gtk.Abstract.Widget
import qualified Graphics.UI.Gtk.Builder                  as Gtk
import           Graphics.UI.Gtk.General.General.Extended (gAsync, gSync)
import qualified Graphics.UI.Gtk.General.General.Extended as Gtk
import           Graphics.UI.Gtk.Windows.Window
import           System.Glib.Signals                      hiding (Signal)
-- }}}

initialize :: (ControlIO m, Alternative m, MonadError Text m, MonadThreadedLogger m, MonadResource m)
           => FilePath -> m (Gtk.Builder, MainView, PromptBar, StatusBar, NotificationBar)
initialize (fpToText -> file) = do
    debug $ "Building GUI from " ++ file
    builder <- gSync Gtk.builderNew
    gSync . Gtk.builderAddFromFile builder $ unpack file

    mainView   <- MainView.initialize =<< MainView.buildFrom builder
    mainWindow <- initializeWindow =<< getWidget builder "mainWindow"
    promptBar  <- Prompt.initialize =<< Prompt.buildFrom builder
    notifBar   <- NotifBar.initialize =<< NotifBar.buildFrom builder
    statusBar  <- StatusBar <$> getWidget builder "statusBox"

    let webView = mainView^.webViewL
    gAsync . widgetShowAll $ mainWindow
    Prompt.close promptBar

    gAsync $ windowSetDefault mainWindow (Just webView)
    addHandler (promptBar^.closedL) (const . gAsync $ widgetGrabFocus webView)

    -- io $ scrolledWindowSetPolicy (gui^.scrollWindowL) PolicyNever PolicyNever
    -- io $ G.set (gui^.scrollWindowL) [ scrolledWindowHscrollbarPolicy := PolicyNever, scrolledWindowVscrollbarPolicy := PolicyNever]

    return (builder, mainView, promptBar, statusBar, notifBar)

-- TODO: catch IOException
-- builderAddFromFile ::
-- builderAddFromFile builder file = catchGErrorJustDomain (Right <$> Gtk.builderAddFromFile builder file) handler
--   where
--     handler :: Gtk.BuilderError -> Text -> IO (Either Text a)
--     handler e message = return . Left $ "Error while building GUI from [" ++ file ++ "]: " ++ message

initializeWindow :: (MonadIO m) => Window -> m Window
initializeWindow window = do
  gAsync $ do
    widgetModifyBg window StateNormal (Color 0 0 5000)
    void . on window deleteEvent $ gAsync Gtk.mainQuit >> return False
  return window