diff options
author | taw27 <taw27@bf6ca9ba-c028-0410-8290-897cf20841d1> | 2007-12-03 00:05:51 +0000 |
---|---|---|
committer | taw27 <taw27@bf6ca9ba-c028-0410-8290-897cf20841d1> | 2007-12-03 00:05:51 +0000 |
commit | 7fce8715762390de88450c777f2fba474bf6bf12 (patch) | |
tree | 83fa16fcb5997bb4de4cf785d880a73e482ff3d3 | |
parent | cf7a9b848cfa0ec4b649f54100b6ff92e5553232 (diff) |
UI revamp
Bump version number to 1.0.7
git-svn-id: svn://cook.msm.cam.ac.uk:745/diff-tomo/dtr@217 bf6ca9ba-c028-0410-8290-897cf20841d1
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | data/displaywindow.ui | 19 | ||||
-rw-r--r-- | src/control.c | 1 | ||||
-rw-r--r-- | src/control.h | 4 | ||||
-rw-r--r-- | src/dirax.c | 4 | ||||
-rw-r--r-- | src/displaywindow.c | 178 | ||||
-rw-r--r-- | src/displaywindow.h | 5 | ||||
-rw-r--r-- | src/imagedisplay.c | 33 | ||||
-rw-r--r-- | src/imagedisplay.h | 2 | ||||
-rw-r--r-- | src/mapping.c | 5 | ||||
-rw-r--r-- | src/refine.c | 108 | ||||
-rw-r--r-- | src/refine.h | 3 | ||||
-rw-r--r-- | src/reproject.c | 108 | ||||
-rw-r--r-- | src/reproject.h | 2 |
14 files changed, 256 insertions, 218 deletions
diff --git a/configure.ac b/configure.ac index 1345495..42432a4 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ dnl Process this file with autoconf to produce a configure script. -AC_INIT(dtr, 1.0.6, taw27@cam.ac.uk) +AC_INIT(dtr, 1.0.7, taw27@cam.ac.uk) VERSION=AC_PACKAGE_VERSION AM_CONFIG_HEADER(config.h) diff --git a/data/displaywindow.ui b/data/displaywindow.ui index 83be71c..d94f8ef 100644 --- a/data/displaywindow.ui +++ b/data/displaywindow.ui @@ -20,8 +20,8 @@ <menuitem name="dirax" action="DirAxAction" /> <menuitem name="diraxrerun" action="DirAxReRunAction" /> <menuitem name="diraxstop" action="StopDirAxAction" /> - <menuitem name="reproject" action="ReprojectAction" /> - <menuitem name="refine" action="RefineAction" /> + <menuitem name="refinestep" action="RefineStepAction" /> + <menuitem name="refineseq" action="RefineSeqAction" /> <separator /> <menuitem name="setaxis" action="SetAxisAction" /> <menuitem name="incraxis" action="IncrAxisAction" /> @@ -34,5 +34,20 @@ </menubar> + <toolbar name="displaywindowtoolbar"> + + <toolitem name="tiltaxis" action="ButtonTiltAxisAction" /> + <toolitem name="dirax" action="ButtonDirAxAction" /> + <separator /> + <toolitem name="first" action="ButtonFirstImageAction" /> + <toolitem name="prev" action="ButtonPrevImageAction" /> + <toolitem name="next" action="ButtonNextImageAction" /> + <toolitem name="last" action="ButtonLastImageAction" /> + <separator /> + <toolitem name="refinestep" action="ButtonRefineStepAction" /> + <toolitem name="refineseq" action="ButtonRefineSeqAction" /> + + </toolbar> + </ui> diff --git a/src/control.c b/src/control.c index 0346e7a..5c66713 100644 --- a/src/control.c +++ b/src/control.c @@ -31,7 +31,6 @@ ControlContext *control_ctx_new() { ctx->reflectionlist = NULL; ctx->refine_window = NULL; ctx->cell_lattice = NULL; - ctx->reproject_id = NULL; return ctx; diff --git a/src/control.h b/src/control.h index 4bb828d..c6e1306 100644 --- a/src/control.h +++ b/src/control.h @@ -102,10 +102,6 @@ typedef struct cctx_struct { int dirax_step; int dirax_read_cell; - /* Reprojection stuff */ - int reproject_cur_image; - struct imagedisplay_struct *reproject_id; - /* Refinement stuff */ GtkWidget *refine_window; diff --git a/src/dirax.c b/src/dirax.c index e57be11..e58983a 100644 --- a/src/dirax.c +++ b/src/dirax.c @@ -33,6 +33,7 @@ #include "utils.h" #include "basis.h" #include "displaywindow.h" +#include "reproject.h" typedef enum { DIRAX_INPUT_NONE, @@ -98,6 +99,7 @@ static void dirax_parseline(const char *line, ControlContext *ctx) { ctx->cell->a.z = z1*1e10; ctx->cell->b.z = z2*1e10; ctx->cell->c.z = z3*1e10; printf("DX: Read a reciprocal unit cell\n"); displaywindow_update(ctx->dw); + reproject_lattice_changed(ctx); ctx->dirax_read_cell = 0; return; } @@ -331,7 +333,7 @@ void dirax_invoke(ControlContext *ctx) { int saved_stderr; if ( ctx->dirax ) { - printf("DX: DirAx is already running.\n"); + dirax_rerun(ctx); return; } diff --git a/src/displaywindow.c b/src/displaywindow.c index 25a48a4..9769a07 100644 --- a/src/displaywindow.c +++ b/src/displaywindow.c @@ -35,6 +35,7 @@ #include "cache.h" #include "mapping.h" #include "refine.h" +#include "imagedisplay.h" static void displaywindow_gl_set_ortho(DisplayWindow *dw, GLfloat w, GLfloat h) { @@ -940,10 +941,6 @@ static void displaywindow_dirax(GtkWidget *widget, DisplayWindow *dw) { dirax_invoke(dw->ctx); } -static void displaywindow_reproject(GtkWidget *widget, DisplayWindow *dw) { - reproject_open(dw->ctx); -} - static void displaywindow_dirax_stop(GtkWidget *widget, DisplayWindow *dw) { dirax_stop(dw->ctx); } @@ -1092,8 +1089,44 @@ static gint displaywindow_setaxis(GtkWidget *widget, DisplayWindow *dw) { } -static gint displaywindow_refine(GtkWidget *widget, DisplayWindow *dw) { - refine_open(dw->ctx); +static gint displaywindow_image_first(GtkWidget *widget, DisplayWindow *dw) { + + dw->cur_image = 0; + displaywindow_update_imagestack(dw); + + return 0; +} + +static gint displaywindow_image_prev(GtkWidget *widget, DisplayWindow *dw) { + + if ( dw->cur_image > 0 ) { + dw->cur_image--; + displaywindow_update_imagestack(dw); + } + return 0; +} + +static gint displaywindow_image_next(GtkWidget *widget, DisplayWindow *dw) { + if ( dw->cur_image < dw->ctx->images->n_images-1 ) { + dw->cur_image++; + displaywindow_update_imagestack(dw); + } + return 0; +} + +static gint displaywindow_image_last(GtkWidget *widget, DisplayWindow *dw) { + dw->cur_image = dw->ctx->images->n_images-1; + displaywindow_update_imagestack(dw); + return 0; +} + +static gint displaywindow_refinestep(GtkWidget *widget, DisplayWindow *dw) { + refine_do_image(dw->ctx); + return 0; +} + +static gint displaywindow_refinestack(GtkWidget *widget, DisplayWindow *dw) { + refine_do_stack(dw->ctx); return 0; } @@ -1111,15 +1144,24 @@ static void displaywindow_addmenubar(DisplayWindow *dw) { { "DirAxAction", GTK_STOCK_EXECUTE, "Start _DirAx", "<Ctrl>D", NULL, G_CALLBACK(displaywindow_dirax) }, { "DirAxReRunAction", NULL, "Run another DirAx cycle", NULL, NULL, G_CALLBACK(displaywindow_dirax_rerun) }, { "StopDirAxAction", NULL, "Stop DirAx", NULL, NULL, G_CALLBACK(displaywindow_dirax_stop) }, - { "ReprojectAction", NULL, "_Reproject Diffraction Patterns", NULL, NULL, G_CALLBACK(displaywindow_reproject) }, - { "RefineAction", GTK_STOCK_EXECUTE, "Refine Reconstruction", NULL, NULL, G_CALLBACK(displaywindow_refine) }, + { "RefineStepAction", GTK_STOCK_EXECUTE, "Refine Current Image", NULL, NULL, G_CALLBACK(displaywindow_refinestep) }, + { "RefineSeqAction", GTK_STOCK_EXECUTE, "Refine Entire Stack", NULL, NULL, G_CALLBACK(displaywindow_refinestack) }, { "SetAxisAction", NULL, "Set Tilt Axis Position", NULL, NULL, G_CALLBACK(displaywindow_setaxis) }, { "IncrAxisAction", NULL, "Increase Tilt Axis Position", "<Ctrl>Up", NULL, G_CALLBACK(displaywindow_incraxis) }, { "DecrAxisAction", NULL, "Decrease Tilt Axis Position", "<Ctrl>Down", NULL, G_CALLBACK(displaywindow_decraxis) }, { "HelpAction", NULL, "_Help", NULL, NULL, NULL }, { "AboutAction", GTK_STOCK_ABOUT, "_About DTR...", NULL, NULL, G_CALLBACK(displaywindow_about) }, - + + { "ButtonDirAxAction", GTK_STOCK_EXECUTE, "Run _DirAx", NULL, NULL, G_CALLBACK(displaywindow_dirax) }, + { "ButtonTiltAxisAction", GTK_STOCK_PROPERTIES, "Adjust Tilt Axis", NULL, NULL, G_CALLBACK(displaywindow_setaxis) }, + { "ButtonRefineStepAction", GTK_STOCK_EXECUTE, "Refine Image", NULL, NULL, G_CALLBACK(displaywindow_refinestep) }, + { "ButtonRefineSeqAction", GTK_STOCK_EXECUTE, "Refine Stack", NULL, NULL, G_CALLBACK(displaywindow_refinestack) }, + { "ButtonFirstImageAction", GTK_STOCK_GOTO_FIRST, "First Image", NULL, NULL, G_CALLBACK(displaywindow_image_first) }, + { "ButtonPrevImageAction", GTK_STOCK_GO_BACK, "Previous Image", NULL, NULL, G_CALLBACK(displaywindow_image_prev) }, + { "ButtonNextImageAction", GTK_STOCK_GO_FORWARD, "Next Image", NULL, NULL, G_CALLBACK(displaywindow_image_next) }, + { "ButtonLastImageAction", GTK_STOCK_GOTO_LAST, "Last Image", NULL, NULL, G_CALLBACK(displaywindow_image_last) }, + }; guint n_entries = G_N_ELEMENTS(entries); GtkRadioActionEntry radios[] = { @@ -1154,12 +1196,93 @@ static void displaywindow_addmenubar(DisplayWindow *dw) { } +/* Notify that something about the image stack display needs to be changed. + eg. marks, tilt axis, image to be displayed. */ +void displaywindow_update_imagestack(DisplayWindow *dw) { + + ImageFeatureList *flist; + size_t j; + ImageRecord *image; + GtkWidget *d; + + imagedisplay_clear_marks(dw->stack); + imagedisplay_put_data(dw->stack, dw->ctx->images->images[dw->cur_image]); + + image = &dw->ctx->images->images[dw->cur_image]; + + if ( dw->ctx->cell_lattice ) { + + /* Perform relrod projection if necessary */ + if ( !image->rflist ) { + image->rflist = reproject_get_reflections(image, dw->ctx->cell_lattice); + } + + /* Draw the reprojected peaks */ + for ( j=0; j<image->rflist->n_features; j++ ) { + imagedisplay_add_mark(dw->stack, image->rflist->features[j].x, image->rflist->features[j].y, + IMAGEDISPLAY_MARK_CIRCLE_1, image->rflist->features[j].intensity); + } + + } + + if ( image->features ) { + /* Now draw the original measured peaks */ + flist = image->features; + for ( j=0; j<flist->n_features; j++ ) { + imagedisplay_add_mark(dw->stack, flist->features[j].x, flist->features[j].y, + IMAGEDISPLAY_MARK_CIRCLE_2, flist->features[j].intensity); + } + } + + if ( image->features && dw->ctx->cell_lattice ) { + /* Now connect partners */ + for ( j=0; j<image->rflist->n_features; j++ ) { + if ( image->rflist->features[j].partner ) { + imagedisplay_add_line(dw->stack, image->rflist->features[j].x, image->rflist->features[j].y, + image->rflist->features[j].partner->x, image->rflist->features[j].partner->y, + IMAGEDISPLAY_MARK_LINE_1); + } + } + } + + if ( dw->cur_image == 0 ) { + d = gtk_ui_manager_get_widget(dw->ui, "/ui/displaywindowtoolbar/first"); + gtk_widget_set_sensitive(GTK_WIDGET(d), FALSE); + d = gtk_ui_manager_get_widget(dw->ui, "/ui/displaywindowtoolbar/prev"); + gtk_widget_set_sensitive(GTK_WIDGET(d), FALSE); + d = gtk_ui_manager_get_widget(dw->ui, "/ui/displaywindowtoolbar/next"); + gtk_widget_set_sensitive(GTK_WIDGET(d), TRUE); + d = gtk_ui_manager_get_widget(dw->ui, "/ui/displaywindowtoolbar/last"); + gtk_widget_set_sensitive(GTK_WIDGET(d), TRUE); + } else if ( dw->cur_image == dw->ctx->images->n_images-1 ) { + d = gtk_ui_manager_get_widget(dw->ui, "/ui/displaywindowtoolbar/first"); + gtk_widget_set_sensitive(GTK_WIDGET(d), TRUE); + d = gtk_ui_manager_get_widget(dw->ui, "/ui/displaywindowtoolbar/prev"); + gtk_widget_set_sensitive(GTK_WIDGET(d), TRUE); + d = gtk_ui_manager_get_widget(dw->ui, "/ui/displaywindowtoolbar/next"); + gtk_widget_set_sensitive(GTK_WIDGET(d), FALSE); + d = gtk_ui_manager_get_widget(dw->ui, "/ui/displaywindowtoolbar/last"); + gtk_widget_set_sensitive(GTK_WIDGET(d), FALSE); + } else { + d = gtk_ui_manager_get_widget(dw->ui, "/ui/displaywindowtoolbar/first"); + gtk_widget_set_sensitive(GTK_WIDGET(d), TRUE); + d = gtk_ui_manager_get_widget(dw->ui, "/ui/displaywindowtoolbar/prev"); + gtk_widget_set_sensitive(GTK_WIDGET(d), TRUE); + d = gtk_ui_manager_get_widget(dw->ui, "/ui/displaywindowtoolbar/next"); + gtk_widget_set_sensitive(GTK_WIDGET(d), TRUE); + d = gtk_ui_manager_get_widget(dw->ui, "/ui/displaywindowtoolbar/last"); + gtk_widget_set_sensitive(GTK_WIDGET(d), TRUE); + } + +} + DisplayWindow *displaywindow_open(ControlContext *ctx) { const char *filename; char *title; GdkGLConfig *glconfig; DisplayWindow *dw; + GtkWidget *notebook; dw = malloc(sizeof(DisplayWindow)); @@ -1168,6 +1291,9 @@ DisplayWindow *displaywindow_open(ControlContext *ctx) { strcpy(title, filename); strcat(title, " - dtr"); + dw->ctx = ctx; + ctx->dw = dw; + dw->gl_use_buffers = 1; dw->view = DW_ORTHO; dw->distance = 150; @@ -1177,24 +1303,27 @@ DisplayWindow *displaywindow_open(ControlContext *ctx) { dw->view_quat[1] = 0.0; dw->view_quat[2] = 0.0; dw->view_quat[3] = 1.0; - dw->ctx = ctx; dw->cube = TRUE; dw->lines = FALSE; dw->background = TRUE; + dw->cur_image = 0; dw->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(dw->window), title); free(title); - dw->bigvbox = gtk_vbox_new(FALSE, FALSE); + dw->bigvbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(dw->window), dw->bigvbox); displaywindow_addmenubar(dw); - + dw->status_bar = gtk_statusbar_new(); gtk_statusbar_set_has_resize_grip(GTK_STATUSBAR(dw->status_bar), FALSE); gtk_box_pack_end(GTK_BOX(dw->bigvbox), dw->status_bar, FALSE, FALSE, 0); - + g_signal_connect(GTK_OBJECT(dw->window), "destroy", G_CALLBACK(displaywindow_closedown), dw); + notebook = gtk_notebook_new(); + gtk_box_pack_end(GTK_BOX(dw->bigvbox), notebook, TRUE, TRUE, 0); + /* GL stuff */ glconfig = gdk_gl_config_new_by_mode(GDK_GL_MODE_RGB | GDK_GL_MODE_DEPTH | GDK_GL_MODE_DOUBLE); if ( glconfig == NULL ) { @@ -1205,7 +1334,7 @@ DisplayWindow *displaywindow_open(ControlContext *ctx) { dw->drawing_area = gtk_drawing_area_new(); gtk_widget_set_size_request(dw->drawing_area, 640, 640); gtk_widget_set_gl_capability(dw->drawing_area, glconfig, NULL, TRUE, GDK_GL_RGBA_TYPE); - gtk_box_pack_start(GTK_BOX(dw->bigvbox), dw->drawing_area, TRUE, TRUE, 0); + gtk_notebook_append_page(GTK_NOTEBOOK(notebook), dw->drawing_area, gtk_label_new("Reconstruction")); gtk_widget_add_events(dw->drawing_area, GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_VISIBILITY_NOTIFY_MASK); g_signal_connect(GTK_OBJECT(dw->drawing_area), "configure_event", G_CALLBACK(displaywindow_gl_configure), dw); g_signal_connect(GTK_OBJECT(dw->drawing_area), "realize", G_CALLBACK(displaywindow_gl_realise), dw); @@ -1213,8 +1342,14 @@ DisplayWindow *displaywindow_open(ControlContext *ctx) { g_signal_connect(GTK_OBJECT(dw->drawing_area), "button_press_event", G_CALLBACK(displaywindow_gl_button_press), dw); g_signal_connect(GTK_OBJECT(dw->drawing_area), "motion_notify_event", G_CALLBACK(displaywindow_gl_motion_notify), dw); + dw->stack = imagedisplay_new_nowindow(ctx->images->images[dw->cur_image], IMAGEDISPLAY_SHOW_TILT_AXIS | IMAGEDISPLAY_SHOW_CENTRE, NULL, NULL, NULL); + gtk_notebook_append_page(GTK_NOTEBOOK(notebook), dw->stack->vbox, gtk_label_new("Image Stack")); + displaywindow_update_imagestack(dw); + + displaywindow_enable_cell_functions(dw, FALSE); displaywindow_update_dirax(ctx, dw); + gtk_window_set_default_size(GTK_WINDOW(dw->window), 800, 750); gtk_widget_show_all(dw->window); return dw; @@ -1262,3 +1397,18 @@ void displaywindow_error(const char *msg, DisplayWindow *dw) { } +void displaywindow_enable_cell_functions(DisplayWindow *dw, gboolean g) { + + GtkWidget *d; + + d = gtk_ui_manager_get_widget(dw->ui, "/ui/displaywindow/tools/refinestep"); + gtk_widget_set_sensitive(d, g); + d = gtk_ui_manager_get_widget(dw->ui, "/ui/displaywindow/tools/refineseq"); + gtk_widget_set_sensitive(d, g); + d = gtk_ui_manager_get_widget(dw->ui, "/ui/displaywindowtoolbar/refineseq"); + gtk_widget_set_sensitive(d, g); + d = gtk_ui_manager_get_widget(dw->ui, "/ui/displaywindowtoolbar/refinestep"); + gtk_widget_set_sensitive(d, g); + +} + diff --git a/src/displaywindow.h b/src/displaywindow.h index fbd1ab5..6484b33 100644 --- a/src/displaywindow.h +++ b/src/displaywindow.h @@ -72,6 +72,9 @@ typedef struct dw_struct { float x_start; float y_start; + int cur_image; + struct imagedisplay_struct *stack; + /* Tilt axis adjustment window */ GtkWidget *tiltaxis_window; GtkWidget *tiltaxis_entry; @@ -79,10 +82,12 @@ typedef struct dw_struct { } DisplayWindow; extern DisplayWindow *displaywindow_open(ControlContext *ctx); +extern void displaywindow_update_imagestack(DisplayWindow *dw); extern void displaywindow_update(DisplayWindow *dw); extern void displaywindow_update_dirax(ControlContext *ctx, DisplayWindow *dw); extern void displaywindow_error(const char *msg, DisplayWindow *dw); +extern void displaywindow_enable_cell_functions(DisplayWindow *dw, gboolean g); #endif /* DISPLAYWINDOW_H */ diff --git a/src/imagedisplay.c b/src/imagedisplay.c index 9c3f6cd..9774a33 100644 --- a/src/imagedisplay.c +++ b/src/imagedisplay.c @@ -162,7 +162,9 @@ static void imagedisplay_destroyed(GtkWidget *widget, ImageDisplay *imagedisplay void imagedisplay_close(ImageDisplay *imagedisplay) { imagedisplay->flags = (imagedisplay->flags | IMAGEDISPLAY_QUIT_IF_CLOSED)^IMAGEDISPLAY_QUIT_IF_CLOSED; - gtk_widget_destroy(imagedisplay->window); + if ( imagedisplay->window ) { + gtk_widget_destroy(imagedisplay->window); + } } #define imagedisplay_draw_line(gc,x1,y1,x2,y2) (gdk_draw_line(drawingarea->window,gc, \ @@ -295,32 +297,27 @@ static gint imagedisplay_realize(GtkWidget *widget, ImageDisplay *imagedisplay) } -/* Display an image */ -ImageDisplay *imagedisplay_open_with_message(ImageRecord imagerecord, const char *title, const char *message, - ImageDisplayFlags flags, GCallback mouse_click_func, gpointer callback_data) { +ImageDisplay *imagedisplay_new_nowindow(ImageRecord imagerecord, ImageDisplayFlags flags, const char *message, + GCallback mouse_click_func, gpointer callback_data) { ImageDisplay *imagedisplay; - GdkGeometry geom; imagedisplay = malloc(sizeof(ImageDisplay)); imagedisplay->imagerecord = imagerecord; imagedisplay->view_width = 512; imagedisplay->view_height = 512; - imagedisplay->title = strdup(title); imagedisplay->message = message; - imagedisplay->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); imagedisplay->mouse_click_func = mouse_click_func; imagedisplay->flags = flags; imagedisplay->marks = NULL; imagedisplay->pixbuf = NULL; imagedisplay->pixbuf_scaled = NULL; imagedisplay->realised = FALSE; - gtk_window_set_title(GTK_WINDOW(imagedisplay->window), imagedisplay->title); + imagedisplay->window = NULL; imagedisplay_put_data(imagedisplay, imagerecord); imagedisplay->vbox = gtk_vbox_new(FALSE, 0); - gtk_container_add(GTK_CONTAINER(imagedisplay->window), imagedisplay->vbox); if ( message ) { GtkWidget *label; @@ -343,6 +340,24 @@ ImageDisplay *imagedisplay_open_with_message(ImageRecord imagerecord, const char g_signal_connect(GTK_OBJECT(imagedisplay->drawingarea), "configure_event", G_CALLBACK(imagedisplay_configure_event), imagedisplay); g_signal_connect(GTK_OBJECT(imagedisplay->drawingarea), "expose-event", G_CALLBACK(imagedisplay_redraw), imagedisplay); + return imagedisplay; + +} + +/* Display an image */ +ImageDisplay *imagedisplay_open_with_message(ImageRecord imagerecord, const char *title, const char *message, + ImageDisplayFlags flags, GCallback mouse_click_func, gpointer callback_data) { + + ImageDisplay *imagedisplay; + GdkGeometry geom; + + imagedisplay = imagedisplay_new_nowindow(imagerecord, flags, message, mouse_click_func, callback_data); + + imagedisplay->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_container_add(GTK_CONTAINER(imagedisplay->window), imagedisplay->vbox); + imagedisplay->title = strdup(title); + gtk_window_set_title(GTK_WINDOW(imagedisplay->window), imagedisplay->title); + geom.min_width = 128; geom.min_height = 128; gtk_window_set_geometry_hints(GTK_WINDOW(imagedisplay->window), GTK_WIDGET(imagedisplay->drawingarea), &geom, GDK_HINT_MIN_SIZE); diff --git a/src/imagedisplay.h b/src/imagedisplay.h index 681de79..325ea96 100644 --- a/src/imagedisplay.h +++ b/src/imagedisplay.h @@ -82,6 +82,8 @@ typedef struct imagedisplay_struct { extern ImageDisplay *imagedisplay_open(ImageRecord image, const char *title, ImageDisplayFlags flags); extern ImageDisplay *imagedisplay_open_with_message(ImageRecord image, const char *title, const char *message, ImageDisplayFlags flags, GCallback mouse_click_func, gpointer callback_data); +extern ImageDisplay *imagedisplay_new_nowindow(ImageRecord imagerecord, ImageDisplayFlags flags, const char *message, + GCallback mouse_click_func, gpointer callback_data); extern void imagedisplay_add_mark(ImageDisplay *imagedisplay, double x, double y, ImageDisplayMarkType type, double weight); extern void imagedisplay_add_line(ImageDisplay *imagedisplay, double x1, double y1, double x2, double y2, ImageDisplayMarkType type); extern void imagedisplay_force_redraw(ImageDisplay *imagedisplay); diff --git a/src/mapping.c b/src/mapping.c index e1e59c5..bc6e062 100644 --- a/src/mapping.c +++ b/src/mapping.c @@ -167,7 +167,10 @@ void mapping_adjust_axis(ControlContext *ctx, double offset) { } mapping_map_features(ctx); - if ( ctx->dw ) displaywindow_update(ctx->dw); + if ( ctx->dw ) { + displaywindow_update_imagestack(ctx->dw); + displaywindow_update(ctx->dw); + } } diff --git a/src/refine.c b/src/refine.c index 8b6c716..25c4243 100644 --- a/src/refine.c +++ b/src/refine.c @@ -52,9 +52,6 @@ static ImageFeature *refine_fit_image(Basis *cell, ImageRecord *image, Reflectio double day = 0.0, dby = 0.0, dcy = 0.0; double dlx = 0.0, dly = 0.0, dlz = 0.0; - if ( !image->rflist ) { - image->rflist = reproject_get_reflections(image, cell_lattice); - } flist = image->features; M = gsl_matrix_alloc(3, 3); @@ -199,7 +196,7 @@ static int refine_sequence_sweep(ControlContext *ctx, double *fit, double *warp) int series_dev_n = 0; /* Ensure that ctx->cell_lattice is set up */ - reproject_lattice_changed(ctx); + reproject_cell_to_lattice(ctx); for ( i=0; i<ctx->images->n_images; i++ ) { @@ -210,8 +207,9 @@ static int refine_sequence_sweep(ControlContext *ctx, double *fit, double *warp) image = &ctx->images->images[i]; /* Fit this image and update ctx->cell_lattice, index the selected pattern */ + if ( !image->rflist ) image->rflist = reproject_get_reflections(image, ctx->cell_lattice); refine_fit_image(ctx->cell, image, ctx->cell_lattice); - reproject_lattice_changed(ctx); + reproject_cell_to_lattice(ctx); image->rflist = reproject_get_reflections(image, ctx->cell_lattice); n = 0; @@ -247,7 +245,7 @@ static int refine_sequence_sweep(ControlContext *ctx, double *fit, double *warp) } -static gint refine_dialog_sequence(GtkWidget *widget, ControlContext *ctx) { +void refine_do_stack(ControlContext *ctx) { double omega_offs; GtkWidget *window_fit; @@ -257,21 +255,16 @@ static gint refine_dialog_sequence(GtkWidget *widget, ControlContext *ctx) { GtkWidget *graph_warp; double *warp_vals; size_t idx; - ImageDisplay *id; fit_vals = malloc(401*sizeof(double)); warp_vals = malloc(401*sizeof(double)); idx = 0; - if ( !ctx->cell ) { + if ( !ctx->cell_lattice ) { displaywindow_error("No reciprocal unit cell has been found.", ctx->dw); - return 0; + return; } - /* Temporarily disable ImageDisplay stuff */ - id = ctx->reproject_id; - ctx->reproject_id = NULL; - for ( omega_offs=-2.0; omega_offs<=2.0; omega_offs+=0.01 ) { double fit, warp; @@ -285,7 +278,6 @@ static gint refine_dialog_sequence(GtkWidget *widget, ControlContext *ctx) { if ( refine_sequence_sweep(ctx, &fit, &warp) ) { printf("RF: Sequencer sweep failed\n"); - return 0; } printf("RF: omega_offs=%f, fit=%f, warp=%f\n", omega_offs, fit, warp); fit_vals[idx] = fit; @@ -298,7 +290,7 @@ static gint refine_dialog_sequence(GtkWidget *widget, ControlContext *ctx) { } - ctx->reproject_id = id; + displaywindow_update(ctx->dw); reproject_lattice_changed(ctx); window_fit = gtk_window_new(GTK_WINDOW_TOPLEVEL); @@ -317,88 +309,22 @@ static gint refine_dialog_sequence(GtkWidget *widget, ControlContext *ctx) { gtk_container_add(GTK_CONTAINER(window_warp), graph_warp); gtk_widget_show_all(window_warp); - return 0; - } -static gint refine_dialog_fit_image(GtkWidget *step_button, ControlContext *ctx) { +void refine_do_image(ControlContext *ctx) { - if ( (ctx->reproject_id) && (ctx->cell_lattice) ) { - - ImageFeature *fitted; - - fitted = refine_fit_image(ctx->cell, &ctx->images->images[ctx->reproject_cur_image], ctx->cell_lattice); - - ctx->images->images[ctx->reproject_cur_image].rflist = NULL; - reproject_lattice_changed(ctx); - displaywindow_update(ctx->dw); - - if ( fitted ) { - imagedisplay_add_mark(ctx->reproject_id, fitted->x,fitted->y, IMAGEDISPLAY_MARK_CIRCLE_3, fitted->intensity); - } - - } else { - displaywindow_error("Please first open the reprojection window and select the image to fit", ctx->dw); + if ( !ctx->cell_lattice ) { + displaywindow_error("No reciprocal unit cell has been found.", ctx->dw); + return; } - - return 0; - -} - -static gint refine_dialog_response(GtkWidget *refine_window, gint response, ControlContext *ctx) { - - ctx->refine_window = NULL; - gtk_widget_destroy(refine_window); - - return 0; - -} - -void refine_open(ControlContext *ctx) { - - GtkWidget *vbox; - GtkWidget *hbox; - GtkWidget *table; - GtkWidget *label; - GtkWidget *step_button; - GtkWidget *sequence_button; - - if ( ctx->refine_window ) return; - ctx->refine_window = gtk_dialog_new_with_buttons("Refine Reconstruction", GTK_WINDOW(ctx->dw->window), - GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL); - gtk_window_set_default_size(GTK_WINDOW(ctx->refine_window), 280, -1); + ImageFeature *fitted; - vbox = gtk_vbox_new(FALSE, 0); - hbox = gtk_hbox_new(TRUE, 0); - gtk_box_pack_start(GTK_BOX(GTK_DIALOG(ctx->refine_window)->vbox), GTK_WIDGET(hbox), FALSE, TRUE, 7); - gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(vbox), FALSE, TRUE, 5); + fitted = refine_fit_image(ctx->cell, &ctx->images->images[ctx->dw->cur_image], ctx->cell_lattice); - table = gtk_table_new(5, 1, FALSE); - gtk_table_set_row_spacings(GTK_TABLE(table), 5); - gtk_table_set_col_spacings(GTK_TABLE(table), 5); - gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(table), FALSE, TRUE, 0); - - label = gtk_label_new("Steps"); - gtk_label_set_markup(GTK_LABEL(label), "<span weight=\"bold\">Steps</span>"); - gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); - gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 1, 2); - step_button = gtk_button_new_with_label("Refine Lattice to Fit Current Pattern"); - gtk_table_attach_defaults(GTK_TABLE(table), step_button, 1, 2, 2, 3); - g_signal_connect(G_OBJECT(step_button), "clicked", G_CALLBACK(refine_dialog_fit_image), ctx); - - label = gtk_label_new("Sequencing"); - gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); - gtk_label_set_markup(GTK_LABEL(label), "<span weight=\"bold\">Sequencing</span>"); - gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 4, 5); - - sequence_button = gtk_button_new_with_label("Run Sequencer"); - gtk_table_attach_defaults(GTK_TABLE(table), sequence_button, 1, 2, 5, 6); - g_signal_connect(G_OBJECT(sequence_button), "clicked", G_CALLBACK(refine_dialog_sequence), ctx); - - g_signal_connect(G_OBJECT(ctx->refine_window), "response", G_CALLBACK(refine_dialog_response), ctx); - gtk_widget_show_all(ctx->refine_window); - - + ctx->images->images[ctx->dw->cur_image].rflist = NULL; + reproject_lattice_changed(ctx); + displaywindow_update(ctx->dw); + } diff --git a/src/refine.h b/src/refine.h index f52d130..7a01e83 100644 --- a/src/refine.h +++ b/src/refine.h @@ -18,7 +18,8 @@ #include "control.h" -extern void refine_open(ControlContext *ctx); +extern void refine_do_stack(ControlContext *ctx); +extern void refine_do_image(ControlContext *ctx); #endif /* REFINE_H */ diff --git a/src/reproject.c b/src/reproject.c index 2bb33dc..dc19e9a 100644 --- a/src/reproject.c +++ b/src/reproject.c @@ -204,108 +204,32 @@ ImageFeatureList *reproject_get_reflections(ImageRecord *image, ReflectionList * } -static void reproject_mark_peaks(ControlContext *ctx) { +/* Ensure ctx->cell_lattice matches ctx->cell */ +void reproject_cell_to_lattice(ControlContext *ctx) { - ImageFeatureList *flist; - size_t j; - ImageRecord *image; - - image = &ctx->images->images[ctx->reproject_cur_image]; - - /* Draw the reprojected peaks */ - if ( !image->rflist ) { - image->rflist = reproject_get_reflections(image, ctx->cell_lattice); - } - for ( j=0; j<image->rflist->n_features; j++ ) { - imagedisplay_add_mark(ctx->reproject_id, image->rflist->features[j].x, image->rflist->features[j].y, - IMAGEDISPLAY_MARK_CIRCLE_1, image->rflist->features[j].intensity); - } - - /* Now draw the original measured peaks */ - flist = image->features; - for ( j=0; j<flist->n_features; j++ ) { - imagedisplay_add_mark(ctx->reproject_id, flist->features[j].x, flist->features[j].y, - IMAGEDISPLAY_MARK_CIRCLE_2, image->rflist->features[j].intensity); - } - - /* Now connect partners */ - for ( j=0; j<image->rflist->n_features; j++ ) { - if ( image->rflist->features[j].partner ) { - imagedisplay_add_line(ctx->reproject_id, image->rflist->features[j].x, image->rflist->features[j].y, - image->rflist->features[j].partner->x, image->rflist->features[j].partner->y, - IMAGEDISPLAY_MARK_LINE_1); - } - } - -} - -static void reproject_update(ControlContext *ctx) { - - imagedisplay_clear_marks(ctx->reproject_id); - - reproject_mark_peaks(ctx); - - imagedisplay_put_data(ctx->reproject_id, ctx->images->images[ctx->reproject_cur_image]); - -} - -static gint reproject_clicked(GtkWidget *widget, GdkEventButton *event, ControlContext *ctx) { - - ctx->reproject_cur_image++; - if ( ctx->reproject_cur_image == ctx->images->n_images ) ctx->reproject_cur_image = 0; - - reproject_update(ctx); + int i; - return 0; - -} - -void reproject_lattice_changed(ControlContext *ctx) { - if ( ctx->cell_lattice ) { reflection_list_from_new_cell(ctx->cell_lattice, ctx->cell); } else { ctx->cell_lattice = reflection_list_from_cell(ctx->cell); } - if ( ctx->reproject_id ) reproject_update(ctx); - -} - -static gint reproject_closed(GtkWidget *widget, ControlContext *ctx) { - ctx->reproject_id = NULL; - return 0; -} - -void reproject_open(ControlContext *ctx) { - - if ( ctx->reproject_id ) { - displaywindow_error("Reprojection window is already open.", ctx->dw); - return; - } - - if ( !ctx->cell ) { - printf("RP: No current cell\n"); - displaywindow_error("No reciprocal unit cell has been specified.", ctx->dw); - return; - } + displaywindow_enable_cell_functions(ctx->dw, TRUE); - if ( !ctx->images ) { - printf("RP: No images!\n"); - displaywindow_error("No images to reproject!", ctx->dw); - return; + /* Invalidate all the reprojected feature lists */ + for ( i=0; i<ctx->images->n_images; i++ ) { + image_feature_list_free(ctx->images->images[i].rflist); + ctx->images->images[i].rflist = NULL; } - ctx->reproject_cur_image = 0; - reproject_lattice_changed(ctx); - - ctx->reproject_id = imagedisplay_open_with_message(ctx->images->images[ctx->reproject_cur_image], - "Reprojected Diffraction Pattern", "Click to change image", - IMAGEDISPLAY_SHOW_CENTRE | IMAGEDISPLAY_SHOW_TILT_AXIS, G_CALLBACK(reproject_clicked), ctx); - - reproject_mark_peaks(ctx); - - g_signal_connect(GTK_OBJECT(ctx->reproject_id->drawingarea), "destroy", G_CALLBACK(reproject_closed), ctx); - +} + +/* Notify that ctx->cell has changed (also need to call displaywindow_update) */ +void reproject_lattice_changed(ControlContext *ctx) { + + reproject_cell_to_lattice(ctx); + displaywindow_update_imagestack(ctx->dw); + } diff --git a/src/reproject.h b/src/reproject.h index 79aa919..26d28bb 100644 --- a/src/reproject.h +++ b/src/reproject.h @@ -21,7 +21,7 @@ extern ImageFeatureList *reproject_get_reflections(ImageRecord *image, ReflectionList *reflectionlist); extern void reproject_partner_features(ImageFeatureList *rflist, ImageRecord *image); -extern void reproject_open(ControlContext *ctx); +extern void reproject_cell_to_lattice(ControlContext *ctx); extern void reproject_lattice_changed(ControlContext *ctx); #endif /* REPROJECT_H */ |