diff options
author | Thomas White <taw@physics.org> | 2020-08-26 16:47:58 +0200 |
---|---|---|
committer | Thomas White <taw@physics.org> | 2020-08-26 16:47:58 +0200 |
commit | beed39e09a3573380ee2cc0792b547c2f2d52852 (patch) | |
tree | b606a9d9faab02d68f848f78bc4600559dac63f2 /src | |
parent | f249385feb6799c913f3eba13d79dfd507c72c04 (diff) |
Add job title and notes fields
This required a bit of callback re-wiring
Diffstat (limited to 'src')
-rw-r--r-- | src/gui_backend_local.c | 4 | ||||
-rw-r--r-- | src/gui_backend_slurm.c | 4 | ||||
-rw-r--r-- | src/gui_index.c | 195 | ||||
-rw-r--r-- | src/gui_project.c | 9 | ||||
-rw-r--r-- | src/gui_project.h | 8 |
5 files changed, 174 insertions, 46 deletions
diff --git a/src/gui_backend_local.c b/src/gui_backend_local.c index 6d4ac66c..98182720 100644 --- a/src/gui_backend_local.c +++ b/src/gui_backend_local.c @@ -151,7 +151,9 @@ void setup_subprocess(gpointer user_data) } -static void *run_indexing(char **filenames, +static void *run_indexing(const char *job_title, + const char *job_notes, + char **filenames, char **events, int n_frames, char *geom_filename, diff --git a/src/gui_backend_slurm.c b/src/gui_backend_slurm.c index 684bcbaa..c2b2b93e 100644 --- a/src/gui_backend_slurm.c +++ b/src/gui_backend_slurm.c @@ -68,7 +68,9 @@ static void cancel_task(void *job_priv) } -static void *run_indexing(char **filenames, +static void *run_indexing(const char *job_title, + const char *job_notes, + char **filenames, char **events, int n_frames, char *geom_filename, diff --git a/src/gui_index.c b/src/gui_index.c index af6f7eba..ffcadb9b 100644 --- a/src/gui_index.c +++ b/src/gui_index.c @@ -89,21 +89,16 @@ static void get_indexing_opts(struct crystfelproject *proj, } -static void run_indexing_all(struct crystfelproject *proj) +static void run_indexing_all(struct crystfelproject *proj, + int backend_idx, const char *job_title, + const char *job_notes) { - int backend_idx; struct crystfel_backend *be; void *job_priv; - get_indexing_opts(proj, - CRYSTFEL_INDEXING_OPTS(proj->indexing_opts)); - - - backend_idx = gtk_combo_box_get_active(GTK_COMBO_BOX(proj->indexing_backend_combo)); - if ( backend_idx < 0 ) return; - be = &proj->backends[backend_idx]; - job_priv = be->run_indexing(proj->filenames, + job_priv = be->run_indexing(job_title, job_notes, + proj->filenames, proj->events, proj->n_frames, proj->geom_filename, @@ -118,44 +113,145 @@ static void run_indexing_all(struct crystfelproject *proj) } +struct new_job_params { + struct crystfelproject *proj; + GtkWidget *indexing_backend_combo; + GtkWidget *indexing_backend_opts_widget; + GtkWidget *indexing_backend_opts_box; + GtkWidget *job_title_entry; + GtkWidget *job_notes_text; +}; + + +static char *get_all_text(GtkTextView *view) +{ + GtkTextBuffer *buf; + GtkTextIter start, end; + + buf = gtk_text_view_get_buffer(view); + + gtk_text_buffer_get_start_iter(buf, &start); + gtk_text_buffer_get_end_iter(buf, &end); + + return gtk_text_buffer_get_text(buf, &start, &end, FALSE); +} + + static void index_all_response_sig(GtkWidget *dialog, gint resp, - struct crystfelproject *proj) + struct new_job_params *njp) { if ( resp == GTK_RESPONSE_OK ) { - run_indexing_all(proj); + + int backend_idx; + const char *job_title; + char *job_notes; + + get_indexing_opts(njp->proj, + CRYSTFEL_INDEXING_OPTS(njp->proj->indexing_opts)); + + backend_idx = gtk_combo_box_get_active(GTK_COMBO_BOX(njp->indexing_backend_combo)); + if ( backend_idx < 0 ) return; + + job_title = gtk_entry_get_text(GTK_ENTRY(njp->job_title_entry)); + job_notes = get_all_text(GTK_TEXT_VIEW(njp->job_notes_text)); + + free(njp->proj->indexing_new_job_title); + njp->proj->indexing_new_job_title = strdup(job_title); + + run_indexing_all(njp->proj, backend_idx, + job_title, job_notes); + + free(job_notes); } gtk_widget_destroy(dialog); - proj->indexing_opts = NULL; + njp->proj->indexing_opts = NULL; } static void indexing_backend_changed_sig(GtkWidget *combo, - struct crystfelproject *proj) + struct new_job_params *njp) { int backend_idx; struct crystfel_backend *be; backend_idx = gtk_combo_box_get_active(GTK_COMBO_BOX(combo)); if ( backend_idx < 0 ) return; - proj->indexing_backend_selected = backend_idx; + njp->proj->indexing_backend_selected = backend_idx; - be = &proj->backends[backend_idx]; + be = &njp->proj->backends[backend_idx]; + + if ( njp->indexing_backend_opts_widget != NULL ) { + gtk_widget_destroy(njp->indexing_backend_opts_widget); + } + + njp->indexing_backend_opts_widget = be->make_indexing_parameters_widget(be->indexing_opts_priv); + + gtk_box_pack_start(GTK_BOX(njp->indexing_backend_opts_box), + GTK_WIDGET(njp->indexing_backend_opts_widget), + FALSE, FALSE, 0); + gtk_widget_show_all(njp->indexing_backend_opts_widget); +} + + +static GtkWidget *make_job_opts(struct crystfelproject *proj, + struct new_job_params *njp) +{ + GtkWidget *box; + GtkWidget *hbox; + GtkWidget *label; + GtkWidget *scroll; - if ( proj->indexing_backend_opts_widget != NULL ) { - gtk_widget_destroy(proj->indexing_backend_opts_widget); + box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); + gtk_container_set_border_width(GTK_CONTAINER(box), 8); + + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); + gtk_box_pack_start(GTK_BOX(box), GTK_WIDGET(hbox), + FALSE, FALSE, 0); + label = gtk_label_new("Job name:"); + gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(label), + FALSE, FALSE, 0); + njp->job_title_entry = gtk_entry_new(); + gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(njp->job_title_entry), + TRUE, TRUE, 2.0); + if ( proj->indexing_new_job_title != NULL ) { + gtk_entry_set_text(GTK_ENTRY(njp->job_title_entry), + proj->indexing_new_job_title); } - proj->indexing_backend_opts_widget = be->make_indexing_parameters_widget(be->indexing_opts_priv); + label = gtk_label_new("This name will be used for a working subfolder"); + gtk_label_set_markup(GTK_LABEL(label), + "<i>This name will be used for a working subfolder</i>"); + gtk_box_pack_start(GTK_BOX(box), GTK_WIDGET(label), + FALSE, FALSE, 0); + gtk_entry_set_placeholder_text(GTK_ENTRY(njp->job_title_entry), + "indexing-trial-1"); - gtk_box_pack_start(GTK_BOX(proj->indexing_backend_opts_box), - GTK_WIDGET(proj->indexing_backend_opts_widget), + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); + gtk_box_pack_start(GTK_BOX(box), GTK_WIDGET(hbox), + TRUE, TRUE, 0); + label = gtk_label_new("Notes:"); + gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(label), FALSE, FALSE, 0); - gtk_widget_show_all(proj->indexing_backend_opts_widget); + njp->job_notes_text = gtk_text_view_new(); + scroll = gtk_scrolled_window_new(NULL, NULL); + gtk_container_add(GTK_CONTAINER(scroll), njp->job_notes_text); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scroll), + GTK_SHADOW_ETCHED_IN); + gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(scroll), + TRUE, TRUE, 2.0); + + label = gtk_label_new("The notes above will be placed in the job's folder as 'notes.txt'"); + gtk_label_set_markup(GTK_LABEL(label), + "<i>The notes above will be placed in the job's folder as 'notes.txt'</i>"); + gtk_box_pack_start(GTK_BOX(box), GTK_WIDGET(label), + FALSE, FALSE, 0); + + return box; } -static GtkWidget *make_backend_opts(struct crystfelproject *proj) +static GtkWidget *make_backend_opts(struct new_job_params *njp) { GtkWidget *box; GtkWidget *hbox; @@ -172,28 +268,28 @@ static GtkWidget *make_backend_opts(struct crystfelproject *proj) gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(label), FALSE, FALSE, 0); - proj->indexing_backend_combo = gtk_combo_box_text_new(); - gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(proj->indexing_backend_combo), + njp->indexing_backend_combo = gtk_combo_box_text_new(); + gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(njp->indexing_backend_combo), FALSE, FALSE, 0); - for ( i=0; i<proj->n_backends; i++ ) { - gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(proj->indexing_backend_combo), - proj->backends[i].name, - proj->backends[i].friendly_name); + for ( i=0; i<njp->proj->n_backends; i++ ) { + gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(njp->indexing_backend_combo), + njp->proj->backends[i].name, + njp->proj->backends[i].friendly_name); } - proj->indexing_backend_opts_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, + njp->indexing_backend_opts_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); gtk_box_pack_start(GTK_BOX(box), - GTK_WIDGET(proj->indexing_backend_opts_box), + GTK_WIDGET(njp->indexing_backend_opts_box), FALSE, FALSE, 0); - proj->indexing_backend_opts_widget = NULL; + njp->indexing_backend_opts_widget = NULL; - /* proj->indexing_backend_opts{_box} must exist before the following */ - g_signal_connect(G_OBJECT(proj->indexing_backend_combo), "changed", - G_CALLBACK(indexing_backend_changed_sig), proj); - gtk_combo_box_set_active(GTK_COMBO_BOX(proj->indexing_backend_combo), - proj->indexing_backend_selected); + /* njp->indexing_backend_opts{_box} must exist before the following */ + g_signal_connect(G_OBJECT(njp->indexing_backend_combo), "changed", + G_CALLBACK(indexing_backend_changed_sig), njp); + gtk_combo_box_set_active(GTK_COMBO_BOX(njp->indexing_backend_combo), + njp->proj->indexing_backend_selected); return box; } @@ -220,15 +316,28 @@ static void set_indexing_opts(struct crystfelproject *proj, } +static void free_new_job_params(gpointer njp, GClosure *closure) +{ + free(njp); +} + + gint index_all_sig(GtkWidget *widget, struct crystfelproject *proj) { GtkWidget *dialog; GtkWidget *content_area; GtkWidget *vbox; GtkWidget *backend_page; + GtkWidget *job_page; + struct new_job_params *njp; if ( proj->indexing_opts != NULL ) return FALSE; + njp = malloc(sizeof(struct new_job_params)); + if ( njp == NULL ) return FALSE; + + njp->proj = proj; + dialog = gtk_dialog_new_with_buttons("Index all frames", GTK_WINDOW(proj->window), GTK_DIALOG_DESTROY_WITH_PARENT, @@ -236,8 +345,9 @@ gint index_all_sig(GtkWidget *widget, struct crystfelproject *proj) "Run", GTK_RESPONSE_OK, NULL); - g_signal_connect(G_OBJECT(dialog), "response", - G_CALLBACK(index_all_response_sig), proj); + g_signal_connect_data(G_OBJECT(dialog), "response", + G_CALLBACK(index_all_response_sig), + njp, free_new_job_params, 0); vbox = gtk_vbox_new(FALSE, 0.0); content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); @@ -250,7 +360,12 @@ gint index_all_sig(GtkWidget *widget, struct crystfelproject *proj) set_indexing_opts(proj, CRYSTFEL_INDEXING_OPTS(proj->indexing_opts)); - backend_page = make_backend_opts(proj), + job_page = make_job_opts(proj, njp); + gtk_notebook_prepend_page(GTK_NOTEBOOK(proj->indexing_opts), + job_page, + gtk_label_new("Job name")); + + backend_page = make_backend_opts(njp); gtk_notebook_append_page(GTK_NOTEBOOK(proj->indexing_opts), backend_page, gtk_label_new("Cluster/batch system")); diff --git a/src/gui_project.c b/src/gui_project.c index 26a2f3a3..637aa85d 100644 --- a/src/gui_project.c +++ b/src/gui_project.c @@ -257,6 +257,11 @@ static void handle_var(const char *key, const char *val, proj->indexing_params.min_peaks = parse_int(val); } + if ( strcmp(key, "indexing.new_job_title") == 0 ) { + free(proj->indexing_new_job_title); + proj->indexing_new_job_title = strdup(val); + } + if ( strcmp(key, "indexing.backend") == 0 ) { proj->indexing_backend_selected = find_backend(val, proj); } @@ -494,6 +499,9 @@ int save_project(struct crystfelproject *proj) fprintf(fh, "indexing.min_peaks %i\n", proj->indexing_params.min_peaks); + fprintf(fh, "indexing.new_job_title %s\n", + proj->indexing_new_job_title); + fprintf(fh, "indexing.backend %s\n", proj->backends[proj->indexing_backend_selected].name); for ( i=0; i<proj->n_backends; i++ ) { @@ -548,6 +556,7 @@ void default_project(struct crystfelproject *proj) proj->cur_image = NULL; proj->indexing_opts = NULL; proj->n_running_tasks = 0; + proj->indexing_new_job_title = NULL; /* FIXME: Crappy error handling */ proj->n_backends = 2; diff --git a/src/gui_project.h b/src/gui_project.h index 6d6ca919..34aa6f61 100644 --- a/src/gui_project.h +++ b/src/gui_project.h @@ -95,7 +95,9 @@ struct crystfel_backend { /* Called to ask the backend to start indexing frames. * It should return a void pointer representing this job */ - void *(*run_indexing)(char **filenames, + void *(*run_indexing)(const char *job_title, + const char *job_notes, + char **filenames, char **events, int n_frames, char *geom_filename, @@ -171,9 +173,7 @@ struct crystfelproject { struct index_params indexing_params; int indexing_backend_selected; GtkWidget *indexing_opts; - GtkWidget *indexing_backend_combo; - GtkWidget *indexing_backend_opts_widget; - GtkWidget *indexing_backend_opts_box; + char *indexing_new_job_title; GtkWidget *type_combo; GtkWidget *peak_vbox; /* Box for peak search parameter widgets */ |