Єдина Країна! Единая Страна!

GTK+ — 8. GtkImage та GtkIconView

Серпень 11th, 2009

У цій частині трішки попрацюємо з графікою, а точніше, з кількома досить простими, але часто використовуваними віджетами для роботи з нею: GtkImage та GtkIconView.

GtkImage

GtkImage — досить простий віджет для відображення растрових зображень.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <gtk /gtk.h>
 
 
int main(int argc, char *argv[])
{
    GtkWidget *window;
    GtkWidget *image;
 
    gtk_init(&argc, &argv);
 
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    gtk_window_set_default_size(GTK_WINDOW(window), 230, 150);
    gtk_window_set_title(GTK_WINDOW(window), "Red Rock");
    gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
 
    gtk_container_set_border_width(GTK_CONTAINER(window), 2);
 
    image = gtk_image_new_from_file("redrock.png");
    gtk_container_add(GTK_CONTAINER(window), image);
 
    g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), G_OBJECT(window));
 
    gtk_widget_show_all(window);
 
    gtk_main();
 
    return 0;
}
</gtk>

У вищенаведеному прикладі ми завантажуємо, і відображаємо світлину замку.

Встановлюємо 2-піксельну рамку навколо зображення:

1
gtk_container_set_border_width(GTK_CONTAINER(window), 2);

Завантажуємо зображення з файлу і додаємо його до контейнеру:

1
2
image = gtk_image_new_from_file("redrock.png");
gtk_container_add(GTK_CONTAINER(window), image);

gtkimage

GtkIconView

GtkIconView — досить простий віджет для відображення растрових зображень.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <gtk/gtk.h>
#include <assert.h>
 
enum
{
    COL_DISPLAY_NAME,
    COL_PIXBUF,
    NUM_COLS
};
 
 
GtkTreeModel * init_model(void)
{
    GtkListStore *list_store;
    GdkPixbuf *p1, *p2, *p3, *p4;
    GtkTreeIter iter;
    GError *err = NULL;
 
    p1 = gdk_pixbuf_new_from_file("ubuntu.png", &err);
    p2 = gdk_pixbuf_new_from_file("gnumeric.png", &err);
    p3 = gdk_pixbuf_new_from_file("blender.png", &err);
    p4 = gdk_pixbuf_new_from_file("inkscape.png", &err);
 
    assert(err==NULL);
 
    list_store = gtk_list_store_new(NUM_COLS, G_TYPE_STRING, GDK_TYPE_PIXBUF);
 
    int i = 0;
    for (i; i < 50; i++) {
        gtk_list_store_append(list_store, &iter);
        gtk_list_store_set(list_store, &iter, COL_DISPLAY_NAME, "ubuntu", COL_PIXBUF, p1, -1);
        gtk_list_store_append(list_store, &iter);
        gtk_list_store_set(list_store, &iter, COL_DISPLAY_NAME, "gnumeric", COL_PIXBUF, p2, -1);
        gtk_list_store_append(list_store, &iter);
        gtk_list_store_set(list_store, &iter, COL_DISPLAY_NAME, "blender", COL_PIXBUF, p3, -1);
        gtk_list_store_append(list_store, &iter);
        gtk_list_store_set(list_store, &iter, COL_DISPLAY_NAME, "inkscape", COL_PIXBUF, p4, -1);
    }
 
   return GTK_TREE_MODEL(list_store);
}
 
int main (int argc, char *argv[])
{
    GtkWidget *window;
    GtkWidget *icon_view;
    GtkWidget *sw;
 
    gtk_init (&argc, &argv);
 
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
 
    gtk_window_set_title(GTK_WINDOW (window), "Icon View");
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    gtk_container_set_border_width(GTK_CONTAINER(window), 10);
    gtk_widget_set_size_request(window, 350, 330);
 
    sw = gtk_scrolled_window_new(NULL, NULL);
    gtk_container_add(GTK_CONTAINER (window), sw);
    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
    gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN);
 
    icon_view = gtk_icon_view_new_with_model(init_model());
    gtk_container_add(GTK_CONTAINER(sw), icon_view);
 
    gtk_icon_view_set_text_column(GTK_ICON_VIEW(icon_view), COL_DISPLAY_NAME);
    gtk_icon_view_set_pixbuf_column(GTK_ICON_VIEW(icon_view),  COL_PIXBUF);
    gtk_icon_view_set_selection_mode(GTK_ICON_VIEW(icon_view), GTK_SELECTION_MULTIPLE);
 
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
 
    gtk_widget_show_all(window);
 
    gtk_main();
 
    return 0;
}

У вищенаведеному прикладі ми відображаємо 200 піктограм.

Зчитуємо з жорсткого диску 4 піктограми:

1
2
3
4
p1 = gdk_pixbuf_new_from_file("ubuntu.png", &err);
p2 = gdk_pixbuf_new_from_file("gnumeric.png", &err);
p3 = gdk_pixbuf_new_from_file("blender.png", &err);
p4 = gdk_pixbuf_new_from_file("inkscape.png", &err);

Ми зберігатимуть текстові та pixbuf дані:

1
list_store = gtk_list_store_new(NUM_COLS, G_TYPE_STRING, GDK_TYPE_PIXBUF);

А цей код додає нову піктограму до GtkIconView:

1
2
gtk_list_store_append(list_store, &iter);
gtk_list_store_set(list_store, &iter, COL_DISPLAY_NAME, "ubuntu", COL_PIXBUF, p1, -1);

Створюємо віджет GtkIconView встановлюємо значення для піктограми та її назву:

1
2
3
4
5
icon_view = gtk_icon_view_new_with_model(init_model());
gtk_container_add(GTK_CONTAINER(sw), icon_view);
 
gtk_icon_view_set_text_column(GTK_ICON_VIEW(icon_view), COL_DISPLAY_NAME);
gtk_icon_view_set_pixbuf_column(GTK_ICON_VIEW(icon_view), COL_PIXBUF);

gtkiconview

Переклад. Оригінал: GTK+ Widgets II

Коментарі

коментарі

Powered by Facebook Comments

Leave a Reply