packages feed

sylvia-0.2.2: 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.Render.Core
import Sylvia.Render.Pair
import Sylvia.Render.Backend.Cairo

title :: String
title = "Sylvia"

showInWindow :: [Exp Void] -> IO ()
showInWindow es = 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 es
        widgetSetSizeRequest canvas w h
        set window [ containerChild := canvas ]
        canvas `on` exposeEvent $ updateCanvas es

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

updateCanvas :: [Exp Void] -> EventM EExpose Bool
updateCanvas es = do
    win <- eventWindow
    liftIO $ do
        let (action, _) = renderCairo es
        renderWithDrawable win action
    return True

renderCairo :: [Exp Void] -> (Render (), PInt)
renderCairo = runImageWithPadding def . stackHorizontally . map render

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