{-# LANGUAGE CPP #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DeriveAnyClass #-}
module Graphics.Vty.Attributes
( module Graphics.Vty.Attributes.Color
, Attr(..)
, FixedAttr(..)
, MaybeDefault(..)
, defAttr
, currentAttr
, Style
, withStyle
, standout
, italic
, strikethrough
, underline
, reverseVideo
, blink
, dim
, bold
, defaultStyleMask
, styleMask
, hasStyle
, withForeColor
, withBackColor
, withURL
)
where
import Control.DeepSeq
import Data.Bits
#if !(MIN_VERSION_base(4,11,0))
import Data.Semigroup
#endif
import Data.Text (Text)
import Data.Word
import GHC.Generics
import Graphics.Vty.Attributes.Color
data Attr = Attr
{ Attr -> MaybeDefault Style
attrStyle :: !(MaybeDefault Style)
, Attr -> MaybeDefault Color
attrForeColor :: !(MaybeDefault Color)
, Attr -> MaybeDefault Color
attrBackColor :: !(MaybeDefault Color)
, Attr -> MaybeDefault Text
attrURL :: !(MaybeDefault Text)
} deriving ( Attr -> Attr -> Bool
(Attr -> Attr -> Bool) -> (Attr -> Attr -> Bool) -> Eq Attr
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Attr -> Attr -> Bool
$c/= :: Attr -> Attr -> Bool
== :: Attr -> Attr -> Bool
$c== :: Attr -> Attr -> Bool
Eq, Int -> Attr -> ShowS
[Attr] -> ShowS
Attr -> String
(Int -> Attr -> ShowS)
-> (Attr -> String) -> ([Attr] -> ShowS) -> Show Attr
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Attr] -> ShowS
$cshowList :: [Attr] -> ShowS
show :: Attr -> String
$cshow :: Attr -> String
showsPrec :: Int -> Attr -> ShowS
$cshowsPrec :: Int -> Attr -> ShowS
Show, ReadPrec [Attr]
ReadPrec Attr
Int -> ReadS Attr
ReadS [Attr]
(Int -> ReadS Attr)
-> ReadS [Attr] -> ReadPrec Attr -> ReadPrec [Attr] -> Read Attr
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Attr]
$creadListPrec :: ReadPrec [Attr]
readPrec :: ReadPrec Attr
$creadPrec :: ReadPrec Attr
readList :: ReadS [Attr]
$creadList :: ReadS [Attr]
readsPrec :: Int -> ReadS Attr
$creadsPrec :: Int -> ReadS Attr
Read, (forall x. Attr -> Rep Attr x)
-> (forall x. Rep Attr x -> Attr) -> Generic Attr
forall x. Rep Attr x -> Attr
forall x. Attr -> Rep Attr x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Attr x -> Attr
$cfrom :: forall x. Attr -> Rep Attr x
Generic, Attr -> ()
(Attr -> ()) -> NFData Attr
forall a. (a -> ()) -> NFData a
rnf :: Attr -> ()
$crnf :: Attr -> ()
NFData )
instance Semigroup Attr where
Attr
attr0 <> :: Attr -> Attr -> Attr
<> Attr
attr1 =
MaybeDefault Style
-> MaybeDefault Color
-> MaybeDefault Color
-> MaybeDefault Text
-> Attr
Attr ( Attr -> MaybeDefault Style
attrStyle Attr
attr0 MaybeDefault Style -> MaybeDefault Style -> MaybeDefault Style
forall a. Semigroup a => a -> a -> a
<> Attr -> MaybeDefault Style
attrStyle Attr
attr1 )
( Attr -> MaybeDefault Color
attrForeColor Attr
attr0 MaybeDefault Color -> MaybeDefault Color -> MaybeDefault Color
forall a. Semigroup a => a -> a -> a
<> Attr -> MaybeDefault Color
attrForeColor Attr
attr1 )
( Attr -> MaybeDefault Color
attrBackColor Attr
attr0 MaybeDefault Color -> MaybeDefault Color -> MaybeDefault Color
forall a. Semigroup a => a -> a -> a
<> Attr -> MaybeDefault Color
attrBackColor Attr
attr1 )
( Attr -> MaybeDefault Text
attrURL Attr
attr0 MaybeDefault Text -> MaybeDefault Text -> MaybeDefault Text
forall a. Semigroup a => a -> a -> a
<> Attr -> MaybeDefault Text
attrURL Attr
attr1 )
instance Monoid Attr where
mempty :: Attr
mempty = MaybeDefault Style
-> MaybeDefault Color
-> MaybeDefault Color
-> MaybeDefault Text
-> Attr
Attr MaybeDefault Style
forall a. Monoid a => a
mempty MaybeDefault Color
forall a. Monoid a => a
mempty MaybeDefault Color
forall a. Monoid a => a
mempty MaybeDefault Text
forall a. Monoid a => a
mempty
#if !(MIN_VERSION_base(4,11,0))
mappend = (<>)
#endif
data FixedAttr = FixedAttr
{ FixedAttr -> Style
fixedStyle :: !Style
, FixedAttr -> Maybe Color
fixedForeColor :: !(Maybe Color)
, FixedAttr -> Maybe Color
fixedBackColor :: !(Maybe Color)
, FixedAttr -> Maybe Text
fixedURL :: !(Maybe Text)
} deriving ( FixedAttr -> FixedAttr -> Bool
(FixedAttr -> FixedAttr -> Bool)
-> (FixedAttr -> FixedAttr -> Bool) -> Eq FixedAttr
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: FixedAttr -> FixedAttr -> Bool
$c/= :: FixedAttr -> FixedAttr -> Bool
== :: FixedAttr -> FixedAttr -> Bool
$c== :: FixedAttr -> FixedAttr -> Bool
Eq, Int -> FixedAttr -> ShowS
[FixedAttr] -> ShowS
FixedAttr -> String
(Int -> FixedAttr -> ShowS)
-> (FixedAttr -> String)
-> ([FixedAttr] -> ShowS)
-> Show FixedAttr
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [FixedAttr] -> ShowS
$cshowList :: [FixedAttr] -> ShowS
show :: FixedAttr -> String
$cshow :: FixedAttr -> String
showsPrec :: Int -> FixedAttr -> ShowS
$cshowsPrec :: Int -> FixedAttr -> ShowS
Show )
data MaybeDefault v where
Default :: MaybeDefault v
KeepCurrent :: MaybeDefault v
SetTo :: forall v . ( Eq v, Show v, Read v ) => !v -> MaybeDefault v
instance (NFData v) => NFData (MaybeDefault v) where
rnf :: MaybeDefault v -> ()
rnf MaybeDefault v
Default = ()
rnf MaybeDefault v
KeepCurrent = ()
rnf (SetTo v
v) = v -> ()
forall a. NFData a => a -> ()
rnf v
v
deriving instance Eq v => Eq (MaybeDefault v)
deriving instance Eq v => Show (MaybeDefault v)
deriving instance (Eq v, Show v, Read v) => Read (MaybeDefault v)
instance Eq v => Semigroup (MaybeDefault v) where
MaybeDefault v
Default <> :: MaybeDefault v -> MaybeDefault v -> MaybeDefault v
<> MaybeDefault v
Default = MaybeDefault v
forall v. MaybeDefault v
Default
MaybeDefault v
Default <> MaybeDefault v
KeepCurrent = MaybeDefault v
forall v. MaybeDefault v
Default
MaybeDefault v
Default <> SetTo v
v = v -> MaybeDefault v
forall v. (Eq v, Show v, Read v) => v -> MaybeDefault v
SetTo v
v
MaybeDefault v
KeepCurrent <> MaybeDefault v
Default = MaybeDefault v
forall v. MaybeDefault v
Default
MaybeDefault v
KeepCurrent <> MaybeDefault v
KeepCurrent = MaybeDefault v
forall v. MaybeDefault v
KeepCurrent
MaybeDefault v
KeepCurrent <> SetTo v
v = v -> MaybeDefault v
forall v. (Eq v, Show v, Read v) => v -> MaybeDefault v
SetTo v
v
SetTo v
_v <> MaybeDefault v
Default = MaybeDefault v
forall v. MaybeDefault v
Default
SetTo v
v <> MaybeDefault v
KeepCurrent = v -> MaybeDefault v
forall v. (Eq v, Show v, Read v) => v -> MaybeDefault v
SetTo v
v
SetTo v
_ <> SetTo v
v = v -> MaybeDefault v
forall v. (Eq v, Show v, Read v) => v -> MaybeDefault v
SetTo v
v
instance Eq v => Monoid ( MaybeDefault v ) where
mempty :: MaybeDefault v
mempty = MaybeDefault v
forall v. MaybeDefault v
KeepCurrent
#if !(MIN_VERSION_base(4,11,0))
mappend = (<>)
#endif
type Style = Word8
standout, underline, reverseVideo, blink, dim, bold, italic, strikethrough :: Style
standout :: Style
standout = Style
0x01
underline :: Style
underline = Style
0x02
reverseVideo :: Style
reverseVideo = Style
0x04
blink :: Style
blink = Style
0x08
dim :: Style
dim = Style
0x10
bold :: Style
bold = Style
0x20
italic :: Style
italic = Style
0x40
strikethrough :: Style
strikethrough = Style
0x80
defaultStyleMask :: Style
defaultStyleMask :: Style
defaultStyleMask = Style
0x00
styleMask :: Attr -> Word8
styleMask :: Attr -> Style
styleMask Attr
attr
= case Attr -> MaybeDefault Style
attrStyle Attr
attr of
MaybeDefault Style
Default -> Style
0
MaybeDefault Style
KeepCurrent -> Style
0
SetTo Style
v -> Style
v
hasStyle :: Style -> Style -> Bool
hasStyle :: Style -> Style -> Bool
hasStyle Style
s Style
bitMask = ( Style
s Style -> Style -> Style
forall a. Bits a => a -> a -> a
.&. Style
bitMask ) Style -> Style -> Bool
forall a. Eq a => a -> a -> Bool
/= Style
0
withForeColor :: Attr -> Color -> Attr
withForeColor :: Attr -> Color -> Attr
withForeColor Attr
attr Color
c = Attr
attr { attrForeColor :: MaybeDefault Color
attrForeColor = Color -> MaybeDefault Color
forall v. (Eq v, Show v, Read v) => v -> MaybeDefault v
SetTo Color
c }
withBackColor :: Attr -> Color -> Attr
withBackColor :: Attr -> Color -> Attr
withBackColor Attr
attr Color
c = Attr
attr { attrBackColor :: MaybeDefault Color
attrBackColor = Color -> MaybeDefault Color
forall v. (Eq v, Show v, Read v) => v -> MaybeDefault v
SetTo Color
c }
withStyle :: Attr -> Style -> Attr
withStyle :: Attr -> Style -> Attr
withStyle Attr
attr Style
0 = Attr
attr
withStyle Attr
attr Style
styleFlag = Attr
attr { attrStyle :: MaybeDefault Style
attrStyle = Style -> MaybeDefault Style
forall v. (Eq v, Show v, Read v) => v -> MaybeDefault v
SetTo (Style -> MaybeDefault Style) -> Style -> MaybeDefault Style
forall a b. (a -> b) -> a -> b
$ Attr -> Style
styleMask Attr
attr Style -> Style -> Style
forall a. Bits a => a -> a -> a
.|. Style
styleFlag }
withURL :: Attr -> Text -> Attr
withURL :: Attr -> Text -> Attr
withURL Attr
attr Text
url = Attr
attr { attrURL :: MaybeDefault Text
attrURL = Text -> MaybeDefault Text
forall v. (Eq v, Show v, Read v) => v -> MaybeDefault v
SetTo Text
url }
defAttr :: Attr
defAttr :: Attr
defAttr = MaybeDefault Style
-> MaybeDefault Color
-> MaybeDefault Color
-> MaybeDefault Text
-> Attr
Attr MaybeDefault Style
forall v. MaybeDefault v
Default MaybeDefault Color
forall v. MaybeDefault v
Default MaybeDefault Color
forall v. MaybeDefault v
Default MaybeDefault Text
forall v. MaybeDefault v
Default
currentAttr :: Attr
currentAttr :: Attr
currentAttr = MaybeDefault Style
-> MaybeDefault Color
-> MaybeDefault Color
-> MaybeDefault Text
-> Attr
Attr MaybeDefault Style
forall v. MaybeDefault v
KeepCurrent MaybeDefault Color
forall v. MaybeDefault v
KeepCurrent MaybeDefault Color
forall v. MaybeDefault v
KeepCurrent MaybeDefault Text
forall v. MaybeDefault v
KeepCurrent