packages feed

termonad-1.1.0.0: example-config/ExampleColourExtension.hs

-- | This is an example Termonad configuration that shows how to use the
-- 'ColourExtension' to set colours for your terminal.  See the project-wide
-- README.md for how to use Termonad Haskell configuration scripts.

module Main where

import Data.Colour.SRGB (Colour, sRGB24)
import Data.Singletons (sing)
import Termonad
  ( CursorBlinkMode(CursorBlinkModeOff), Option(Set)
  , ShowScrollbar(ShowScrollbarNever), TMConfig, confirmExit, cursorBlinkMode
  , defaultConfigOptions, defaultTMConfig, options, showMenu, showScrollbar
  , start
  )
import Termonad.Config.Colour
  ( Colour, ColourConfig, Palette(ExtendedPalette), addColourExtension
  , createColourExtension, cursorBgColour, defaultColourConfig, foregroundColour
  , palette, sRGB24
  )
import Termonad.Config.Vec
  ( N4, N8, Sing, Vec((:*), EmptyVec), fin_, setAtVec, unsafeFromListVec_
  )

-- This is our main 'TMConfig'.  It holds all of the non-colour settings
-- for Termonad.
--
-- This shows how a few settings can be changed.
myTMConfig :: TMConfig
myTMConfig =
  defaultTMConfig
    { options =
        defaultConfigOptions
          { showScrollbar = ShowScrollbarNever
          , confirmExit = False
          , showMenu = False
          , cursorBlinkMode = CursorBlinkModeOff
          }
    }

-- This is our 'ColourConfig'.  It holds all of our colour-related settings.
myColourConfig :: ColourConfig (Colour Double)
myColourConfig =
  defaultColourConfig
    -- Set the cursor background colour.  This is the normal colour of the
    -- cursor.
    { cursorBgColour = Set (sRGB24 120 80 110) -- purple
    -- Set the default foreground colour of text of the terminal.
    , foregroundColour = sRGB24 220 180 210 -- light pink
    -- Set the extended palette that has 8 colours standard colors and then 8
    -- light colors.
    , palette = ExtendedPalette myStandardColours myLightColours
    }
  where
    -- This is a an example of creating a length-indexed linked-list of colours,
    -- using 'Vec' constructors.
    myStandardColours :: Vec N8 (Colour Double)
    myStandardColours =
         sRGB24  40  30  20 -- dark brown (used as background colour)
      :* sRGB24 180  30  20 -- red
      :* sRGB24  40 160  20 -- green
      :* sRGB24 180 160  20 -- dark yellow
      :* sRGB24  40  30 120 -- dark purple
      :* sRGB24 180  30 120 -- bright pink
      :* sRGB24  40 160 120 -- teal
      :* sRGB24 180 160 120 -- light brown
      :* EmptyVec

    -- This is an example of creating a length-indexed linked-list of colours,
    -- using the 'unsafeFromListVec_' function.  'unsafeFromListVec_' is okay to
    -- use as long as you're absolutely sure you have 8 elements.
    myLightColours :: Vec N8 (Colour Double)
    myLightColours =
      unsafeFromListVec_
        [ sRGB24  70  60  50 -- brown
        , sRGB24 220  30  20 -- light red
        , sRGB24  40 210  20 -- light green
        , sRGB24 220 200  20 -- yellow
        , sRGB24  40  30 180 -- purple
        , sRGB24 140  30 80  -- dark pink
        , sRGB24  50 200 160 -- light teal
        , sRGB24 220 200 150 -- light brown
        ]

    -- This is an example of updating just a single value in a 'Colour' 'Vec'.
    -- Here we are updating the 5th 'Colour' (which is at index 4).
    updateSingleColor :: Vec N8 (Colour Double)
    updateSingleColor =
      let fin4 = fin_ (sing :: Sing N4)
      in setAtVec fin4 (sRGB24 40 30 150) myStandardColours

main :: IO ()
main = do
  -- First, create the colour extension based on 'myColourConfig'.
  myColourExt <- createColourExtension myColourConfig

  -- Update 'myTMConfig' with our colour extension.
  let newTMConfig = addColourExtension myTMConfig myColourExt

  -- Start Termonad with our updated 'TMConfig'.
  start newTMConfig