hoodle-core-0.13: src/Hoodle/ModelAction/ContextMenu.hs
-----------------------------------------------------------------------------
-- |
-- Module : Hoodle.ModelAction.ContextMenu
-- Copyright : (c) 2011-2013 Ian-Woo Kim
--
-- License : BSD3
-- Maintainer : Ian-Woo Kim <ianwookim@gmail.com>
-- Stability : experimental
-- Portability : GHC
--
-----------------------------------------------------------------------------
module Hoodle.ModelAction.ContextMenu where
import qualified Data.ByteString.Char8 as B
import Data.UUID.V4
import Graphics.Rendering.Cairo
import Graphics.UI.Gtk
import System.Directory
import System.FilePath
import System.Process
--
import Data.Hoodle.BBox
import Data.Hoodle.Simple
import Graphics.Hoodle.Render
import Graphics.Hoodle.Render.Type.Item
--
import Hoodle.Type.Event
import Hoodle.Util
-- |
menuOpenALink :: {- (AllEvent -> IO ()) -> -} UrlPath -> IO MenuItem
menuOpenALink {- evhandler -} urlpath = do
let urlname = case urlpath of
FileUrl fp -> fp
HttpUrl url -> url
menuitemlnk <- menuItemNewWithLabel ("Open "++urlname)
menuitemlnk `on` menuItemActivate $ openLinkAction urlpath
return menuitemlnk
-- |
openLinkAction :: UrlPath -> IO ()
openLinkAction urlpath =
case urlpath of
FileUrl fp -> do
let cmdargs = [fp]
createProcess (proc "hoodle" cmdargs)
return ()
HttpUrl url -> do
let cmdargs = [url]
createProcess (proc "xdg-open" cmdargs)
return ()
-- |
menuCreateALink :: (AllEvent -> IO ()) -> [RItem] -> IO (Maybe MenuItem)
menuCreateALink evhandler sitems =
if (length . filter isLinkInRItem) sitems > 0
then return Nothing
else do mi <- menuItemNewWithLabel "Create a link to..."
mi `on` menuItemActivate $
evhandler (UsrEv (GotContextMenuSignal CMenuCreateALink))
return (Just mi)
-- |
makeSVGFromSelection :: [RItem] -> BBox -> IO SVG
makeSVGFromSelection hititms (BBox (ulx,uly) (lrx,lry)) = do
uuid <- nextRandom
tdir <- getTemporaryDirectory
let filename = tdir </> show uuid <.> "svg"
(x,y) = (ulx,uly)
(w,h) = (lrx-ulx,lry-uly)
withSVGSurface filename w h $ \s -> renderWith s $ do
translate (-ulx) (-uly)
mapM_ renderRItem hititms
bstr <- B.readFile filename
let svg = SVG Nothing Nothing bstr (x,y) (Dim w h)
svg `seq` removeFile filename
return svg