2012-08-09 17 views
8

Sto cercando di imparare come disegnare diagrammi usando il diagrams library e il backend Cairo/GTK. Ho una finestra vuota da visualizzare, ma il mio disegno non verrà visualizzato. Che cosa sto facendo di sbagliato?Come utilizzare la libreria di diagrammi con i drawable 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 

Ho provato con "defaultRender" (come ha commentato in precedenza), ma che dà un errore di tipo: a quanto pare "vincere" non è il tipo giusto.

Ho letto il tutorial e il manuale utente per il diagramma, ma in realtà non ti dice come utilizzare il backend Cairo.

Aggiornamento: Ho l'ellisse da renderizzare. La funzione "renderFigure" ora dice:

renderFigure :: DrawingArea -> EventM EExpose Bool 
renderFigure canvas = do 
    -- win <- eventWindow 
    liftIO $ do 
     -- diagramArea <- widgetGetDrawWindow canvas 
     -- renderToGtk diagramArea $ toGtkCoords figure 
     defaultRender canvas figure 
    return True 

e il DrawingArea passato è la "tela" si fa riferimento nella "tela on exposeEvent ..." impostazione.

Ma non riesco ancora a ottenere il rendering di un diagramma di dimensioni fisse utilizzando "renderToGtk".

Aggiornamento 2: Grazie alla risposta di Joachim Breitner, ora ho il programma diagramma-su-GTK minimale simile a questo, pronto per il tuo piacere di taglia e incolla.

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 
+0

Quale errore si ottiene? Il codice originale viene compilato e viene eseguito qui (anche se non disegna nulla). –

+0

Nessun errore; semplicemente non ha disegnato nulla. Joachim ha risposto però. –

+0

Ah, vedo che ho letto male la domanda e ho pensato che la frase "errore di tipo" riguardava il codice non commentato. Scuse. –

risposta

6

Il codice iniziale funziona effettivamente. Ma renderToGtk non ridimensiona l'immagine, quindi appare piuttosto piccola, troppo piccola per essere visibile a quella larghezza della linea. Ma prova

figure :: Diagram Cairo R2 
figure = unitCircle # scaleX 0.5 # rotateBy (1/6) # scale 50 # fc red 

e funzionerà come un fascino!

2

Si può notare che nelle ultime versioni di diagrammi, si dovrebbe usare

import Diagrams.Backend.Gtk 

invece di

import Diagrams.Backend.Cairo.Gtk 

e

figure :: Diagram Cairo 

invece di

figure :: Diagram Cairo R2 

Il risultato ora assomiglia:

module Main where 

import Control.Monad.Trans (liftIO) 
import Graphics.UI.Gtk 
import Diagrams.Backend.Cairo 
import Diagrams.Backend.Gtk 
import Diagrams.Prelude 

main :: IO() 
main = do 
    initGUI 
    window <- windowNew 
    canvas <- drawingAreaNew 
    canvas `on` sizeRequest $ return (Requisition 256 256) 
    Graphics.UI.Gtk.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 
figure = unitCircle # scaleX 0.5 # rotateBy (1/6) # scale 50 # fc red 
Problemi correlati