module Graphics.Rendering.Plot.Gtk.UI.ErrorFig (errorFig) where
import Control.Monad (forM_)
import Graphics.Rendering.Cairo hiding (x, y)
import Graphics.Rendering.Plot.Gtk.UI.Settings (FigureSettings (..))
errorFig :: FigureSettings -> (Int, Int) -> Render ()
errorFig fset (w', h') = do
save
let [w, h] = map fromIntegral [w', h']
setSourceRGBA 0.0 0.0 0.0 0.5
rectangle 0 0 w h
fill
restore
save
let [a, b] = map (/8) [w, h]
setSourceRGBA 0.0 0.0 0.0 0.2
setLineWidth 5
roundRectangle a (2 * b) (6 * a) (4 * b)
fill
restore
let msgs = getErrors fset
save
setSourceRGBA 0.0 0.0 0.0 0.3
setFontSize 30
setSourceRGBA 1.0 1.0 1.0 0.7
selectFontFace "sans" FontSlantNormal FontWeightBold
let ms = zip msgs [0 ..]
forM_ ms $ \(m, i) -> do
(TextExtents _ _ tw th _ _) <- textExtents m
moveTo (4 * a tw / 2) ((2.5 + i) * b + th / 2)
showText m
restore
getErrors :: FigureSettings -> [String]
getErrors fset = prepare [
"~~ Error(s) ~~"
, let Just (xl, xu) = xRange fset
in if xu <= xl then "Invalid X-Range" else ""
, case yRange fset of
Nothing -> "Unrealistic Y-Range"
Just (yl, yu) -> if yu <= yl
then "Invalid Y-Range"
else ""
]
where prepare xs = if not . null $ xs
then xs
else [ "The gray screen"
, "of no plots :)" ]
roundRectangle :: Double -> Double -> Double -> Double -> Render ()
roundRectangle x y w h = do
let r = h / 10
arc (x + w r) (y + r) r (pi/2) 0
arc (x + w r) (y + h r) r 0 ( pi/2)
arc (x + r) (y + h r) r (pi/2) pi
arc (x + r) (y + r) r pi (3*pi/2)
closePath