Font and color selection are much like file selection. There are three ways to implement them, as widgets, dialogs and buttons. The user selected values are obtained through the appropriate attributes or functions. We'll discuss font selection first. You can use:
fontSelectionNew :: IO FontSelection fontSelectionDialogNew :: String -> IO FontSelectionDialog fontButtonNew :: IO FontButton
String parameter is the title of the dialog window.
There are a host of attributes and functions to manage the
display of these widgets, all pretty straightforward. With a
dialog you use the appropriate
ResponseId types; with the
FontButton you use:
onFontSet:: FontButtonClass self => self -> IO () -> IO (ConnectId self)
Then you use the following function to get the name of the user selected font:
fontButtonGetFontName :: FontButtonClass self => self -> IO String
The font name will be something like "Courier Italic 10" or "URW Gothic L Semi-Bold Oblique 16", whatever is available on your system. As you can see from the image below, the user can select a family, a style and a size.
Finding and querying information about fonts is documented
in Graphics.UI.Gtk.Pango.Font. Many advanced features are
supported, but the general user will only need to know how to
FontDescription from a font name.
fontDescriptionFromString :: String -> IO FontDescription
Once you have a
FontDescription you can use:
widgetModifyFont:: WidgetClass self => self -> Maybe FontDescription -> IO ()
Color selection is analogous to font selection. You have three choices:
colorSelectionNew :: IO Color Selection colorSelectionDialogNew: :: String -> IO ColorSelectionDialog colorButtonNew :: IO Color Button
With a ColorButton use:
onColorSet :: ColorButtonClass self => self -> IO () -> IO (ConnectId self)
colorButtonGetColor :: ColorButtonClass self => self -> IO Color
There is also a function (and an attribute) to get the Alpha value (opacity) if this feature has been enabled.
The default color selection window looks like this:
Color is a data type of three
Ints , ranging from 0 to 65535, specifying the red,
green and blue components. There are functions to set the
foreground, background, text and base colors of a widget, and
these functions take a
StateType parameter. These are:
StateNormal, StateActive, StatePreLight, StateSelected
and StateInsensitive and they depend on whether a widget
is active, the mouse pointer is over a widget, a widget is
selected and such. Display of widgets has many features, but to
change the color of a label text, for example, you just use
StateNormal and the
Color the user has selected.
widgetModifyFg :: WidgetClass self => self -> StateType -> Color -> IO ()
When in doubt what
StateType the widget has, there is the following
widgetGetState :: WidgetClass w => w -> IO StateType
Here is an example of font and color selection.
The window automatically resizes to accommodate the larger font.
import Graphics.UI.Gtk main :: IO () main = do initGUI window <- windowNew set window [windowTitle := "Font and Color Selection", containerBorderWidth := 10 ] vb <- vBoxNew False 0 containerAdd window vb qtlab <- labelNew (Just "How poor are they that have not patience!\nWhat wound did ever heal but by degrees?\nThou know'st we work by wit, and not by witchcraft;\nAnd wit depends on dilatory time.") boxPackStart vb qtlab PackGrow 0 srclab <- labelNew (Just "From Othello (II, iii, 376-379)") srcfont <- fontDescriptionFromString "Courier Italic 10" widgetModifyFont srclab (Just srcfont) miscSetAlignment srclab 1.0 0.5 boxPackStart vb srclab PackNatural 10 sep <- hSeparatorNew boxPackStart vb sep PackGrow 10 fntb <- fontButtonNew boxPackStart vb fntb PackGrow 0 colb <- colorButtonNew boxPackStart vb colb PackGrow 0 onFontSet fntb $ do name <- fontButtonGetFontName fntb fdesc <- fontDescriptionFromString name widgetModifyFont qtlab (Just fdesc) putStrLn name onColorSet colb $ do colour <- colorButtonGetColor colb widgetModifyFg qtlab StateNormal colour putStrLn (show colour) widgetShowAll window onDestroy window mainQuit mainGUI instance Show Color where show (Color r g b) = "Red: " ++ (show r) ++ " Green: " ++ (show g) ++ " Blue: " ++ (show b)