1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274
|
{-# LANGUAGE CPP #-}
-- -*-haskell-*-
-- GIMP Toolkit (GTK) Widget HSV
--
-- Author : Andy Stewart
--
-- Created: 25 Mar 2010
--
-- Copyright (C) 2010 Andy Stewart
--
-- This library is free software; you can redistribute it and/or
-- modify it under the terms of the GNU Lesser General Public
-- License as published by the Free Software Foundation; either
-- version 2.1 of the License, or (at your option) any later version.
--
-- This library is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-- Lesser General Public License for more details.
--
-- |
-- Maintainer : gtk2hs-users@lists.sourceforge.net
-- Stability : provisional
-- Portability : portable (depends on GHC)
--
-- A \'color wheel\' widget
--
-- * Module available since Gtk+ version 2.14
--
module Graphics.UI.Gtk.Selectors.HSV (
-- * Detail
--
-- | 'HSV' is the \'color wheel\' part of a complete color selector widget. It
-- allows to select a color by determining its 'HSV' components in an intuitive
-- way. Moving the selection around the outer ring changes the hue, and moving
-- the selection point inside the inner triangle changes value and saturation.
-- * Class Hierarchy
--
-- |
-- @
-- | 'GObject'
-- | +----'Object'
-- | +----'Widget'
-- | +----HSV
-- @
#if GTK_CHECK_VERSION(2,14,0)
-- * Types
HSV,
HSVClass,
castToHSV,
toHSV,
-- * Constructors
hsvNew,
-- * Methods
hsvIsAdjusting,
hsvToRgb,
rgbToHsv,
-- * Attributes
hsvColor,
hsvMetrics,
-- * Signals
hsvChanged,
hsvMove,
#endif
) where
import Control.Monad (liftM)
import System.Glib.FFI
import System.Glib.Attributes
import Graphics.UI.Gtk.General.Enums (DirectionType (..))
import Graphics.UI.Gtk.Abstract.Object (makeNewObject)
{#import Graphics.UI.Gtk.Signals#}
{#import Graphics.UI.Gtk.Types#}
{# context lib="gtk" prefix="gtk" #}
#if GTK_CHECK_VERSION(2,14,0)
--------------------
-- Constructors
-- | Creates a new 'HSV' color selector.
--
-- * Available since 2.14
--
hsvNew :: IO HSV
hsvNew =
makeNewObject mkHSV $
liftM (castPtr :: Ptr Widget -> Ptr HSV) $
{# call gtk_hsv_new #}
--------------------
-- Methods
-- | Sets the current color in an 'HSV' color selector. Color component values
-- must be in the [0.0, 1.0] range.
--
-- * Available since 2.14
--
hsvSetColor :: HSVClass self => self
-> (Double, Double, Double)
-- ^ @(h, s, v)@
-- @h@ - value for the hue
-- @s@ value for the saturation
-- @v@ value for the value
-> IO ()
hsvSetColor self (h, s, v) =
{# call gtk_hsv_set_color #}
(toHSV self)
(realToFrac h)
(realToFrac s)
(realToFrac v)
-- | Queries the current color in an 'HSV' color selector. Returned values will
-- be in the [0.0, 1.0] range.
--
hsvGetColor :: HSVClass self => self
-> IO (Double, Double, Double) -- ^ @(h, s, v)@ @h@ - Return value for the hue @s@ -
-- Return value for the saturation @v@ - Return
-- value for the value
hsvGetColor self =
alloca $ \hPtr ->
alloca $ \sPtr ->
alloca $ \vPtr -> do
{# call gtk_hsv_get_color #}
(toHSV self)
hPtr
sPtr
vPtr
h <- peek hPtr
s <- peek sPtr
v <- peek vPtr
return (realToFrac h, realToFrac s, realToFrac v)
-- | Sets the size and ring width of an 'HSV' color selector.
--
hsvSetMetrics :: HSVClass self => self
-> (Int, Int)
-- ^ @(size, ringWidth)@
-- ^ @size@ - Diameter for the hue ring
-- ^ @ringWidth@ - Width of the hue ring
-> IO ()
hsvSetMetrics self (size, ringWidth) =
{# call gtk_hsv_set_metrics #}
(toHSV self)
(fromIntegral size)
(fromIntegral ringWidth)
-- | Queries the size and ring width of an 'HSV' color selector.
--
hsvGetMetrics :: HSVClass self => self
-> IO (Int, Int) -- ^ @(size, ringWidth)@
-- @size@ - Return value for the diameter of the hue ring
-- @ringWidth@ - Return value for the width of the hue ring
hsvGetMetrics self =
alloca $ \sizePtr ->
alloca $ \ringWidthPtr -> do
{# call gtk_hsv_get_metrics #}
(toHSV self)
sizePtr
ringWidthPtr
size <- peek sizePtr
ringWidth <- peek ringWidthPtr
return (fromIntegral size, fromIntegral ringWidth)
-- | An 'HSV' color selector can be said to be adjusting if multiple rapid
-- changes are being made to its value, for example, when the user is adjusting
-- the value with the mouse. This function queries whether the 'HSV' color
-- selector is being adjusted or not.
--
hsvIsAdjusting :: HSVClass self => self
-> IO Bool -- ^ returns @True@ if clients can ignore changes to the color
-- value, since they may be transitory, or @False@ if they should
-- consider the color value status to be final.
hsvIsAdjusting self =
liftM toBool $
{# call gtk_hsv_is_adjusting #}
(toHSV self)
-- | Converts a color from 'HSV' space to RGB. Input values must be in the [0.0,
-- 1.0] range; output values will be in the same range.
--
hsvToRgb ::
(Double, Double, Double)
-- ^ @(h, s, v)@
-- @h@ - value for the hue
-- @s@ value for the saturation
-- @v@ value for the value
-> (Double, Double, Double) -- ^ @(r, g, b)@ @r@ - Return value for the red
-- component @g@ - Return value for the green
-- component @b@ - Return value for the blue
-- component
hsvToRgb (h, s, v) =
unsafePerformIO $
alloca $ \rPtr ->
alloca $ \gPtr ->
alloca $ \bPtr -> do
{# call gtk_hsv_to_rgb #}
(realToFrac h)
(realToFrac s)
(realToFrac v)
rPtr
gPtr
bPtr
r <- peek rPtr
g <- peek gPtr
b <- peek bPtr
return (realToFrac r, realToFrac g, realToFrac b)
-- | Converts a color from RGB space to 'HSV'. Input values must be in the [0.0, 1.0] range; output values
-- will be in the same range.
rgbToHsv ::
(Double, Double, Double)
-- ^ @(r, g, b)@ @r@ value for the red component
-- @g@ value for the green component
-- @b@ value for the blue component
-> (Double, Double, Double)
-- ^ @(h, s, v)@
-- @h@ - Return value for the hue
-- @s@ - Return value for the saturation
-- @v@ - Return value for the value
rgbToHsv (r, g, b) =
unsafePerformIO $
alloca $ \hPtr ->
alloca $ \sPtr ->
alloca $ \vPtr -> do
{# call rgb_to_hsv #}
(realToFrac r)
(realToFrac g)
(realToFrac b)
hPtr
sPtr
vPtr
h <- peek hPtr
s <- peek sPtr
v <- peek vPtr
return (realToFrac h, realToFrac s, realToFrac v)
--------------------
-- Attributes
-- | Color in an 'HSV' color selector.
-- Color component values must be in the [0.0, 1.0] range.
hsvColor :: HSVClass self => Attr self (Double, Double, Double)
hsvColor = newAttr
hsvGetColor
hsvSetColor
-- | The size and ring width of an 'HSV' color selector.
hsvMetrics :: HSVClass self => Attr self (Int, Int)
hsvMetrics = newAttr
hsvGetMetrics
hsvSetMetrics
--------------------
-- Signals
-- |
--
hsvChanged :: HSVClass self => Signal self (IO ())
hsvChanged = Signal (connect_NONE__NONE "changed")
-- |
--
hsvMove :: HSVClass self => Signal self (DirectionType -> IO ())
hsvMove = Signal (connect_ENUM__NONE "move")
#endif
|