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
The
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
get a
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)
and then:
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
function:
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)