diagrams-lib-0.4: src/Diagrams/TwoD/Text.hs
{-# LANGUAGE DeriveDataTypeable
, GeneralizedNewtypeDeriving
, FlexibleContexts
, TypeFamilies
#-}
-----------------------------------------------------------------------------
-- |
-- Module : Diagrams.TwoD.Text
-- Copyright : (c) 2011 diagrams-lib team (see LICENSE)
-- License : BSD-style (see LICENSE)
-- Maintainer : diagrams-discuss@googlegroups.com
--
-- Very basic text primitives along with associated attributes.
--
-----------------------------------------------------------------------------
module Diagrams.TwoD.Text (
-- * Creating text diagrams
Text(..)
, text
-- * Text attributes
-- ** Font family
, Font(..), getFont, font
-- ** Font size
, FontSize(..), getFontSize, fontSize
-- ** Font slant
, FontSlant(..), FontSlantA, getFontSlant, fontSlant, italic, oblique
-- ** Font weight
, FontWeight(..), FontWeightA, getFontWeight, fontWeight, bold
) where
import Graphics.Rendering.Diagrams
import Diagrams.TwoD.Types
import Diagrams.Util
import Data.AffineSpace ((.-.))
import Data.Monoid (mempty)
import Data.Semigroup (Semigroup, Last(..))
import Data.Typeable
------------------------------------------------------------
-- Text diagrams
------------------------------------------------------------
-- | A text primitive consists of the string contents along with a
-- transformation mapping from the local vector space of the text to
-- the vector space in which it is embedded.
data Text = Text T2 String
type instance V Text = R2
instance Transformable Text where
transform t (Text tt s) = Text (t <> tt) s
instance HasOrigin Text where
moveOriginTo p = translate (origin .-. p)
-- | Create a primitive text diagram from the given string, which
-- /takes up no space/. By default, the text is centered with
-- respect to its local origin (see 'alignText').
text :: Renderable Text b => String -> Diagram b R2
text t = mkAD (Prim (Text mempty t))
mempty
mempty
mempty
------------------------------------------------------------
-- Text attributes
------------------------------------------------------------
{-
--------------------------------------------------
-- Alignment
-- | The @TextAlignment@ attribute specifies what alignment should be
-- applied to text. Inner @TextAlignment@ attributes override outer
-- ones.
newtype TextAlignment = TextAlignment (Last (Alignment R2))
deriving (Typeable, Semigroup)
instance AttributeClass TextAlignment
-- | Extract an alignment from a @TextAlignment@ attribute.
getTextAlignment :: TextAlignment -> Alignment R2
getTextAlignment (TextAlignment (Last a)) = a
-- | The default alignment for text is centered.
centeredText :: TextAlignment
centeredText = TextAlignment (Last (asAlignment id))
-- | @alignText f@ aligns text by applying the alignment function @f@
-- (any transformation of boundable things with origins may be used;
-- for example, 'alignTL' and friends).
alignText :: HasStyle a => (Alignment R2 -> Alignment R2) -> a -> a
alignText = applyAttr . TextAlignment . Last . asAlignment
-}
--------------------------------------------------
-- Font family
-- | The @Font@ attribute specifies the name of a font family. Inner
-- @Font@ attributes override outer ones.
newtype Font = Font (Last String)
deriving (Typeable, Semigroup)
instance AttributeClass Font
-- | Extract the font family name from a @Font@ attribute.
getFont :: Font -> String
getFont (Font (Last f)) = f
-- | Specify a font family to be used for all text within a diagram.
font :: HasStyle a => String -> a -> a
font = applyAttr . Font . Last
--------------------------------------------------
-- Font size
-- | The @FontSize@ attribute specifies the size of a font's
-- em-square, measured with respect to the current local vector space.
-- Inner @FontSize@ attributes override outer ones.
newtype FontSize = FontSize (Last Double)
deriving (Typeable, Semigroup)
instance AttributeClass FontSize
-- | Extract the size from a @FontSize@ attribute.
getFontSize :: FontSize -> Double
getFontSize (FontSize (Last s)) = s
-- | Set the font size, that is, the size of the font's em-square as
-- measured within the current local vector space. The default size
-- is @1@.
fontSize :: HasStyle a => Double -> a -> a
fontSize = applyAttr . FontSize . Last
--------------------------------------------------
-- Font slant
data FontSlant = FontSlantNormal
| FontSlantItalic
| FontSlantOblique
-- | The @FontSlantA@ attribute specifies the slant (normal, italic,
-- or oblique) that should be used for all text within a diagram.
-- Inner @FontSlantA@ attributes override outer ones.
newtype FontSlantA = FontSlantA (Last (FontSlant))
deriving (Typeable, Semigroup)
instance AttributeClass FontSlantA
-- | Extract the font slant from a 'FontSlantA' attribute.
getFontSlant :: FontSlantA -> FontSlant
getFontSlant (FontSlantA (Last s)) = s
-- | Specify the slant (normal, italic, or oblique) that should be
-- used for all text within a diagram. See also 'italic' and
-- 'oblique' for useful special cases.
fontSlant :: HasStyle a => FontSlant -> a -> a
fontSlant = applyAttr . FontSlantA . Last
-- | Set all text in italics.
italic :: HasStyle a => a -> a
italic = fontSlant FontSlantItalic
-- | Set all text using an oblique slant.
oblique :: HasStyle a => a -> a
oblique = fontSlant FontSlantOblique
--------------------------------------------------
-- Font weight
data FontWeight = FontWeightNormal
| FontWeightBold
-- | The @FontWeightA@ attribute specifies the weight (normal or bold)
-- that should be used for all text within a diagram. Inner
-- @FontWeightA@ attributes override outer ones.
newtype FontWeightA = FontWeightA (Last FontWeight)
deriving (Typeable, Semigroup)
instance AttributeClass FontWeightA
-- | Extract the font weight from a 'FontWeightA' attribute.
getFontWeight :: FontWeightA -> FontWeight
getFontWeight (FontWeightA (Last w)) = w
-- | Specify the weight (normal or bold) that should be
-- used for all text within a diagram. See also 'bold'
-- for a useful special case.
fontWeight :: HasStyle a => FontWeight -> a -> a
fontWeight = applyAttr . FontWeightA . Last
-- | Set all text using a bold font weight.
bold :: HasStyle a => a -> a
bold = fontWeight FontWeightBold