{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE TypeFamilies #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

module Control.Moffy.Samples.Event.CalcTextExtents (
	CalcTextExtents(..), pattern OccCalcTextExtents,
	TextExtents(..), Rectangle(..), FontName, FontSize, calcTextExtents
	) where

import Control.Moffy
import Data.Type.Set
import Data.Bool

import qualified Data.Text as T

-- CALC TEXT EXTENTS

type FontName = String
type FontSize = Double

data CalcTextExtents = CalcTextExtentsReq FontName FontSize T.Text
	deriving (Int -> CalcTextExtents -> ShowS
[CalcTextExtents] -> ShowS
CalcTextExtents -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CalcTextExtents] -> ShowS
$cshowList :: [CalcTextExtents] -> ShowS
show :: CalcTextExtents -> String
$cshow :: CalcTextExtents -> String
showsPrec :: Int -> CalcTextExtents -> ShowS
$cshowsPrec :: Int -> CalcTextExtents -> ShowS
Show, CalcTextExtents -> CalcTextExtents -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CalcTextExtents -> CalcTextExtents -> Bool
$c/= :: CalcTextExtents -> CalcTextExtents -> Bool
== :: CalcTextExtents -> CalcTextExtents -> Bool
$c== :: CalcTextExtents -> CalcTextExtents -> Bool
Eq, Eq CalcTextExtents
CalcTextExtents -> CalcTextExtents -> Bool
CalcTextExtents -> CalcTextExtents -> Ordering
CalcTextExtents -> CalcTextExtents -> CalcTextExtents
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: CalcTextExtents -> CalcTextExtents -> CalcTextExtents
$cmin :: CalcTextExtents -> CalcTextExtents -> CalcTextExtents
max :: CalcTextExtents -> CalcTextExtents -> CalcTextExtents
$cmax :: CalcTextExtents -> CalcTextExtents -> CalcTextExtents
>= :: CalcTextExtents -> CalcTextExtents -> Bool
$c>= :: CalcTextExtents -> CalcTextExtents -> Bool
> :: CalcTextExtents -> CalcTextExtents -> Bool
$c> :: CalcTextExtents -> CalcTextExtents -> Bool
<= :: CalcTextExtents -> CalcTextExtents -> Bool
$c<= :: CalcTextExtents -> CalcTextExtents -> Bool
< :: CalcTextExtents -> CalcTextExtents -> Bool
$c< :: CalcTextExtents -> CalcTextExtents -> Bool
compare :: CalcTextExtents -> CalcTextExtents -> Ordering
$ccompare :: CalcTextExtents -> CalcTextExtents -> Ordering
Ord)
numbered [t| CalcTextExtents |]
instance Request CalcTextExtents where
	data Occurred CalcTextExtents =
		OccCalcTextExtents FontName FontSize T.Text TextExtents
		deriving Int -> Occurred CalcTextExtents -> ShowS
[Occurred CalcTextExtents] -> ShowS
Occurred CalcTextExtents -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Occurred CalcTextExtents] -> ShowS
$cshowList :: [Occurred CalcTextExtents] -> ShowS
show :: Occurred CalcTextExtents -> String
$cshow :: Occurred CalcTextExtents -> String
showsPrec :: Int -> Occurred CalcTextExtents -> ShowS
$cshowsPrec :: Int -> Occurred CalcTextExtents -> ShowS
Show

data TextExtents = TextExtents {
	TextExtents -> Rectangle
textExtentsInkRect :: Rectangle,
	TextExtents -> Rectangle
textExtentsLogicalRect :: Rectangle } deriving Int -> TextExtents -> ShowS
[TextExtents] -> ShowS
TextExtents -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [TextExtents] -> ShowS
$cshowList :: [TextExtents] -> ShowS
show :: TextExtents -> String
$cshow :: TextExtents -> String
showsPrec :: Int -> TextExtents -> ShowS
$cshowsPrec :: Int -> TextExtents -> ShowS
Show

data Rectangle = Rectangle {
	Rectangle -> FontSize
rectangleLeft :: Double,
	Rectangle -> FontSize
rectangleTop :: Double,
	Rectangle -> FontSize
rectangleWidth :: Double,
	Rectangle -> FontSize
rectangleHeight :: Double } deriving Int -> Rectangle -> ShowS
[Rectangle] -> ShowS
Rectangle -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Rectangle] -> ShowS
$cshowList :: [Rectangle] -> ShowS
show :: Rectangle -> String
$cshow :: Rectangle -> String
showsPrec :: Int -> Rectangle -> ShowS
$cshowsPrec :: Int -> Rectangle -> ShowS
Show

calcTextExtents :: FontName -> FontSize -> T.Text ->
	React s (Singleton CalcTextExtents) TextExtents
calcTextExtents :: forall s.
String
-> FontSize
-> Text
-> React s (Singleton CalcTextExtents) TextExtents
calcTextExtents String
fn FontSize
fs Text
t = forall b a. b -> (a -> b) -> Maybe a -> b
maybe (forall s.
String
-> FontSize
-> Text
-> React s (Singleton CalcTextExtents) TextExtents
calcTextExtents String
fn FontSize
fs Text
t) forall (f :: * -> *) a. Applicative f => a -> f a
pure
	forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< forall e r s. e -> (Occurred e -> r) -> React s (Singleton e) r
await (String -> FontSize -> Text -> CalcTextExtents
CalcTextExtentsReq String
fn FontSize
fs Text
t)
		\(OccCalcTextExtents String
fn' FontSize
fs' Text
t' TextExtents
glp) ->
			forall a. a -> a -> Bool -> a
bool forall a. Maybe a
Nothing (forall a. a -> Maybe a
Just TextExtents
glp) forall a b. (a -> b) -> a -> b
$ (String
fn, FontSize
fs, Text
t) forall a. Eq a => a -> a -> Bool
== (String
fn', FontSize
fs', Text
t')