bool Action::System::set_action_status(etl::handle<Action::Undoable> action, bool x) { Stack::iterator iter; int failed=false; if(action->is_active()==x) return true; handle<Action::Undoable> cur_pos=undo_action_stack_.front(); Action::CanvasSpecific* canvas_specific(dynamic_cast<Action::CanvasSpecific*>(action.get())); handle<UIInterface> uim=new ConfidentUIInterface(); iter=find(undo_action_stack_.begin(),undo_action_stack_.end(),action); if(iter!=undo_action_stack_.end()) { while(undo_action_stack_.front()!=action) { if(!undo_(uim)) { return false; } } if(!undo_(uim)) { return false; } action->set_active(x); if(redo_(get_ui_interface())) { signal_action_status_changed_(action); } else { action->set_active(!x); failed=true; } while(undo_action_stack_.front()!=cur_pos) { if(!redo_(uim)) { redo_action_stack_.front()->set_active(false); signal_action_status_changed_(redo_action_stack_.front()); } } if(!failed && canvas_specific && canvas_specific->is_dirty()) { Canvas::Handle canvas=canvas_specific->get_canvas(); handle<CanvasInterface> canvas_interface=static_cast<Instance*>(this)->find_canvas_interface(canvas); assert(canvas_interface); //canvas_interface->signal_dirty_preview()(); } return true; } iter=find(redo_action_stack_.begin(),redo_action_stack_.end(),action); if(iter!=redo_action_stack_.end()) { action->set_active(x); signal_action_status_changed_(action); if(canvas_specific && canvas_specific->is_dirty()) { Canvas::Handle canvas=canvas_specific->get_canvas(); handle<CanvasInterface> canvas_interface=static_cast<Instance*>(this)->find_canvas_interface(canvas); assert(canvas_interface); //canvas_interface->signal_dirty_preview()(); } return true; } return false; }