diff options
author | Thomas White <taw@physics.org> | 2020-08-25 17:15:49 +0200 |
---|---|---|
committer | Thomas White <taw@physics.org> | 2020-08-25 17:15:49 +0200 |
commit | 295b6184171bdd230e5e61f0ba2ad26d504062a8 (patch) | |
tree | 53a2586007c6303d6f8c674a4f1ec1e4ac0fbd05 /src/crystfel_gui.c | |
parent | 11e896334aea873017287733ab3c0f216939861f (diff) |
Implement progress bar for indexing via generic interface
Diffstat (limited to 'src/crystfel_gui.c')
-rw-r--r-- | src/crystfel_gui.c | 47 |
1 files changed, 43 insertions, 4 deletions
diff --git a/src/crystfel_gui.c b/src/crystfel_gui.c index fd79e9da..3e8f6b24 100644 --- a/src/crystfel_gui.c +++ b/src/crystfel_gui.c @@ -1006,7 +1006,11 @@ static void infobar_response_sig(GtkInfoBar *infobar, gint resp, if ( resp == GTK_RESPONSE_CANCEL ) { task->backend->cancel_task(task->job_priv); - /* FIXME: Cancel processing */ + + } else if ( resp == GTK_RESPONSE_CLOSE ) { + + gtk_info_bar_set_revealed(infobar, FALSE); + /* FIXME: Remove task from list */ } else { ERROR("Unrecognised infobar response!\n"); @@ -1014,6 +1018,33 @@ static void infobar_response_sig(GtkInfoBar *infobar, gint resp, } +static gboolean update_info_bar(gpointer data) +{ + struct gui_task *task = data; + int running; + float frac_complete; + + if ( task->backend->task_status(task->job_priv, + &running, &frac_complete) ) { + ERROR("Error retrieving task status\n"); + return G_SOURCE_CONTINUE; + } + + gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(task->progress_bar), + frac_complete); + + if ( !running && task->running ) { + /* Task is no longer running */ + gtk_widget_destroy(task->cancel_button); + gtk_info_bar_set_show_close_button(GTK_INFO_BAR(task->info_bar), + TRUE); + return G_SOURCE_REMOVE; + } + + return G_SOURCE_CONTINUE; +} + + void add_running_task(struct crystfelproject *proj, const char *task_desc, struct crystfel_backend *backend, @@ -1025,11 +1056,17 @@ void add_running_task(struct crystfelproject *proj, task = &proj->tasks[proj->n_running_tasks++]; task->job_priv = job_priv; task->backend = backend; + task->running = 1; /* Progress info bar */ - task->info_bar = gtk_info_bar_new_with_buttons(GTK_STOCK_CANCEL, - GTK_RESPONSE_CANCEL, - NULL); + task->info_bar = gtk_info_bar_new(); + gtk_info_bar_set_message_type(GTK_INFO_BAR(task->info_bar), + GTK_MESSAGE_INFO); + + task->cancel_button = gtk_info_bar_add_button(GTK_INFO_BAR(task->info_bar), + GTK_STOCK_CANCEL, + GTK_RESPONSE_CANCEL); + gtk_box_pack_end(GTK_BOX(proj->main_vbox), GTK_WIDGET(task->info_bar), FALSE, FALSE, 0.0); @@ -1050,4 +1087,6 @@ void add_running_task(struct crystfelproject *proj, gtk_widget_show_all(task->info_bar); gtk_info_bar_set_revealed(GTK_INFO_BAR(task->info_bar), TRUE); + + g_timeout_add(500, update_info_bar, task); } |