nano-ui-0.1.0.0: lib/NanoUI/Widgets/Chrome.hs
{-# LANGUAGE OverloadedStrings #-}
-- | Floating overlay chrome: title bars, close buttons.
module NanoUI.Widgets.Chrome
( modalTitleBarH
, titleBarChromeHFor
, titleBarLayoutFor
, titleLabelLayoutFor
, floatMinFor
, closeButton
, windowChromeTop
, windowChromeSepH
) where
import Data.Bits ((.|.))
import Effectful (Eff, type (:>))
import NanoUI.WidgetText (buttonCloseTrailing, buttonFlagClose)
import NanoUI.Monad (Ui)
import NanoUI.Style
( Layout (..)
, alignMid
, defaultLayout
, fillW
, fixedH
, fixedWH
, gap
, tight
)
import NanoUI.Types (clamp)
import NanoUI.Widgets.Combinators (buttonStyled)
import NanoUI.Widgets.Node (Response)
titleBarH :: Float
titleBarH = 28
closeButtonSize :: Float
closeButtonSize = 24
windowChromeTop :: Float
windowChromeTop = 10
modalTitleBarH :: Float
modalTitleBarH = 40
windowChromeSepH :: Float
windowChromeSepH = 1
titleBarChromeHFor :: Float
titleBarChromeHFor = titleBarH + windowChromeTop + windowChromeSepH
titleBarLayoutFor :: Float -> Layout
titleBarLayoutFor barH =
tight . gap 6 . alignMid . fixedH barH . fillW $ defaultLayout
titleLabelLayoutFor :: Float -> Layout
titleLabelLayoutFor barH =
(fixedH barH . alignMid . tight) $
defaultLayout {layoutMinH = barH, layoutMaxH = barH}
floatMinFor :: Float -> Float -> Float
floatMinFor authored avail = clamp 1 avail authored
{-# INLINE closeButton #-}
closeButton :: (Ui :> es) => Eff es Response
closeButton = buttonStyled "" 0 layout (buttonFlagClose .|. buttonCloseTrailing)
where
layout = tight . fixedWH closeButtonSize closeButtonSize . alignMid $ defaultLayout