void Glut2DView::ExecCommand(Command &command) { switch (command.GetId()) { case TRANSLATE_COMMAND: { TranslateBy(((TranslateCommand*)(&command))->trans.x, ((TranslateCommand*)(&command))->trans.y); RedisplayCommand redisplay; GlutView::ExecCommand(redisplay); } break; case ZOOM_COMMAND: { ZoomBy(((ZoomCommand*) &command)->zoom.x, ((ZoomCommand*) &command)->zoom.y); RedisplayCommand redisplay; GlutView::ExecCommand(redisplay); } break; case ZOOM_X_COMMAND: { ZoomBy(((ZoomCommand*) &command)->zoom.x, 1.0); RedisplayCommand redisplay; GlutView::ExecCommand(redisplay); } break; case ZOOM_Y_COMMAND: { ZoomBy(1.0, ((ZoomCommand*) &command)->zoom.y); RedisplayCommand redisplay; GlutView::ExecCommand(redisplay); } break; case FOCUS_COMMAND: { FocusCommand* cmd = (FocusCommand*) &command; Vertex2d focus = WindowToWorld(cmd->focus.x, cmd->focus.y); SetFocus(focus.x, focus.y); } break; default: GlutView::ExecCommand(command); } }
void SummonController::ExecCommand(Command &command) { // route view commands to connected view if (g_viewAttr.Has(&command)) { m_view->ExecCommand(command); return; } // send SUMMON commands that are not for controller to global // NOTE: why did I have this greater than GLUT_COMMANDS_BEGIN // To prevent an infinite loop (GLUT commands are processed here) if (command.GetId() > GLUT_COMMANDS_END && !g_controllerAttr.Has(&command)) { m_global->ExecCommand(command); return; } // controller commands switch (command.GetId()) { case SET_BINDING_COMMAND: m_binding->AddBinding(((SetBindingCommand*)&command)->input, ((SetBindingCommand*)&command)->command); break; case CLEAR_BINDING_COMMAND: { Input *input = ((ClearBindingCommand*)&command)->input; m_binding->ClearBinding(*input); delete input; } break; case CLEAR_ALL_BINDINGS_COMMAND: { m_binding->Clear(); } break; case HOTSPOT_CLICK_COMMAND: HotspotClick(((HotspotClickCommand*) &command)->pos, Hotspot::CLICK); break; case HOTSPOT_DRAG_COMMAND: HotspotClick(((HotspotClickCommand*) &command)->pos, Hotspot::DRAG); break; case HOTSPOT_DRAG_START_COMMAND: HotspotClick(((HotspotClickCommand*) &command)->pos, Hotspot::DRAG_START); break; case HOTSPOT_DRAG_STOP_COMMAND: HotspotClick(((HotspotClickCommand*) &command)->pos, Hotspot::DRAG_STOP); break; case GET_MOUSE_POS_COMMAND: { Vertex2i pos = GetMousePos(); Vertex2f pos2(-1,-1); GetMousePosCommand* cmd = (GetMousePosCommand*) &command; if (cmd->kind == "world") { pos2 = m_view->WindowToWorld(pos.x, pos.y); } else if (cmd->kind == "screen") { pos2 = m_view->WindowToScreen(pos.x, pos.y); } else if (cmd->kind == "window") { pos2 = pos; } else { Error("Unknown coordinate system '%s'", cmd->kind.c_str()); } cmd->SetReturn(BuildScm("ff", pos2.x, pos2.y)); } break; case SET_WINDOW_ON_RESIZE_COMMAND: { SetWindowOnResizeCommand *resize = (SetWindowOnResizeCommand*) &command; m_resizeProc = resize->proc; } break; case SET_WINDOW_ON_MOVE_COMMAND: { SetWindowOnMoveCommand *move = (SetWindowOnMoveCommand*) &command; m_moveProc = move->proc; } break; default: // execute default commands Glut2DController::ExecCommand(command); } }