module Hbro.Extra where
-- {{{ Imports
import Hbro.Core
import Hbro.Gui
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.Entry.Entry
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
import System.Process
-- }}}
-- {{{ Statusbar elements
-- | Display scroll position in status bar.
-- Needs a Label intitled "scroll" from the builder.
statusBarScrollPosition :: Browser -> IO ()
statusBarScrollPosition browser =
let
builder = mBuilder (mGUI browser)
scrollWindow = mScrollWindow (mGUI browser)
in 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) ++ "%"
return ()
-- | Display pressed keys in status bar.
-- Needs a Label intitled "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 of
Just string -> liftIO $ labelSetMarkup keysLabel $ "" ++ show modifiers ++ escapeMarkup string ++ ""
_ -> return ()
return False
return ()
-- | Display load progress in status bar.
-- Needs a Label intitled "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 intitled "uri" from the builder.
statusBarURI :: Browser -> IO ()
statusBarURI browser =
let
builder = mBuilder (mGUI browser)
webView = mWebView (mGUI browser)
in do
uriLabel <- builderGetObject builder castToLabel "uri"
_ <- on webView loadCommitted $ \_ -> do
getUri <- (webViewGetUri webView)
case getUri of
Just uri -> labelSetMarkup uriLabel $ "" ++ escapeMarkup uri ++ ""
_ -> labelSetMarkup uriLabel "ERROR"
_ <- on webView hoveringOverLink $ \title hoveredUri -> do
getUri <- (webViewGetUri webView)
case (hoveredUri, getUri) of
(Just u, _) -> labelSetMarkup uriLabel $ "" ++ escapeMarkup u ++ ""
(_, Just u) -> labelSetMarkup uriLabel $ "" ++ escapeMarkup u ++ ""
_ -> putStrLn "FIXME"
return ()
-- }}}
-- {{{ Features prompts
-- | Prompt for key words to search in current webpage.
promptFind :: Bool -> Bool -> Bool -> Browser -> IO ()
promptFind caseSensitive forward wrap browser =
prompt "Search" "" True browser (\browser' -> do
keyWord <- entryGetText (mPromptEntry $ mGUI browser')
found <- webViewSearchText (mWebView $ mGUI browser) keyWord caseSensitive forward wrap
return ())
-- | Switch to next found key word.
findNext :: Bool -> Bool -> Bool -> Browser -> IO ()
findNext caseSensitive forward wrap browser = do
keyWord <- entryGetText (mPromptEntry $ mGUI browser)
found <- webViewSearchText (mWebView $ mGUI browser) keyWord caseSensitive forward wrap
return ()
-- | Prompt for URI to open in current window.
promptURL :: Bool -> Browser -> IO()
promptURL False browser =
prompt "Open URL" "" False browser (\b -> do
uri <- entryGetText (mPromptEntry $ mGUI b)
loadURL uri b)
promptURL _ browser = do
uri <- webViewGetUri (mWebView $ mGUI browser)
case uri of
Just url -> prompt "Open URL" url False browser (\b -> do
u <- entryGetText (mPromptEntry $ mGUI b)
loadURL u b)
_ -> return ()
-- }}}
-- {{{ Copy/paste
copyUri, copyTitle, loadURIFromClipBoard :: Browser -> IO()
-- | Copy current URI in clipboard.
copyUri browser = do
getUri <- webViewGetUri (mWebView $ mGUI browser)
case getUri of
Just u -> runCommand ("echo -n " ++ u ++ " | xclip") >> return ()
_ -> return ()
-- | Copy current page title in clipboard.
copyTitle browser = do
getTitle <- webViewGetTitle (mWebView $ mGUI browser)
case getTitle of
Just t -> runCommand ("echo -n " ++ t ++ " | xclip") >> return ()
_ -> return ()
-- | Load URI from clipboard. Does not work for now...
loadURIFromClipBoard browser = do
uri <- readProcess "xclip" ["-o"] []
loadURL uri browser
-- }}}
-- {{{ Others
toggleSourceMode :: Browser -> IO ()
toggleSourceMode browser = do
currentMode <- webViewGetViewSourceMode (mWebView $ mGUI browser)
webViewSetViewSourceMode (mWebView $ mGUI browser) (not currentMode)
reload True browser
-- }}}