From 37bd4fc5a180f15c1d29bbb5ec8403b33626f451 Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Mon, 25 Jun 2018 21:25:23 -0400 Subject: [PATCH] Added a test program to demonstrate the GTK+ progress bar cell renderer timer issues. --- doc/misctests/gtkprogresstable.c | 136 +++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 doc/misctests/gtkprogresstable.c diff --git a/doc/misctests/gtkprogresstable.c b/doc/misctests/gtkprogresstable.c new file mode 100644 index 00000000..220cb370 --- /dev/null +++ b/doc/misctests/gtkprogresstable.c @@ -0,0 +1,136 @@ +// 25 june 2018 +#include + +GtkWidget *mainwin; +GtkWidget *vbox; +GtkWidget *hbox; +GtkWidget *startProgress; +GtkWidget *startTable; +GtkWidget *progressbar; +GtkWidget *scrolledWindow; +GtkListStore *model; +GtkWidget *treeview; +GtkWidget *hbox2; + +static gboolean pulseProgress(gpointer data) +{ + gtk_progress_bar_pulse(GTK_PROGRESS_BAR(progressbar)); + return TRUE; +} + +static void onStartProgressClicked(GtkButton *button, gpointer data) +{ + gtk_widget_set_sensitive(startProgress, FALSE); + g_timeout_add(100, pulseProgress, NULL); +} + +gboolean pbarStarted = FALSE; +gint pbarValue; + +static void pbarDataFunc(GtkTreeViewColumn *col, GtkCellRenderer *r, GtkTreeModel *m, GtkTreeIter *iter, gpointer data) +{ + if (!pbarStarted) { + g_object_set(r, + "pulse", -1, + "value", 0, + NULL); + return; + } + pbarValue++; + if (pbarValue == G_MAXINT) + pbarValue = 1; + g_object_set(r, "pulse", pbarValue, NULL); +} + +static gboolean pulseTable(gpointer data) +{ + GtkTreePath *path; + GtkTreeIter iter; + + path = gtk_tree_path_new_from_indices(0, -1); + gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, path); + gtk_tree_model_row_changed(GTK_TREE_MODEL(model), path, &iter); + gtk_tree_path_free(path); + return TRUE; +} + +static void onStartTableClicked(GtkButton *button, gpointer data) +{ + pbarStarted = TRUE; + pbarValue = 0; + + gtk_widget_set_sensitive(startTable, FALSE); + g_timeout_add(100, pulseTable, NULL); +} + +static gboolean onClosing(GtkWidget *win, GdkEvent *e, gpointer data) +{ + gtk_main_quit(); + return FALSE; +} + +int main(void) +{ + GtkTreeIter iter; + GtkTreeViewColumn *col; + GtkCellRenderer *r; + + gtk_init(NULL, NULL); + + mainwin = gtk_window_new(GTK_WINDOW_TOPLEVEL); + g_signal_connect(mainwin, "delete-event", G_CALLBACK(onClosing), NULL); + + vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 12); + gtk_container_set_border_width(GTK_CONTAINER(vbox), 12); + gtk_container_add(GTK_CONTAINER(mainwin), vbox); + + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6); + gtk_widget_set_halign(hbox, GTK_ALIGN_CENTER); + gtk_container_add(GTK_CONTAINER(vbox), hbox); + + startProgress = gtk_button_new_with_label("Start Progress Bar"); + g_signal_connect(startProgress, "clicked", G_CALLBACK(onStartProgressClicked), NULL); + gtk_container_add(GTK_CONTAINER(hbox), startProgress); + + startTable = gtk_button_new_with_label("Start Table Cell Renderer"); + g_signal_connect(startTable, "clicked", G_CALLBACK(onStartTableClicked), NULL); + gtk_container_add(GTK_CONTAINER(hbox), startTable); + + progressbar = gtk_progress_bar_new(); + gtk_container_add(GTK_CONTAINER(vbox), progressbar); + + scrolledWindow = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledWindow), GTK_SHADOW_IN); + gtk_widget_set_vexpand(scrolledWindow, TRUE); + gtk_container_add(GTK_CONTAINER(vbox), scrolledWindow); + + model = gtk_list_store_new(1, G_TYPE_INT); + gtk_list_store_append(model, &iter); + gtk_list_store_set(model, &iter, + 0, 0, + -1); + + treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model)); + gtk_container_add(GTK_CONTAINER(scrolledWindow), treeview); + + col = gtk_tree_view_column_new(); + gtk_tree_view_column_set_resizable(col, TRUE); + gtk_tree_view_column_set_title(col, "Column"); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), col); + + r = gtk_cell_renderer_progress_new(); + gtk_tree_view_column_pack_start(col, r, TRUE); + gtk_tree_view_column_set_cell_data_func(col, r, pbarDataFunc, NULL, NULL); + + hbox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6); + gtk_widget_set_halign(hbox2, GTK_ALIGN_CENTER); + gtk_container_add(GTK_CONTAINER(vbox), hbox2); + + gtk_container_add(GTK_CONTAINER(hbox2), gtk_button_new_with_label("These buttons")); + gtk_container_add(GTK_CONTAINER(hbox2), gtk_button_new_with_label("do nothing")); + gtk_container_add(GTK_CONTAINER(hbox2), gtk_button_new_with_label("when clicked")); + + gtk_widget_show_all(mainwin); + gtk_main(); + return 0; +}