threepenny-gui-0.9.4.2: samples/DragNDropExample.hs
import Control.Monad
import Data.IORef
import Paths
import qualified Graphics.UI.Threepenny as UI
import Graphics.UI.Threepenny.Core
{-----------------------------------------------------------------------------
Drag'N'Drop example
------------------------------------------------------------------------------}
main :: IO ()
main = do
static <- getStaticDir
startGUI defaultConfig { jsStatic = Just static } setup
setup :: Window -> UI ()
setup w = void $ do
return w # set title "Drag 'N' Drop Example"
UI.addStyleSheet w "DragNDropExample.css"
pairs <- sequence $
zipWith mkDragPair (words "red green blue") (map (150*) [0..2])
getBody w #+ concat [[element i, element o] | (i,o) <- pairs]
type Color = String
mkDragPair :: Color -> Int -> UI (Element, Element)
mkDragPair color position = do
elDrag <- UI.new #. "box-drag"
# set UI.style [("left", show position ++ "px"), ("color",color)]
# set text "Drag me!"
# set UI.draggable True
# set UI.dragData color
elDrop <- UI.new #. "box-drop"
# set UI.style [("border","2px solid " ++ color), ("left", show position ++ "px")]
dropSuccess <- liftIO $ newIORef False
on UI.dragStart elDrag $ \_ -> void $
element elDrop
# set text "Drop here!"
# set UI.droppable True
on UI.dragEnd elDrag $ \_ -> void $ do
dropped <- liftIO $ readIORef dropSuccess
when (not dropped) $ void $
element elDrop
# set text ""
# set UI.droppable False
on UI.drop elDrop $ \color' -> when (color == color') $ void $ do
liftIO $ writeIORef dropSuccess True
delete elDrag
element elDrop
# set text "Dropped!"
# set UI.droppable False
return (elDrag, elDrop)