Я начал реализовывать отмену и повтор с помощью шаблона 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));
}
Моя проблема: каждый раз, когда я нажимаю кнопку «отменить», поскольку она обновляет значения ползунков, мой Memento будет перезаписываться при срабатывании контроллера, так что я получил 2 равных состояния моего импульса. Теперь это совсем неплохо, так как я хотел бы также реализовать «повтор», поэтому я подумал о том, чтобы поместить этот «дубликат» перед моим фактическим состоянием, чтобы иметь возможность вернуться «назад из отмены». ". Как я могу реализовать такое условие? Не лучше ли изменить подход и записывать свои Memento States везде?