我已经开始通过Memento模式实现撤消和重做,到目前为止,我的进展是:
从类控制器,功能RGB(...):
void Controller::rgb(int exp, double cont, int r, int g, int b){
originator->setValue(exp, originator->exposure_Val);
originator->setValue(cont, originator->contrast_Val);
originator->setValue(r, originator->red_Val);
originator->setValue(g, originator->green_Val);
originator->setValue(b, originator->blue_Val);
caretaker->setMemento(originator->createMemento());
RGB_process run(model->src, model->dst, exp, cont, r, g, b);
run.doProcess();
model->setValue(exp, cont, r, g, b);
}
无效模型:: setValue(...):
....code that sets values...
notify(); //notify observer, and update the view
然后在我看来,on_undo_btn(...):
void MainWindow::on_undo_btn_clicked()
{
controller->originator->restoreToMemento(controller->caretaker->getMemento());
ui->exposure_slider->setValue(controller->originator->getValue(controller->originator->exposure_Val));
ui->contrast_slider->setValue(controller->originator->getValue(controller->originator->contrast_Val));
ui->red_slider->setValue(controller->originator->getValue(controller->originator->red_Val));
ui->green_slider->setValue(controller->originator->getValue(controller->originator->green_Val));
ui->blue_slider->setValue(controller->originator->getValue(controller->originator->blue_Val));
}
我的问题是: 每次我按“撤消” btn时,它会更新滑块值,当控制器被触发时,我的Memento将被重新记录,这样我的动量就有两个相等的状态。 现在,这一点都还不错,因为我也想实现一个“重做”,所以我的想法是将这个“重复的”推到我的实际状态之前,以便能够“从撤消中退回”。 ”。 如何实现这种条件? 改变方法并在其他地方记录我的记忆状态是否更好?
答案 0 :(得分:0)
控制器现在具有“ bool undoing”值,以跳过观察者通知。