{-# LANGUAGE ImplicitParams, OverloadedStrings, AllowAmbiguousTypes, GADTs, CPP, ExistentialQuantification, TypeSynonymInstances, FlexibleInstances, MultiParamTypeClasses, FlexibleContexts, ScopedTypeVariables, UndecidableInstances #-} module Graphics.UI.FLTK.Theme.Light.Menu ( choiceNew, sysMenuBarNew ) where import Graphics.UI.FLTK.LowLevel.Fl_Enumerations import Graphics.UI.FLTK.LowLevel.Fl_Types import Graphics.UI.FLTK.Theme.Light.Common import qualified Data.Text as T import qualified Graphics.UI.FLTK.LowLevel.FLTKHS as LowLevel import Graphics.UI.FLTK.Theme.Light.Assets sysMenuBarNew :: (?assets :: Assets) => Rectangle -> Maybe T.Text -> IO (Ref LowLevel.SysMenuBar) sysMenuBarNew rectangle label = do let customDraw :: Ref LowLevel.SysMenuBar -> IO () customDraw m = do (color :: Color) <- LowLevel.getColor m let slightlyDarker = colorAverage color blackColor 0.80 items <- LowLevel.getMenu m mapM_ (\miMaybe -> maybe (return ()) (\mi -> do LowLevel.setLabelfont mi commonFont LowLevel.setLabelsize mi commonFontSize) miMaybe) items withCustomBoxDraw BorderBox (\rect _ -> do let (x',y',w',h') = fromRectangle rect LowLevel.flcSetColor slightlyDarker LowLevel.flcBeginLine LowLevel.flcVertex (toPrecisePosition (toPosition (x',y'+h'))) LowLevel.flcVertex (toPrecisePosition (toPosition (x'+w',y'+h'))) LowLevel.flcEndLine LowLevel.flcSetColor color ) (LowLevel.drawSuper m) m <- LowLevel.sysMenuBarCustom rectangle label (Just customDraw) Nothing LowLevel.setBox m BorderBox LowLevel.setColor m lightBackground LowLevel.setTextfont m commonFont LowLevel.setTextsize m commonFontSize return m choiceNew :: (?assets :: Assets) => Rectangle -> Maybe T.Text -> IO (Ref LowLevel.Choice) choiceNew rectangle label = do c <- LowLevel.choiceCustom rectangle label (Just drawChoice) Nothing let color = lightBackground LowLevel.setLabelfont c commonFont LowLevel.setLabelsize c commonFontSize LowLevel.setTextfont c commonFont LowLevel.setTextsize c commonFontSize LowLevel.setColor c color color <- commonSelectionColor LowLevel.setSelectionColor c color return c drawChoice :: Ref LowLevel.Choice -> IO () drawChoice c = do color <- LowLevel.getColor c selectionColor <- fmap darker (LowLevel.getSelectionColor c) bounds' <- LowLevel.getRectangle c let (x,y,w,h) = fromRectangle bounds' let slightlyDarker = colorAverage color blackColor 0.85 hoverColor <- rgbColorWithRgb (0xBB, 0xBB, 0xBB) let spec = BorderBoxSpec { borderBoxHoveringColor = hoverColor, borderBoxColor = slightlyDarker, borderBoxFocusedColor = selectionColor, borderBoxFillColor = color, borderBoxBounds = toRectangle (x,y,w-1,h-1) } withCustomBoxDraw UpBox (\_ _ -> drawBorderBox c spec True) (LowLevel.drawSuper c)