{-# 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 :: Float
titleBarH = Float
28

closeButtonSize :: Float
closeButtonSize :: Float
closeButtonSize = Float
24

windowChromeTop :: Float
windowChromeTop :: Float
windowChromeTop = Float
10

modalTitleBarH :: Float
modalTitleBarH :: Float
modalTitleBarH = Float
40

windowChromeSepH :: Float
windowChromeSepH :: Float
windowChromeSepH = Float
1

titleBarChromeHFor :: Float
titleBarChromeHFor :: Float
titleBarChromeHFor = Float
titleBarH Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Float
windowChromeTop Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Float
windowChromeSepH

titleBarLayoutFor :: Float -> Layout
titleBarLayoutFor :: Float -> Layout
titleBarLayoutFor Float
barH =
  Layout -> Layout
tight (Layout -> Layout) -> (Layout -> Layout) -> Layout -> Layout
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Float -> Layout -> Layout
gap Float
6 (Layout -> Layout) -> (Layout -> Layout) -> Layout -> Layout
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Layout -> Layout
alignMid (Layout -> Layout) -> (Layout -> Layout) -> Layout -> Layout
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Float -> Layout -> Layout
fixedH Float
barH (Layout -> Layout) -> (Layout -> Layout) -> Layout -> Layout
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Layout -> Layout
fillW (Layout -> Layout) -> Layout -> Layout
forall a b. (a -> b) -> a -> b
$ Layout
defaultLayout

titleLabelLayoutFor :: Float -> Layout
titleLabelLayoutFor :: Float -> Layout
titleLabelLayoutFor Float
barH =
  (Float -> Layout -> Layout
fixedH Float
barH (Layout -> Layout) -> (Layout -> Layout) -> Layout -> Layout
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Layout -> Layout
alignMid (Layout -> Layout) -> (Layout -> Layout) -> Layout -> Layout
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Layout -> Layout
tight) (Layout -> Layout) -> Layout -> Layout
forall a b. (a -> b) -> a -> b
$
    Layout
defaultLayout {layoutMinH = barH, layoutMaxH = barH}

floatMinFor :: Float -> Float -> Float
floatMinFor :: Float -> Float -> Float
floatMinFor Float
authored Float
avail = Float -> Float -> Float -> Float
forall a. Ord a => a -> a -> a -> a
clamp Float
1 Float
avail Float
authored

{-# INLINE closeButton #-}
closeButton :: (Ui :> es) => Eff es Response
closeButton :: forall (es :: [Effect]). (Ui :> es) => Eff es Response
closeButton = Text -> Float -> Layout -> Int -> Eff es Response
forall (es :: [Effect]).
(Ui :> es) =>
Text -> Float -> Layout -> Int -> Eff es Response
buttonStyled Text
"" Float
0 Layout
layout (Int
buttonFlagClose Int -> Int -> Int
forall a. Bits a => a -> a -> a
.|. Int
buttonCloseTrailing)
  where
    layout :: Layout
layout = Layout -> Layout
tight (Layout -> Layout) -> (Layout -> Layout) -> Layout -> Layout
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Float -> Float -> Layout -> Layout
fixedWH Float
closeButtonSize Float
closeButtonSize (Layout -> Layout) -> (Layout -> Layout) -> Layout -> Layout
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Layout -> Layout
alignMid (Layout -> Layout) -> Layout -> Layout
forall a b. (a -> b) -> a -> b
$ Layout
defaultLayout