Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members   Related Pages  

cmd_mouse.C

Go to the documentation of this file.
00001 /***************************************************************************
00002  *cr                                                                       
00003  *cr            (C) Copyright 1995-2008 The Board of Trustees of the           
00004  *cr                        University of Illinois                       
00005  *cr                         All Rights Reserved                        
00006  *cr                                                                   
00007  ***************************************************************************/
00008 /***************************************************************************
00009  * RCS INFORMATION:
00010  *
00011  *      $RCSfile: cmd_mouse.C,v $
00012  *      $Author: johns $        $Locker:  $             $State: Exp $
00013  *      $Revision: 1.25 $      $Date: 2008/06/09 04:02:41 $
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 // print usage message
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 // The following use MOUSE_MODE
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     // if here, something went wrong, so return an error message
00052     mouse_usage(interp);
00053     return TCL_ERROR;
00054   }
00055 
00056   // get the mouse submode, if there is one
00057   int m2 = (argc > 3 ? atoi(argv[3]) : (-1));
00058     
00059   // the modes are:
00060   //  ROTATION == 0, ... USER == 6 ; as defined in Mouse.h
00061   if(!strupncmp(argv[1], "mode", CMDLEN)) {
00062     int m1;
00063     // see if these are string values
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     // picking modes...
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         // if pick is called with a submode, we process it the "old" way
00090         // This is only for backward-compatibility
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; // shouldn't happen...
00110         }
00111       }
00112     } else if (!strupncmp(argv[2], "user", CMDLEN)) { 
00113       // this is obsolete (left in for backwards-compatibility)
00114       m1 = Mouse::PICK;  
00115     }
00116     else {
00117       // not a string so convert to a number
00118       // XXX need to check if atoi fails..
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       // if here, something went wrong, so return an error message
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     // if here, something went wrong, so return an error message
00144     mouse_usage(interp);
00145     return TCL_ERROR;
00146   }
00147   
00148   // if here, everything worked out ok
00149   return TCL_OK;
00150 }
00151 

Generated on Sun Jul 6 01:27:21 2008 for VMD (current) by doxygen1.2.14 written by Dimitri van Heesch, © 1997-2002