1 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
2 * filename: xvifi.c *
3 * *
4 * UTIL C-source: Medical Image Conversion Utility *
5 * *
6 * purpose : edit FILEINFO structure *
7 * *
8 * project : (X)MedCon by Erik Nolf *
9 * *
10 * Functions : XMdcEditFileInfoCallbackApply - Apply FILEINFO changes *
11 * XMdcEditFileInfo() - Edit FILEINFO struct *
12 * *
13 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
14 /*
15 */
16
17 /*
18 Copyright (C) 1997-2021 by Erik Nolf
19
20 This program is free software; you can redistribute it and/or modify it
21 under the terms of the GNU General Public License as published by the
22 Free Software Foundation; either version 2, or (at your option) any later
23 version.
24
25 This program is distributed in the hope that it will be useful, but
26 WITHOUT ANY WARRANTY; without even the implied warranty of
27 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
28 Public License for more details.
29
30 You should have received a copy of the GNU General Public License along
31 with this program; if not, write to the Free Software Foundation, Inc.,
32 59 Place - Suite 330, Boston, MA 02111-1307, USA. */
33
34 /****************************************************************************
35 H E A D E R S
36 ****************************************************************************/
37
38 #include "m-depend.h"
39
40 #include <stdio.h>
41 #ifdef HAVE_STDLIB_H
42 #include <stdlib.h>
43 #endif
44 #ifdef HAVE_STRING_H
45 #include <string.h>
46 #endif
47 #ifdef HAVE_STRINGS_H
48 #ifndef _WIN32
49 #include <strings.h>
50 #endif
51 #endif
52
53 #include "xmedcon.h"
54
55 /****************************************************************************
56 D E F I N E S
57 ****************************************************************************/
58
59
60 /****************************************************************************
61 F U N C T I O N S
62 ****************************************************************************/
63
XMdcEditFileInfoCallbackApply(GtkWidget * widget,gpointer data)64 void XMdcEditFileInfoCallbackApply(GtkWidget *widget, gpointer data)
65 {
66
67 IMG_DATA *id;
68 DYNAMIC_DATA *dd;
69 const char *entry;
70 char *msg;
71 float pixel_size, slice_width, slice_spacing, frame_duration;
72 Uint32 i, planes, frames, gates, beds, windows, number;
73
74 if (XMdcNoFileOpened()) return;
75
76 /* Orientation */
77 for (i=0; i < MDC_MAX_ORIENT; i++) {
78 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sEditFI.PatSliceOrient[i]))) {
79 my.fi->pat_slice_orient = (Int8)i; break;
80 }
81 }
82
83 strcpy(my.fi->pat_pos,MdcGetStrPatPos(my.fi->pat_slice_orient));
84 strcpy(my.fi->pat_orient,MdcGetStrPatOrient(my.fi->pat_slice_orient));
85
86 /* Sizes/Time */
87 entry = gtk_entry_get_text(GTK_ENTRY(sEditFI.PixelSize));
88 pixel_size = (float)atof(entry);
89
90 entry = gtk_entry_get_text(GTK_ENTRY(sEditFI.SliceWidth));
91 slice_width = (float)atof(entry);
92
93 entry = gtk_entry_get_text(GTK_ENTRY(sEditFI.SliceSpacing));
94 slice_spacing = (float)atof(entry);
95
96 entry = gtk_entry_get_text(GTK_ENTRY(sEditFI.FrameDuration));
97 frame_duration = (float)atof(entry);
98
99 /* Dimensions */
100 entry = gtk_entry_get_text(GTK_ENTRY(sEditFI.NrDimPlanes));
101 planes = (Uint32)atoi(entry);
102
103 entry = gtk_entry_get_text(GTK_ENTRY(sEditFI.NrDimFrames));
104 frames = (Uint32)atoi(entry);
105
106 entry = gtk_entry_get_text(GTK_ENTRY(sEditFI.NrDimGates));
107 gates = (Uint32)atoi(entry);
108
109 entry = gtk_entry_get_text(GTK_ENTRY(sEditFI.NrDimBeds));
110 beds = (Uint32)atoi(entry);
111
112 entry = gtk_entry_get_text(GTK_ENTRY(sEditFI.NrDimWindows));
113 windows = (Uint32)atoi(entry);
114
115 number = planes * frames * gates * beds * windows;
116 if (number == my.fi->number) {
117 my.fi->dim[3] = planes;
118 my.fi->dim[4] = frames;
119 my.fi->dim[5] = gates;
120 my.fi->dim[6] = beds;
121 my.fi->dim[7] = windows;
122 }else{
123 XMdcDisplayWarn("Incorrect dimensions not applied");
124 }
125
126 /* set proper dim[0] */
127 for (i=7; i>=3; i--) {
128 if (my.fi->dim[i] > 1) {
129 my.fi->dim[0] = (Int16) i;
130 i=1; /* last found, so leave */
131 }
132 }
133
134
135 /* Study Parameters */
136 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sEditFI.Reconstructed))) {
137 my.fi->reconstructed = MDC_YES;
138 }else{
139 my.fi->reconstructed = MDC_NO;
140 }
141
142 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sEditFI.Planar))) {
143 my.fi->planar = MDC_YES;
144 }else{
145 my.fi->planar = MDC_NO;
146 }
147
148 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sEditFI.ModalityNM))) {
149 sEditFI.CurModality = M_NM;
150 }else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sEditFI.ModalityPT))) {
151 sEditFI.CurModality = M_PT;
152 }else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sEditFI.ModalityCT))) {
153 sEditFI.CurModality = M_CT;
154 }else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sEditFI.ModalityMR))) {
155 sEditFI.CurModality = M_MR;
156 }
157
158 for (i=0; i < MDC_MAX_ACQUISITIONS; i++) {
159 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sEditFI.AcquisitionType[i]))) {
160 my.fi->acquisition_type = (Int16) i; break;
161 }
162 }
163
164 /* reset other data structs */
165 msg = MdcResetODs(my.fi);
166 if (msg != NULL) {
167 XMdcDisplayFatalErr(MDC_BAD_CODE,msg);
168 return;
169 }
170
171 /* fill in FI struct */
172
173 my.fi->modality = sEditFI.CurModality;
174
175 if (my.fi->pixdim[0] < 4) my.fi->pixdim[0] = 4; /* at least */
176 my.fi->pixdim[1] = pixel_size;
177 my.fi->pixdim[2] = pixel_size;
178 my.fi->pixdim[3] = slice_width;
179 my.fi->pixdim[4] = frame_duration;
180
181 /* fill in IMG_DATA structs */
182 for (i=0; i<my.fi->number; i++) {
183 id = &my.fi->image[i];
184
185 id->pixel_xsize = pixel_size;
186 id->pixel_ysize = pixel_size;
187 id->slice_width = slice_width;
188 id->slice_spacing = slice_spacing;
189
190 MdcFillImgPos(my.fi,i,i%my.fi->dim[3],0.0);
191 MdcFillImgOrient(my.fi,i);
192 }
193
194 /* fill DYNAMIC_DATA structs */
195 for (i=0; i<my.fi->dynnr; i++) {
196 dd = &my.fi->dyndata[i];
197
198 dd->nr_of_slices = my.fi->dim[3];
199 dd->time_frame_duration = frame_duration;
200 }
201
202 /* some final completions */
203 msg = MdcImagesPixelFiddle(my.fi);
204 if (msg != NULL) {
205 XMdcDisplayFatalErr(MDC_BAD_CODE,msg);
206 return;
207 }
208
209 /* reframe images */
210 XMdcProgressBar(MDC_PROGRESS_BEGIN,0.,"Reframe images:");
211
212 XMdcViewerHide();
213 XMdcViewerEnableAutoShrink();
214 XMdcViewerReset();
215 XMdcDisplayImages();
216
217 XMdcProgressBar(MDC_PROGRESS_END,0.,NULL);
218
219 XMDC_FILE_TYPE = XMDC_EDITFI;
220
221 }
222
XMdcEditFileInfo(void)223 void XMdcEditFileInfo(void)
224 {
225 GtkWidget *window=NULL;
226 GtkWidget *box1;
227 GtkWidget *box2;
228 GtkWidget *box3;
229 GtkWidget *box4;
230 GtkWidget *frame;
231 GtkWidget *top, *left, *right;
232 GtkWidget *label;
233 GtkWidget *table;
234 GtkWidget *tablabel;
235 GtkWidget *entry;
236 GtkWidget *button;
237 GtkWidget *separator;
238 GtkWidget *notebook;
239 GSList *group;
240 EditFileInfoStruct *vifi = &sEditFI;
241 int i;
242
243 if (XMdcNoFileOpened()) return;
244
245 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
246
247 g_signal_connect(GTK_OBJECT(window),"destroy",
248 G_CALLBACK(gtk_widget_destroy),NULL);
249
250 gtk_window_set_title(GTK_WINDOW(window),"Edit FileInfo");
251 gtk_container_set_border_width(GTK_CONTAINER(window),0);
252
253 box1 = gtk_vbox_new(FALSE,5);
254 gtk_container_add(GTK_CONTAINER(window),box1);
255 gtk_container_set_border_width(GTK_CONTAINER(box1),5);
256 gtk_widget_show(box1);
257
258 label=gtk_label_new("* any changes can seriously damage study integrity *");
259 gtk_misc_set_alignment(GTK_MISC(label),0.5,0.5);
260 gtk_box_pack_start(GTK_BOX(box1),label,TRUE,TRUE,0);
261 gtk_widget_show(label);
262
263 notebook = gtk_notebook_new();
264 gtk_container_add(GTK_CONTAINER(box1),notebook);
265 gtk_container_set_border_width(GTK_CONTAINER(notebook), 10);
266 gtk_widget_show(notebook);
267
268 /* tab page Patient Slice Orientation */
269 box2 = gtk_hbox_new(FALSE, 10);
270 gtk_widget_show(box2);
271
272 tablabel = gtk_label_new("Orientation");
273 gtk_widget_show(tablabel);
274 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), box2, tablabel);
275
276 box3 = gtk_vbox_new(FALSE,5);
277 gtk_container_add(GTK_CONTAINER(box2),box3);
278 gtk_container_set_border_width(GTK_CONTAINER(box3),5);
279 gtk_widget_show(box3);
280
281 table = gtk_table_new(2,2,FALSE);
282 gtk_container_add(GTK_CONTAINER(box3),table);
283 gtk_widget_show(table);
284
285 top = gtk_vbox_new(FALSE,5);
286 gtk_table_attach_defaults(GTK_TABLE(table),top,0,1,0,1);
287 gtk_widget_show(top);
288
289 left = gtk_vbox_new(FALSE,5);
290 gtk_table_attach_defaults(GTK_TABLE(table),left,0,1,1,2);
291 gtk_widget_show(left);
292
293 right = gtk_vbox_new(FALSE,5);
294 gtk_table_attach_defaults(GTK_TABLE(table),right,1,2,1,2);
295 gtk_widget_show(right);
296
297
298 button = NULL; group = NULL;
299 for (i=0; i < MDC_MAX_ORIENT; i++) {
300
301 if (i == 0) {
302 button = gtk_radio_button_new_with_label(NULL,MdcGetStrPatSlOrient(i));
303 }else{
304 group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button));
305 button = gtk_radio_button_new_with_label(group,MdcGetStrPatSlOrient(i));
306 }
307
308 if (i == 0) {
309 /* unknown singled on top */
310 gtk_box_pack_start(GTK_BOX(top),button,TRUE,TRUE,0);
311 }else if (i <= MDC_MAX_ORIENT/2) {
312 /* all supine left */
313 gtk_box_pack_start(GTK_BOX(left),button,TRUE,TRUE,0);
314 }else{
315 /* all prone right */
316 gtk_box_pack_start(GTK_BOX(right),button,TRUE,TRUE,0);
317 }
318
319 if (my.fi->pat_slice_orient == i) {
320 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
321 }else{
322 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), FALSE);
323 }
324 gtk_widget_show(button);
325
326 vifi->PatSliceOrient[i] = button;
327 }
328
329 /* tab page Sizes */
330 box2 = gtk_vbox_new(FALSE, 10);
331 gtk_widget_show(box2);
332
333 tablabel = gtk_label_new("Sizes / Time");
334 gtk_widget_show(tablabel);
335 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), box2, tablabel);
336
337 label = gtk_label_new("Note: Following entries require float values\n\
338 Examples: 10.0 1.0e+1");
339
340 gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_LEFT);
341 gtk_widget_set_name (label, "FixedLabel");
342 gtk_box_pack_start(GTK_BOX(box2),label,TRUE,TRUE,5);
343 gtk_widget_show(label);
344
345 box3 = gtk_vbox_new(FALSE,5);
346 gtk_container_add(GTK_CONTAINER(box2),box3);
347 gtk_container_set_border_width(GTK_CONTAINER(box3),5);
348 gtk_widget_show(box3);
349
350 table = gtk_table_new(4,3, FALSE);
351 gtk_container_add(GTK_CONTAINER(box3),table);
352 gtk_widget_show(table);
353
354 label = gtk_label_new("Pixel Size");
355 gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_RIGHT);
356 gtk_widget_set_name(label, "FixedLabel");
357 gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,0,1);
358 gtk_widget_show(label);
359
360 entry = gtk_entry_new();
361 gtk_entry_set_max_length(GTK_ENTRY(entry), 15);
362 sprintf(mdcbufr,"%e",my.fi->image[0].pixel_xsize);
363 gtk_entry_set_text(GTK_ENTRY(entry),mdcbufr);
364 gtk_editable_select_region(GTK_EDITABLE(entry),0,-1);
365 gtk_table_attach_defaults(GTK_TABLE(table),entry,1,2,0,1);
366 gtk_widget_show(entry);
367 vifi->PixelSize = entry;
368
369 label = gtk_label_new("[mm]");
370 gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_RIGHT);
371 gtk_widget_set_name(label, "FixedLabel");
372 gtk_table_attach_defaults(GTK_TABLE(table),label,2,3,0,1);
373 gtk_widget_show(label);
374
375 label = gtk_label_new("Slice Width");
376 gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_RIGHT);
377 gtk_widget_set_name(label, "FixedLabel");
378 gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,1,2);
379 gtk_widget_show(label);
380
381 entry = gtk_entry_new();
382 gtk_entry_set_max_length(GTK_ENTRY(entry), 15);
383 sprintf(mdcbufr,"%e",my.fi->image[0].slice_width);
384 gtk_entry_set_text(GTK_ENTRY(entry),mdcbufr);
385 gtk_editable_select_region(GTK_EDITABLE(entry),0,-1);
386 gtk_table_attach_defaults(GTK_TABLE(table),entry,1,2,1,2);
387 gtk_widget_show(entry);
388 vifi->SliceWidth = entry;
389
390 label = gtk_label_new("[mm]");
391 gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_RIGHT);
392 gtk_widget_set_name(label, "FixedLabel");
393 gtk_table_attach_defaults(GTK_TABLE(table),label,2,3,1,2);
394 gtk_widget_show(label);
395
396 label = gtk_label_new("Slice Separation");
397 gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_RIGHT);
398 gtk_widget_set_name(label, "FixedLabel");
399 gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,2,3);
400 gtk_widget_show(label);
401
402 entry = gtk_entry_new();
403 gtk_entry_set_max_length(GTK_ENTRY(entry), 15);
404 sprintf(mdcbufr,"%e",my.fi->image[0].slice_spacing);
405 gtk_entry_set_text(GTK_ENTRY(entry),mdcbufr);
406 gtk_editable_select_region(GTK_EDITABLE(entry),0,-1);
407 gtk_table_attach_defaults(GTK_TABLE(table),entry,1,2,2,3);
408 gtk_widget_show(entry);
409 vifi->SliceSpacing = entry;
410
411 label = gtk_label_new("[mm]");
412 gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_RIGHT);
413 gtk_widget_set_name(label, "FixedLabel");
414 gtk_table_attach_defaults(GTK_TABLE(table),label,2,3,2,3);
415 gtk_widget_show(label);
416
417 label = gtk_label_new("Frame Duration");
418 gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_RIGHT);
419 gtk_widget_set_name(label, "FixedLabel");
420 gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,3,4);
421 gtk_widget_show(label);
422
423 entry = gtk_entry_new();
424 gtk_entry_set_max_length(GTK_ENTRY(entry), 15);
425 if ((my.fi->dynnr > 0) && (my.fi->dyndata != NULL)) {
426 sprintf(mdcbufr,"%e",my.fi->dyndata[0].time_frame_duration);
427 }else{
428 sprintf(mdcbufr,"%e",0.);
429 }
430
431 gtk_entry_set_text(GTK_ENTRY(entry),mdcbufr);
432 gtk_editable_select_region(GTK_EDITABLE(entry),0,-1);
433 gtk_table_attach_defaults(GTK_TABLE(table),entry,1,2,3,4);
434 gtk_widget_show(entry);
435 vifi->FrameDuration = entry;
436
437 label = gtk_label_new("[ms]");
438 gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_RIGHT);
439 gtk_widget_set_name(label, "FixedLabel");
440 gtk_table_attach_defaults(GTK_TABLE(table),label,2,3,3,4);
441 gtk_widget_show(label);
442
443 /* tab page Dimensions */
444 box2 = gtk_vbox_new(FALSE, 10);
445 gtk_widget_show(box2);
446
447 tablabel = gtk_label_new("Dimensions");
448 gtk_widget_show(tablabel);
449 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), box2, tablabel);
450
451 sprintf(mdcbufr,"Note: Each entry must be a 1-based integer and the\n\
452 product of dim[]-values = total number of images (%u)",my.fi->number);
453 label = gtk_label_new(mdcbufr);
454 gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_LEFT);
455 gtk_widget_set_name (label, "FixedLabel");
456 gtk_box_pack_start(GTK_BOX(box2),label,TRUE,TRUE,5);
457 gtk_widget_show(label);
458
459 box3 = gtk_vbox_new(FALSE,5);
460 gtk_container_add(GTK_CONTAINER(box2),box3);
461 gtk_container_set_border_width(GTK_CONTAINER(box3),5);
462 gtk_widget_show(box3);
463
464 table = gtk_table_new(5,3, FALSE);
465 gtk_container_add(GTK_CONTAINER(box3),table);
466 gtk_widget_show(table);
467
468 label = gtk_label_new("dim[3] = ");
469 gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_RIGHT);
470 gtk_widget_set_name(label, "FixedLabel");
471 gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,0,1);
472 gtk_widget_show(label);
473
474 entry = gtk_entry_new();
475 gtk_entry_set_max_length(GTK_ENTRY(entry), 15);
476 sprintf(mdcbufr,"%u",my.fi->dim[3]);
477 gtk_entry_set_text(GTK_ENTRY(entry),mdcbufr);
478 gtk_editable_select_region(GTK_EDITABLE(entry),0,-1);
479 gtk_table_attach_defaults(GTK_TABLE(table),entry,1,2,0,1);
480 gtk_widget_show(entry);
481 vifi->NrDimPlanes = entry;
482
483 label = gtk_label_new("(planes | (time) slices)");
484 gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_RIGHT);
485 gtk_widget_set_name(label, "FixedLabel");
486 gtk_table_attach_defaults(GTK_TABLE(table),label,2,3,0,1);
487 gtk_widget_show(label);
488
489 label = gtk_label_new("dim[4] = ");
490 gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_RIGHT);
491 gtk_widget_set_name(label, "FixedLabel");
492 gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,1,2);
493 gtk_widget_show(label);
494
495 entry = gtk_entry_new();
496 gtk_entry_set_max_length(GTK_ENTRY(entry), 15);
497 sprintf(mdcbufr,"%u",my.fi->dim[4]);
498 gtk_entry_set_text(GTK_ENTRY(entry),mdcbufr);
499 gtk_editable_select_region(GTK_EDITABLE(entry),0,-1);
500 gtk_table_attach_defaults(GTK_TABLE(table),entry,1,2,1,2);
501 gtk_widget_show(entry);
502 vifi->NrDimFrames = entry;
503
504 label = gtk_label_new(" (frames | time slots | phases)");
505 gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_RIGHT);
506 gtk_widget_set_name(label, "FixedLabel");
507 gtk_table_attach_defaults(GTK_TABLE(table),label,2,3,1,2);
508 gtk_widget_show(label);
509
510 label = gtk_label_new("dim[5] = ");
511 gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_RIGHT);
512 gtk_widget_set_name(label, "FixedLabel");
513 gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,2,3);
514 gtk_widget_show(label);
515
516 entry = gtk_entry_new();
517 gtk_entry_set_max_length(GTK_ENTRY(entry), 15);
518 sprintf(mdcbufr,"%u",my.fi->dim[5]);
519 gtk_entry_set_text(GTK_ENTRY(entry),mdcbufr);
520 gtk_editable_select_region(GTK_EDITABLE(entry),0,-1);
521 gtk_table_attach_defaults(GTK_TABLE(table),entry,1,2,2,3);
522 gtk_widget_show(entry);
523 vifi->NrDimGates = entry;
524
525 label = gtk_label_new("(gates | R-R intervals)");
526 gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_RIGHT);
527 gtk_widget_set_name(label, "FixedLabel");
528 gtk_table_attach_defaults(GTK_TABLE(table),label,2,3,2,3);
529 gtk_widget_show(label);
530
531 label = gtk_label_new("dim[6] = ");
532 gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_RIGHT);
533 gtk_widget_set_name(label, "FixedLabel");
534 gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,3,4);
535 gtk_widget_show(label);
536
537 entry = gtk_entry_new();
538 gtk_entry_set_max_length(GTK_ENTRY(entry), 15);
539 sprintf(mdcbufr,"%u",my.fi->dim[6]);
540 gtk_entry_set_text(GTK_ENTRY(entry),mdcbufr);
541 gtk_editable_select_region(GTK_EDITABLE(entry),0,-1);
542 gtk_table_attach_defaults(GTK_TABLE(table),entry,1,2,3,4);
543 gtk_widget_show(entry);
544 vifi->NrDimBeds = entry;
545
546 label = gtk_label_new("(beds | detector heads)");
547 gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_RIGHT);
548 gtk_widget_set_name(label, "FixedLabel");
549 gtk_table_attach_defaults(GTK_TABLE(table),label,2,3,3,4);
550 gtk_widget_show(label);
551
552 label = gtk_label_new("dim[7] = ");
553 gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_RIGHT);
554 gtk_widget_set_name(label, "FixedLabel");
555 gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,4,5);
556 gtk_widget_show(label);
557
558 entry = gtk_entry_new();
559 gtk_entry_set_max_length(GTK_ENTRY(entry), 15);
560 sprintf(mdcbufr,"%u",my.fi->dim[7]);
561 gtk_entry_set_text(GTK_ENTRY(entry),mdcbufr);
562 gtk_editable_select_region(GTK_EDITABLE(entry),0,-1);
563 gtk_table_attach_defaults(GTK_TABLE(table),entry,1,2,4,5);
564 gtk_widget_show(entry);
565 vifi->NrDimWindows = entry;
566
567 label = gtk_label_new("(energy windows)");
568 gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_RIGHT);
569 gtk_widget_set_name(label, "FixedLabel");
570 gtk_table_attach_defaults(GTK_TABLE(table),label,2,3,4,5);
571 gtk_widget_show(label);
572
573 /* tab page Study Parameters */
574 box2 = gtk_vbox_new(FALSE, 10);
575 gtk_widget_show(box2);
576
577 tablabel = gtk_label_new("Study Parameters");
578 gtk_widget_show(tablabel);
579 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), box2, tablabel);
580
581 box3 = gtk_hbox_new(FALSE,5);
582 gtk_container_add(GTK_CONTAINER(box2),box3);
583 gtk_container_set_border_width(GTK_CONTAINER(box3),5);
584 gtk_widget_show(box3);
585
586 frame = gtk_frame_new("Reconstructed");
587 gtk_container_add(GTK_CONTAINER(box3),frame);
588 gtk_container_set_border_width(GTK_CONTAINER(frame),5);
589 gtk_widget_show(frame);
590
591 box4 = gtk_hbox_new(FALSE,5);
592 gtk_container_add(GTK_CONTAINER(frame),box4);
593 gtk_container_set_border_width(GTK_CONTAINER(box4),0);
594 gtk_widget_show(box4);
595
596 button = gtk_radio_button_new_with_label(NULL,"Yes");
597 gtk_box_pack_start(GTK_BOX(box4),button,TRUE,TRUE,0);
598 /* MARK: only save the Yes option */
599 if (my.fi->reconstructed == MDC_YES)
600 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
601 gtk_widget_show(button);
602 vifi->Reconstructed = button;
603
604 group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button));
605 button = gtk_radio_button_new_with_label(group,"No");
606 gtk_box_pack_start(GTK_BOX(box4),button,TRUE,TRUE,0);
607 if (my.fi->reconstructed == MDC_NO)
608 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
609 gtk_widget_show(button); /* MARK: no need to preserve, only two supported */
610
611 frame = gtk_frame_new("Planar");
612 gtk_container_add(GTK_CONTAINER(box3),frame);
613 gtk_container_set_border_width(GTK_CONTAINER(frame),5);
614 gtk_widget_show(frame);
615
616 box4 = gtk_hbox_new(FALSE,5);
617 gtk_container_add(GTK_CONTAINER(frame),box4);
618 gtk_container_set_border_width(GTK_CONTAINER(box4),0);
619 gtk_widget_show(box4);
620
621 button = gtk_radio_button_new_with_label(NULL,"Yes");
622 gtk_box_pack_start(GTK_BOX(box4),button,TRUE,TRUE,0);
623 /* MARK: only save the Yes option */
624 if (my.fi->planar == MDC_YES)
625 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
626 gtk_widget_show(button);
627 vifi->Planar = button;
628
629 group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button));
630 button = gtk_radio_button_new_with_label(group,"No");
631 gtk_box_pack_start(GTK_BOX(box4),button,TRUE,TRUE,0);
632 if (my.fi->planar == MDC_NO)
633 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
634 gtk_widget_show(button); /* MARK: no need to preserve, only two supported */
635
636 box3 = gtk_hbox_new(FALSE,5);
637 gtk_container_add(GTK_CONTAINER(box2),box3);
638 gtk_container_set_border_width(GTK_CONTAINER(box3),5);
639 gtk_widget_show(box3);
640
641 frame = gtk_frame_new("Acquisition Type");
642 gtk_container_add(GTK_CONTAINER(box3),frame);
643 gtk_container_set_border_width(GTK_CONTAINER(frame),5);
644 gtk_widget_show(frame);
645
646 box4 = gtk_vbox_new(FALSE,5);
647 gtk_container_add(GTK_CONTAINER(frame),box4);
648 gtk_container_set_border_width(GTK_CONTAINER(box4),0);
649 gtk_widget_show(box4);
650
651 for (i=0; i < MDC_MAX_ACQUISITIONS; i++) {
652 if (i == 0) {
653 button = gtk_radio_button_new_with_label(NULL,MdcGetStrAcquisition(i));
654 }else{
655 group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button));
656 button = gtk_radio_button_new_with_label(group,MdcGetStrAcquisition(i)); }
657
658 gtk_box_pack_start(GTK_BOX(box4),button,TRUE,TRUE,0);
659 if (my.fi->acquisition_type == i) {
660 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
661 }else{
662 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), FALSE);
663 }
664 gtk_widget_show(button);
665
666 vifi->AcquisitionType[i] = button;
667 }
668
669 frame = gtk_frame_new("Modality");
670 gtk_container_add(GTK_CONTAINER(box3),frame);
671 gtk_container_set_border_width(GTK_CONTAINER(frame),5);
672 gtk_widget_show(frame);
673
674 box4 = gtk_vbox_new(FALSE,5);
675 gtk_container_add(GTK_CONTAINER(frame),box4);
676 gtk_container_set_border_width(GTK_CONTAINER(box4),0);
677 gtk_widget_show(box4);
678
679 vifi->CurModality = my.fi->modality;
680
681 button = gtk_radio_button_new_with_label(NULL,"NM");
682 gtk_box_pack_start(GTK_BOX(box4),button,TRUE,TRUE,0);
683 /*if (vifi->CurModality == M_NM) {
684 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
685 }*/
686 gtk_widget_show(button);
687 vifi->ModalityNM = button;
688
689 group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button));
690 button = gtk_radio_button_new_with_label(group,"PT");
691 gtk_box_pack_start(GTK_BOX(box4),button,TRUE,TRUE,0);
692 /*if (vifi->CurModality == M_PT) {
693 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
694 }*/
695 gtk_widget_show(button);
696 vifi->ModalityPT = button;
697
698 group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button));
699 button = gtk_radio_button_new_with_label(group,"CT");
700 gtk_box_pack_start(GTK_BOX(box4),button,TRUE,TRUE,0);
701 /*if (vifi->CurModality == M_CT) {
702 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
703 }*/
704 gtk_widget_show(button);
705 vifi->ModalityCT = button;
706
707 group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button));
708 button = gtk_radio_button_new_with_label(group,"MR");
709 gtk_box_pack_start(GTK_BOX(box4),button,TRUE,TRUE,0);
710 /*if (vifi->CurModality == M_MR) {
711 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
712 }*/
713 gtk_widget_show(button);
714 vifi->ModalityMR = button;
715
716 group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button));
717 button = gtk_radio_button_new_with_label(group,"keep current");
718 gtk_box_pack_start(GTK_BOX(box4),button,TRUE,TRUE,0);
719 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
720 gtk_widget_show(button);
721 vifi->ModalityCurrent = button;
722
723 /* create horizontal separator */
724 separator = gtk_hseparator_new();
725 gtk_box_pack_start(GTK_BOX(box1),separator,FALSE,FALSE,0);
726 gtk_widget_show(separator);
727
728 /* create bottom buttons */
729 box2 = gtk_hbox_new(FALSE,0);
730 gtk_box_pack_start(GTK_BOX(box1),box2,TRUE,TRUE,2);
731 gtk_widget_show(box2);
732
733 button = gtk_button_new_with_label("Apply");
734 gtk_box_pack_start(GTK_BOX(box2),button,TRUE,TRUE,2);
735 g_signal_connect_swapped(GTK_OBJECT(button), "clicked",
736 G_CALLBACK(gtk_widget_hide), GTK_OBJECT(window));
737 g_signal_connect(GTK_OBJECT(button),"clicked",
738 G_CALLBACK(XMdcEditFileInfoCallbackApply), NULL);
739 g_signal_connect_swapped(GTK_OBJECT(button),"clicked",
740 G_CALLBACK(gtk_widget_destroy), GTK_OBJECT(window));
741 gtk_widget_show(button);
742
743 button = gtk_button_new_with_label("Cancel");
744 gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 2);
745 g_signal_connect_swapped(GTK_OBJECT (button), "clicked",
746 G_CALLBACK(gtk_widget_destroy), GTK_OBJECT(window));
747 gtk_widget_show(button);
748
749 XMdcShowWidget(window);
750 }
751