GTK+ 2.0 Tutorial

<<< Previous

Контейнерные виджеты (Container Widgets)

Next >>>


Панель инструментов

Панели инструментов обычно используются для группировки некоторого числа виджетов, чтобы упростить настройку их вида и расположения. Обычно панель состоит из кнопок с изображениями и текстовыми ярлыками, но можно добавить и любой другой виджет на панель. Объекты на панели могут выравниваться горизонтально или вертикально, а кнопки могут отображаться с пиктограммами, текстовыми ярлыками или с тем и другим сразу.

Создание панели инструментов:

GtkWidget *gtk_toolbar_new( void );

После создания панели в неё можно добавлять пункты (короткие текстовые строки) или элементы (любые виджеты). Чтобы описать пункт, нужен текстовый ярлык, пиктограмма, текст подсказки, текст расширенной подсказки и функция обратного вызова. Для прикрепления к панели пункта можно использовать функции:

GtkWidget *gtk_toolbar_append_item( GtkToolbar *toolbar, const char *text, const char *tooltip_text, const char *tooltip_private_text, GtkWidget *icon, GtkSignalFunc callback, gpointer user_data ); GtkWidget *gtk_toolbar_prepend_item( GtkToolbar *toolbar, const char *text, const char *tooltip_text, const char *tooltip_private_text, GtkWidget *icon, GtkSignalFunc callback, gpointer user_data );

Если Вы хотите использовать gtk_toolbar_insert_item(), единственный дополнительный параметр который должен быть определен - положение в которое пункт должен быть вставлен, выглядит это таким образом:

GtkWidget *gtk_toolbar_insert_item( GtkToolbar *toolbar, const char *text, const char *tooltip_text, const char *tooltip_private_text, GtkWidget *icon, GtkSignalFunc callback, gpointer user_data, gint position );

Чтобы упростить добавку места между пунктами панели инструментов, вы можете использовать следующие функции:

void gtk_toolbar_append_space( GtkToolbar *toolbar ); void gtk_toolbar_prepend_space( GtkToolbar *toolbar ); void gtk_toolbar_insert_space( GtkToolbar *toolbar, gint position );

Если требуется, ориентация панели инструментов и ее стиля может быть изменена "на лету" используя следующие функции:

void gtk_toolbar_set_orientation( GtkToolbar *toolbar, GtkOrientation orientation ); void gtk_toolbar_set_style( GtkToolbar *toolbar, GtkToolbarStyle style ); void gtk_toolbar_set_tooltips( GtkToolbar *toolbar, gint enable );

Где аргумент orientation одно из двух значений GTK_ORIENTATION_HORIZONTAL или GTK_ORIENTATION_VERTICAL. Аргумент style используется для установки одного из возможных вариантов отображения пунктов на панели GTK_TOOLBAR_ICONS, GTK_TOOLBAR_TEXT или GTK_TOOLBAR_BOTH.

Чтобы показать некоторые дополнительные действия, которые могут быть сделаны с панелью инструментов, давайте рассмотрим следующую программу (мы прервем пример с некоторыми дополнительными объяснениями):

#include <gtk/gtk.h> /* Эта функция подключается к кнопке Close или * закрытию окна с помощью WM */ gint delete_event (GtkWidget *widget, GdkEvent *event, gpointer data) { gtk_main_quit (); return FALSE; }

Вышеупомянутое начало кажется наверняка знакомым, если это не первая ваша программа GTK. Дополнительно мы включили изображение (XPM picture) для всех кнопок.

GtkWidget* close_button; /* Эта кнопка создаёт сигнал для * закрытия приложения */ GtkWidget* tooltips_button; /* включить/выключить (enable/disable) подсказки */ GtkWidget* text_button, * icon_button, * both_button; /* кнопка переключения стиля панели */ GtkWidget* entry; /* ввод текста для упаковки в какой нибудь виджет при отображении на панели */

Фактически не все вышеупомянутые виджеты необходимы здесь, но для более ясного понимания мы разместили их все вместе.

/* при переключении кнопки мы проверяем какой стиль был активным * и делаем соответствующие установки * ВНИМАНИЕ: панель передаётся как данные для обратного вызова! */ void radio_event (GtkWidget *widget, gpointer data) { if (GTK_TOGGLE_BUTTON (text_button)->active) gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_TEXT); else if (GTK_TOGGLE_BUTTON (icon_button)->active) gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_ICONS); else if (GTK_TOGGLE_BUTTON (both_button)->active) gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH); } /* проверяем переключатель для включения/выключения подсказок */ void toggle_event (GtkWidget *widget, gpointer data) { gtk_toolbar_set_tooltips (GTK_TOOLBAR (data), GTK_TOGGLE_BUTTON (widget)->active ); }

В зависимости от того какая кнопка нажата, будет вызвана одна из двух функций. Вам знакомо это, если вы уже использовали переключатели и кнопки выбора (radio buttons).

int main (int argc, char *argv[]) { /* Наше главное окно (диалог) и контейнер */ GtkWidget* dialog; GtkWidget* handlebox; /* Нам нужна панель и пиктограммы (одна для всех кнопок), * а также icon widget для размещения в нём пиктограмм * (но мы создадим отдельный виджет для размещения каждой кнопки) */ GtkWidget * toolbar; GtkWidget * iconw; /* Необходимый для всех GTK программ вызов. */ gtk_init (&argc, &argv); /* Создаём новое окно с заголовком и необходимого размера */ dialog = gtk_dialog_new (); gtk_window_set_title (GTK_WINDOW (dialog), "GTKToolbar Tutorial"); gtk_widget_set_size_request (GTK_WIDGET (dialog), 600, 300); GTK_WINDOW (dialog)->allow_shrink = TRUE; /* типичный выход при попытке закрытия */ g_signal_connect (G_OBJECT (dialog), "delete_event", G_CALLBACK (delete_event), NULL); /* мы должны реализовать окно, потому что используем пиктограммы в контексте */ gtk_widget_realize (dialog); /* поместим панель в удобный контейнер для разделения с основным окном */ handlebox = gtk_handle_box_new (); gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), handlebox, FALSE, FALSE, 5);

Из всего вышеперечисленного в объяснении нуждается только «удобный контейнер» (handle box). «Удобный контейнер» используется для упаковки виджетов, но отличается от обычных контейнеров. Различие заключается в том, что «удобный контейнер» может быть отсоединен от основного окна для произвольного позиционирования виджетов размещенных в нем (в пределах родительского окна). Обычно он используется для создания съёмных панелей инструментов.

/* панель будет размещена горизонтально с пиктограммами и текстом, * между пунктами будет промежуток в 5pxl * и всё это будет упаковано в handlebox */ toolbar = gtk_toolbar_new (); gtk_toolbar_set_orientation (GTK_TOOLBAR (toolbar), GTK_ORIENTATION_HORIZONTAL); gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_BOTH); gtk_container_set_border_width (GTK_CONTAINER (toolbar), 5); gtk_toolbar_set_space_size (GTK_TOOLBAR (toolbar), 5); gtk_container_add (GTK_CONTAINER (handlebox), toolbar);

То, что сделано выше, является прямой инициализацией виджета панели инструментов.

/* наш первый пункт кнопка <close> */ iconw = gtk_image_new_from_file ("gtk.xpm"); /* icon widget */ close_button = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), /* наша панель */ "Close", /* ярлык кнопки */ "Closes this app", /* подсказка кнопки */ "Private", /* подробная подсказка */ iconw, /* icon widget */ GTK_SIGNAL_FUNC (delete_event), /* сигнал */ NULL); gtk_toolbar_append_space (GTK_TOOLBAR (toolbar)); /* пробел после пункта */

В вышеупомянутом коде вы видите самый простой способ добавления кнопки на панель инструментов.  Как раз перед добавлением нового пункта, мы должны сконструировать виджет изображения (image widget), чтобы служить изображением для этого пункта; этот шаг должен будет быть повторен для каждого нового пункта. Также мы добавляем пробел после пункта для избежания касания с ним других пунктов. Как вы видите, функция gtk_toolbar_append_item() возвращает указатель на вновь созданную кнопку, вы можете работать с ним как обычно.

/* создаём группу кнопок выбора */ iconw = gtk_image_new_from_file ("gtk.xpm"); icon_button = gtk_toolbar_append_element ( GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_RADIOBUTTON, /* тип элемента */ NULL, /* указатель на виджет */ "Icon", /* ярлык */ "Only icons in toolbar", /* подсказка */ "Private", /* расширенная подсказка */ iconw, /* пиктограмма */ GTK_SIGNAL_FUNC (radio_event), /* сигнал */ toolbar); /* данные сигнала */ gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));

Для создания группы переключателей мы использовали gtk_toolbar_append_element. Фактически используя эту функцию можно легко добавлять пункты или пробелы (type = GTK_TOOLBAR_CHILD_SPACE или +GTK_TOOLBAR_CHILD_BUTTON). В создании других радио-кнопок для этой группы требуется указатель на предыдущую кнопку в группе, чтобы легко построить список кнопок (см. секцию Radio Buttons).

/* following radio buttons refer to previous ones */ iconw = gtk_image_new_from_file ("gtk.xpm"); text_button = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_RADIOBUTTON, icon_button, "Text", "Only texts in toolbar", "Private", iconw, GTK_SIGNAL_FUNC (radio_event), toolbar); gtk_toolbar_append_space (GTK_TOOLBAR (toolbar)); iconw = gtk_image_new_from_file ("gtk.xpm"); both_button = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_RADIOBUTTON, text_button, "Both", "Icons and text in toolbar", "Private", iconw, GTK_SIGNAL_FUNC (radio_event), toolbar); gtk_toolbar_append_space (GTK_TOOLBAR (toolbar)); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (both_button), TRUE);

В конце мы должны установить статус одной из кнопок вручную (иначе, они все остаются в активном статусе, препятствуя нам переключаться между ними).

/* простая кнопка переключения */ iconw = gtk_image_new_from_file ("gtk.xpm"); tooltips_button = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL, "Tooltips", "Toolbar with or without tips", "Private", iconw, GTK_SIGNAL_FUNC (toggle_event), toolbar); gtk_toolbar_append_space (GTK_TOOLBAR (toolbar)); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tooltips_button), TRUE);

Переключатель создаётся очевидным способом (если вы уже знаете как создать кнопку выбора).

/* упаковываем виджет в панель и прикрепляем соответствующую подсказку */ entry = gtk_entry_new (); gtk_toolbar_append_widget (GTK_TOOLBAR (toolbar), entry, "This is just an entry", "Private"); /* отображаем созданное */ gtk_widget_show (entry);

Как вы видите, добавить любой виджет к панели инструментов достаточно просто. Однако вы должны помнить, что этот виджет нужно показать вручную (вопреки другим пунктам, которые будут показаны вместе с панелью инструментов).

/* выводим на экран всё сразу. */ gtk_widget_show (toolbar); gtk_widget_show (handlebox); gtk_widget_show (dialog); /* переходим в цикл ожидания событий */ gtk_main (); return 0; }

Наша пиктограмма (XPM icon):

/* XPM */ static char * gtk_xpm[] = { "32 39 5 1", ". c none", "+ c black", "@ c #3070E0", "# c #F05050", "$ c #35E035", "................+...............", "..............+++++.............", "............+++++@@++...........", "..........+++++@@@@@@++.........", "........++++@@@@@@@@@@++........", "......++++@@++++++++@@@++.......", ".....+++@@@+++++++++++@@@++.....", "...+++@@@@+++@@@@@@++++@@@@+....", "..+++@@@@+++@@@@@@@@+++@@@@@++..", ".++@@@@@@+++@@@@@@@@@@@@@@@@@@++", ".+#+@@@@@@++@@@@+++@@@@@@@@@@@@+", ".+##++@@@@+++@@@+++++@@@@@@@@$@.", ".+###++@@@@+++@@@+++@@@@@++$$$@.", ".+####+++@@@+++++++@@@@@+@$$$$@.", ".+#####+++@@@@+++@@@@++@$$$$$$+.", ".+######++++@@@@@@@++@$$$$$$$$+.", ".+#######+##+@@@@+++$$$$$$@@$$+.", ".+###+++##+##+@@++@$$$$$$++$$$+.", ".+###++++##+##+@@$$$$$$$@+@$$@+.", ".+###++++++#+++@$$@+@$$@++$$$@+.", ".+####+++++++#++$$@+@$$++$$$$+..", ".++####++++++#++$$@+@$++@$$$$+..", ".+#####+++++##++$$++@+++$$$$$+..", ".++####+++##+#++$$+++++@$$$$$+..", ".++####+++####++$$++++++@$$$@+..", ".+#####++#####++$$+++@++++@$@+..", ".+#####++#####++$$++@$$@+++$@@..", ".++####++#####++$$++$$$$$+@$@++.", ".++####++#####++$$++$$$$$$$$+++.", ".+++####+#####++$$++$$$$$$$@+++.", "..+++#########+@$$+@$$$$$$+++...", "...+++########+@$$$$$$$$@+++....", ".....+++######+@$$$$$$$+++......", "......+++#####+@$$$$$@++........", ".......+++####+@$$$$+++.........", ".........++###+$$$@++...........", "..........++##+$@+++............", "...........+++++++..............", ".............++++..............."};

<<< Previous

Home

Next >>>

Button Boxes

Up

Notebooks