-- ----------------------------------------------------------------------- -- -- $Source: /repository/uni/htk/widgets/Scale.hs,v $ -- -- HTk - a GUI toolkit for Haskell - (c) Universitaet Bremen -- -- $Revision: 1.4 $ from $Date: 2002/01/07 21:14:26 $ -- Last modification by $Author: ludi $ -- -- ----------------------------------------------------------------------- --- -- HTk's scale widget.
-- A simple slider in a through representing a range of numeric values. module Scale ( ScaleValue(..), Scale, newScale, HasIncrement(..), digits, getDigits, interval, getInterval, intervalTo, getIntervalTo, intervalFrom, getIntervalFrom, Slider(..), HasSlider(..), bigIncrement, getBigIncrement, showValue, getShowValue ) where import Core import BaseClasses(Widget) import Configuration import Resources import Slider import Synchronized import Destructible import Computation import ReferenceVariables import Concurrent import Packer import Tooltip -- ----------------------------------------------------------------------- -- Scale type -- ----------------------------------------------------------------------- --- -- The Scale datatype. data Scale a = Scale GUIOBJECT (Ref Double) -- the position should really be part of the kind attribute of the GUIObject -- ----------------------------------------------------------------------- -- classes -- ----------------------------------------------------------------------- --- -- Values associated with a scale instansiate the -- class ScaleValue. class (Num a, GUIValue a) => ScaleValue a where toDouble :: a -> Double fromDouble :: Double -> a --- -- A double value is a scale value. instance ScaleValue Double where --- -- Internal. toDouble = id --- -- Internal. fromDouble = id -- ----------------------------------------------------------------------- -- Scale creation -- ----------------------------------------------------------------------- --- -- Constructs a new scale widget and returns a handler. -- @param par - the parent widget, which has to be a container widget. -- @param cnf - the list of configuration options for this scale -- - widget. -- @return result - A scale widget. newScale :: (GUIValue a, ScaleValue a, Container par) => par -> [Config (Scale a)] -> IO (Scale a) newScale par cnf = do wid <- createGUIObject (toGUIObject par) SCALE scaleMethods ref <- newRef 0 sc <- return (Scale wid ref) configure sc (interval (0,100) : cnf) -- ----------------------------------------------------------------------- -- Configuration options: Instantiations -- ----------------------------------------------------------------------- --- -- Internal. instance Eq (Scale a) where --- -- Internal. w1 == w2 = (toGUIObject w1) == (toGUIObject w2) --- -- Internal. instance GUIObject (Scale a) where --- -- Internal. toGUIObject (Scale w _) = w --- -- Internal. cname _ = "Scale" --- -- A scale widget can be destroyed. instance Destroyable (Scale a) where destroy = destroy . toGUIObject --- -- A scale widget has standard widget properties -- (concerning focus, cursor). instance Widget (Scale a) --- -- You can synchronize on a scale widget. instance Synchronized (Scale a) where --- -- Synchronizes on a scale widget. synchronize = synchronize . toGUIObject --- -- A scale widget has a configureable border. instance HasBorder (Scale a) --- -- A scale widget has a configureable foreground, background and -- activebackground colour. instance HasColour (Scale a) where --- -- Internal. legalColourID w "background" = True legalColourID w "foreground" = True legalColourID w "activebackground" = True legalColourID w _ = False --- -- A scale widget is a stateful widget, it can be enabled or disabled. instance HasEnable (Scale a) --- -- A scale widget has a configureable font. instance HasFont (Scale a) --- -- A scale widget has a configureable incrementation interval. instance ScaleValue a => HasIncrement (Scale a) a where --- -- Sets the scale widget's incrementation interval. increment d w = cset w "tickinterval" (toDouble d) --- -- Gets the scale widget's incrementation interval. getIncrement w = cget w "tickinterval" >>= return . fromDouble --- -- A scale widget's orientation can either be vertical or horizontal. instance HasOrientation (Scale a) --- -- A scale widget has a configureable size. instance HasSize (Scale a) where --- -- Sets the scale widget's length. height d w = cset w "length" d --- -- Gets the scale widget's length. getHeight w = cget w "length" --- -- A scale widget has a configureable slider. instance HasSlider (Scale a) --- -- A scale widget has a text label. instance GUIValue v => HasText (Scale a) v where --- -- Sets the text of the scale widget's label. text s w = cset w "label" s --- -- Gets the text of the scale widget's label. getText w = cget w "label" --- -- A scale widget can have a tooltip. instance HasTooltip (Scale a) -- ----------------------------------------------------------------------- -- Scale specific config options -- ----------------------------------------------------------------------- --- -- Sets the number of significant values in the scale widget. digits :: Int -> Config (Scale a) digits d w = cset w "digits" d --- -- Gets the number of significant values in the scale widget. getDigits :: Scale a -> IO Int getDigits w = cget w "digits" --- -- Sets the maximum value of the scale widget. intervalTo :: ScaleValue a => a -> Config (Scale a) intervalTo v w = cset w "to" (toDouble v) --- -- Gets the maximum value of the scale widget. getIntervalTo :: ScaleValue a => Scale a -> IO a getIntervalTo w = cget w "to" >>= return . fromDouble --- -- Sets the minimum value of the scale widget. intervalFrom :: ScaleValue a => a -> Config (Scale a) intervalFrom v w = cset w "from" (toDouble v) --- -- Gets the minimum value of the scale widget. getIntervalFrom :: ScaleValue a => Scale a -> IO a getIntervalFrom w = cget w "from" >>= return . fromDouble --- -- Sets the scale widgets maximum and minumum value. interval :: ScaleValue a => (a, a) -> Config (Scale a) interval (b,e) w = synchronize w (do{ cset w "to" (toDouble b); cset w "from" (toDouble e) }) --- -- Gets the scale widgets maximum and minumum value. getInterval :: ScaleValue a => Scale a -> IO (a,a) getInterval w = synchronize w (do { cget w "to" >>= \b -> cget w "from" >>= \e -> return (fromDouble b,fromDouble e) }) -- ----------------------------------------------------------------------- -- Slider specific config options -- ----------------------------------------------------------------------- --- -- A scale's slider has a configureable resulution. instance ScaleValue a => HasIncrement (Slider (Scale a)) a where --- -- Sets the slider's resolution. increment d w = cset w "resolution" (toDouble d) --- -- Gets the slider's resolution. getIncrement w = cget w "resolution" >>= return . fromDouble --- -- A scale's slider has a configureable size. instance HasSize (Slider (Scale a)) where --- -- Sets the sliders width. width d w = cset w "width" d --- -- Gets the sliders width. getWidth w = cget w "width" --- -- Sets the sliders height. height d w = cset w "sliderlength" d --- -- Gets the sliders height. getHeight w = cget w "sliderlength" --- -- Sets the coarse grain slider adjustment value. bigIncrement :: ScaleValue a => a -> Config (Slider (Scale a)) bigIncrement d w = cset w "bigincrement" (toDouble d) --- -- Gets the coarse grain slider adjustment value. getBigIncrement :: ScaleValue a => (Slider (Scale a)) -> IO a getBigIncrement w = cget w "bigincrement" >>= return . fromDouble --- -- Shows the sliders value when set. showValue :: Toggle -> Config (Slider (Scale a)) showValue d w = cset w "showvalue" d --- -- Gets the current showvalue setting. getShowValue :: (Slider (Scale a)) -> IO Toggle getShowValue w = cget w "showvalue" -- ----------------------------------------------------------------------- -- Scale methods -- ----------------------------------------------------------------------- scaleMethods :: Methods scaleMethods = defMethods -- ----------------------------------------------------------------------- -- Tk intrinsics -- ----------------------------------------------------------------------- tkScaleCmd :: ObjectID -> TclCmd tkScaleCmd (ObjectID i) = "Scaled " ++ show i {-# INLINE tkScaleCmd #-} tkPackScale _ _ name opts oid binds = ("pack " ++ (show name) ++ " " ++ (showConfigs opts))