ダイアグラムライブラリとCairo/GTKバックエンドを使用してダイアグラムを描画する方法を学ぼうとしています。空白のウィンドウが表示されますが、図面がレンダリングされません。私は何が間違っているのですか?
module Main where
import Control.Monad.Trans (liftIO)
import Graphics.UI.Gtk
import Diagrams.Backend.Cairo
import Diagrams.Backend.Cairo.Gtk
import Diagrams.Prelude
main :: IO ()
main = do
initGUI
window <- windowNew
canvas <- drawingAreaNew
canvas `on` sizeRequest $ return (Requisition 1000 1000)
set window [ containerBorderWidth := 10,
containerChild := canvas ]
canvas `on` exposeEvent $ renderFigure
onDestroy window mainQuit
widgetShowAll window
mainGUI
renderFigure :: EventM EExpose Bool
renderFigure = do
win <- eventWindow
liftIO $ renderToGtk win $ toGtkCoords figure
-- liftIO $ defaultRender win figure
return True
figure :: Diagram Cairo R2
figure = unitCircle # scaleX 0.5 # rotateBy (1/6) # scale 50
「defaultRender」を使用してみましたが(上記でコメントアウト)、タイプエラーが発生します。明らかに「win」は正しいタイプではありません。
ダイアグラムのチュートリアルとユーザーマニュアルを読みましたが、実際にはCairoバックエンドの使用方法を説明していません。
更新:レンダリングする楕円があります。「renderFigure」関数は次のようになります。
renderFigure :: DrawingArea -> EventM EExpose Bool
renderFigure canvas = do
-- win <- eventWindow
liftIO $ do
-- diagramArea <- widgetGetDrawWindow canvas
-- renderToGtk diagramArea $ toGtkCoords figure
defaultRender canvas figure
return True
on
渡されるDrawingAreaは、「 canvasexposeEvent...」設定で参照される「canvas 」です。
しかし、「renderToGtk」を使用して固定サイズの図をレンダリングすることはできません。
更新2: Joachim Breitnerの回答のおかげで、このような最小限のGTKダイアグラムプログラムが作成され、カットアンドペーストを楽しむ準備が整いました。
module Main where
import Control.Monad.Trans (liftIO)
import Graphics.UI.Gtk
import Diagrams.Backend.Cairo
import Diagrams.Backend.Cairo.Gtk
import Diagrams.Prelude
main :: IO ()
main = do
initGUI
window <- windowNew
canvas <- drawingAreaNew
canvas `on` sizeRequest $ return (Requisition 256 256)
set window [ containerBorderWidth := 10,
containerChild := canvas ]
canvas `on` exposeEvent $ renderFigure
onDestroy window mainQuit
widgetShowAll window
mainGUI
renderFigure :: EventM EExpose Bool
renderFigure = do
win <- eventWindow
liftIO $ renderToGtk win $ toGtkCoords figure
return True
figure :: Diagram Cairo R2
figure = unitCircle # scaleX 0.5 # rotateBy (1/6) # scale 50 # fc red