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
Quale errore si ottiene? Il codice originale viene compilato e viene eseguito qui (anche se non disegna nulla). –
Nessun errore; semplicemente non ha disegnato nulla. Joachim ha risposto però. –
Ah, vedo che ho letto male la domanda e ho pensato che la frase "errore di tipo" riguardava il codice non commentato. Scuse. –