El widged de ventana panelable (paned window) resulta muy útil cuando
quieres dividir un área en dos partes, y que el usuario pueda determinar el
tamaño relativo de ambas. Se dibuja una línea entre ambas partes, con una flecha
doble que el usuario puede arrastrar para cambiar el tamaño de ambas porciones
(lo que se agranda una se empequeñece la otra). La división puede ser horizontal
HPaned
, o vertical,
VPaned
.
Para crear una ventana panelable puedes usar:
hPanedNew :: IO HPanel vPanedNew :: IO VPaned
La posición del divisor se establece con:
panedSetPosition :: PanedClass self => self -> Int -> IO ()
Tras crear la ventana panelable, necesitas añadir widgets hijos a las dos mitades.
panedAdd1 :: (PanedClass self, WidgetClass child) => self -> child -> IO () panedAdd2 :: (PanedClass self, WidgetClass child) => self -> child -> IO ()
El primero se situa en la parte superior (derecha) , el segundo lo hace en la parte inferior (izquierda)
de la ventana panelable. Si no quieres que algún hijo no se expanda o reduzca con el widget
panelable debes usar
panedPack1
y
panedPack2
.
Un marco de ratio fijo (Aspect Frame) es un marco para el que puedes definir una relación constante entre la altura y la anchura. Este no cambiará al cambiar el tamaño del marco. Para crear uno puedes usar:
aspectFrameNew :: Float -> Float -> Maybe Float -> IO AspectFrame
El primer parámetro establece el alineamiento horizontal del hijo dentro del marco (entre 0.0 y 1.0).
El segundo hace lo mismo con el alineamiento vertical. Opcionalmente, puedes establecer la
proporción deseada con el tercer parámetro. Como un widget
AspectFrame
es un widget de tipo Frame
, puedes añadirle una
etiqueta.
En el ejemplo siguiente hemos creado un panel vertical de ratio fijo con un marco de ratio fijo en la mitad superior.
Hemos creado un widget DrawingArea
(área de dibujo) en el
AspectFrame
. Un widget
DrawingArea
es un widget vacío, que puede usarse para dibujar en él, aunque
aquí sólo le hemos puesto un color de fondo para demostrar el uso del
AspectFrame
. En la mitad inferior del widget
VPaned
hemos creado un widget
TextView
. Este es un visor y editor de texto multilínea con muchas
y poderosas características. Aquí, sin embargo, simplemente hemos tomado el
buffer de texto asociado y hemos contado los caracteres cada vez
que el usuario edita algún texto.
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