diff options
author | Thomas White <taw@physics.org> | 2022-08-23 15:56:57 +0200 |
---|---|---|
committer | Thomas White <taw@physics.org> | 2022-08-23 16:07:44 +0200 |
commit | 4464b2fc8d2840d489a839e4973fab1e71144efc (patch) | |
tree | 40efb8a10f7ed0e0ba5cb2b11a257ef6bd08b3b7 /src/crystfel_gui.c | |
parent | 1179bed2ebc892dc918aae09dae586c516d0e36e (diff) |
GUI: Add resolution rings
It will refuse to draw the rings if the detector is too far from being
flat (as judged by detgeom_mean_camera_length). Otherwise, the drawing
is exactly the same as was done by hdfsee.
Diffstat (limited to 'src/crystfel_gui.c')
-rw-r--r-- | src/crystfel_gui.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/src/crystfel_gui.c b/src/crystfel_gui.c index 066422a3..1c439b18 100644 --- a/src/crystfel_gui.c +++ b/src/crystfel_gui.c @@ -275,6 +275,8 @@ void update_imageview(struct crystfelproject *proj) proj->show_peaks); crystfel_image_view_set_show_centre(CRYSTFEL_IMAGE_VIEW(proj->imageview), proj->show_centre); + crystfel_image_view_set_resolution_rings(CRYSTFEL_IMAGE_VIEW(proj->imageview), + proj->resolution_rings); crystfel_image_view_set_image(CRYSTFEL_IMAGE_VIEW(proj->imageview), proj->cur_image); @@ -670,6 +672,30 @@ static gint show_centre_sig(GtkWidget *w, struct crystfelproject *proj) } +static gint resolution_rings_sig(GtkWidget *w, struct crystfelproject *proj) +{ + int tr = gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(w)); + + if ( tr && proj->cur_image == NULL ) { + error_box(proj, "Load some images first!\n"); + return FALSE; + } + + if ( tr && isnan(detgeom_mean_camera_length(proj->cur_image->detgeom)) ) { + error_box(proj, "Cannot display resolution rings accurately " + "because detector is not flat enough"); + tr = FALSE; + gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(w), FALSE); + } + + proj->resolution_rings = tr; + crystfel_image_view_set_resolution_rings(CRYSTFEL_IMAGE_VIEW(proj->imageview), + tr); + + return FALSE; +} + + static gint show_peaks_sig(GtkWidget *w, struct crystfelproject *proj) { proj->show_peaks = gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(w)); @@ -711,6 +737,7 @@ static void add_menu_bar(struct crystfelproject *proj, GtkWidget *vbox) " <menuitem name=\"refls\" action=\"ReflsAction\" />" " <menuitem name=\"labelrefls\" action=\"LabelReflsAction\" />" " <menuitem name=\"centre\" action=\"CentreAction\" />" + " <menuitem name=\"resrings\" action=\"ResolutionRingsAction\" />" " <separator />" " <menuitem name=\"resetzoom\" action=\"ResetZoomAction\" />" "</menu>" @@ -757,6 +784,8 @@ static void add_menu_bar(struct crystfelproject *proj, GtkWidget *vbox) G_CALLBACK(label_refls_sig), FALSE }, { "CentreAction", NULL, "Beam centre", NULL, NULL, G_CALLBACK(show_centre_sig), FALSE }, + { "ResolutionRingsAction", NULL, "Resolution rings", NULL, NULL, + G_CALLBACK(resolution_rings_sig), FALSE }, { "RescanOnChangeAction", NULL, "Rescan streams when changing frame", NULL, NULL, G_CALLBACK(rescan_on_change_sig), FALSE }, }; @@ -1165,6 +1194,10 @@ int main(int argc, char *argv[]) gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(act), proj.label_refls); + act = gtk_ui_manager_get_action(proj.ui, "/mainwindow/view/resrings"); + gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(act), + proj.resolution_rings); + act = gtk_ui_manager_get_action(proj.ui, "/mainwindow/tools/rescanonchange"); gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(act), proj.rescan_on_change); |