module Hbro.Extra.StatusBar where -- {{{ Imports import Hbro.Types import Hbro.Util import Control.Monad.Trans(liftIO) import Graphics.Rendering.Pango.Layout import Graphics.UI.Gtk.Abstract.Widget import Graphics.UI.Gtk.Builder import Graphics.UI.Gtk.Display.Label import Graphics.UI.Gtk.Gdk.EventM import Graphics.UI.Gtk.Misc.Adjustment import Graphics.UI.Gtk.Scrolling.ScrolledWindow import Graphics.UI.Gtk.WebKit.WebView import System.Glib.Signals -- }}} -- | Display scroll position in status bar. -- Needs a Label entitled "scroll" from the builder. statusBarScrollPosition :: Browser -> IO () statusBarScrollPosition browser = do scrollLabel <- builderGetObject builder castToLabel "scroll" adjustment <- scrolledWindowGetVAdjustment scrollWindow _ <- onValueChanged adjustment $ do current <- adjustmentGetValue adjustment lower <- adjustmentGetLower adjustment upper <- adjustmentGetUpper adjustment page <- adjustmentGetPageSize adjustment case upper-lower-page of 0 -> labelSetMarkup scrollLabel "ALL" x -> labelSetMarkup scrollLabel $ show (round $ current/x*100) ++ "%" labelSetMarkup scrollLabel "0%" where builder = mBuilder (mGUI browser) scrollWindow = mScrollWindow (mGUI browser) -- | Display current zoom level in status bar. -- Needs a Label entitled "zoom" from the builder. statusBarZoomLevel :: Browser -> IO () statusBarZoomLevel browser = do zoomLevel <- webViewGetZoomLevel webView zoomLabel <- builderGetObject builder castToLabel "zoom" labelSetMarkup zoomLabel $ "x" ++ escapeMarkup (show zoomLevel) ++ "" where builder = mBuilder (mGUI browser) webView = mWebView (mGUI browser) -- | Display pressed keys in status bar. -- Needs a Label entitled "keys" from the builder. statusBarPressedKeys :: Browser -> IO () statusBarPressedKeys browser = let builder = mBuilder (mGUI browser) webView = mWebView (mGUI browser) in do keysLabel <- builderGetObject builder castToLabel "keys" _ <- after webView keyPressEvent $ do value <- eventKeyVal modifiers <- eventModifier let keyString = keyToString value case (keyString, modifiers) of (Just k, []) -> liftIO $ labelSetMarkup keysLabel $ "" ++ escapeMarkup k ++ "" (Just k, m) -> liftIO $ labelSetMarkup keysLabel $ "" ++ show m ++ escapeMarkup k ++ "" _ -> return () return False return () -- | Display load progress in status bar. -- Needs a Label entitled "progress" from the builder. statusBarLoadProgress :: Browser -> IO () statusBarLoadProgress browser = let builder = mBuilder (mGUI browser) webView = mWebView (mGUI browser) in do progressLabel <- builderGetObject builder castToLabel "progress" _ <- on webView loadStarted $ \_ -> do labelSetMarkup progressLabel "0%" _ <- on webView progressChanged $ \progress' -> labelSetMarkup progressLabel $ "" ++ show progress' ++ "%" _ <- on webView loadFinished $ \_ -> do labelSetMarkup progressLabel "100%" _ <- on webView loadError $ \_ _ _ -> do labelSetMarkup progressLabel "ERROR" return False return () -- | Display current URI, or the destination of a hovered link, in the status bar. -- Needs a Label named "uri" from the builder. statusBarURI :: Browser -> IO () statusBarURI browser = do uriLabel <- builderGetObject builder castToLabel "uri" _ <- on webView loadCommitted $ \_ -> do getUri <- (webViewGetUri webView) let (color, uri) = case getUri of Just (u@('h':'t':'t':'p':'s':_)) -> ("orange", u) Just u -> ("gray", u) _ -> ("red", "ERROR") labelSetMarkup uriLabel $ "" ++ escapeMarkup uri ++ "" _ <- on webView hoveringOverLink $ \_title hoveredUri -> do getUri <- (webViewGetUri webView) let (color, uri) = case (hoveredUri, getUri) of (Just u, _) -> ("#5555ff", u) (_, Just (u@('h':'t':'t':'p':'s':_))) -> ("orange", u) (_, Just u) -> ("white", u) _ -> ("red", "ERROR") labelSetMarkup uriLabel $ "" ++ escapeMarkup uri ++ "" return () where builder = mBuilder (mGUI browser) webView = mWebView (mGUI browser)