diff options
Diffstat (limited to 'src/dw-hdfsee.c')
-rw-r--r-- | src/dw-hdfsee.c | 134 |
1 files changed, 132 insertions, 2 deletions
diff --git a/src/dw-hdfsee.c b/src/dw-hdfsee.c index 75232b12..73a56832 100644 --- a/src/dw-hdfsee.c +++ b/src/dw-hdfsee.c @@ -39,6 +39,7 @@ #include <string.h> #include <cairo.h> #include <gdk-pixbuf/gdk-pixbuf.h> +#include <gdk/gdkkeysyms.h> #include "dw-hdfsee.h" #include "hdfsee-render.h" @@ -1012,6 +1013,26 @@ static int load_geometry_file(DisplayWindow *dw, struct image *image, return 0; } +static int save_geometry_file(DisplayWindow *dw) +{ + GtkWidget *d; + gchar * filename; + int w; + + d = gtk_file_chooser_dialog_new("Save Calibration Geometry", + GTK_WINDOW(dw->window), + GTK_FILE_CHOOSER_ACTION_SAVE, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, + NULL); + + gtk_dialog_run (GTK_DIALOG (d)); + filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER (d)); + w = write_detector_geometry(filename, dw->image->det); + gtk_widget_destroy(d); + g_free(filename); + return w; +} static gint displaywindow_loadgeom_response(GtkWidget *d, gint response, DisplayWindow *dw) @@ -1096,6 +1117,25 @@ static gint displaywindow_set_usegeom(GtkWidget *d, DisplayWindow *dw) return 0; } +static gint displaywindow_set_calibmode(GtkWidget *d, DisplayWindow *dw) +{ + + GtkWidget *w; + w = gtk_ui_manager_get_widget(dw->ui, + "/ui/displaywindow/tools/calibmode"); + + if (dw->use_geom == 0) { + gtk_check_menu_item_set_state(GTK_CHECK_MENU_ITEM(w),0); + } else { + + /* Get new value */ + dw->calib_mode = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(w)); + + displaywindow_update(dw); + } + + return 0; +} static gint displaywindow_set_rings(GtkWidget *d, DisplayWindow *dw) { @@ -1495,6 +1535,8 @@ static void displaywindow_addmenubar(DisplayWindow *dw, GtkWidget *vbox, GtkToggleActionEntry toggles[] = { { "GeometryAction", NULL, "Use Detector Geometry", NULL, NULL, G_CALLBACK(displaywindow_set_usegeom), FALSE }, + { "CalibModeAction", NULL, "Calibration Mode", NULL, NULL, + G_CALLBACK(displaywindow_set_calibmode), FALSE }, { "ColScaleAction", NULL, "Colour Scale", NULL, NULL, G_CALLBACK(displaywindow_set_colscale), FALSE }, { "RingsAction", NULL, "Resolution Rings", "F9", NULL, @@ -1818,9 +1860,80 @@ static gint displaywindow_press(GtkWidget *widget, GdkEventButton *event, } +static gint displaywindow_keypress(GtkWidget *widget, GdkEventKey *event, + DisplayWindow *dw) +{ + int pi,s; + + if (dw->calib_mode == 0) { + return 0; + } + + switch (event->keyval) { + + case GDK_Up: + for (pi=0;pi<dw->image->det->rigid_groups[dw->calib_mode_curr_quad]->n_panels;++pi) { + dw->image->det->rigid_groups[dw->calib_mode_curr_quad]->panels[pi]->cny += 1.0; + } + redraw_window(dw); + break; + + case GDK_Down: + for (pi=0;pi<dw->image->det->rigid_groups[dw->calib_mode_curr_quad]->n_panels;++pi) { + dw->image->det->rigid_groups[dw->calib_mode_curr_quad]->panels[pi]->cny -= 1.0; + } + while (gtk_events_pending()) { + gtk_main_iteration_do(FALSE); + } + redraw_window(dw); + break; + + case GDK_Left: + for (pi=0;pi<dw->image->det->rigid_groups[dw->calib_mode_curr_quad]->n_panels;++pi) { + dw->image->det->rigid_groups[dw->calib_mode_curr_quad]->panels[pi]->cnx -= 1.0; + } + redraw_window(dw); + break; + + case GDK_Right: + for (pi=0;pi<dw->image->det->rigid_groups[dw->calib_mode_curr_quad]->n_panels;++pi) { + dw->image->det->rigid_groups[dw->calib_mode_curr_quad]->panels[pi]->cnx += 1.0; + } + redraw_window(dw); + break; + + case GDK_1: + dw->calib_mode_curr_quad = 0; + break; + + case GDK_2: + dw->calib_mode_curr_quad = 1; + break; + + case GDK_3: + dw->calib_mode_curr_quad = 2; + break; + + case GDK_4: + dw->calib_mode_curr_quad = 3; + break; + + case GDK_s: + s = save_geometry_file(dw); + if ( s != 0 ) { + if ( s != 2 ) { + displaywindow_error(dw, "Unable to save the calibration geometry."); + } + } + break; + } + + return 0; +} + DisplayWindow *displaywindow_open(const char *filename, const char *peaks, double boost, int binning, - int noisefilter, int colscale, + int noisefilter, int calibmode, int colscale, const char *element, const char *geometry, const char *beam, int show_rings, double *ring_radii, @@ -1831,6 +1944,7 @@ DisplayWindow *displaywindow_open(const char *filename, const char *peaks, char *title; GtkWidget *vbox; GtkWidget *w; + GtkWidget *ww; dw = calloc(1, sizeof(DisplayWindow)); if ( dw == NULL ) return NULL; @@ -1857,6 +1971,8 @@ DisplayWindow *displaywindow_open(const char *filename, const char *peaks, dw->n_rings = n_rings; dw->median_filter = median_filter; dw->image = calloc(1, sizeof(struct image)); + dw->calib_mode = 0; + dw->calib_mode_curr_quad = 0; if ( beam != NULL ) { dw->image->beam = get_beam_parameters(beam); @@ -1940,18 +2056,32 @@ DisplayWindow *displaywindow_open(const char *filename, const char *peaks, load_geometry_file(dw, dw->image, geometry); } + if (dw->use_geom == 1) { + dw->calib_mode = calibmode; + } + + if (dw->calib_mode == 1) { + ww = gtk_ui_manager_get_widget(dw->ui, "/ui/displaywindow/tools/calibmode"); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(ww), TRUE); + } + displaywindow_update(dw); gtk_widget_add_events(GTK_WIDGET(dw->drawingarea), GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - | GDK_BUTTON1_MOTION_MASK); + | GDK_BUTTON1_MOTION_MASK + | GDK_KEY_PRESS_MASK); g_object_set(G_OBJECT(dw->drawingarea), "can-focus", TRUE, NULL); + gtk_widget_grab_focus(dw->drawingarea); + g_signal_connect(GTK_OBJECT(dw->drawingarea), "button-press-event", G_CALLBACK(displaywindow_press), dw); g_signal_connect(GTK_OBJECT(dw->drawingarea), "button-release-event", G_CALLBACK(displaywindow_release), dw); + g_signal_connect(GTK_OBJECT(dw->drawingarea), "key-press-event", + G_CALLBACK(displaywindow_keypress), dw); displaywindow_update_menus(dw, element); dw->not_ready_yet = 0; |