packages feed

sylvia-0.2.0.1: Sylvia/UI/GTK.hs

{-# OPTIONS_GHC -fno-warn-unused-do-bind #-}

-- |
-- Module      : Sylvia.UI.GTK
-- Copyright   : GPLv3
--
-- Maintainer  : chrisyco@gmail.com
-- Portability : portable
--
-- Graphical interface based on Cairo and GTK.

module Sylvia.UI.GTK ( showInWindow ) where

import Data.Default
import Data.Void
import Graphics.Rendering.Cairo
import Graphics.UI.Gtk
import System.IO ( hPutStr, hPutStrLn, stderr )

import Sylvia.Model
import Sylvia.Renderer.Pair
import Sylvia.Renderer.Impl.Cairo

title :: String
title = "Sylvia"

showInWindow :: Exp Void -> IO ()
showInWindow e = do
    "Initializing GTK" -:- do
        initGUI

    window <- "Creating window" -:- do
        window <- windowNew
        set window
            [ windowTitle := title
            , widgetAppPaintable := True
            ]
        onDestroy window mainQuit
        return window

    "Creating canvas" -:- do
        canvas <- drawingAreaNew
        let (_, (w :| h)) = renderCairo e
        widgetSetSizeRequest canvas w h
        set window [ containerChild := canvas ]
        canvas `on` exposeEvent $ updateCanvas e

    "Show ALL the things!" -:- do
        widgetShowAll window
        mainGUI

updateCanvas :: Exp Void -> EventM EExpose Bool
updateCanvas e = do
    win <- eventWindow
    liftIO $ do
        let (action, size) = renderCairo e
        let (w :| h) = fmap fromIntegral $ size |+| ctxGridSize def
        renderWithDrawable win $ translate w h >> action
    return True

renderCairo :: Exp Void -> (Render (), PInt)
renderCairo = runImage' def . render

infixr 1 -:-
(-:-) :: String -> IO a -> IO a
msg -:- action = do
    hPutStr stderr msg
    result <- action
    hPutStrLn stderr " ... done"
    return result