# Scale (C)

Monica Kochofar
monicakochofar@gmail.com 2012
Widget stupnice pro výběr hodnoty z nějakého rozsahu

# Scale

Jezděte po stupnici!

#include <gtk/gtk.h>

/* Toto je funkce zpětného volání * Jedná se o obslužnou funkci, která reaguje na signál * V tomto případě upozorní uživatele na hodnotu na stupnici v podobě popisku */ static void hscale_moved (GtkRange *range, gpointer user_data) { GtkWidget *label = user_data;

/* Získá hodnotu z rozsahu a převede ji na řetězec, který bude * použit jako nový popisek pro vodorovnou stupnici * %.0f - maska pro typ double, který bude mít 0 desetinných míst */ gdouble pos = gtk_range_get_value (range); /* Poznámka: g_strdup_printf vrací řetězec, který je třeba uvolnit * (což je uděláno dále) */ gchar *str = g_strdup_printf ("Horizontal scale is %.0f", pos); gtk_label_set_text (GTK_LABEL (label), str);

g_free(str); }

/* Toto je druhá funkce zpětného volání. Jedná se o obslužnou funkci, která * reaguje na signál. Dělá stejnou věc, jako funkce výše, akorát pro svislou * stupnici */ vscale_moved (GtkRange *range, gpointer user_data) { GtkWidget *label = user_data;

gdouble pos = gtk_range_get_value (range); /* %.1f - maska pro typ double, který bude mít 1 desetinné místo */ gchar *str = g_strdup_printf ("Vertical scale is %.1f", pos); gtk_label_set_text (GTK_LABEL (label), str);

g_free (str); }

static void activate (GtkApplication *app, gpointer user_data) { /* Deklarace proměnných */ GtkWidget *window; GtkWidget *h_scale; GtkWidget *v_scale; GtkWidget *hlabel; GtkWidget *vlabel; GtkWidget *grid;

/* Objekt Adjustment představující hodnoty, které * budou přiřazeny jako dolní a horní mez */ GtkAdjustment *hadjustment; GtkAdjustment *vadjustment;

/* Vytvoří okno s názvem do záhlaví a výchozí velikostí */ window = gtk_application_window_new (app); gtk_window_set_title (GTK_WINDOW (window), "Scale Example"); gtk_window_set_default_size (GTK_WINDOW (window), 400, 300); gtk_container_set_border_width (GTK_CONTAINER (window), 5);

/* Dva popisky, které budou zobrazeny v okně */ hlabel = gtk_label_new ("Move the scale handle..."); vlabel = gtk_label_new ("Move the scale handle...");

/* gtk_adjustment_new přebírá šest parametrů, tři z nich * mohou být složitější na pochopení: * přírůstek kroku- viditelný posun táhla při použití kurzorové šipky na klávesnici * přírůstek stránky - viditelný posun táhla při kliknutí mimo něj na stupnici * velikost stránky - zde nepoužito */ hadjustment = gtk_adjustment_new (0, 0, 100, 5, 10, 0); vadjustment = gtk_adjustment_new (50, 0, 100, 5, 10, 0);

/* Vytvoří vodorovnou stupnici, zajistí že čísla nebudou mít žádná * desetinná místa */ h_scale = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, hadjustment); gtk_scale_set_digits (GTK_SCALE (h_scale), 0);

/* Umožníme ji roztáhnout se vodorovně (pokud je místo) a * nastaví ji svislé zarovnání */ gtk_widget_set_hexpand (h_scale, TRUE); gtk_widget_set_valign (h_scale, GTK_ALIGN_START);

/* Napojí signál "value-changed" pro vodorovnou stupnici na * příslušnou funkci zpětného volání * Všimněte si, že GtkRange je součástí hierarchie objektů GtkScale */ g_signal_connect (h_scale, "value-changed", G_CALLBACK (hscale_moved), hlabel);

/* Vytvoří svislou stupnici. Tentokrát uvidíme, co se stane, když * čísla nejsou na začátku nastavena */ v_scale = gtk_scale_new (GTK_ORIENTATION_VERTICAL, vadjustment); gtk_widget_set_vexpand (v_scale, TRUE);

/* Napojí signál "value-changed" pro svislou stupnici na * příslušnou funkci zpětného volání */ g_signal_connect (v_scale, "value-changed", G_CALLBACK (vscale_moved), vlabel);

/* Vytvoří mřížku a vše do ní správně uspořádá */ grid = gtk_grid_new (); gtk_grid_set_column_spacing (GTK_GRID (grid), 10); gtk_grid_set_column_homogeneous (GTK_GRID (grid), TRUE); gtk_grid_attach (GTK_GRID (grid), h_scale, 0, 0, 1, 1); gtk_grid_attach (GTK_GRID (grid), v_scale, 1, 0, 1, 1); gtk_grid_attach (GTK_GRID (grid), hlabel, 0, 1, 1, 1); gtk_grid_attach (GTK_GRID (grid), vlabel, 1, 1, 1, 1);

gtk_container_add (GTK_CONTAINER (window), grid);

gtk_widget_show_all (window); }

int main (int argc, char **argv) { GtkApplication *app; int status;

app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE); g_signal_connect (app, "activate", G_CALLBACK (activate), NULL); status = g_application_run (G_APPLICATION (app), argc, argv); g_object_unref (app);

return status; }

V této ukázce se používá následující:

GtkApplication

GtkWindow

GtkScale

GtkRange

GtkAdjustment

Funkce pro práci s řetězci