Как использовать библиотеку диаграмм с рисунками GTK?

Я пытаюсь научиться рисовать диаграммы, используя библиотеку диаграмм и бэкенд 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 — это «холст», указанный в настройке «холст onexposeEvent...».

Но я все еще не могу заставить его отображать диаграмму фиксированного размера, используя «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  

8
задан duplode 17 October 2016 в 00:02
поделиться