Widgets de desplazamiento

GtkHScrollbar/GtkVSrollbar

Véase la “Widgets de selección de rango”

GtkScrolledWindow

GtkScrolledWindow es una subclase de GtkBin: es decir, es un contenedor que permite albergar a un único widget hijo. GtkScrolledWindow añade barras de desplazamiento al widget albergado y opcionalmente, permite dibujar un marco biselado alrededor de dicho widget hijo. La ventana con scroll puede funcionar de dos formas diferentes. Algunos widgets tienen soporte de scrolling nativo; estos widgets tienen ranuras para insertar objtos de tipo GtkAdjustment (ver “Ajustes”). Algunos de los widgets con soporte nativo de scroll son GtkTreeView, GtkTextView y GtkLayout. Para los widgets sin soporte nativo de scroll, se debe usar un widget adaptador previamente, el GtkViewport, antes de poder insertarlo en una ventana de scroll. Por ejemplo, deberemos usar GtkViewport para darle funcionalidad de scroll a widgets como GtkTable, GtkBox, etc.

Por tanto, si un widget tiene soporte nativo de scrolling, puede ser añadido a un GtkScrolledWindow directamente con la función gtk_container_add(). Si un widget carece de soporte de scrolling de forma nativa, debemos añadirlo primero a un GtkViewport y luego añadir éste último a la ventana de scroll. Para hacer esto, la forma más directa es usar la función gtk_scrolled_window_add_with_viewport() .

La posición de las barras de scroll se controla con los ajustes de scroll (ver “Ajustes” para conocer los campos disponibles de un ajuste - para GtkScrollbar, widget usado internamente por GtkScrolledWindow, el campo "value" representa la posición de la barra de scroll, que debe tomar un valor entre el campo "lower" y la diferencia "upper - page_size". El campo "page_size" representa el tamaño del área visible de scroll. Los campos "step_increment" y "page_increment" se usan cuando el usuario pincha en "bajar" (usando las flechas de de bajar) o en página abajo (usando por ejemplo la tecla PageDown).

Si el widget GtkScrolledWindow no se comporta tal y como nos gustaría, o no se muestra en pantalla tal y como deseamos, existe la posibilidad de personalizar nuestras propias barra de desplazamiento a más detalle, usando GtkScrollbar y por ejemplo un widget GtkTable.

Figura 17. Ejemplo de GtkScrolledWindow, extraído de la sección de ejemplos de la documentación de GTK+

Ejemplo de GtkScrolledWindow, extraído de la sección de ejemplos de la documentación de GTK+

En el ejemplo de código siguiente, crearemos una tabla de botones de dimensiones 10x10, y la meteremos dentro de un contenedor GtkScrolledWindow. El scroll vertical se dará siempre, mientras que el horizontal sólo se mostrará en caso necesario (si redimensionamos con el ratón la ventana padre, haciéndola lo suficientemente ancha como para que entren las 10 columnas de la tabla, el scroll horizontal no aparecerá).

 
    /* la política es ó GTK_POLICY AUTOMATIC ó GTK_POLICY_ALWAYS.
     * GTK_POLICY_AUTOMATIC decidirá automáticamente cuando es necesario pintar
     * barras de scroll, mientras que GTK_POLICY_ALWAYS pintará siempre
     * dichas barras.  El primer parámetro se refiere a la barra horizontal,
     * el segundo a la barra vertical. */
    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
                                    GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
    /* se crea el cuadro de diálogo, empaquetando un vbox dentro del mismo */                                                          
    gtk_box_pack_start (GTK_BOX (GTK_DIALOG(window)->vbox), scrolled_window, 
                        TRUE, TRUE, 0);
    gtk_widget_show (scrolled_window);
    
    /* creamos la tabla de 10 x 10 celdas */
    table = gtk_table_new (10, 10, FALSE);
    
    /* espaciado de 10 en vertical y 10 en horizontal  */
    gtk_table_set_row_spacings (GTK_TABLE (table), 10);
    gtk_table_set_col_spacings (GTK_TABLE (table), 10);
    
    /* empaquetamos la tabla en una ventana de scroll */
    gtk_scrolled_window_add_with_viewport (
                   GTK_SCROLLED_WINDOW (scrolled_window), table);
    gtk_widget_show (table);