0

我已经开始通过备忘录模式实现撤消和重做,到目前为止我的进展是:

来自类控制器,函数 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));
}

我的问题是:每次我按下“撤消”按钮时,当它更新滑块值时,我的 Memento 将在控制器被触发时重新录制,这样我就获得了 2 个相等的动量状态。现在,这还不错,因为我也想实现“重做”,所以我的想法是将这个“重复”推到我的实际状态之前,以便能够“从撤消中返回” ”。我怎样才能实现这样的条件?改变方法并在其他地方记录我的纪念品状态更好吗?

4

1 回答 1

0

控制器现在有一个“bool undoing”值来跳过观察者通知。

于 2019-07-12T09:02:51.203 回答