00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include <stdlib.h>
00018 #include <tcl.h>
00019 #include "config.h"
00020 #include "VMDApp.h"
00021 #include "Mouse.h"
00022 #include "PickModeList.h"
00023 #include "utilities.h"
00024
00025
00026
00027 static void mouse_usage(Tcl_Interp *interp) {
00028 Tcl_AppendResult(interp, "mouse usage:\n",
00029 "mouse callback [on|off]\n",
00030 "mouse rocking [on|off]\n",
00031 "mouse mode <mode> <submode>\n",
00032 " modes: rotate, translate, scale, light, userpoint\n",
00033 " pick, center, query, labelatom\n",
00034 " labelbond, labelangle, labeldihedral\n",
00035 " moveatom, moveres, movefrag, movemol, moverep\n",
00036 " forceatom, forceres, forcefrag, addbond\n",
00037 NULL);
00038 }
00039
00040
00041
00042 int text_cmd_mouse(ClientData cd, Tcl_Interp *interp, int argc,
00043 const char *argv[]) {
00044
00045 VMDApp *app = (VMDApp *)cd;
00046
00047 if (argc == 2 && !strupncmp(argv[1], "stoprotation", CMDLEN)) {
00048 app->scene_stoprotation();
00049 return TCL_OK;
00050 } else if(argc < 3 || argc > 4) {
00051
00052 mouse_usage(interp);
00053 return TCL_ERROR;
00054 }
00055
00056
00057 int m2 = (argc > 3 ? atoi(argv[3]) : (-1));
00058
00059
00060
00061 if(!strupncmp(argv[1], "mode", CMDLEN)) {
00062 int m1;
00063
00064 if (!strupncmp(argv[2], "rotate", CMDLEN)) m1 = Mouse::ROTATION;
00065 else if (!strupncmp(argv[2], "translate", CMDLEN)) m1 = Mouse::TRANSLATION;
00066 else if (!strupncmp(argv[2], "scale", CMDLEN)) m1 = Mouse::SCALING;
00067 else if (!strupncmp(argv[2], "light", CMDLEN)) m1 = Mouse::LIGHT;
00068 else if (!strupncmp(argv[2], "userpoint", CMDLEN)) m1 = Mouse::USERPOINT;
00069
00070 else if (!strupncmp(argv[2], "query", CMDLEN)) m1 = Mouse::QUERY;
00071 else if (!strupncmp(argv[2], "center", CMDLEN)) m1 = Mouse::CENTER;
00072 else if (!strupncmp(argv[2], "labelatom", CMDLEN)) m1 = Mouse::LABELATOM;
00073 else if (!strupncmp(argv[2], "labelbond", CMDLEN)) m1 = Mouse::LABELBOND;
00074 else if (!strupncmp(argv[2], "labelangle", CMDLEN)) m1 = Mouse::LABELANGLE;
00075 else if (!strupncmp(argv[2], "labeldihedral", CMDLEN)) m1 = Mouse::LABELDIHEDRAL;
00076 else if (!strupncmp(argv[2], "moveatom", CMDLEN)) m1 = Mouse::MOVEATOM;
00077 else if (!strupncmp(argv[2], "moveres", CMDLEN)) m1 = Mouse::MOVERES;
00078 else if (!strupncmp(argv[2], "movefrag", CMDLEN)) m1 = Mouse::MOVEFRAG;
00079 else if (!strupncmp(argv[2], "movemol", CMDLEN)) m1 = Mouse::MOVEMOL;
00080 else if (!strupncmp(argv[2], "forceatom", CMDLEN)) m1 = Mouse::FORCEATOM;
00081 else if (!strupncmp(argv[2], "forceres", CMDLEN)) m1 = Mouse::FORCERES;
00082 else if (!strupncmp(argv[2], "forcefrag", CMDLEN)) m1 = Mouse::FORCEFRAG;
00083 else if (!strupncmp(argv[2], "moverep", CMDLEN)) m1 = Mouse::MOVEREP;
00084 else if (!strupncmp(argv[2], "addbond", CMDLEN)) m1 = Mouse::ADDBOND;
00085 else if (!strupncmp(argv[2], "pick", CMDLEN)) {
00086 if (argc == 3 || m2 == -1)
00087 m1 = Mouse::PICK;
00088 else {
00089
00090
00091 switch (m2) {
00092 case PickModeList::QUERY: m1 = Mouse::QUERY; break;
00093 case PickModeList::CENTER: m1 = Mouse::CENTER; break;
00094 case PickModeList::LABELATOM: m1 = Mouse::LABELATOM; break;
00095 case PickModeList::LABELBOND: m1 = Mouse::LABELBOND; break;
00096 case PickModeList::LABELANGLE: m1 = Mouse::LABELANGLE; break;
00097 case PickModeList::LABELDIHEDRAL: m1 = Mouse::LABELDIHEDRAL; break;
00098 case PickModeList::MOVEATOM: m1 = Mouse::MOVEATOM; break;
00099 case PickModeList::MOVERES: m1 = Mouse::MOVERES; break;
00100 case PickModeList::MOVEFRAG: m1 = Mouse::MOVEFRAG; break;
00101 case PickModeList::MOVEMOL: m1 = Mouse::MOVEMOL; break;
00102 case PickModeList::FORCEATOM: m1 = Mouse::FORCEATOM; break;
00103 case PickModeList::FORCERES: m1 = Mouse::FORCERES; break;
00104 case PickModeList::FORCEFRAG: m1 = Mouse::FORCEFRAG; break;
00105 case PickModeList::MOVEREP: m1 = Mouse::MOVEREP; break;
00106 case PickModeList::ADDBOND: m1 = Mouse::ADDBOND; break;
00107 case PickModeList::PICK: m1 = Mouse::PICK; break;
00108 default:
00109 m1 = Mouse::QUERY;
00110 }
00111 }
00112 } else if (!strupncmp(argv[2], "user", CMDLEN)) {
00113
00114 m1 = Mouse::PICK;
00115 }
00116 else {
00117
00118
00119 m1 = atoi(argv[2]);
00120 }
00121
00122 if (!app->mouse_set_mode(m1, m2)) {
00123 Tcl_AppendResult(interp, "Unable to set mouse mode to ",
00124 argv[2], argc > 3 ? argv[3] : NULL, NULL);
00125
00126
00127 mouse_usage(interp);
00128
00129 return TCL_ERROR;
00130 }
00131
00132 } else if(!strupncmp(argv[1], "callback", CMDLEN)) {
00133 int on=-1;
00134 if (Tcl_GetBoolean(interp, argv[2], &on) != TCL_OK) return TCL_ERROR;
00135 if(on!=-1) {
00136 app->set_mouse_callbacks(on);
00137 }
00138 } else if (argc == 3 && !strupncmp(argv[1], "rocking", CMDLEN)) {
00139 int on = 0;
00140 if (Tcl_GetBoolean(interp, argv[2], &on) != TCL_OK) return TCL_ERROR;
00141 app->set_mouse_rocking(on);
00142 } else {
00143
00144 mouse_usage(interp);
00145 return TCL_ERROR;
00146 }
00147
00148
00149 return TCL_OK;
00150 }
00151