packages feed

h-raylib-5.1.1.0: src/Raylib/Types/Util/GUI.hs

{-# OPTIONS -Wall #-}
{-# LANGUAGE DeriveAnyClass #-}

-- | Bindings for types used in @raygui@
module Raylib.Types.Util.GUI
  ( -- * Enumerations
    GuiState (..),
    GuiTextAlignment (..),
    GuiTextAlignmentVertical (..),
    GuiTextWrapMode (..),
    GuiControl (..),
    GuiControlProperty (..),
    GuiDefaultProperty (..),
    GuiToggleProperty (..),
    GuiSliderProperty (..),
    GuiProgressBarProperty (..),
    GuiScrollBarProperty (..),
    GuiCheckBoxProperty (..),
    GuiComboBoxProperty (..),
    GuiDropdownBoxProperty (..),
    GuiTextBoxProperty (..),
    GuiSpinnerProperty (..),
    GuiListViewProperty (..),
    GuiColorPickerProperty (..),
    GuiIconName (..),

    -- * Structures
    GuiStyleProp (..),

    -- * Pointer utilities
    p'guiStyleProp'controlId,
    p'guiStyleProp'propertyId,
    p'guiStyleProp'propertyValue,
  )
where

import Foreign
  ( Ptr,
    Storable (alignment, peek, poke, sizeOf),
    Word16,
    castPtr,
    plusPtr,
  )
import Foreign.C
  ( CInt (..),
    CUShort,
  )
import Raylib.Internal.Foreign (Freeable)

---------------------------------------
-- raygui enums -----------------------
---------------------------------------

-- | Gui control state
data GuiState
  = StateNormal
  | StateFocused
  | StatePressed
  | StateDisabled
  deriving (Eq, Show)

instance Enum GuiState where
  fromEnum x = case x of
    StateNormal -> 0
    StateFocused -> 1
    StatePressed -> 2
    StateDisabled -> 3
  toEnum x = case x of
    0 -> StateNormal
    1 -> StateFocused
    2 -> StatePressed
    3 -> StateDisabled
    n -> error $ "(GuiState.toEnum) Invalid value: " ++ show n

instance Storable GuiState where
  sizeOf _ = 4
  alignment _ = 4
  peek ptr = do
    val <- peek (castPtr ptr)
    return $ toEnum $ fromEnum (val :: CInt)
  poke ptr v = poke (castPtr ptr) (fromIntegral (fromEnum v) :: CInt)

-- | Gui control text alignment
data GuiTextAlignment
  = TextAlignLeft
  | TextAlignCenter
  | TextAlignRight
  deriving (Eq, Show)

instance Enum GuiTextAlignment where
  fromEnum x = case x of
    TextAlignLeft -> 0
    TextAlignCenter -> 1
    TextAlignRight -> 2
  toEnum x = case x of
    0 -> TextAlignLeft
    1 -> TextAlignCenter
    2 -> TextAlignRight
    n -> error $ "(GuiTextAlignment.toEnum) Invalid value: " ++ show n

instance Storable GuiTextAlignment where
  sizeOf _ = 4
  alignment _ = 4
  peek ptr = do
    val <- peek (castPtr ptr)
    return $ toEnum $ fromEnum (val :: CInt)
  poke ptr v = poke (castPtr ptr) (fromIntegral (fromEnum v) :: CInt)

-- | Gui control text alignment vertical
data GuiTextAlignmentVertical
  = TextAlignTop
  | TextAlignMiddle
  | TextAlignBottom
  deriving (Eq, Show)

instance Enum GuiTextAlignmentVertical where
  fromEnum x = case x of
    TextAlignTop -> 0
    TextAlignMiddle -> 1
    TextAlignBottom -> 2
  toEnum x = case x of
    0 -> TextAlignTop
    1 -> TextAlignMiddle
    2 -> TextAlignBottom
    n -> error $ "(GuiTextAlignmentVertical.toEnum) Invalid value: " ++ show n

instance Storable GuiTextAlignmentVertical where
  sizeOf _ = 4
  alignment _ = 4
  peek ptr = do
    val <- peek (castPtr ptr)
    return $ toEnum $ fromEnum (val :: CInt)
  poke ptr v = poke (castPtr ptr) (fromIntegral (fromEnum v) :: CInt)

-- | Gui control text wrap mode
data GuiTextWrapMode
  = TextWrapNone
  | TextWrapChar
  | TextWrapWord
  deriving (Eq, Show)

instance Enum GuiTextWrapMode where
  fromEnum x = case x of
    TextWrapNone -> 0
    TextWrapChar -> 1
    TextWrapWord -> 2
  toEnum x = case x of
    0 -> TextWrapNone
    1 -> TextWrapChar
    2 -> TextWrapWord
    n -> error $ "(GuiTextWrapMode.toEnum) Invalid value: " ++ show n

instance Storable GuiTextWrapMode where
  sizeOf _ = 4
  alignment _ = 4
  peek ptr = do
    val <- peek (castPtr ptr)
    return $ toEnum $ fromEnum (val :: CInt)
  poke ptr v = poke (castPtr ptr) (fromIntegral (fromEnum v) :: CInt)

-- | Gui controls
data GuiControl
  = Default
  | -- | Used also for: LABELBUTTON
    Label
  | Button
  | -- | Used also for: TOGGLEGROUP
    Toggle
  | -- | Used also for: SLIDERBAR, TOGGLESLIDER
    Slider
  | Progressbar
  | Checkbox
  | Combobox
  | Dropdownbox
  | -- | Used also for: TEXTBOXMULTI
    Textbox
  | Valuebox
  | -- | Uses: BUTTON, VALUEBOX
    Spinner
  | Listview
  | Colorpicker
  | Scrollbar
  | Statusbar
  deriving (Eq, Show)

instance Enum GuiControl where
  fromEnum x = case x of
    Default -> 0
    Label -> 1
    Button -> 2
    Toggle -> 3
    Slider -> 4
    Progressbar -> 5
    Checkbox -> 6
    Combobox -> 7
    Dropdownbox -> 8
    Textbox -> 9
    Valuebox -> 10
    Spinner -> 11
    Listview -> 12
    Colorpicker -> 13
    Scrollbar -> 14
    Statusbar -> 15
  toEnum x = case x of
    0 -> Default
    1 -> Label
    2 -> Button
    3 -> Toggle
    4 -> Slider
    5 -> Progressbar
    6 -> Checkbox
    7 -> Combobox
    8 -> Dropdownbox
    9 -> Textbox
    10 -> Valuebox
    11 -> Spinner
    12 -> Listview
    13 -> Colorpicker
    14 -> Scrollbar
    15 -> Statusbar
    n -> error $ "(GuiControl.toEnum) Invalid value: " ++ show n

instance Storable GuiControl where
  sizeOf _ = 4
  alignment _ = 4
  peek ptr = do
    val <- peek (castPtr ptr)
    return $ toEnum $ fromEnum (val :: CInt)
  poke ptr v = poke (castPtr ptr) (fromIntegral (fromEnum v) :: CInt)

-- | Gui base properties for every control
data GuiControlProperty
  = -- | Control border color in STATE_NORMAL
    BorderColorNormal
  | -- | Control base color in STATE_NORMAL
    BaseColorNormal
  | -- | Control text color in STATE_NORMAL
    TextColorNormal
  | -- | Control border color in STATE_FOCUSED
    BorderColorFocused
  | -- | Control base color in STATE_FOCUSED
    BaseColorFocused
  | -- | Control text color in STATE_FOCUSED
    TextColorFocused
  | -- | Control border color in STATE_PRESSED
    BorderColorPressed
  | -- | Control base color in STATE_PRESSED
    BaseColorPressed
  | -- | Control text color in STATE_PRESSED
    TextColorPressed
  | -- | Control border color in STATE_DISABLED
    BorderColorDisabled
  | -- | Control base color in STATE_DISABLED
    BaseColorDisabled
  | -- | Control text color in STATE_DISABLED
    TextColorDisabled
  | -- | Control border size, 0 for no border
    BorderWidth
  | -- | Control text padding, not considering border
    TextPadding
  | -- | Control text horizontal alignment inside control text bound (after border and padding)
    TextAlignment
  deriving (Eq, Show)

instance Enum GuiControlProperty where
  fromEnum x = case x of
    BorderColorNormal -> 0
    BaseColorNormal -> 1
    TextColorNormal -> 2
    BorderColorFocused -> 3
    BaseColorFocused -> 4
    TextColorFocused -> 5
    BorderColorPressed -> 6
    BaseColorPressed -> 7
    TextColorPressed -> 8
    BorderColorDisabled -> 9
    BaseColorDisabled -> 10
    TextColorDisabled -> 11
    BorderWidth -> 12
    TextPadding -> 13
    TextAlignment -> 14
  toEnum x = case x of
    0 -> BorderColorNormal
    1 -> BaseColorNormal
    2 -> TextColorNormal
    3 -> BorderColorFocused
    4 -> BaseColorFocused
    5 -> TextColorFocused
    6 -> BorderColorPressed
    7 -> BaseColorPressed
    8 -> TextColorPressed
    9 -> BorderColorDisabled
    10 -> BaseColorDisabled
    11 -> TextColorDisabled
    12 -> BorderWidth
    13 -> TextPadding
    14 -> TextAlignment
    n -> error $ "(GuiControlProperty.toEnum) Invalid value: " ++ show n

instance Storable GuiControlProperty where
  sizeOf _ = 4
  alignment _ = 4
  peek ptr = do
    val <- peek (castPtr ptr)
    return $ toEnum $ fromEnum (val :: CInt)
  poke ptr v = poke (castPtr ptr) (fromIntegral (fromEnum v) :: CInt)

-- | DEFAULT extended properties
data GuiDefaultProperty
  = -- | Text size (glyphs max height)
    TextSize
  | -- | Text spacing between glyphs
    TextSpacing
  | -- | Line control color
    LineColor
  | -- | Background color
    BackgroundColor
  | -- | Text spacing between lines
    TextLineSpacing
  | -- | Text vertical alignment inside text bounds (after border and padding)
    TextAlignmentVertical
  | -- | Text wrap-mode inside text bounds
    TextWrapMode
  deriving (Eq, Show)

instance Enum GuiDefaultProperty where
  fromEnum x = case x of
    TextSize -> 16
    TextSpacing -> 17
    LineColor -> 18
    BackgroundColor -> 19
    TextLineSpacing -> 20
    TextAlignmentVertical -> 21
    TextWrapMode -> 22
  toEnum x = case x of
    16 -> TextSize
    17 -> TextSpacing
    18 -> LineColor
    19 -> BackgroundColor
    20 -> TextLineSpacing
    21 -> TextAlignmentVertical
    22 -> TextWrapMode
    n -> error $ "(GuiDefaultProperty.toEnum) Invalid value: " ++ show n

instance Storable GuiDefaultProperty where
  sizeOf _ = 4
  alignment _ = 4
  peek ptr = do
    val <- peek (castPtr ptr)
    return $ toEnum $ fromEnum (val :: CInt)
  poke ptr v = poke (castPtr ptr) (fromIntegral (fromEnum v) :: CInt)

-- | Toggle/ToggleGroup
data GuiToggleProperty
  = -- | ToggleGroup separation between toggles
    GroupPadding
  deriving (Eq, Show)

instance Enum GuiToggleProperty where
  fromEnum x = case x of
    GroupPadding -> 16
  toEnum x = case x of
    16 -> GroupPadding
    n -> error $ "(GuiToggleProperty.toEnum) Invalid value: " ++ show n

instance Storable GuiToggleProperty where
  sizeOf _ = 4
  alignment _ = 4
  peek ptr = do
    val <- peek (castPtr ptr)
    return $ toEnum $ fromEnum (val :: CInt)
  poke ptr v = poke (castPtr ptr) (fromIntegral (fromEnum v) :: CInt)

-- | Slider/SliderBar
data GuiSliderProperty
  = -- | Slider size of internal bar
    SliderWidth
  | -- | Slider/SliderBar internal bar padding
    SliderPadding
  deriving (Eq, Show)

instance Enum GuiSliderProperty where
  fromEnum x = case x of
    SliderWidth -> 16
    SliderPadding -> 17
  toEnum x = case x of
    16 -> SliderWidth
    17 -> SliderPadding
    n -> error $ "(GuiSliderProperty.toEnum) Invalid value: " ++ show n

instance Storable GuiSliderProperty where
  sizeOf _ = 4
  alignment _ = 4
  peek ptr = do
    val <- peek (castPtr ptr)
    return $ toEnum $ fromEnum (val :: CInt)
  poke ptr v = poke (castPtr ptr) (fromIntegral (fromEnum v) :: CInt)

-- | ProgressBar
data GuiProgressBarProperty
  = -- | ProgressBar internal padding
    ProgressPadding
  deriving (Eq, Show)

instance Enum GuiProgressBarProperty where
  fromEnum x = case x of
    ProgressPadding -> 16
  toEnum x = case x of
    16 -> ProgressPadding
    n -> error $ "(GuiProgressBarProperty.toEnum) Invalid value: " ++ show n

instance Storable GuiProgressBarProperty where
  sizeOf _ = 4
  alignment _ = 4
  peek ptr = do
    val <- peek (castPtr ptr)
    return $ toEnum $ fromEnum (val :: CInt)
  poke ptr v = poke (castPtr ptr) (fromIntegral (fromEnum v) :: CInt)

-- | ScrollBar
data GuiScrollBarProperty
  = -- | ScrollBar arrows size
    ArrowsSize
  | -- | ScrollBar arrows visible
    ArrowsVisible
  | -- | ScrollBar slider internal padding
    ScrollSliderPadding
  | -- | ScrollBar slider size
    ScrollSliderSize
  | -- | ScrollBar scroll padding from arrows
    ScrollPadding
  | -- | ScrollBar scrolling speed
    ScrollSpeed
  deriving (Eq, Show)

instance Enum GuiScrollBarProperty where
  fromEnum x = case x of
    ArrowsSize -> 16
    ArrowsVisible -> 17
    ScrollSliderPadding -> 18
    ScrollSliderSize -> 19
    ScrollPadding -> 20
    ScrollSpeed -> 21
  toEnum x = case x of
    16 -> ArrowsSize
    17 -> ArrowsVisible
    18 -> ScrollSliderPadding
    19 -> ScrollSliderSize
    20 -> ScrollPadding
    21 -> ScrollSpeed
    n -> error $ "(GuiScrollBarProperty.toEnum) Invalid value: " ++ show n

instance Storable GuiScrollBarProperty where
  sizeOf _ = 4
  alignment _ = 4
  peek ptr = do
    val <- peek (castPtr ptr)
    return $ toEnum $ fromEnum (val :: CInt)
  poke ptr v = poke (castPtr ptr) (fromIntegral (fromEnum v) :: CInt)

-- | CheckBox
data GuiCheckBoxProperty
  = -- | CheckBox internal check padding
    CheckPadding
  deriving (Eq, Show)

instance Enum GuiCheckBoxProperty where
  fromEnum x = case x of
    CheckPadding -> 16
  toEnum x = case x of
    16 -> CheckPadding
    n -> error $ "(GuiCheckBoxProperty.toEnum) Invalid value: " ++ show n

instance Storable GuiCheckBoxProperty where
  sizeOf _ = 4
  alignment _ = 4
  peek ptr = do
    val <- peek (castPtr ptr)
    return $ toEnum $ fromEnum (val :: CInt)
  poke ptr v = poke (castPtr ptr) (fromIntegral (fromEnum v) :: CInt)

-- | ComboBox
data GuiComboBoxProperty
  = -- | ComboBox right button width
    ComboButtonWidth
  | -- | ComboBox button separation
    ComboButtonSpacing
  deriving (Eq, Show)

instance Enum GuiComboBoxProperty where
  fromEnum x = case x of
    ComboButtonWidth -> 16
    ComboButtonSpacing -> 17
  toEnum x = case x of
    16 -> ComboButtonWidth
    17 -> ComboButtonSpacing
    n -> error $ "(GuiComboBoxProperty.toEnum) Invalid value: " ++ show n

instance Storable GuiComboBoxProperty where
  sizeOf _ = 4
  alignment _ = 4
  peek ptr = do
    val <- peek (castPtr ptr)
    return $ toEnum $ fromEnum (val :: CInt)
  poke ptr v = poke (castPtr ptr) (fromIntegral (fromEnum v) :: CInt)

-- | DropdownBox
data GuiDropdownBoxProperty
  = -- | DropdownBox arrow separation from border and items
    ArrowPadding
  | -- | DropdownBox items separation
    DropdownItemsSpacing
  deriving (Eq, Show)

instance Enum GuiDropdownBoxProperty where
  fromEnum x = case x of
    ArrowPadding -> 16
    DropdownItemsSpacing -> 17
  toEnum x = case x of
    16 -> ArrowPadding
    17 -> DropdownItemsSpacing
    n -> error $ "(GuiDropdownBoxProperty.toEnum) Invalid value: " ++ show n

instance Storable GuiDropdownBoxProperty where
  sizeOf _ = 4
  alignment _ = 4
  peek ptr = do
    val <- peek (castPtr ptr)
    return $ toEnum $ fromEnum (val :: CInt)
  poke ptr v = poke (castPtr ptr) (fromIntegral (fromEnum v) :: CInt)

-- | TextBox/TextBoxMulti/ValueBox/Spinner
data GuiTextBoxProperty
  = -- | TextBox in read-only mode: 0-text editable, 1-text no-editable
    TextReadonly
  deriving (Eq, Show)

instance Enum GuiTextBoxProperty where
  fromEnum x = case x of
    TextReadonly -> 16
  toEnum x = case x of
    16 -> TextReadonly
    n -> error $ "(GuiTextBoxProperty.toEnum) Invalid value: " ++ show n

instance Storable GuiTextBoxProperty where
  sizeOf _ = 4
  alignment _ = 4
  peek ptr = do
    val <- peek (castPtr ptr)
    return $ toEnum $ fromEnum (val :: CInt)
  poke ptr v = poke (castPtr ptr) (fromIntegral (fromEnum v) :: CInt)

-- | Spinner
data GuiSpinnerProperty
  = -- | Spinner left/right buttons width
    SpinButtonWidth
  | -- | Spinner buttons separation
    SpinButtonSpacing
  deriving (Eq, Show)

instance Enum GuiSpinnerProperty where
  fromEnum x = case x of
    SpinButtonWidth -> 16
    SpinButtonSpacing -> 17
  toEnum x = case x of
    16 -> SpinButtonWidth
    17 -> SpinButtonSpacing
    n -> error $ "(GuiSpinnerProperty.toEnum) Invalid value: " ++ show n

instance Storable GuiSpinnerProperty where
  sizeOf _ = 4
  alignment _ = 4
  peek ptr = do
    val <- peek (castPtr ptr)
    return $ toEnum $ fromEnum (val :: CInt)
  poke ptr v = poke (castPtr ptr) (fromIntegral (fromEnum v) :: CInt)

-- | ListView
data GuiListViewProperty
  = -- | ListView items height
    ListItemsHeight
  | -- | ListView items separation
    ListItemsSpacing
  | -- | ListView scrollbar size (usually width)
    ScrollbarWidth
  | -- | ListView scrollbar side (0-SCROLLBAR_LEFT_SIDE, 1-SCROLLBAR_RIGHT_SIDE)
    ScrollbarSide
  deriving (Eq, Show)

instance Enum GuiListViewProperty where
  fromEnum x = case x of
    ListItemsHeight -> 16
    ListItemsSpacing -> 17
    ScrollbarWidth -> 18
    ScrollbarSide -> 19
  toEnum x = case x of
    16 -> ListItemsHeight
    17 -> ListItemsSpacing
    18 -> ScrollbarWidth
    19 -> ScrollbarSide
    n -> error $ "(GuiListViewProperty.toEnum) Invalid value: " ++ show n

instance Storable GuiListViewProperty where
  sizeOf _ = 4
  alignment _ = 4
  peek ptr = do
    val <- peek (castPtr ptr)
    return $ toEnum $ fromEnum (val :: CInt)
  poke ptr v = poke (castPtr ptr) (fromIntegral (fromEnum v) :: CInt)

-- | ColorPicker
data GuiColorPickerProperty
  = ColorSelectorSize
  | -- | ColorPicker right hue bar width
    HuebarWidth
  | -- | ColorPicker right hue bar separation from panel
    HuebarPadding
  | -- | ColorPicker right hue bar selector height
    HuebarSelectorHeight
  | -- | ColorPicker right hue bar selector overflow
    HuebarSelectorOverflow
  deriving (Eq, Show)

instance Enum GuiColorPickerProperty where
  fromEnum x = case x of
    ColorSelectorSize -> 16
    HuebarWidth -> 17
    HuebarPadding -> 18
    HuebarSelectorHeight -> 19
    HuebarSelectorOverflow -> 20
  toEnum x = case x of
    16 -> ColorSelectorSize
    17 -> HuebarWidth
    18 -> HuebarPadding
    19 -> HuebarSelectorHeight
    20 -> HuebarSelectorOverflow
    n -> error $ "(GuiColorPickerProperty.toEnum) Invalid value: " ++ show n

instance Storable GuiColorPickerProperty where
  sizeOf _ = 4
  alignment _ = 4
  peek ptr = do
    val <- peek (castPtr ptr)
    return $ toEnum $ fromEnum (val :: CInt)
  poke ptr v = poke (castPtr ptr) (fromIntegral (fromEnum v) :: CInt)

data GuiIconName
  = IconNone
  | IconFolderFileOpen
  | IconFileSaveClassic
  | IconFolderOpen
  | IconFolderSave
  | IconFileOpen
  | IconFileSave
  | IconFileExport
  | IconFileAdd
  | IconFileDelete
  | IconFiletypeText
  | IconFiletypeAudio
  | IconFiletypeImage
  | IconFiletypePlay
  | IconFiletypeVideo
  | IconFiletypeInfo
  | IconFileCopy
  | IconFileCut
  | IconFilePaste
  | IconCursorHand
  | IconCursorPointer
  | IconCursorClassic
  | IconPencil
  | IconPencilBig
  | IconBrushClassic
  | IconBrushPainter
  | IconWaterDrop
  | IconColorPicker
  | IconRubber
  | IconColorBucket
  | IconTextT
  | IconTextA
  | IconScale
  | IconResize
  | IconFilterPoint
  | IconFilterBilinear
  | IconCrop
  | IconCropAlpha
  | IconSquareToggle
  | IconSymmetry
  | IconSymmetryHorizontal
  | IconSymmetryVertical
  | IconLens
  | IconLensBig
  | IconEyeOn
  | IconEyeOff
  | IconFilterTop
  | IconFilter
  | IconTargetPoint
  | IconTargetSmall
  | IconTargetBig
  | IconTargetMove
  | IconCursorMove
  | IconCursorScale
  | IconCursorScaleRight
  | IconCursorScaleLeft
  | IconUndo
  | IconRedo
  | IconReredo
  | IconMutate
  | IconRotate
  | IconRepeat
  | IconShuffle
  | IconEmptybox
  | IconTarget
  | IconTargetSmallFill
  | IconTargetBigFill
  | IconTargetMoveFill
  | IconCursorMoveFill
  | IconCursorScaleFill
  | IconCursorScaleRightFill
  | IconCursorScaleLeftFill
  | IconUndoFill
  | IconRedoFill
  | IconReredoFill
  | IconMutateFill
  | IconRotateFill
  | IconRepeatFill
  | IconShuffleFill
  | IconEmptyboxSmall
  | IconBox
  | IconBoxTop
  | IconBoxTopRight
  | IconBoxRight
  | IconBoxBottomRight
  | IconBoxBottom
  | IconBoxBottomLeft
  | IconBoxLeft
  | IconBoxTopLeft
  | IconBoxCenter
  | IconBoxCircleMask
  | IconPot
  | IconAlphaMultiply
  | IconAlphaClear
  | IconDithering
  | IconMipmaps
  | IconBoxGrid
  | IconGrid
  | IconBoxCornersSmall
  | IconBoxCornersBig
  | IconFourBoxes
  | IconGridFill
  | IconBoxMultisize
  | IconZoomSmall
  | IconZoomMedium
  | IconZoomBig
  | IconZoomAll
  | IconZoomCenter
  | IconBoxDotsSmall
  | IconBoxDotsBig
  | IconBoxConcentric
  | IconBoxGridBig
  | IconOkTick
  | IconCross
  | IconArrowLeft
  | IconArrowRight
  | IconArrowDown
  | IconArrowUp
  | IconArrowLeftFill
  | IconArrowRightFill
  | IconArrowDownFill
  | IconArrowUpFill
  | IconAudio
  | IconFx
  | IconWave
  | IconWaveSinus
  | IconWaveSquare
  | IconWaveTriangular
  | IconCrossSmall
  | IconPlayerPrevious
  | IconPlayerPlayBack
  | IconPlayerPlay
  | IconPlayerPause
  | IconPlayerStop
  | IconPlayerNext
  | IconPlayerRecord
  | IconMagnet
  | IconLockClose
  | IconLockOpen
  | IconClock
  | IconTools
  | IconGear
  | IconGearBig
  | IconBin
  | IconHandPointer
  | IconLaser
  | IconCoin
  | IconExplosion
  | Icon1up
  | IconPlayer
  | IconPlayerJump
  | IconKey
  | IconDemon
  | IconTextPopup
  | IconGearEx
  | IconCrack
  | IconCrackPoints
  | IconStar
  | IconDoor
  | IconExit
  | IconMode2d
  | IconMode3d
  | IconCube
  | IconCubeFaceTop
  | IconCubeFaceLeft
  | IconCubeFaceFront
  | IconCubeFaceBottom
  | IconCubeFaceRight
  | IconCubeFaceBack
  | IconCamera
  | IconSpecial
  | IconLinkNet
  | IconLinkBoxes
  | IconLinkMulti
  | IconLink
  | IconLinkBroke
  | IconTextNotes
  | IconNotebook
  | IconSuitcase
  | IconSuitcaseZip
  | IconMailbox
  | IconMonitor
  | IconPrinter
  | IconPhotoCamera
  | IconPhotoCameraFlash
  | IconHouse
  | IconHeart
  | IconCorner
  | IconVerticalBars
  | IconVerticalBarsFill
  | IconLifeBars
  | IconInfo
  | IconCrossline
  | IconHelp
  | IconFiletypeAlpha
  | IconFiletypeHome
  | IconLayersVisible
  | IconLayers
  | IconWindow
  | IconHidpi
  | IconFiletypeBinary
  | IconHex
  | IconShield
  | IconFileNew
  | IconFolderAdd
  | IconAlarm
  | IconCpu
  | IconRom
  | IconStepOver
  | IconStepInto
  | IconStepOut
  | IconRestart
  | IconBreakpointOn
  | IconBreakpointOff
  | IconBurgerMenu
  | IconCaseSensitive
  | IconRegExp
  | IconFolder
  | IconFile
  | IconSandTimer
  | Icon220
  | Icon221
  | Icon222
  | Icon223
  | Icon224
  | Icon225
  | Icon226
  | Icon227
  | Icon228
  | Icon229
  | Icon230
  | Icon231
  | Icon232
  | Icon233
  | Icon234
  | Icon235
  | Icon236
  | Icon237
  | Icon238
  | Icon239
  | Icon240
  | Icon241
  | Icon242
  | Icon243
  | Icon244
  | Icon245
  | Icon246
  | Icon247
  | Icon248
  | Icon249
  | Icon250
  | Icon251
  | Icon252
  | Icon253
  | Icon254
  | Icon255
  deriving (Eq, Show)

instance Enum GuiIconName where
  fromEnum x = case x of
    IconNone -> 0
    IconFolderFileOpen -> 1
    IconFileSaveClassic -> 2
    IconFolderOpen -> 3
    IconFolderSave -> 4
    IconFileOpen -> 5
    IconFileSave -> 6
    IconFileExport -> 7
    IconFileAdd -> 8
    IconFileDelete -> 9
    IconFiletypeText -> 10
    IconFiletypeAudio -> 11
    IconFiletypeImage -> 12
    IconFiletypePlay -> 13
    IconFiletypeVideo -> 14
    IconFiletypeInfo -> 15
    IconFileCopy -> 16
    IconFileCut -> 17
    IconFilePaste -> 18
    IconCursorHand -> 19
    IconCursorPointer -> 20
    IconCursorClassic -> 21
    IconPencil -> 22
    IconPencilBig -> 23
    IconBrushClassic -> 24
    IconBrushPainter -> 25
    IconWaterDrop -> 26
    IconColorPicker -> 27
    IconRubber -> 28
    IconColorBucket -> 29
    IconTextT -> 30
    IconTextA -> 31
    IconScale -> 32
    IconResize -> 33
    IconFilterPoint -> 34
    IconFilterBilinear -> 35
    IconCrop -> 36
    IconCropAlpha -> 37
    IconSquareToggle -> 38
    IconSymmetry -> 39
    IconSymmetryHorizontal -> 40
    IconSymmetryVertical -> 41
    IconLens -> 42
    IconLensBig -> 43
    IconEyeOn -> 44
    IconEyeOff -> 45
    IconFilterTop -> 46
    IconFilter -> 47
    IconTargetPoint -> 48
    IconTargetSmall -> 49
    IconTargetBig -> 50
    IconTargetMove -> 51
    IconCursorMove -> 52
    IconCursorScale -> 53
    IconCursorScaleRight -> 54
    IconCursorScaleLeft -> 55
    IconUndo -> 56
    IconRedo -> 57
    IconReredo -> 58
    IconMutate -> 59
    IconRotate -> 60
    IconRepeat -> 61
    IconShuffle -> 62
    IconEmptybox -> 63
    IconTarget -> 64
    IconTargetSmallFill -> 65
    IconTargetBigFill -> 66
    IconTargetMoveFill -> 67
    IconCursorMoveFill -> 68
    IconCursorScaleFill -> 69
    IconCursorScaleRightFill -> 70
    IconCursorScaleLeftFill -> 71
    IconUndoFill -> 72
    IconRedoFill -> 73
    IconReredoFill -> 74
    IconMutateFill -> 75
    IconRotateFill -> 76
    IconRepeatFill -> 77
    IconShuffleFill -> 78
    IconEmptyboxSmall -> 79
    IconBox -> 80
    IconBoxTop -> 81
    IconBoxTopRight -> 82
    IconBoxRight -> 83
    IconBoxBottomRight -> 84
    IconBoxBottom -> 85
    IconBoxBottomLeft -> 86
    IconBoxLeft -> 87
    IconBoxTopLeft -> 88
    IconBoxCenter -> 89
    IconBoxCircleMask -> 90
    IconPot -> 91
    IconAlphaMultiply -> 92
    IconAlphaClear -> 93
    IconDithering -> 94
    IconMipmaps -> 95
    IconBoxGrid -> 96
    IconGrid -> 97
    IconBoxCornersSmall -> 98
    IconBoxCornersBig -> 99
    IconFourBoxes -> 100
    IconGridFill -> 101
    IconBoxMultisize -> 102
    IconZoomSmall -> 103
    IconZoomMedium -> 104
    IconZoomBig -> 105
    IconZoomAll -> 106
    IconZoomCenter -> 107
    IconBoxDotsSmall -> 108
    IconBoxDotsBig -> 109
    IconBoxConcentric -> 110
    IconBoxGridBig -> 111
    IconOkTick -> 112
    IconCross -> 113
    IconArrowLeft -> 114
    IconArrowRight -> 115
    IconArrowDown -> 116
    IconArrowUp -> 117
    IconArrowLeftFill -> 118
    IconArrowRightFill -> 119
    IconArrowDownFill -> 120
    IconArrowUpFill -> 121
    IconAudio -> 122
    IconFx -> 123
    IconWave -> 124
    IconWaveSinus -> 125
    IconWaveSquare -> 126
    IconWaveTriangular -> 127
    IconCrossSmall -> 128
    IconPlayerPrevious -> 129
    IconPlayerPlayBack -> 130
    IconPlayerPlay -> 131
    IconPlayerPause -> 132
    IconPlayerStop -> 133
    IconPlayerNext -> 134
    IconPlayerRecord -> 135
    IconMagnet -> 136
    IconLockClose -> 137
    IconLockOpen -> 138
    IconClock -> 139
    IconTools -> 140
    IconGear -> 141
    IconGearBig -> 142
    IconBin -> 143
    IconHandPointer -> 144
    IconLaser -> 145
    IconCoin -> 146
    IconExplosion -> 147
    Icon1up -> 148
    IconPlayer -> 149
    IconPlayerJump -> 150
    IconKey -> 151
    IconDemon -> 152
    IconTextPopup -> 153
    IconGearEx -> 154
    IconCrack -> 155
    IconCrackPoints -> 156
    IconStar -> 157
    IconDoor -> 158
    IconExit -> 159
    IconMode2d -> 160
    IconMode3d -> 161
    IconCube -> 162
    IconCubeFaceTop -> 163
    IconCubeFaceLeft -> 164
    IconCubeFaceFront -> 165
    IconCubeFaceBottom -> 166
    IconCubeFaceRight -> 167
    IconCubeFaceBack -> 168
    IconCamera -> 169
    IconSpecial -> 170
    IconLinkNet -> 171
    IconLinkBoxes -> 172
    IconLinkMulti -> 173
    IconLink -> 174
    IconLinkBroke -> 175
    IconTextNotes -> 176
    IconNotebook -> 177
    IconSuitcase -> 178
    IconSuitcaseZip -> 179
    IconMailbox -> 180
    IconMonitor -> 181
    IconPrinter -> 182
    IconPhotoCamera -> 183
    IconPhotoCameraFlash -> 184
    IconHouse -> 185
    IconHeart -> 186
    IconCorner -> 187
    IconVerticalBars -> 188
    IconVerticalBarsFill -> 189
    IconLifeBars -> 190
    IconInfo -> 191
    IconCrossline -> 192
    IconHelp -> 193
    IconFiletypeAlpha -> 194
    IconFiletypeHome -> 195
    IconLayersVisible -> 196
    IconLayers -> 197
    IconWindow -> 198
    IconHidpi -> 199
    IconFiletypeBinary -> 200
    IconHex -> 201
    IconShield -> 202
    IconFileNew -> 203
    IconFolderAdd -> 204
    IconAlarm -> 205
    IconCpu -> 206
    IconRom -> 207
    IconStepOver -> 208
    IconStepInto -> 209
    IconStepOut -> 210
    IconRestart -> 211
    IconBreakpointOn -> 212
    IconBreakpointOff -> 213
    IconBurgerMenu -> 214
    IconCaseSensitive -> 215
    IconRegExp -> 216
    IconFolder -> 217
    IconFile -> 218
    IconSandTimer -> 219
    Icon220 -> 220
    Icon221 -> 221
    Icon222 -> 222
    Icon223 -> 223
    Icon224 -> 224
    Icon225 -> 225
    Icon226 -> 226
    Icon227 -> 227
    Icon228 -> 228
    Icon229 -> 229
    Icon230 -> 230
    Icon231 -> 231
    Icon232 -> 232
    Icon233 -> 233
    Icon234 -> 234
    Icon235 -> 235
    Icon236 -> 236
    Icon237 -> 237
    Icon238 -> 238
    Icon239 -> 239
    Icon240 -> 240
    Icon241 -> 241
    Icon242 -> 242
    Icon243 -> 243
    Icon244 -> 244
    Icon245 -> 245
    Icon246 -> 246
    Icon247 -> 247
    Icon248 -> 248
    Icon249 -> 249
    Icon250 -> 250
    Icon251 -> 251
    Icon252 -> 252
    Icon253 -> 253
    Icon254 -> 254
    Icon255 -> 255
  toEnum x = case x of
    0 -> IconNone
    1 -> IconFolderFileOpen
    2 -> IconFileSaveClassic
    3 -> IconFolderOpen
    4 -> IconFolderSave
    5 -> IconFileOpen
    6 -> IconFileSave
    7 -> IconFileExport
    8 -> IconFileAdd
    9 -> IconFileDelete
    10 -> IconFiletypeText
    11 -> IconFiletypeAudio
    12 -> IconFiletypeImage
    13 -> IconFiletypePlay
    14 -> IconFiletypeVideo
    15 -> IconFiletypeInfo
    16 -> IconFileCopy
    17 -> IconFileCut
    18 -> IconFilePaste
    19 -> IconCursorHand
    20 -> IconCursorPointer
    21 -> IconCursorClassic
    22 -> IconPencil
    23 -> IconPencilBig
    24 -> IconBrushClassic
    25 -> IconBrushPainter
    26 -> IconWaterDrop
    27 -> IconColorPicker
    28 -> IconRubber
    29 -> IconColorBucket
    30 -> IconTextT
    31 -> IconTextA
    32 -> IconScale
    33 -> IconResize
    34 -> IconFilterPoint
    35 -> IconFilterBilinear
    36 -> IconCrop
    37 -> IconCropAlpha
    38 -> IconSquareToggle
    39 -> IconSymmetry
    40 -> IconSymmetryHorizontal
    41 -> IconSymmetryVertical
    42 -> IconLens
    43 -> IconLensBig
    44 -> IconEyeOn
    45 -> IconEyeOff
    46 -> IconFilterTop
    47 -> IconFilter
    48 -> IconTargetPoint
    49 -> IconTargetSmall
    50 -> IconTargetBig
    51 -> IconTargetMove
    52 -> IconCursorMove
    53 -> IconCursorScale
    54 -> IconCursorScaleRight
    55 -> IconCursorScaleLeft
    56 -> IconUndo
    57 -> IconRedo
    58 -> IconReredo
    59 -> IconMutate
    60 -> IconRotate
    61 -> IconRepeat
    62 -> IconShuffle
    63 -> IconEmptybox
    64 -> IconTarget
    65 -> IconTargetSmallFill
    66 -> IconTargetBigFill
    67 -> IconTargetMoveFill
    68 -> IconCursorMoveFill
    69 -> IconCursorScaleFill
    70 -> IconCursorScaleRightFill
    71 -> IconCursorScaleLeftFill
    72 -> IconUndoFill
    73 -> IconRedoFill
    74 -> IconReredoFill
    75 -> IconMutateFill
    76 -> IconRotateFill
    77 -> IconRepeatFill
    78 -> IconShuffleFill
    79 -> IconEmptyboxSmall
    80 -> IconBox
    81 -> IconBoxTop
    82 -> IconBoxTopRight
    83 -> IconBoxRight
    84 -> IconBoxBottomRight
    85 -> IconBoxBottom
    86 -> IconBoxBottomLeft
    87 -> IconBoxLeft
    88 -> IconBoxTopLeft
    89 -> IconBoxCenter
    90 -> IconBoxCircleMask
    91 -> IconPot
    92 -> IconAlphaMultiply
    93 -> IconAlphaClear
    94 -> IconDithering
    95 -> IconMipmaps
    96 -> IconBoxGrid
    97 -> IconGrid
    98 -> IconBoxCornersSmall
    99 -> IconBoxCornersBig
    100 -> IconFourBoxes
    101 -> IconGridFill
    102 -> IconBoxMultisize
    103 -> IconZoomSmall
    104 -> IconZoomMedium
    105 -> IconZoomBig
    106 -> IconZoomAll
    107 -> IconZoomCenter
    108 -> IconBoxDotsSmall
    109 -> IconBoxDotsBig
    110 -> IconBoxConcentric
    111 -> IconBoxGridBig
    112 -> IconOkTick
    113 -> IconCross
    114 -> IconArrowLeft
    115 -> IconArrowRight
    116 -> IconArrowDown
    117 -> IconArrowUp
    118 -> IconArrowLeftFill
    119 -> IconArrowRightFill
    120 -> IconArrowDownFill
    121 -> IconArrowUpFill
    122 -> IconAudio
    123 -> IconFx
    124 -> IconWave
    125 -> IconWaveSinus
    126 -> IconWaveSquare
    127 -> IconWaveTriangular
    128 -> IconCrossSmall
    129 -> IconPlayerPrevious
    130 -> IconPlayerPlayBack
    131 -> IconPlayerPlay
    132 -> IconPlayerPause
    133 -> IconPlayerStop
    134 -> IconPlayerNext
    135 -> IconPlayerRecord
    136 -> IconMagnet
    137 -> IconLockClose
    138 -> IconLockOpen
    139 -> IconClock
    140 -> IconTools
    141 -> IconGear
    142 -> IconGearBig
    143 -> IconBin
    144 -> IconHandPointer
    145 -> IconLaser
    146 -> IconCoin
    147 -> IconExplosion
    148 -> Icon1up
    149 -> IconPlayer
    150 -> IconPlayerJump
    151 -> IconKey
    152 -> IconDemon
    153 -> IconTextPopup
    154 -> IconGearEx
    155 -> IconCrack
    156 -> IconCrackPoints
    157 -> IconStar
    158 -> IconDoor
    159 -> IconExit
    160 -> IconMode2d
    161 -> IconMode3d
    162 -> IconCube
    163 -> IconCubeFaceTop
    164 -> IconCubeFaceLeft
    165 -> IconCubeFaceFront
    166 -> IconCubeFaceBottom
    167 -> IconCubeFaceRight
    168 -> IconCubeFaceBack
    169 -> IconCamera
    170 -> IconSpecial
    171 -> IconLinkNet
    172 -> IconLinkBoxes
    173 -> IconLinkMulti
    174 -> IconLink
    175 -> IconLinkBroke
    176 -> IconTextNotes
    177 -> IconNotebook
    178 -> IconSuitcase
    179 -> IconSuitcaseZip
    180 -> IconMailbox
    181 -> IconMonitor
    182 -> IconPrinter
    183 -> IconPhotoCamera
    184 -> IconPhotoCameraFlash
    185 -> IconHouse
    186 -> IconHeart
    187 -> IconCorner
    188 -> IconVerticalBars
    189 -> IconVerticalBarsFill
    190 -> IconLifeBars
    191 -> IconInfo
    192 -> IconCrossline
    193 -> IconHelp
    194 -> IconFiletypeAlpha
    195 -> IconFiletypeHome
    196 -> IconLayersVisible
    197 -> IconLayers
    198 -> IconWindow
    199 -> IconHidpi
    200 -> IconFiletypeBinary
    201 -> IconHex
    202 -> IconShield
    203 -> IconFileNew
    204 -> IconFolderAdd
    205 -> IconAlarm
    206 -> IconCpu
    207 -> IconRom
    208 -> IconStepOver
    209 -> IconStepInto
    210 -> IconStepOut
    211 -> IconRestart
    212 -> IconBreakpointOn
    213 -> IconBreakpointOff
    214 -> IconBurgerMenu
    215 -> IconCaseSensitive
    216 -> IconRegExp
    217 -> IconFolder
    218 -> IconFile
    219 -> IconSandTimer
    220 -> Icon220
    221 -> Icon221
    222 -> Icon222
    223 -> Icon223
    224 -> Icon224
    225 -> Icon225
    226 -> Icon226
    227 -> Icon227
    228 -> Icon228
    229 -> Icon229
    230 -> Icon230
    231 -> Icon231
    232 -> Icon232
    233 -> Icon233
    234 -> Icon234
    235 -> Icon235
    236 -> Icon236
    237 -> Icon237
    238 -> Icon238
    239 -> Icon239
    240 -> Icon240
    241 -> Icon241
    242 -> Icon242
    243 -> Icon243
    244 -> Icon244
    245 -> Icon245
    246 -> Icon246
    247 -> Icon247
    248 -> Icon248
    249 -> Icon249
    250 -> Icon250
    251 -> Icon251
    252 -> Icon252
    253 -> Icon253
    254 -> Icon254
    255 -> Icon255
    n -> error $ "(GuiIconName.toEnum) Invalid value: " ++ show n

instance Storable GuiIconName where
  sizeOf _ = 4
  alignment _ = 4
  peek ptr = do
    val <- peek (castPtr ptr)
    return $ toEnum $ fromEnum (val :: CInt)
  poke ptr v = poke (castPtr ptr) (fromIntegral (fromEnum v) :: CInt)

---------------------------------------
-- raygui structures ------------------
---------------------------------------

-- | Style property
--
-- NOTE: Used when exporting style as code for convenience
data GuiStyleProp = GuiStyleProp
  { -- | Control identifier
    guiStyleProp'controlId :: Word16,
    -- | Property identifier
    guiStyleProp'propertyId :: Word16,
    -- | Property value
    guiStyleProp'propertyValue :: Int
  }
  deriving (Eq, Show, Freeable)

instance Storable GuiStyleProp where
  sizeOf _ = 8
  alignment _ = 4
  peek _p = do
    controlId <- fromIntegral <$> peek (p'guiStyleProp'controlId _p)
    propertyId <- fromIntegral <$> peek (p'guiStyleProp'propertyId _p)
    propertyValue <- fromIntegral <$> peek (p'guiStyleProp'propertyValue _p)
    return $ GuiStyleProp controlId propertyId propertyValue
  poke _p (GuiStyleProp controlId propertyId propertyValue) = do
    poke (p'guiStyleProp'controlId _p) (fromIntegral controlId)
    poke (p'guiStyleProp'propertyId _p) (fromIntegral propertyId)
    poke (p'guiStyleProp'propertyValue _p) (fromIntegral propertyValue)
    return ()

p'guiStyleProp'controlId :: Ptr GuiStyleProp -> Ptr CUShort
p'guiStyleProp'controlId = (`plusPtr` 0)

p'guiStyleProp'propertyId :: Ptr GuiStyleProp -> Ptr CUShort
p'guiStyleProp'propertyId = (`plusPtr` 2)

p'guiStyleProp'propertyValue :: Ptr GuiStyleProp -> Ptr CInt
p'guiStyleProp'propertyValue = (`plusPtr` 4)