diagrams-hsqml 0.0.0.2 → 0.1.0.0
raw patch · 5 files changed
+59/−48 lines, 5 filesdep ~basedep ~diagrams-coredep ~diagrams-lib
Dependency ranges changed: base, diagrams-core, diagrams-lib
Files
- diagrams-hsqml.cabal +13/−5
- src/Diagrams/Backend/HsQML.hs +3/−4
- src/Diagrams/Backend/HsQML/DiagramObj/Commands.hs +14/−14
- src/Diagrams/Backend/HsQML/DiagramObj/Type.hs +0/−2
- src/Diagrams/Backend/HsQML/Render.hs +29/−23
diagrams-hsqml.cabal view
@@ -2,7 +2,7 @@ -- documentation, see http://haskell.org/cabal/users-guide/ name: diagrams-hsqml-version: 0.0.0.2+version: 0.1.0.0 synopsis: HsQML (Qt5) backend for Diagrams description: `diagrams-hsqml` is a `diagrams` backend painting on a QtQuick Canvas.@@ -36,16 +36,24 @@ Diagrams.Backend.HsQML.Tutorial -- other-modules: -- other-extensions: - build-depends: base >=4.7 && <4.8+ build-depends: base >=4.8 && < 4.9 , colour , containers- , diagrams-core- , diagrams-lib+ , diagrams-core >= 1.3+ , diagrams-lib >= 1.3 , hsqml , lens , text , transformers hs-source-dirs: src default-language: Haskell2010- ghc-options: -Wall+ ghc-options: -Wall + if flag(devel) + ghc-options: -Werror++Flag devel+ Description: Development settings+ Manual: True+ Default: False+
src/Diagrams/Backend/HsQML.hs view
@@ -11,23 +11,22 @@ module Diagrams.Backend.HsQML ( renderHsQML- , SizeSpec2D(..)+ , SizeSpec , mkSizeSpec , HsQML(..), Options(..) , B , DiagramObj ) where -import Diagrams.Core.Types(Backend(..)) import Diagrams.Backend.HsQML.Render hiding (renderHsQML) import Diagrams.Backend.HsQML.DiagramObj.Type import Diagrams.Core-import Diagrams.TwoD.Size import Diagrams.TwoD.Types+import Diagrams.Size import Graphics.QML type B = HsQML -renderHsQML :: SizeSpec2D -> Diagram HsQML R2 -> IO (ObjRef (DiagramObj ()))+renderHsQML :: SizeSpec V2 Double -> Diagram HsQML -> IO (ObjRef (DiagramObj ())) -- ^Render a diagram to a QML object that controls a Canvas. renderHsQML s = renderDia HsQML (HsQMLOptions s)
src/Diagrams/Backend/HsQML/DiagramObj/Commands.hs view
@@ -6,7 +6,7 @@ Maintainer : marcin.jan.mrotek@gmail.com Stability : experimental -As 'DiagramObj' is a 'Monoid', complex diagrams may be optained by 'mappend'ing simple ones together.+As 'DiagramObj' is a 'Monoid', complex diagrams may be obtained by 'mappend'ing simple ones together. This module provides functions creating 'DiagramObj's containing a single command each. -} @@ -22,7 +22,7 @@ import Control.Monad.IO.Class import Data.Colour import Data.Colour.SRGB-import Diagrams.Prelude+import Diagrams.Prelude hiding (over) import Diagrams.TwoD.Attributes import Diagrams.TwoD.Text import Graphics.QML@@ -47,7 +47,7 @@ -- ^Connect the current path vertex to the start of the path. closePath = DiagramObj $ fireSignal S.closePath -moveTo :: P2 -> DiagramObj ()+moveTo :: P2 Double -> DiagramObj () -- ^Change the current position. moveTo p = let (x,y) = unp2 p in DiagramObj $ \this -> fireSignal S.moveTo this x y @@ -59,15 +59,15 @@ -- ^Fill the current path. Works only on paths that were previously 'close'd. fill = DiagramObj $ fireSignal S.fill -lineTo :: P2 -> DiagramObj ()+lineTo :: P2 Double -> DiagramObj () -- ^Draw a straight line from the current position to a given point. lineTo p = DiagramObj $ \this -> fireSignal S.lineTo this x y where (x,y) = unp2 p bezierCurveTo - :: P2 -- ^First control point.- -> P2 -- ^Second control point- -> P2 -- ^End point.+ :: P2 Double -- ^First control point.+ -> P2 Double -- ^Second control point+ -> P2 Double -- ^End point. -> DiagramObj () -- ^Draw a bezier curve from the current position to a given point, using two control points. bezierCurveTo cp1 cp2 p = DiagramObj $ \this -> @@ -100,9 +100,9 @@ -- ^Set the global alpha (subject to 'save' and 'restore'). setOpacity o = DiagramObj $ \this -> fireSignal S.setGlobalAlpha this (getOpacity o) -setLineWidth :: LineWidth -> DiagramObj ()+setLineWidth :: LineWidth Double -> DiagramObj () -- ^Set the line width (output coordinates assumed).-setLineWidth w = DiagramObj $ \this -> fireSignal S.setLineWidth this (fromOutput $ getLineWidth w)+setLineWidth w = DiagramObj $ \this -> fireSignal S.setLineWidth this (getLineWidth w) getRGBA :: SomeColor -> (Double, Double, Double, Double) -- ^Convert a colour to a tuple of (r,g,b,a) components.@@ -111,7 +111,7 @@ a = alphaChannel ac ac = someToAlpha c -getLinearGradient :: LGradient -> DiagramObj (ObjRef GradientObj)+getLinearGradient :: LGradient Double -> DiagramObj (ObjRef GradientObj) -- ^Create a linear gradient. getLinearGradient lg = DiagramObj $ \this -> do g <- newGradient@@ -120,7 +120,7 @@ where (x0,y0) = unp2.papply (lg^.lGradTrans) $ lg^.lGradStart (x1,y1) = unp2.papply (lg^.lGradTrans) $ lg^.lGradEnd -getRadialGradient :: RGradient -> DiagramObj (ObjRef GradientObj)+getRadialGradient :: RGradient Double -> DiagramObj (ObjRef GradientObj) -- ^Create a radial gradient. getRadialGradient rg = DiagramObj $ \this -> do g <- newGradient@@ -140,7 +140,7 @@ -- ^Set stroke style to a previously assembled gradient. setLineGradient = DiagramObj $ fireSignal S.setLineGradient -setLineTexture :: LineTexture -> DiagramObj ()+setLineTexture :: LineTexture Double -> DiagramObj () -- ^Set stroke style. setLineTexture tex = case getLineTexture tex of@@ -148,7 +148,7 @@ LG l -> getLinearGradient l >>= liftIO.(setGradient $ l^.lGradStops) >> setLineGradient RG r -> getRadialGradient r >>= liftIO.(setGradient $ r^.rGradStops) >> setLineGradient -setGradient :: [GradientStop] -> ObjRef GradientObj -> IO ()+setGradient :: [GradientStop Double] -> ObjRef GradientObj -> IO () -- ^Add colour stops to a gradient. setGradient stops grad = forM_ stops $ \stop -> let (r,g,b,a) = getRGBA (stop^.stopColor)@@ -164,7 +164,7 @@ -- ^Set fill style to a previously defined gradient. setFillGradient = DiagramObj $ fireSignal S.setFillGradient -setFillTexture :: FillTexture -> DiagramObj ()+setFillTexture :: FillTexture Double -> DiagramObj () -- ^Set fill style. setFillTexture tex = case getFillTexture tex of
src/Diagrams/Backend/HsQML/DiagramObj/Type.hs view
@@ -22,9 +22,7 @@ import Diagrams.Backend.HsQML.DiagramObj.Signals -import Control.Applicative import Control.Monad.IO.Class-import Data.Monoid import Data.Typeable import Graphics.QML
src/Diagrams/Backend/HsQML/Render.hs view
@@ -1,3 +1,4 @@+{-# OPTIONS_GHC -fno-warn-unused-imports #-} {-# OPTIONS_HADDOCK show-extensions #-} {-# LANGUAGE DeriveDataTypeable@@ -23,11 +24,11 @@ import Diagrams.Backend.HsQML.DiagramObj import Data.Foldable (foldl', foldMap)-import Control.Lens hiding ((#), from)+import Control.Lens hiding ((#), from, transform, under) import Data.Monoid import Data.Tree import Data.Typeable-import Diagrams.Prelude hiding ((<>), start, moveTo, stroke, text)+import Diagrams.Prelude hiding ((<>), start, moveTo, stroke, text, from) import Diagrams.Core.Types import Diagrams.TwoD.Adjust import Diagrams.TwoD.Attributes(LineTexture, FillTexture) -- imported for haddock hyperlinks@@ -37,25 +38,30 @@ data HsQML = HsQML deriving Typeable -instance Backend HsQML R2 where- data Render HsQML R2 = HsQMLRender {getObj :: DiagramObj ()}- type Result HsQML R2 = IO (ObjRef (DiagramObj ()))- data Options HsQML R2 = HsQMLOptions { _sizeSpec :: SizeSpec2D }+type instance V HsQML = V2+type instance N HsQML = Double++instance Backend HsQML V2 Double where+ data Render HsQML V2 Double = HsQMLRender {getObj :: DiagramObj ()}+ type Result HsQML V2 Double = IO (ObjRef (DiagramObj ()))+ data Options HsQML V2 Double = HsQMLOptions { _sizeSpec :: SizeSpec V2 Double } renderRTree HsQML opts tree = newObjectDC . getObj $ renderHsQML opts tree- adjustDia HsQML opts dia = adjustDia2D sizeSpec HsQML opts (dia # reflectY)+ adjustDia HsQML opts dia = (opts', reflectionY <> trans, dia' # scale 0.87 `underT` inv trans)+ where+ (opts', trans, dia') = adjustDia2D sizeSpec HsQML opts $ reflectY dia sizeSpec - :: Functor f => (SizeSpec2D -> f SizeSpec2D) -> Options HsQML R2 -> f (Options HsQML R2) --- ^A lens from HsQML backend options to a 'SizeSpec2D'.+ :: Functor f => (SizeSpec V2 Double -> f (SizeSpec V2 Double)) -> Options HsQML V2 Double -> f (Options HsQML V2 Double) +-- ^A lens from HsQML backend options to a 'SizeSpec V2 Double'. -- --- @ sizeSpec :: 'Lens'' ('Options' 'HsQML' 'R2') 'SizeSpec2D' @+-- @ sizeSpec :: 'Lens'' ('Options' 'HsQML' 'V2') ('SizeSpec' 'V2' 'Double') @ sizeSpec = lens (\(HsQMLOptions s) -> s) (\_ s -> HsQMLOptions s) -addAnnotation :: String -> DiagramObj ()+addAnnotation :: Annotation -> DiagramObj () -- ^Currently not supported, returns 'mempty'. addAnnotation _ = mempty -useStyle :: Style R2 -> DiagramObj ()+useStyle :: Style V2 Double -> DiagramObj () {-^ Apply style to a Context2D. Currently supports the following 'Attribute's: @@ -82,22 +88,22 @@ ] where handle f = fmap f.getAttr -renderHsQML :: Options HsQML R2 -> RTree HsQML R2 Annotation -> Render HsQML R2+renderHsQML :: Options HsQML V2 Double -> RTree HsQML V2 Double Annotation -> Render HsQML V2 Double -- ^Render a 'RTree' to an intermediate representation. renderHsQML opts (Node root ns) = case root of RStyle s -> HsQMLRender $ save <> useStyle s <> proceed <> restore- RAnnot (Href s) -> HsQMLRender $ addAnnotation s <> proceed+ RAnnot a -> HsQMLRender $ addAnnotation a <> proceed RPrim p -> render HsQML p REmpty -> HsQMLRender $ proceed where proceed = mconcat $ map (getObj . renderHsQML opts) ns -instance Renderable Text HsQML where- render HsQML (Text _ t2 _ str) = HsQMLRender $ text str x y +instance Renderable (Text Double) HsQML where+ render HsQML (Text t2 _ str) = HsQMLRender $ text str x y where (x,y) = unp2 . papply t2 $ origin -renderTrail :: P2 -> Trail R2 -> DiagramObj ()+renderTrail :: P2 Double -> Trail V2 Double -> DiagramObj () -- ^Render a trail, closing loops. renderTrail start trail = mconcat [ beginPath@@ -114,23 +120,23 @@ , next) where next = p .+^ segOffset seg -renderSeg :: P2 -> Segment Closed R2 -> DiagramObj ()+renderSeg :: P2 Double -> Segment Closed V2 Double -> DiagramObj () -- ^Render a closed segment beginning on a given point. renderSeg from (Linear (OffsetClosed v)) = lineTo (from .+^ v) renderSeg from (Cubic c1 c2 (OffsetClosed v)) = bezierCurveTo (from .+^ c1) (from .+^ c2) (from .+^ v) closeSeg - :: Segment Open R2 -- ^The last segment of a loop.- -> P2 -- ^First end.- -> P2 -- ^Second end.+ :: Segment Open V2 Double -- ^The last segment of a loop.+ -> P2 Double -- ^First end.+ -> P2 Double -- ^Second end. -> DiagramObj () -- ^Close a loop using the last (open) segment and two endpoints. closeSeg (Linear _) _ start = lineTo start closeSeg (Cubic c1 c2 _) prev start = bezierCurveTo (prev .+^ c1) (prev .+^ c2) start -instance Renderable (Trail R2) HsQML where+instance Renderable (Trail V2 Double) HsQML where render HsQML trail = HsQMLRender $ renderTrail origin trail -instance Renderable (Path R2) HsQML where+instance Renderable (Path V2 Double) HsQML where render HsQML path = HsQMLRender . foldMap (uncurry renderTrail . viewLoc) $ pathTrails path