#include <gtk/gtk.h>
typedef struct _progressdata {
gtkwidget *window;
gtkwidget *pbar;
int timer;
gboolean activity_mode;
} progressdata;
/* обновляем значение шкалы выполнения
* для отображения некоторых действий */
gint progress_timeout( gpointer data )
{
progressdata *pdata = (progressdata *)data;
gdouble new_val;
if (pdata->activity_mode)
gtk_progress_bar_pulse (gtk_progress_bar (pdata->pbar));
else
{
/* вычисляем значение шкалы выполнения используя
* установленные значения диапазона в объекте регулирования (adjustment object) */
new_val = gtk_progress_bar_get_fraction (gtk_progress_bar (pdata->pbar)) + 0.01;
if (new_val > 1.0)
new_val = 0.0;
/* устанавливаем новые значения */
gtk_progress_bar_set_fraction (gtk_progress_bar (pdata->pbar), new_val);
}
/* для продолжения вызова функции перерыва
* (timeout function) необходимо вернуть значение true */
return true;
}
/* обратный вызов переключателя для отображения текста в колее шкалы выполнения */
void toggle_show_text( gtkwidget *widget,
progressdata *pdata )
{
const gchar *text;
text = gtk_progress_bar_get_text (gtk_progress_bar (pdata->pbar));
if (text && *text)
gtk_progress_bar_set_text (gtk_progress_bar (pdata->pbar), "");
else
gtk_progress_bar_set_text (gtk_progress_bar (pdata->pbar), "любой текст");
}
/* переключатель активного состояния шкалы выполнения */
void toggle_activity_mode( gtkwidget *widget,
progressdata *pdata )
{
pdata->activity_mode = !pdata->activity_mode;
if (pdata->activity_mode)
gtk_progress_bar_pulse (gtk_progress_bar (pdata->pbar));
else
gtk_progress_bar_set_fraction (gtk_progress_bar (pdata->pbar), 0.0);
}
/* переключатель ориентации шкалы выполнения */
void toggle_orientation( gtkwidget *widget,
progressdata *pdata )
{
switch (gtk_progress_bar_get_orientation (gtk_progress_bar (pdata->pbar))) {
case gtk_progress_left_to_right:
gtk_progress_bar_set_orientation (gtk_progress_bar (pdata->pbar),
gtk_progress_right_to_left);
break;
case gtk_progress_right_to_left:
gtk_progress_bar_set_orientation (gtk_progress_bar (pdata->pbar),
gtk_progress_left_to_right);
break;
}
}
/* очистка выделенной памяти и удаление таймера */
void destroy_progress( gtkwidget *widget,
progressdata *pdata)
{
gtk_timeout_remove (pdata->timer);
pdata->timer = 0;
pdata->window = null;
g_free (pdata);
gtk_main_quit ();
}
int main( int argc,
char *argv[])
{
progressdata *pdata;
gtkwidget *align;
gtkwidget *separator;
gtkwidget *table;
gtkwidget *button;
gtkwidget *check;
gtkwidget *vbox;
gtk_init (&argc, &argv);
/* выделение памяти для данных размещенных в обратных вызовах */
pdata = g_malloc (sizeof (progressdata));
pdata->window = gtk_window_new (gtk_window_toplevel);
gtk_window_set_resizable (gtk_window (pdata->window), true);
g_signal_connect (g_object (pdata->window), "destroy",
g_callback (destroy_progress),
(gpointer) pdata);
gtk_window_set_title (gtk_window (pdata->window), "gtkprogressbar");
gtk_container_set_border_width (gtk_container (pdata->window), 0);
vbox = gtk_vbox_new (false, 5);
gtk_container_set_border_width (gtk_container (vbox), 10);
gtk_container_add (gtk_container (pdata->window), vbox);
gtk_widget_show (vbox);
/* создаём объект выравнивания */
align = gtk_alignment_new (0.5, 0.5, 0, 0);
gtk_box_pack_start (gtk_box (vbox), align, false, false, 5);
gtk_widget_show (align);
/* создаём gtkprogressbar */
pdata->pbar = gtk_progress_bar_new ();
gtk_container_add (gtk_container (align), pdata->pbar);
gtk_widget_show (pdata->pbar);
/* добавляем обратный вызов таймера для обновления значения шкалы выполнения */
pdata->timer = gtk_timeout_add (100, progress_timeout, pdata);
separator = gtk_hseparator_new ();
gtk_box_pack_start (gtk_box (vbox), separator, false, false, 0);
gtk_widget_show (separator);
/* ряды, колонки, homogeneous */
table = gtk_table_new (2, 3, false);
gtk_box_pack_start (gtk_box (vbox), table, false, true, 0);
gtk_widget_show (table);
/* добавляем кнопку контроля для отображения текста в колее */
check = gtk_check_button_new_with_label ("показать текст");
gtk_table_attach (gtk_table (table), check, 0, 1, 0, 1,
gtk_expand | gtk_fill, gtk_expand | gtk_fill,
5, 5);
g_signal_connect (g_object (check), "clicked",
g_callback (toggle_show_text),
(gpointer) pdata);
gtk_widget_show (check);
/* добавляем контроль-кнопку активного режима */
check = gtk_check_button_new_with_label ("активный режим");
gtk_table_attach (gtk_table (table), check, 0, 1, 1, 2,
gtk_expand | gtk_fill, gtk_expand | gtk_fill,
5, 5);
g_signal_connect (g_object (check), "clicked",
g_callback (toggle_activity_mode),
(gpointer) pdata);
gtk_widget_show (check);
/* добавляем контроль-кнопку переключателя активного режима */
check = gtk_check_button_new_with_label ("с право на лево");
gtk_table_attach (gtk_table (table), check, 0, 1, 2, 3,
gtk_expand | gtk_fill, gtk_expand | gtk_fill,
5, 5);
g_signal_connect (g_object (check), "clicked",
g_callback (toggle_orientation),
(gpointer) pdata);
gtk_widget_show (check);
/* добавляем кнопку выхода из программмы */
button = gtk_button_new_with_label ("закрыть");
g_signal_connect_swapped (g_object (button), "clicked",
g_callback (gtk_widget_destroy),
g_object (pdata->window));
gtk_box_pack_start (gtk_box (vbox), button, false, false, 0);
/* создаем активную кнопку по умолчанию. */
gtk_widget_set_flags (button, gtk_can_default);
/* устанавливаем перехват для кнопки по умолчанию.
* простое нажатие клавиши "enter" активизирует кнопку. */
gtk_widget_grab_default (button);
gtk_widget_show (button);
gtk_widget_show (pdata->window);
gtk_main ();
return 0;
}
|