/** * Sets the current action. */ void RS_EventHandler::setCurrentAction(RS_ActionInterface* action) { RS_DEBUG->print("RS_EventHandler::setCurrentAction"); if (action==NULL) { return; } // Predecessor of the new action or NULL: RS_ActionInterface* predecessor = NULL; // Suspend current action: if(hasAction()){ predecessor = currentActions.last(); predecessor->suspend(); predecessor->hideOptions(); } else { if (defaultAction) { predecessor = defaultAction; predecessor->suspend(); predecessor->hideOptions(); } } // // Forget about the oldest action and make space for the new action: // if (actionIndex==RS_MAXACTIONS-1) { // // delete oldest action if necessary (usually never happens): // if (currentActions[0]) { // currentActions[0]->finish(); // delete currentActions[0]; // currentActions[0] = NULL; // } // // Move up actionstack (optimize): // for (int i=0; i<RS_MAXACTIONS-1; ++i) { // currentActions[i] = currentActions[i+1]; // } // } else if (actionIndex<RS_MAXACTIONS-1) { // actionIndex++; // } // Set current action: currentActions.push_back(action); RS_DEBUG->print("RS_EventHandler::setCurrentAction: current action is: %s", currentActions.last()->getName().toLatin1().data()); // Initialisation of our new action: RS_DEBUG->print("RS_EventHandler::setCurrentAction: init current action"); action->init(); // ## new: if (action->isFinished()==false) { RS_DEBUG->print("RS_EventHandler::setCurrentAction: show options"); currentActions.last()->showOptions(); RS_DEBUG->print("RS_EventHandler::setCurrentAction: set predecessor"); action->setPredecessor(predecessor); } RS_DEBUG->print("RS_EventHandler::setCurrentAction: cleaning up.."); cleanUp(); RS_DEBUG->print("RS_EventHandler::setCurrentAction: debugging actions"); debugActions(); RS_DEBUG->print("RS_GraphicView::setCurrentAction: OK"); }
/** * Garbage collector for actions. */ void RS_EventHandler::cleanUp() { RS_DEBUG->print("RS_EventHandler::cleanUp"); int o=0; // old index int n=0; // new index int resume=0; // index of action to resume bool doResume=false; // do we need to resume an action actionIndex = -1; debugActions(); do { // search first used action (o) while (currentActions[o]==NULL && o<RS_MAXACTIONS) { o++; } // delete action if it is finished if (o<RS_MAXACTIONS && currentActions[o]!=NULL && currentActions[o]->isFinished()) { delete currentActions[o]; currentActions[o] = NULL; doResume = true; } // move a running action up in the stack if (o<RS_MAXACTIONS && currentActions[o]!=NULL) { if (n!=o) { currentActions[n] = currentActions[o]; resume = n; currentActions[o] = NULL; } else { if (o<RS_MAXACTIONS) { o++; } } actionIndex = n; if (n<RS_MAXACTIONS-1) { n++; } } } while (o<RS_MAXACTIONS); debugActions(); // Resume last used action: if (doResume) { if (currentActions[resume]!=NULL && !currentActions[resume]->isFinished()) { currentActions[resume]->resume(); currentActions[resume]->showOptions(); } else { if (defaultAction!=NULL) { defaultAction->resume(); defaultAction->showOptions(); } } } RS_DEBUG->print("RS_EventHandler::cleanUp: OK"); }