aboutsummaryrefslogtreecommitdiff
path: root/src/displaywindow.c
diff options
context:
space:
mode:
authortaw27 <taw27@bf6ca9ba-c028-0410-8290-897cf20841d1>2007-12-03 00:05:51 +0000
committertaw27 <taw27@bf6ca9ba-c028-0410-8290-897cf20841d1>2007-12-03 00:05:51 +0000
commit7fce8715762390de88450c777f2fba474bf6bf12 (patch)
tree83fa16fcb5997bb4de4cf785d880a73e482ff3d3 /src/displaywindow.c
parentcf7a9b848cfa0ec4b649f54100b6ff92e5553232 (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.c178
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);
+
+}
+