📄 ui_panel.c
字号:
/*user interface: permanent control panel plus various popup panels*/#include <Xm/DialogS.h>#include <Xm/Frame.h>#include <Xm/Label.h>#include <Xm/MainW.h>#include <Xm/PushB.h>#include <Xm/RowColumn.h>#include <Xm/Scale.h>#include <Xm/Separator.h>#include <Xm/TextF.h>#include <stdio.h>#include "main.h"#include "ui.h"#include "axis.h"#include "data.h"#include "map.h"#include "render.h"#include "view.h"#include "region.h"#include "pick.h"#include "movie.h"#include "color.h"#include "colorbar.h"extern UI ui;extern Message message;/********************************* CONTROL PANEL ******************************/#define CS XmStringCreateSimple/* label generator */#undef LABEL#define LABEL(name) \ XtVaCreateManagedWidget (name,xmLabelWidgetClass,parent,NULL);/* button generator */#undef BUTTON#define BUTTON(name,callback) {\ Widget widget;\ extern callback();\ widget = XtVaCreateManagedWidget (name,xmPushButtonWidgetClass,parent,NULL);\ XtAddCallback (widget,XmNactivateCallback,(XtCallbackProc)callback,NULL);\ }/* slider generator */#undef SLIDER#define SLIDER(name,var,value,callback) {\ extern callback();\ if (name[0] != '\0') {\ XtVaCreateManagedWidget (name,xmLabelWidgetClass,parent,NULL);}\ ui->var = XtVaCreateManagedWidget (name,xmScaleWidgetClass,parent,\ XmNorientation, XmHORIZONTAL,\ XmNvalue, (int)(100*value),\ NULL);\ XtAddCallback (ui->var,XmNvalueChangedCallback,(XtCallbackProc)callback,NULL);\ }/* initialize controls */UIControlInit1 (parent)Widget parent; { Widget widget; WidgetList list; extern UIMovie(), UIDirection(); if (!ui) return; /* control panel */ ui->control = XtVaCreateManagedWidget ("control1",xmRowColumnWidgetClass,parent, XmNwidth, UI_WIDE, /* controls laid out left to right */ XmNorientation, XmHORIZONTAL, XmNpacking, XmPACK_TIGHT, NULL); parent = XtVaCreateManagedWidget ("frame",xmFrameWidgetClass,ui->control,NULL); widget = XmVaCreateSimpleRadioBox (parent, "movie", 1, (XtCallbackProc)UIMovie, XmVaRADIOBUTTON, CS("GO"),NULL,NULL,NULL, XmVaRADIOBUTTON, CS("NO"),NULL,NULL,NULL, XmNorientation, XmHORIZONTAL, NULL); XtManageChild (widget); XtManageChild (parent); parent = XtVaCreateManagedWidget ("frame",xmFrameWidgetClass,ui->control,NULL); widget = XmVaCreateSimpleRadioBox (parent, "dir", 0, (XtCallbackProc)UIDirection, XmVaRADIOBUTTON, CS("z"),NULL,NULL,NULL, XmVaRADIOBUTTON, CS("Z"),NULL,NULL,NULL, XmVaRADIOBUTTON, CS("<"),NULL,NULL,NULL, XmVaRADIOBUTTON, CS(">"),NULL,NULL,NULL, XmVaRADIOBUTTON, CS("^"),NULL,NULL,NULL, XmVaRADIOBUTTON, CS("v"),NULL,NULL,NULL, XmNorientation, XmHORIZONTAL, NULL); XtManageChild (widget); XtManageChild (parent); parent = ui->control; SLIDER ("SPEED",speed,1.0,UISpeed); }/* toggle movie */UIMovie (widget,item)Widget widget;int item; { static int toggle = 0; toggle = 1 - toggle; if (toggle) return; switch (item) { case 0: MovieOn(); break; case 1: MovieOff(); break; } }/* toggle direction */UIDirection (widget,item)Widget widget;int item; { static int toggle = 0; toggle = 1 - toggle; if (toggle) return; switch (item) { case 4: if (!View3D()) return; ViewSetMovie (MOVIE_TOP); MovieSetDir (MOVIE_REVERSE); if (!MovieRun()) ViewDrawMovie (); break; case 5: if (!View3D()) return; ViewSetMovie (MOVIE_TOP); MovieSetDir (MOVIE_FORWARD); if (!MovieRun()) ViewDrawMovie (); break; case 2: if (!View3D()) return; ViewSetMovie (MOVIE_SIDE); MovieSetDir (MOVIE_REVERSE); if (!MovieRun()) ViewDrawMovie (); break; case 3: if (!View3D()) return; ViewSetMovie (MOVIE_SIDE); MovieSetDir (MOVIE_FORWARD); if (!MovieRun()) ViewDrawMovie (); break; case 0: ViewSetMovie (MOVIE_FRONT); MovieSetDir (MOVIE_REVERSE); if (!MovieRun()) ViewDrawMovie (); break; case 1: ViewSetMovie (MOVIE_FRONT); MovieSetDir (MOVIE_FORWARD); if (!MovieRun()) ViewDrawMovie (); break; } }UIControlInit2 (parent)Widget parent; { if (!ui) return; /* control panel */ ui->control = XtVaCreateManagedWidget ("control2",xmRowColumnWidgetClass,parent, XmNwidth, UI_WIDE, /* controls laid out left to right */ XmNorientation, XmHORIZONTAL, XmNpacking, XmPACK_TIGHT, NULL); parent = ui->control; SLIDER ("CONTRAST",contrast,0.5,UIContrast); SLIDER ("CENTER",contrast0,0.5,UIContrast0); BUTTON ("RESET",UIResetContrast); }/* get toggle state */UIGetToggle (widget)Widget widget; { int state = 0; XtVaGetValues (widget,XmNset,&state,NULL); return (state); }/* set toggle widget state */UIToggleSet (widget,state)Widget widget;int state; { XtVaSetValues (widget,XmNset,state,NULL); }/* set slider widget value between 0 and 1 */UISetSlider (widget,value)Widget widget;float value; { XtVaSetValues (widget,XmNvalue,(int)(100*value),NULL); }/* set slider widget value between 0 and 1 */UIGetSlider (widget)Widget widget; { int value = 0; XtVaGetValues (widget,XmNvalue,&value,NULL); return (value); }/* speed slider callback */UISpeed (widget,client,data)Widget widget;XtPointer client;XmScaleCallbackStruct *data; { MovieSetSpeed (data->value); }/* contrast slider callback */UIContrast (widget,client,data)Widget widget;XtPointer client;XmScaleCallbackStruct *data; { ColorSetContrast (data->value); ColorSwitch (); }UIContrast0 (widget,client,data)Widget widget;XtPointer client;XmScaleCallbackStruct *data; { ColorSetContrast0 (data->value); ColorSwitch (); }/* reset contrast */UIResetContrast () { if (!ui) return; ColorSetContrast (CONTRAST); ColorSetContrast0 (CONTRAST0); UISetSlider (ui->contrast,0.5); UISetSlider (ui->contrast0,0.5); ColorSwitch (); }/********************************* SIZE PANEL ******************************//* bounds callback for array settings and sizing */UISizeRaise () { UISizeInit (); UISizeReset (); XtPopup (ui->s_shell,XtGrabNone); }/* initialize size control panel */UISizeInit () { extern View view; string svalue; Widget widget, parent; if (ui->s_shell) return; ui->s_shell = XtVaCreatePopupShell ("size",xmDialogShellWidgetClass,ui->main, XmNtitle, CS("SIZE PARAMETERS"), NULL); ui->s_base = XtVaCreateWidget ("s_base",xmRowColumnWidgetClass,ui->s_shell, XmNnumColumns, 8, XmNpacking, XmPACK_COLUMN, XmNorientation, XmHORIZONTAL, NULL);#undef LABEL#define LABEL(name) XtVaCreateManagedWidget (name, xmLabelWidgetClass, parent,\ NULL);#undef LABEL1#define LABEL1(name,var) ui->var = XtVaCreateManagedWidget (name, xmLabelWidgetClass, parent,\ NULL);#undef BUTTON#define BUTTON(name,callback) {\ Widget widget;\ extern callback();\ widget = XtVaCreateManagedWidget (name, xmPushButtonWidgetClass, parent, NULL);\ XtAddCallback (widget,XmNactivateCallback,(XtCallbackProc)callback,NULL);\ }#undef SLIDER#define SLIDER(axis,var,var1) {\ Widget widget;\ extern UISizeSlider(), UISizeText();\ widget = XtVaCreateWidget ("slider", xmRowColumnWidgetClass, parent,\ XmNorientation, XmHORIZONTAL,\ NULL);\ ui->var = XtVaCreateManagedWidget ("var", xmScaleWidgetClass, widget,\ XmNshowValue, True,\ XmNorientation, XmHORIZONTAL,\ NULL);\ XtAddCallback (ui->var,XmNdragCallback,(XtCallbackProc)UISizeSlider,NULL);\ ui->var1 = XtVaCreateManagedWidget ("var1", xmTextFieldWidgetClass, widget,\ XmNcolumns, 6,\ NULL);\ XtAddCallback (ui->var1,XmNactivateCallback,(XtCallbackProc)UISizeText,NULL);\ XtManageChild (widget);\ ui->s_slist[ui->s_nslider] = ui->var;\ ui->s_vlist[ui->s_nslider] = ui->var1;\ ui->s_alist[ui->s_nslider] = axis;\ ui->s_nslider++;\ } ui->s_nslider = 0; parent = ui->s_base; LABEL("SET SIZE:"); LABEL1("DOWN:n1",s_label[AXIS_DOWN]); LABEL1("ACROSS:n2",s_label[AXIS_ACROSS]); LABEL1("DEEP:n3",s_label[AXIS_DEEP]); LABEL("MINIMUM"); SLIDER(AXIS_DOWN,s_mins[AXIS_DOWN],s_minv[AXIS_DOWN]); SLIDER(AXIS_ACROSS,s_mins[AXIS_ACROSS],s_minv[AXIS_ACROSS]); SLIDER(AXIS_DEEP,s_mins[AXIS_DEEP],s_minv[AXIS_DEEP]); LABEL("MAXIMUM"); SLIDER(AXIS_DOWN,s_maxs[AXIS_DOWN],s_maxv[AXIS_DOWN]); SLIDER(AXIS_ACROSS,s_maxs[AXIS_ACROSS],s_maxv[AXIS_ACROSS]); SLIDER(AXIS_DEEP,s_maxs[AXIS_DEEP],s_maxv[AXIS_DEEP]); LABEL("FRAME"); SLIDER(AXIS_DOWN,s_frames[AXIS_DOWN],s_framev[AXIS_DOWN]); SLIDER(AXIS_ACROSS,s_frames[AXIS_ACROSS],s_framev[AXIS_ACROSS]); SLIDER(AXIS_DEEP,s_frames[AXIS_DEEP],s_framev[AXIS_DEEP]); LABEL("FRAME-INC"); SLIDER(AXIS_DOWN,s_dframes[AXIS_DOWN],s_dframev[AXIS_DOWN]); SLIDER(AXIS_ACROSS,s_dframes[AXIS_ACROSS],s_dframev[AXIS_ACROSS]); SLIDER(AXIS_DEEP,s_dframes[AXIS_DEEP],s_dframev[AXIS_DEEP]); LABEL("PIXELS"); SLIDER(NO_INDEX,s_sizes[AXIS_DOWN],s_sizev[AXIS_DOWN]); SLIDER(NO_INDEX,s_sizes[AXIS_ACROSS],s_sizev[AXIS_ACROSS]); SLIDER(NO_INDEX,s_sizes[AXIS_DEEP],s_sizev[AXIS_DEEP]); BUTTON("EXECUTE SETTINGS",UISizeDraw); BUTTON("CURRENT SETTINGS",UISizeReset); BUTTON("INITIAL SETTINGS",UISizeInitial); BUTTON("CLOSE",UISizeClose); XtManageChild (ui->s_base); }/* size control panel draw callback */UISizeDraw () { int imap, first, last, frame, dframe, size; extern View view; for (imap=1; imap<4; imap++) { XtVaGetValues (ui->s_mins[imap],XmNvalue,&first,NULL); XtVaGetValues (ui->s_maxs[imap],XmNvalue,&last,NULL); XtVaGetValues (ui->s_frames[imap],XmNvalue,&frame,NULL); XtVaGetValues (ui->s_dframes[imap],XmNvalue,&dframe,NULL); XtVaGetValues (ui->s_sizes[imap],XmNvalue,&size,NULL); MapSet (ViewMap(view,imap),MapAxis(ViewMap(view,imap)),size,first,last,first,last,dframe); MapSetFrame (ViewMap(view,imap),frame); } ViewDrawAll(); }/* set size control panel to current image values */UISizeReset () { int imap, islider; extern View view; string svalue; if (!ui->s_shell) return; for (imap=1; imap<4; imap++) { sprintf (svalue,"%s:%s",MapName(ViewMap(view,imap)),AxisLabel(MapAxis(ViewMap(view,imap)))); XtVaSetValues (ui->s_label[imap],XmNlabelString,CS(svalue), NULL); XtVaSetValues (ui->s_mins[imap],XmNmaximum,AxisSize(MapAxis(ViewMap(view,imap)))-1, XmNvalue, MapFirst(ViewMap(view,imap)), NULL); XtVaSetValues (ui->s_maxs[imap],XmNmaximum,AxisSize(MapAxis(ViewMap(view,imap)))-1, XmNvalue, MapLast(ViewMap(view,imap)), NULL); XtVaSetValues (ui->s_frames[imap],XmNmaximum,AxisSize(MapAxis(ViewMap(view,imap)))-1, XmNvalue, MapFrame(ViewMap(view,imap)), NULL); XtVaSetValues (ui->s_dframes[imap],XmNminimum,1, XmNmaximum,100, XmNvalue, MapDmovie(ViewMap(view,imap)), NULL); XtVaSetValues (ui->s_sizes[imap],XmNminimum,16, XmNmaximum,1000, XmNvalue,MapSize(ViewMap(view,imap)), NULL); } for (islider=0; islider<ui->s_nslider; islider++) { UISizeSlider (ui->s_slist[islider]); } }/* set size control panel to initial size values */UISizeInitial () { int imap, islider; extern View view; if (!ui->s_shell) return; for (imap=1; imap<4; imap++) { XtVaSetValues (ui->s_mins[imap],XmNvalue,0,NULL); XtVaSetValues (ui->s_maxs[imap],XmNvalue,AxisSize(MapAxis(ViewMap(view,imap)))-1,NULL); XtVaSetValues (ui->s_frames[imap],XmNvalue,0,NULL); } for (islider=0; islider<ui->s_nslider; islider++) { UISizeSlider (ui->s_slist[islider]); } }/* close size control panel */UISizeClose () { XtPopdown (ui->s_shell);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -