The paned window widgets are useful when you want to divide
an area into two parts, with the relative size of the two parts
controlled by the user. A groove is drawn between the two
portions, with a handle that the user can drag to change the
ratio. The division can either be horizontal,
HPaned, or vertical,
VPaned.
To create a new paned window, use one of:
hPanedNew :: IO HPaned vPanedNew :: IO VPaned
Set the position of the divider with:
panedSetPosition :: PanedClass self => self -> Int -> IO ()
After creating the paned window widget, you need to add child widgets to its two halves.
panedAdd1 :: (PanedClass self, WidgetClass child) => self -> child -> IO () panedAdd2 :: (PanedClass self, WidgetClass child) => self -> child -> IO ()
The first adds to the top (right) , the second to the bottom (left) half of the
paned window. If you don't want the children to expand or
resize with the paned widget use
panedPack1 and
panedPack2 instead.
An Aspect Frame is a frame for which you can define a constant width/height ratio. This so called aspect ratio will not change when the frame is resized. You create one with:
aspectFrameNew :: Float -> Float -> Maybe Float -> IO AspectFrame
The first parameter sets the horizontal alignment of the
child within the frame (between 0.0 and 1.0). The second does
the same for the vertical alignment. Optionally, you set the
desired aspect ratio with the third parameter. Since an
AspectFrame widget is a
Frame widget, you can also add a label.
In the following example we've created a vertical paned window with an aspect frame in the top half.
We've created a
DrawingArea widget in the
AspectFrame. A
DrawingArea is a blank widget, which can be used to
draw on, but here we just set the background color to
demonstrate the use of the
AspectFrame. In the lower half of the
VPaned widget we've created a
TextView widget. This is a multi-line text
viewer and editor with many powerful features. Here, however, we
just take the associated text buffer and count the characters
whenever the user edits some text.
import Graphics.UI.Gtk
main :: IO ()
main = do
initGUI
window <- windowNew
set window [windowTitle := "Paned Window", containerBorderWidth := 10,
windowDefaultWidth := 400, windowDefaultHeight := 400 ]
pw <- vPanedNew
panedSetPosition pw 250
containerAdd window pw
af <- aspectFrameNew 0.5 0.5 (Just 3.0)
frameSetLabel af "Aspect Ratio: 3.0"
frameSetLabelAlign af 1.0 0.0
panedAdd1 pw af
da <- drawingAreaNew
containerAdd af da
widgetModifyBg da StateNormal (Color 65535 0 0)
tv <- textViewNew
panedAdd2 pw tv
buf <- textViewGetBuffer tv
onBufferChanged buf $ do cn <- textBufferGetCharCount buf
putStrLn (show cn)
widgetShowAll window
onDestroy window mainQuit
mainGUI