/*========================================================================*/ int ControlInit(PyMOLGlobals * G) { register CControl *I = NULL; if((I = (G->Control = Calloc(CControl, 1)))) { I->Block = OrthoNewBlock(G, NULL); I->Block->fClick = ControlClick; I->Block->fDraw = ControlDraw; I->Block->fDrag = ControlDrag; I->Block->fRelease = ControlRelease; I->Block->fReshape = ControlReshape; I->Block->active = true; I->Block->TextColor[0] = 1.0; I->Block->TextColor[1] = 0.75; I->Block->TextColor[2] = 0.75; I->ButtonColor[0] = 0.5F; I->ButtonColor[1] = 0.5F; I->ButtonColor[2] = 0.5F; I->ActiveColor[0] = 0.65F; I->ActiveColor[1] = 0.65F; I->ActiveColor[2] = 0.65F; I->Pressed = -1; I->Active = -1; OrthoAttach(G, I->Block, cOrthoTool); I->SaveWidth = 0; I->LastClickTime = UtilGetSeconds(G); I->NButton = 9; return 1; } else return 0; }
/*========================================================================*/ static int ControlClick(Block * block, int button, int x, int y, int mod) { PyMOLGlobals *G = block->G; register CControl *I = G->Control; I->SkipRelease = false; if(x < (I->Block->rect.left + cControlLeftMargin)) { y -= I->Block->rect.top - cControlTopMargin; if((y <= 0) && (y > (-cControlBoxSize))) { double now = UtilGetSeconds(block->G); if((now - I->LastClickTime) < 0.35) { if(I->SaveWidth) { SettingSet(G, cSetting_internal_gui_width, (float) I->SaveWidth); OrthoReshape(G, -1, -1, false); I->SaveWidth = 0; } else { I->SaveWidth = (int) SettingGet(G, cSetting_internal_gui_width); SettingSet(G, cSetting_internal_gui_width, (float) cControlMinWidth); OrthoReshape(G, -1, -1, false); } I->SkipRelease = true; } else { I->LastPos = x; OrthoGrab(G, block); I->DragFlag = true; I->LastClickTime = UtilGetSeconds(G); } } } else { I->Pressed = which_button(I, x, y); I->Active = I->Pressed; if(I->Pressed) OrthoGrab(G, block); OrthoDirty(G); } return (1); }
int ControlSdofUpdate(PyMOLGlobals * G, float tx, float ty, float tz, float rx, float ry, float rz) { /* may be called asynchronously anytime after CControl has been initialized */ CControl *I = G->Control; if(I) { if(((I->sdofWroteTo - I->sdofReadFrom) & SDOF_QUEUE_MASK) < SDOF_QUEUE_MASK) { /* a free slot exists */ int slot = (I->sdofWroteTo + 1) & SDOF_QUEUE_MASK; float *buffer = I->sdofBuffer + (6 * slot); buffer[0] = tx; buffer[1] = ty; buffer[2] = tz; buffer[3] = rx; buffer[4] = ry; buffer[5] = rz; I->sdofWroteTo = slot; { float tol = 0.0001; int active = (fabs(buffer[0]) >= tol) || (fabs(buffer[1]) >= tol) || (fabs(buffer[2]) >= tol) || (fabs(buffer[3]) >= tol) || (fabs(buffer[4]) >= tol) || (fabs(buffer[5]) >= tol); if(active && !I->sdofActive) { I->sdofLastIterTime = UtilGetSeconds(G); } I->sdofActive = active; } /*printf("wrote %8.3f %8.3f %8.3f %8.3f %8.3f %8.3f %d %d %d\n",tx,ty,tz,rx,ry,rz,I->sdofReadFrom,I->sdofWroteTo,slot); */ } } return 1; }
static int ControlRelease(Block * block, int button, int x, int y, int mod) { PyMOLGlobals *G = block->G; register CControl *I = G->Control; int sel = 0; I->LastPos = x; sel = which_button(I, x, y); if(!I->SkipRelease) { switch (sel) { case 0: SceneSetFrame(G, 4, 0); PLog(G, "cmd.rewind()", cPLog_pym); break; case 1: SceneSetFrame(G, 5, -1); PLog(G, "cmd.back()", cPLog_pym); break; case 2: MoviePlay(G, cMovieStop); if(SettingGet(G, cSetting_sculpting)) SettingSet(G, cSetting_sculpting, 0); if(SettingGetGlobal_b(G, cSetting_rock)) SettingSetGlobal_b(G, cSetting_rock, false); ExecutiveDrawNow(G); OrthoDirty(G); PLog(G, "cmd.mstop()", cPLog_pym); break; case 3: if(!MoviePlaying(G)) { if(mod & cOrthoCTRL) { PLog(G, "cmd.rewind()", cPLog_pym); PLog(G, "cmd.mplay()", cPLog_pym); SceneSetFrame(G, 4, 0); MoviePlay(G, cMoviePlay); } else { PLog(G, "cmd.mplay()", cPLog_pym); MoviePlay(G, cMoviePlay); } } else { MoviePlay(G, cMovieStop); ExecutiveDrawNow(G); OrthoDirty(G); PLog(G, "cmd.mstop()", cPLog_pym); } break; case 4: SceneSetFrame(G, 5, 1); PLog(G, "cmd.forward()", cPLog_pym); break; case 5: if(mod & cOrthoCTRL) { SceneSetFrame(G, 3, 0); PLog(G, "cmd.middle()", cPLog_pym); } else { SceneSetFrame(G, 6, 0); PLog(G, "cmd.ending()", cPLog_pym); } break; case 6: if(SettingGetGlobal_b(G, cSetting_seq_view)) { SettingSetGlobal_b(G, cSetting_seq_view, 0); SeqChanged(G); PLog(G, "cmd.set('seq_view',0)", cPLog_pym); } else { SettingSetGlobal_b(G, cSetting_seq_view, 1); SeqChanged(G); PLog(G, "cmd.set('seq_view',1)", cPLog_pym); } OrthoDirty(G); break; case 7: SettingSetGlobal_b(G, cSetting_rock, !SettingGetGlobal_b(G, cSetting_rock)); if(SettingGetGlobal_b(G, cSetting_rock)) { SceneRestartSweepTimer(G); PLog(G, "cmd.rock(1)", cPLog_pym); } else PLog(G, "cmd.rock(0)", cPLog_pym); SceneRestartFrameTimer(G); OrthoDirty(G); break; case 8: PLog(G, "cmd.fullscreen()", cPLog_pym); ExecutiveFullScreen(G, -1); break; } OrthoDirty(G); OrthoUngrab(G); I->LastClickTime = UtilGetSeconds(G); I->DragFlag = false; I->Active = -1; I->Pressed = -1; } return (1); }
int ControlSdofIterate(PyMOLGlobals * G) { CControl *I = G->Control; if(I->sdofWroteTo != I->sdofReadFrom) { int slot = I->sdofWroteTo; /* new data available */ float *buffer = I->sdofBuffer + (6 * slot); I->sdofTrans[0] = buffer[0]; I->sdofTrans[1] = buffer[1]; I->sdofTrans[2] = buffer[2]; I->sdofRot[0] = buffer[3]; I->sdofRot[1] = buffer[4]; I->sdofRot[2] = buffer[5]; I->sdofReadFrom = slot; } if(I->sdofActive) { double now = UtilGetSeconds(G); double delta = now - I->sdofLastIterTime; I->sdofLastIterTime = now; { /* suppress small amounts of combined motion using a truncated switching function */ float len_rot = length3f(I->sdofRot); float len_trans = length3f(I->sdofTrans); float *dom, *sub; if(len_rot > len_trans) { dom = &len_rot; sub = &len_trans; } else { dom = &len_trans; sub = &len_rot; } { float expo = 2.0F; float trnc = 0.05F; float sub_fxn = (*sub) / (*dom); if(sub_fxn < trnc) { sub_fxn = 0.0F; } else if(sub_fxn < 0.5F) { sub_fxn = (sub_fxn - trnc) / (0.5F - trnc); sub_fxn = (float) pow(sub_fxn, expo); } else { sub_fxn = 1.0F - (float) pow(1.0F - sub_fxn, expo); } *dom = 1.0F; *sub = sub_fxn; scale3f(I->sdofTrans, len_trans, I->sdofTrans); scale3f(I->sdofRot, len_rot, I->sdofRot); } } /* translate */ SceneTranslateScaled(G, delta * I->sdofTrans[0], -delta * I->sdofTrans[1], -delta * I->sdofTrans[2], I->sdofMode); /* rotate */ SceneRotateScaled(G, 2.0F * delta * I->sdofRot[0], -2.0F * delta * I->sdofRot[1], -2.0F * delta * I->sdofRot[2], I->sdofMode); SceneDirty(G); } return 1; }
int UtilInit(PyMOLGlobals *G) { G->Util = Calloc(CUtil,1); G->Util->StartSec = UtilGetSeconds(G); return 1; }