Viewport e Scrolled Window

 

Viewport

 

E' difficile che possa capitare di usare una viewports da sola. Di solito si usa infatti una scrolled Window che a sua volta la comprende.

Una viewport widget permette di porre una widget spiù larga del contenitore in modo che se ne possa vedere una parte per volta.
Usa un Adjustments per definire l'area correntemente visualizzata.

La Viewport viene creata con la funzione:

GtkWidget *gtk_viewport_new( GtkAdjustment *hadjustment,
GtkAdjustment *vadjustment );

In seguito si può settare l'adjustment con le seguenti funzioni:

GtkAdjustment *gtk_viewport_get_hadjustment (GtkViewport *viewport );

GtkAdjustment *gtk_viewport_get_vadjustment (GtkViewport *viewport );

void gtk_viewport_set_hadjustment( GtkViewport *viewport,
GtkAdjustment *adjustment );

void gtk_viewport_set_vadjustment( GtkViewport *viewport,
GtkAdjustment *adjustment );

L'unica altra funzione della viewport function è usata per modificare il suo aspetto:

void gtk_viewport_set_shadow_type( GtkViewport *viewport,
GtkShadowType type );

Dove i possibli valori che può assumere type sono:

GTK_SHADOW_NONE,
GTK_SHADOW_IN,
GTK_SHADOW_OUT,
GTK_SHADOW_ETCHED_IN,
GTK_SHADOW_ETCHED_OUT

 

 

Scrolled Window

Sono usate per creare un'area scrollabile all'interno di una finestra.

Per creare una nuova scrolled window si usa la funzione:

GtkWidget *gtk_scrolled_window_new( GtkAdjustment *hadjustment,
GtkAdjustment *vadjustment );

Dove il primo argomento è l' adjustment per la direzione orizzontale ed il secondo l'adjustment per la direzione verticale, che comunque sono in genere settatti a NULL.

Per settare la policy relativa alle scrollbars si usa la funzione:

void gtk_scrolled_window_set_policy( GtkScrolledWindow *scrolled_window,
GtkPolicyType hscrollbar_policy,
GtkPolicyType vscrollbar_policy );

Il primo argomento è la scrolled window, il secondo setta la policy della scrollbar orizzontale ed il terzo quella della scrollbar verticale.
I valori accettati sono: GTK_POLICY_AUTOMATIC, o GTK_POLICY_ALWAYS. Il primo fa comparire le scrollbar solo se si crea la necessità di scrollare (es. una lista troppo lunga rispetto al widget che la contiene il secondo lascia le scrollbars sempre visibili).

Per inserire il nostro widget nella scrolled window possiamo usare:

void gtk_scrolled_window_add_with_viewport( GtkScrolledWindow *scrolled_window,
GtkWidget *child);

Ecco un esempio che inserisce 100 toggle buttons in una srolled window.

/* Inizio esempio scrolledwin scrolledwin.c */

#include <gtk/gtk.h>

void destroy(GtkWidget *widget, gpointer data)
{
gtk_main_quit();
}

int main (int argc, char *argv[])
{
static GtkWidget *window;
GtkWidget *scrolled_window;
GtkWidget *table;
GtkWidget *button;
char buffer[32];
int i, j;

gtk_init (&argc, &argv);

/* Crea una nuova dialog window per la scrolled window */
window = gtk_dialog_new ();
gtk_signal_connect (GTK_OBJECT (window), "destroy",
(GtkSignalFunc) destroy, NULL);
gtk_window_set_title (GTK_WINDOW (window), "GtkScrolledWindow example");
gtk_container_set_border_width (GTK_CONTAINER (window), 0);
gtk_widget_set_usize(window, 300, 300);

/* crea una nuova scrolled window. */
scrolled_window = gtk_scrolled_window_new (NULL, NULL);

gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);

/* Setta la policy */
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);

gtk_box_pack_start (GTK_BOX (GTK_DIALOG(window)->vbox), scrolled_window,
TRUE, TRUE, 0);
gtk_widget_show (scrolled_window);

/* crea una table di 10 x 10 spazi. */
table = gtk_table_new (10, 10, FALSE);

/* setta la spaziatura della table */
gtk_table_set_row_spacings (GTK_TABLE (table), 10);
gtk_table_set_col_spacings (GTK_TABLE (table), 10);

/* Inserisce la table nella scrolled window */
gtk_scrolled_window_add_with_viewport (
GTK_SCROLLED_WINDOW (scrolled_window), table);
gtk_widget_show (table);

/* crea una griglia di toggle buttons nella table */
for (i = 0; i < 10; i++)
for (j = 0; j < 10; j++) {
sprintf (buffer, "button (%d,%d)\n", i, j);
button = gtk_toggle_button_new_with_label (buffer);
gtk_table_attach_defaults (GTK_TABLE (table), button,
i, i+1, j, j+1);
gtk_widget_show (button);
}

/* Aggiunge un "close" button alla base della dialog */
button = gtk_button_new_with_label ("close");
gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
(GtkSignalFunc) gtk_widget_destroy,
GTK_OBJECT (window));

/* Rende questo bottone il default. */

GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), button, TRUE, TRUE, 0);

/* Fa il "Grab" sul bottone in modo che viene attivato
* premendo il il tasto "Enter" */
gtk_widget_grab_default (button);
gtk_widget_show (button);

gtk_widget_show (window);

gtk_main();

return(0);
}

/* fine esempio */

 

Torna all'indice