Я пытаюсь научиться рисовать диаграммы, используя библиотеку диаграмм и бэкенд 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
а переданная DrawingArea — это «холст», указанный в настройке «холст on
exposeEvent...».
Но я все еще не могу заставить его отображать диаграмму фиксированного размера, используя «renderToGtk».
Обновление 2:Благодаря ответу Иоахима Брайтнера у меня теперь есть минимальная диаграмма -в программе -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