packages feed

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)