{-# LANGUAGE Strict #-}
module Monomer.Core.SizeReq (
SizeReqUpdater(..),
clearExtra,
clearExtraW,
clearExtraH,
fixedToMinW,
fixedToMinH,
fixedToMaxW,
fixedToMaxH,
fixedToExpandW,
fixedToExpandH,
sizeReqBounded,
sizeReqValid,
sizeReqAddStyle,
sizeReqMin,
sizeReqMax,
sizeReqMaxBounded,
sizeReqFixed,
sizeReqFlex,
sizeReqExtra,
sizeReqFactor,
sizeReqMergeSum,
sizeReqMergeMax
) where
import Control.Lens ((&), (^.), (.~))
import Data.Bits
import Data.Default
import Data.Maybe
import Monomer.Common
import Monomer.Core.StyleTypes
import Monomer.Core.StyleUtil
import Monomer.Core.Util
import Monomer.Helper
import qualified Monomer.Core.Lens as L
type SizeReqUpdater = (SizeReq, SizeReq) -> (SizeReq, SizeReq)
clearExtra :: SizeReqUpdater
(SizeReq
reqW, SizeReq
reqH) = (SizeReq
reqW forall a b. a -> (a -> b) -> b
& forall s a. HasExtra s a => Lens' s a
L.extra forall s t a b. ASetter s t a b -> b -> s -> t
.~ Double
0, SizeReq
reqH forall a b. a -> (a -> b) -> b
& forall s a. HasExtra s a => Lens' s a
L.extra forall s t a b. ASetter s t a b -> b -> s -> t
.~ Double
0)
clearExtraW :: SizeReqUpdater
(SizeReq
reqW, SizeReq
reqH) = (SizeReq
reqW forall a b. a -> (a -> b) -> b
& forall s a. HasExtra s a => Lens' s a
L.extra forall s t a b. ASetter s t a b -> b -> s -> t
.~ Double
0, SizeReq
reqH)
clearExtraH :: SizeReqUpdater
(SizeReq
reqW, SizeReq
reqH) = (SizeReq
reqW, SizeReq
reqH forall a b. a -> (a -> b) -> b
& forall s a. HasExtra s a => Lens' s a
L.extra forall s t a b. ASetter s t a b -> b -> s -> t
.~ Double
0)
fixedToMin
:: Double
-> SizeReqUpdater
fixedToMin :: Double -> SizeReqUpdater
fixedToMin Double
fs (SizeReq
reqW, SizeReq
reqH) = (SizeReq
newReqW, SizeReq
newReqH) where
(Double
fixedW, Double
fixedH) = (SizeReq
reqW forall s a. s -> Getting a s a -> a
^. forall s a. HasFixed s a => Lens' s a
L.fixed, SizeReq
reqH forall s a. s -> Getting a s a -> a
^. forall s a. HasFixed s a => Lens' s a
L.fixed)
newReqW :: SizeReq
newReqW = Double -> Double -> Double -> Double -> SizeReq
SizeReq Double
fixedW Double
0 Double
fixedW Double
fs
newReqH :: SizeReq
newReqH = Double -> Double -> Double -> Double -> SizeReq
SizeReq Double
fixedH Double
0 Double
fixedH Double
fs
fixedToMinW
:: Double
-> SizeReqUpdater
fixedToMinW :: Double -> SizeReqUpdater
fixedToMinW Double
fw (SizeReq Double
fixed Double
_ Double
_ Double
_, SizeReq
reqH) = (SizeReq
newReqW, SizeReq
reqH) where
newReqW :: SizeReq
newReqW = Double -> Double -> Double -> Double -> SizeReq
SizeReq Double
fixed Double
0 Double
fixed Double
fw
fixedToMinH
:: Double
-> SizeReqUpdater
fixedToMinH :: Double -> SizeReqUpdater
fixedToMinH Double
fh (SizeReq
reqW, SizeReq Double
fixed Double
_ Double
_ Double
_) = (SizeReq
reqW, SizeReq
newReqH) where
newReqH :: SizeReq
newReqH = Double -> Double -> Double -> Double -> SizeReq
SizeReq Double
fixed Double
0 Double
fixed Double
fh
fixedToMax
:: Double
-> SizeReqUpdater
fixedToMax :: Double -> SizeReqUpdater
fixedToMax Double
fs (SizeReq
reqW, SizeReq
reqH) = (SizeReq
newReqW, SizeReq
newReqH) where
(Double
fixedW, Double
fixedH) = (SizeReq
reqW forall s a. s -> Getting a s a -> a
^. forall s a. HasFixed s a => Lens' s a
L.fixed, SizeReq
reqH forall s a. s -> Getting a s a -> a
^. forall s a. HasFixed s a => Lens' s a
L.fixed)
newReqW :: SizeReq
newReqW = Double -> Double -> Double -> Double -> SizeReq
SizeReq Double
0 Double
fixedW Double
0 Double
fs
newReqH :: SizeReq
newReqH = Double -> Double -> Double -> Double -> SizeReq
SizeReq Double
0 Double
fixedH Double
0 Double
fs
fixedToMaxW
:: Double
-> SizeReqUpdater
fixedToMaxW :: Double -> SizeReqUpdater
fixedToMaxW Double
fw (SizeReq Double
fixed Double
_ Double
_ Double
_, SizeReq
reqH) = (SizeReq
newReqW, SizeReq
reqH) where
newReqW :: SizeReq
newReqW = Double -> Double -> Double -> Double -> SizeReq
SizeReq Double
0 Double
fixed Double
0 Double
fw
fixedToMaxH
:: Double
-> SizeReqUpdater
fixedToMaxH :: Double -> SizeReqUpdater
fixedToMaxH Double
fh (SizeReq
reqW, SizeReq Double
fixed Double
_ Double
_ Double
_) = (SizeReq
reqW, SizeReq
newReqH) where
newReqH :: SizeReq
newReqH = Double -> Double -> Double -> Double -> SizeReq
SizeReq Double
0 Double
fixed Double
0 Double
fh
fixedToExpand
:: Double
-> SizeReqUpdater
fixedToExpand :: Double -> SizeReqUpdater
fixedToExpand Double
fs (SizeReq
reqW, SizeReq
reqH) = (SizeReq
newReqW, SizeReq
newReqH) where
(Double
fixedW, Double
fixedH) = (SizeReq
reqW forall s a. s -> Getting a s a -> a
^. forall s a. HasFixed s a => Lens' s a
L.fixed, SizeReq
reqH forall s a. s -> Getting a s a -> a
^. forall s a. HasFixed s a => Lens' s a
L.fixed)
newReqW :: SizeReq
newReqW = Double -> Double -> Double -> Double -> SizeReq
SizeReq Double
0 Double
fixedW Double
fixedW Double
fs
newReqH :: SizeReq
newReqH = Double -> Double -> Double -> Double -> SizeReq
SizeReq Double
0 Double
fixedH Double
fixedH Double
fs
fixedToExpandW
:: Double
-> SizeReqUpdater
fixedToExpandW :: Double -> SizeReqUpdater
fixedToExpandW Double
fw (SizeReq Double
fixed Double
_ Double
_ Double
_, SizeReq
reqH) = (SizeReq
newReqW, SizeReq
reqH) where
newReqW :: SizeReq
newReqW = Double -> Double -> Double -> Double -> SizeReq
SizeReq Double
0 Double
fixed Double
fixed Double
fw
fixedToExpandH
:: Double
-> SizeReqUpdater
fixedToExpandH :: Double -> SizeReqUpdater
fixedToExpandH Double
fh (SizeReq
reqW, SizeReq Double
fixed Double
_ Double
_ Double
_) = (SizeReq
reqW, SizeReq
newReqH) where
newReqH :: SizeReq
newReqH = Double -> Double -> Double -> Double -> SizeReq
SizeReq Double
0 Double
fixed Double
fixed Double
fh
sizeReqBounded :: SizeReq -> Double -> Double -> Double
sizeReqBounded :: SizeReq -> Double -> Double -> Double
sizeReqBounded SizeReq
sizeReq Double
offset Double
value = forall a. Ord a => a -> a -> a
max Double
minSize (forall a. Ord a => a -> a -> a
min Double
maxSize Double
value) where
minSize :: Double
minSize = Double
offset forall a. Num a => a -> a -> a
+ SizeReq -> Double
sizeReqMin SizeReq
sizeReq
maxSize :: Double
maxSize = Double
offset forall a. Num a => a -> a -> a
+ SizeReq -> Double
sizeReqMax SizeReq
sizeReq
sizeReqValid :: SizeReq -> Double -> Double -> Bool
sizeReqValid :: SizeReq -> Double -> Double -> Bool
sizeReqValid SizeReq
sizeReq Double
offset Double
value = Double -> Double -> Double -> Bool
doubleInRange Double
minSize Double
maxSize Double
value where
minSize :: Double
minSize = Double
offset forall a. Num a => a -> a -> a
+ SizeReq -> Double
sizeReqMin SizeReq
sizeReq
maxSize :: Double
maxSize = Double
offset forall a. Num a => a -> a -> a
+ SizeReq -> Double
sizeReqMax SizeReq
sizeReq
sizeReqAddStyle :: StyleState -> (SizeReq, SizeReq) -> (SizeReq, SizeReq)
sizeReqAddStyle :: StyleState -> SizeReqUpdater
sizeReqAddStyle StyleState
style (SizeReq
reqW, SizeReq
reqH) = (SizeReq
newReqW, SizeReq
newReqH) where
Size Double
w Double
h = forall a. a -> Maybe a -> a
fromMaybe forall a. Default a => a
def (StyleState -> Size -> Maybe Size
addOuterSize StyleState
style forall a. Default a => a
def)
realReqW :: SizeReq
realReqW = forall a. a -> Maybe a -> a
fromMaybe SizeReq
reqW (StyleState -> Maybe SizeReq
_sstSizeReqW StyleState
style)
realReqH :: SizeReq
realReqH = forall a. a -> Maybe a -> a
fromMaybe SizeReq
reqH (StyleState -> Maybe SizeReq
_sstSizeReqH StyleState
style)
newReqW :: SizeReq
newReqW = SizeReq -> (Double -> Double) -> SizeReq
modifySizeReq SizeReq
realReqW (forall a. Num a => a -> a -> a
+Double
w)
newReqH :: SizeReq
newReqH = SizeReq -> (Double -> Double) -> SizeReq
modifySizeReq SizeReq
realReqH (forall a. Num a => a -> a -> a
+Double
h)
sizeReqMin :: SizeReq -> Double
sizeReqMin :: SizeReq -> Double
sizeReqMin SizeReq
req = SizeReq
req forall s a. s -> Getting a s a -> a
^. forall s a. HasFixed s a => Lens' s a
L.fixed
sizeReqMax :: SizeReq -> Double
sizeReqMax :: SizeReq -> Double
sizeReqMax SizeReq
req
| SizeReq
req forall s a. s -> Getting a s a -> a
^. forall s a. HasExtra s a => Lens' s a
L.extra forall a. Ord a => a -> a -> Bool
> Double
0 = forall a. RealFloat a => a
maxNumericValue
| Bool
otherwise = SizeReq
req forall s a. s -> Getting a s a -> a
^. forall s a. HasFixed s a => Lens' s a
L.fixed forall a. Num a => a -> a -> a
+ SizeReq
req forall s a. s -> Getting a s a -> a
^. forall s a. HasFlex s a => Lens' s a
L.flex
sizeReqMaxBounded :: SizeReq -> Double
sizeReqMaxBounded :: SizeReq -> Double
sizeReqMaxBounded SizeReq
req = SizeReq
req forall s a. s -> Getting a s a -> a
^. forall s a. HasFixed s a => Lens' s a
L.fixed forall a. Num a => a -> a -> a
+ SizeReq
req forall s a. s -> Getting a s a -> a
^. forall s a. HasFlex s a => Lens' s a
L.flex
sizeReqFixed :: SizeReq -> Double
sizeReqFixed :: SizeReq -> Double
sizeReqFixed SizeReq
req = SizeReq
req forall s a. s -> Getting a s a -> a
^. forall s a. HasFixed s a => Lens' s a
L.fixed
sizeReqFlex :: SizeReq -> Double
sizeReqFlex :: SizeReq -> Double
sizeReqFlex SizeReq
req = SizeReq
req forall s a. s -> Getting a s a -> a
^. forall s a. HasFlex s a => Lens' s a
L.flex
sizeReqExtra :: SizeReq -> Double
SizeReq
req = SizeReq
req forall s a. s -> Getting a s a -> a
^. forall s a. HasExtra s a => Lens' s a
L.extra
sizeReqFactor :: SizeReq -> Double
sizeReqFactor :: SizeReq -> Double
sizeReqFactor SizeReq
req = SizeReq
req forall s a. s -> Getting a s a -> a
^. forall s a. HasFactor s a => Lens' s a
L.factor
sizeReqMergeSum :: SizeReq -> SizeReq -> SizeReq
sizeReqMergeSum :: SizeReq -> SizeReq -> SizeReq
sizeReqMergeSum SizeReq
req1 SizeReq
req2 = SizeReq
newReq where
newReq :: SizeReq
newReq = SizeReq {
_szrFixed :: Double
_szrFixed = SizeReq -> Double
_szrFixed SizeReq
req1 forall a. Num a => a -> a -> a
+ SizeReq -> Double
_szrFixed SizeReq
req2,
_szrFlex :: Double
_szrFlex = SizeReq -> Double
_szrFlex SizeReq
req1 forall a. Num a => a -> a -> a
+ SizeReq -> Double
_szrFlex SizeReq
req2,
_szrExtra :: Double
_szrExtra = SizeReq -> Double
_szrExtra SizeReq
req1 forall a. Num a => a -> a -> a
+ SizeReq -> Double
_szrExtra SizeReq
req2,
_szrFactor :: Double
_szrFactor = forall a. Ord a => a -> a -> a
max (SizeReq -> Double
_szrFactor SizeReq
req1) (SizeReq -> Double
_szrFactor SizeReq
req2)
}
sizeReqMergeMax :: SizeReq -> SizeReq -> SizeReq
sizeReqMergeMax :: SizeReq -> SizeReq -> SizeReq
sizeReqMergeMax SizeReq
req1 SizeReq
req2 = SizeReq
newReq where
isFixedReq1 :: Bool
isFixedReq1 = forall a b. (RealFrac a, Integral b) => a -> b
round (SizeReq
req1 forall s a. s -> Getting a s a -> a
^. forall s a. HasFixed s a => Lens' s a
L.fixed) forall a. Ord a => a -> a -> Bool
> Integer
0
isFixedReq2 :: Bool
isFixedReq2 = forall a b. (RealFrac a, Integral b) => a -> b
round (SizeReq
req2 forall s a. s -> Getting a s a -> a
^. forall s a. HasFixed s a => Lens' s a
L.fixed) forall a. Ord a => a -> a -> Bool
> Integer
0
flexReq1 :: Double
flexReq1 = SizeReq
req1 forall s a. s -> Getting a s a -> a
^. forall s a. HasFlex s a => Lens' s a
L.flex
flexReq2 :: Double
flexReq2 = SizeReq
req2 forall s a. s -> Getting a s a -> a
^. forall s a. HasFlex s a => Lens' s a
L.flex
newFixed :: Double
newFixed = forall a. Ord a => a -> a -> a
max (SizeReq
req1 forall s a. s -> Getting a s a -> a
^. forall s a. HasFixed s a => Lens' s a
L.fixed) (SizeReq
req2 forall s a. s -> Getting a s a -> a
^. forall s a. HasFixed s a => Lens' s a
L.fixed)
newFlex :: Double
newFlex
| Bool -> Bool
not (Bool
isFixedReq1 forall a. Bits a => a -> a -> a
`xor` Bool
isFixedReq2) = forall a. Ord a => a -> a -> a
max Double
flexReq1 Double
flexReq2
| Bool
isFixedReq1 Bool -> Bool -> Bool
&& Double
flexReq1 forall a. Ord a => a -> a -> Bool
> Double
flexReq2 = Double
flexReq1
| Bool
isFixedReq2 Bool -> Bool -> Bool
&& Double
flexReq2 forall a. Ord a => a -> a -> Bool
> Double
flexReq1 = Double
flexReq2
| Bool
otherwise = forall a. Ord a => a -> a -> a
max Double
0 forall a b. (a -> b) -> a -> b
$ forall a. Ord a => a -> a -> a
max Double
flexReq1 Double
flexReq2 forall a. Num a => a -> a -> a
- Double
newFixed
newReq :: SizeReq
newReq = SizeReq {
_szrFixed :: Double
_szrFixed = Double
newFixed,
_szrFlex :: Double
_szrFlex = Double
newFlex,
_szrExtra :: Double
_szrExtra = forall a. Ord a => a -> a -> a
max (SizeReq
req1 forall s a. s -> Getting a s a -> a
^. forall s a. HasExtra s a => Lens' s a
L.extra) (SizeReq
req2 forall s a. s -> Getting a s a -> a
^. forall s a. HasExtra s a => Lens' s a
L.extra),
_szrFactor :: Double
_szrFactor = forall a. Ord a => a -> a -> a
max (SizeReq
req1 forall s a. s -> Getting a s a -> a
^. forall s a. HasFactor s a => Lens' s a
L.factor) (SizeReq
req2 forall s a. s -> Getting a s a -> a
^. forall s a. HasFactor s a => Lens' s a
L.factor)
}
modifySizeReq :: SizeReq -> (Double -> Double) -> SizeReq
modifySizeReq :: SizeReq -> (Double -> Double) -> SizeReq
modifySizeReq (SizeReq Double
fixed Double
flex Double
extra Double
factor) Double -> Double
fn = SizeReq {
_szrFixed :: Double
_szrFixed = if Double
fixed forall a. Ord a => a -> a -> Bool
> Double
0 then Double -> Double
fn Double
fixed else Double
0,
_szrFlex :: Double
_szrFlex = if Double
flex forall a. Ord a => a -> a -> Bool
> Double
0 then Double -> Double
fn Double
flex else Double
0,
_szrExtra :: Double
_szrExtra = if Double
extra forall a. Ord a => a -> a -> Bool
> Double
0 then Double -> Double
fn Double
extra else Double
0,
_szrFactor :: Double
_szrFactor = Double
factor
}
doubleInRange :: Double -> Double -> Double -> Bool
doubleInRange :: Double -> Double -> Double -> Bool
doubleInRange Double
minValue Double
maxValue Double
curValue = Bool
validMin Bool -> Bool -> Bool
&& Bool
validMax where
minDiff :: Double
minDiff = Double
curValue forall a. Num a => a -> a -> a
- Double
minValue
maxDiff :: Double
maxDiff = Double
maxValue forall a. Num a => a -> a -> a
- Double
curValue
validMin :: Bool
validMin = Double
minDiff forall a. Ord a => a -> a -> Bool
>= Double
0 Bool -> Bool -> Bool
|| forall a. Num a => a -> a
abs Double
minDiff forall a. Ord a => a -> a -> Bool
< Double
0.0001
validMax :: Bool
validMax = Double
maxDiff forall a. Ord a => a -> a -> Bool
>= Double
0 Bool -> Bool -> Bool
|| forall a. Num a => a -> a
abs Double
maxDiff forall a. Ord a => a -> a -> Bool
< Double
0.0001