module Hbro.Gui where
import Control.Monad.Trans(liftIO)
import Graphics.UI.Gtk.Abstract.Container
import Graphics.UI.Gtk.Abstract.Widget
import Graphics.UI.Gtk.Builder
import Graphics.UI.Gtk.Display.Label
import Graphics.UI.Gtk.Entry.Editable
import Graphics.UI.Gtk.Entry.Entry
import Graphics.UI.Gtk.General.General
import Graphics.UI.Gtk.Gdk.EventM
import Graphics.UI.Gtk.Scrolling.ScrolledWindow
import Graphics.UI.Gtk.WebKit.WebView
import Graphics.UI.Gtk.Windows.Window
import System.Glib.Attributes
import System.Glib.Signals
data GUI = GUI {
mWindow :: Window,
mInspectorWindow :: Window,
mScrollWindow :: ScrolledWindow,
mWebView :: WebView,
mPromptLabel :: Label,
mPrompt :: Entry,
mBuilder :: Builder
}
loadGUI :: String -> IO GUI
loadGUI xmlPath = do
builder <- builderNew
builderAddFromFile builder xmlPath
window <- builderGetObject builder castToWindow "mainWindow"
scrollWindow <- builderGetObject builder castToScrolledWindow "webViewParent"
promptLabel <- builderGetObject builder castToLabel "promptDescription"
promptEntry <- builderGetObject builder castToEntry "promptEntry"
inspectorWindow <- windowNew
set window [ windowTitle := "hbro" ]
webView <- webViewNew
containerAdd scrollWindow webView
set webView [ widgetCanDefault := True ]
windowSetDefault window (Just webView)
set scrollWindow [
scrolledWindowHscrollbarPolicy := PolicyNever,
scrolledWindowVscrollbarPolicy := PolicyNever ]
_ <- on webView closeWebView $ do
mainQuit
return True
return $ GUI window inspectorWindow scrollWindow webView promptLabel promptEntry builder
showPrompt :: Bool -> GUI -> IO ()
showPrompt toShow gui = case toShow of
False -> do widgetHide (mPromptLabel gui)
widgetHide (mPrompt gui)
_ -> do widgetShow (mPromptLabel gui)
widgetShow (mPrompt gui)
prompt :: String -> String -> Bool -> GUI -> (GUI -> IO ()) -> IO ()
prompt label defaultText incremental gui callback = do
showPrompt True gui
labelSetText (mPromptLabel gui) label
entrySetText (mPrompt gui) defaultText
widgetGrabFocus (mPrompt gui)
case incremental of
True -> do
id1 <- on (mPrompt gui) editableChanged $
liftIO $ callback gui
rec id2 <- on (mPrompt gui) keyPressEvent $ do
key <- eventKeyName
case key of
"Return" -> do
liftIO $ showPrompt False gui
liftIO $ signalDisconnect id1
liftIO $ signalDisconnect id2
liftIO $ widgetGrabFocus (mWebView gui)
"Escape" -> do
liftIO $ showPrompt False gui
liftIO $ signalDisconnect id1
liftIO $ signalDisconnect id2
liftIO $ widgetGrabFocus (mWebView gui)
_ -> return ()
return False
return ()
_ -> do
rec id <- on (mPrompt gui) keyPressEvent $ do
key <- eventKeyName
case key of
"Return" -> do
liftIO $ showPrompt False gui
liftIO $ callback gui
liftIO $ signalDisconnect id
liftIO $ widgetGrabFocus (mWebView gui)
"Escape" -> do
liftIO $ showPrompt False gui
liftIO $ signalDisconnect id
liftIO $ widgetGrabFocus (mWebView gui)
_ -> return ()
return False
return ()