packages feed

threepenny-gui-contextmenu-0.1.0.0: src/ContextMenu/Util.hs

module ContextMenu.Util where

import           Data.Maybe                  (catMaybes)
import qualified Graphics.UI.Threepenny      as UI
import           Graphics.UI.Threepenny.Core

type Action = UI Element

-- |Sets the CSS "display: X;" on the given element.
display :: String -> Element -> UI Element
display x el = element el # set style [("display", x)]

-- |Displays the given element at given coordinates.
displayAt :: Int -> Int -> Element -> UI Element
displayAt x y el = do
    element el # set style [("left", show x ++ "px"), ("top", show y ++ "px")]
    display "block" el

-- |Sets the CSS dimensions of an element to the given values.
dimensions :: String -> String -> Element -> UI Element
dimensions w h el = element el # set style [("width", w), ("height", h)]

-- |A little bit of gymastics to restructure the given data.
extract :: [(Element, Maybe [Action])] -> UI ([Element], [Action])
extract tuples = return (map fst tuples, concat $ catMaybes $ map snd tuples)

-- |Execute one action on hover and another on leave.
whileHover :: Element -> Action -> Action -> UI ()
whileHover el onHover onLeave = do
    on UI.hover el $ const onHover
    on UI.leave el $ const onLeave

-- |For each element in the list we apply a user defined function which takes
-- the current element and its index (a, Int), and the original list with
-- indexed elements [(a, Int)].
mapPairsWithIndex :: [a] -> ((a, Int) -> [(a, Int)] -> UI ()) -> UI ()
mapPairsWithIndex xs f = do
    let indexedXs = zip xs [1..]
    mapM_ (flip f indexedXs) indexedXs