vimus-0.1.0: src/WindowLayout.hs
{-# OPTIONS_GHC -fno-warn-unused-do-bind #-}
module WindowLayout (
Attribute (..)
, WindowColor (MainColor, RulerColor, TabColor, InputColor, PlayStatusColor, SongStatusColor, ErrorColor, SuggestionsColor)
, Color, black, red, green, yellow, blue, magenta, cyan, white
, defaultColor
, create
, wchgat
, mvwchgat
, wcolor_set
, defineColor
) where
import Control.Monad
import UI.Curses hiding (wchgat, mvwchgat, wcolor_set)
import qualified UI.Curses as Curses
-- ReservedColor (color pair 0) cannot be modified, so we do not use it.
{-# WARNING ReservedColor "Do not use this!" #-}
data WindowColor =
ReservedColor
| MainColor
| RulerColor
| TabColor
| InputColor
| PlayStatusColor
| SongStatusColor
| ErrorColor
| SuggestionsColor
deriving (Show, Enum, Bounded)
defaultColor :: Color
defaultColor = Color (-1)
defineColor :: WindowColor -> Color -> Color -> IO ()
defineColor color fg bg = init_pair (fromEnum color) fg bg >> return ()
setWindowColor :: WindowColor -> Window -> IO Status
setWindowColor color window = wbkgd window (color_pair . fromEnum $ color)
wchgat :: Window -> Int -> [Attribute] -> WindowColor -> IO ()
wchgat window n attr color = void $ Curses.wchgat window n attr (fromEnum color)
mvwchgat :: Window -> Int -> Int -> Int -> [Attribute] -> WindowColor -> IO ()
mvwchgat window y x n attr color = void $ Curses.mvwchgat window y x n attr (fromEnum color)
wcolor_set :: Window -> WindowColor -> IO ()
wcolor_set window color = void $ Curses.wcolor_set window (fromEnum color)
-- | Set given color pair to default/default
resetColor :: WindowColor -> IO ()
resetColor c = defineColor c defaultColor defaultColor >> return ()
-- | Set all color pairs to default/default
resetColors :: IO ()
resetColors = mapM_ resetColor [toEnum 1 .. maxBound]
create :: IO (IO Window, Window, Window, Window, Window, Window)
create = do
resetColors
let createMainWindow = do
(sizeY, _) <- getmaxyx stdscr
let mainWinSize = sizeY - 4
window <- newwin mainWinSize 0 1 0
setWindowColor MainColor window
return (window, 0, mainWinSize + 1, mainWinSize + 2, mainWinSize + 3)
(mainWindow, pos0, pos2, pos3, pos4) <- createMainWindow
tabWindow <- newwin 1 0 pos0 0
songStatusWindow <- newwin 1 0 pos2 0
playStatusWindow <- newwin 1 0 pos3 0
inputWindow <- newwin 1 0 pos4 0
setWindowColor TabColor tabWindow
setWindowColor InputColor inputWindow
setWindowColor PlayStatusColor playStatusWindow
setWindowColor SongStatusColor songStatusWindow
let onResize = do
(newMainWindow, newPos0, newPos2, newPos3, newPos4) <- createMainWindow
mvwin tabWindow newPos0 0
mvwin songStatusWindow newPos2 0
mvwin playStatusWindow newPos3 0
mvwin inputWindow newPos4 0
wrefresh songStatusWindow
wrefresh playStatusWindow
wrefresh inputWindow
return newMainWindow
return (onResize, tabWindow, mainWindow, songStatusWindow, playStatusWindow, inputWindow)