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 /src/displaywindow.c | |
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
Diffstat (limited to 'src/displaywindow.c')
-rw-r--r-- | src/displaywindow.c | 178 |
1 files changed, 164 insertions, 14 deletions
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); + +} + |