{-# 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