2
-----------------------------------------------------------------------------
4
-- Module : Diagrams.Backend.Gtk
5
-- Copyright : (c) 2011 Diagrams-cairo team (see LICENSE)
6
-- License : BSD-style (see LICENSE)
7
-- Maintainer : diagrams-discuss@googlegroups.com
9
-- Convenient interface to rendering diagrams directly
10
-- on Gtk widgets using the Cairo backend.
12
-----------------------------------------------------------------------------
14
module Diagrams.Backend.Gtk
20
import Diagrams.Prelude hiding (width, height)
21
import Diagrams.Backend.Cairo as Cairo
23
-- Below hack is needed because GHC 7.0.x has a bug regarding export
24
-- of data family constructors; see comments in Diagrams.Backend.Cairo
25
#if __GLASGOW_HASKELL__ < 702 || __GLASGOW_HASKELL__ >= 704
26
import Diagrams.Backend.Cairo.Internal
29
import Graphics.UI.Gtk
30
import qualified Graphics.UI.Gtk.Cairo as CG
32
-- | Convert a Diagram to the backend coordinates.
34
-- Provided to Query the diagram with coordinates from a mouse click
37
-- > widget `on` buttonPressEvent $ tryEvent $ do
38
-- > click <- eventClick
39
-- > (x,y) <- eventCoordinates
40
-- > let result = runQuery (query $ toGtkCoords myDiagram) (P (x,y))
41
-- > do_something_with result
43
-- `toGtkCoords` does no rescaling of the diagram, however it is centered in
45
toGtkCoords :: Monoid' m => QDiagram Cairo R2 m -> QDiagram Cairo R2 m
48
(CairoOptions "" Absolute RenderOnly False)
51
-- | Render a diagram to a DrawingArea, rescaling to fit the full area.
52
defaultRender :: Monoid' m => DrawingArea -> QDiagram Cairo R2 m -> IO ()
53
defaultRender da d = do
54
(w,h) <- widgetGetSize da
55
dw <- widgetGetDrawWindow da
56
let r = snd $ renderDia Cairo
59
, cairoSizeSpec = Dims (fromIntegral w) (fromIntegral h)
60
, cairoOutputType = RenderOnly
61
, cairoBypassAdjust = False
65
CG.renderWithDrawable dw r
67
-- | Render a diagram to a 'DrawableClass'. No rescaling or
68
-- transformations will be performed.
70
-- Typically the diagram will already have been transformed by
73
(DrawableClass dc, Monoid' m)
74
=> dc -- ^ widget to render onto
75
-> QDiagram Cairo R2 m -- ^ Diagram
78
let r = snd $ renderDia Cairo
81
, cairoSizeSpec = Absolute
82
, cairoOutputType = RenderOnly
83
, cairoBypassAdjust = True
87
CG.renderWithDrawable dc r