undo-stack-obs.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #include "undo-stack-obs.hpp"
  2. #include <util/util.hpp>
  3. undo_stack::undo_stack(ui_ptr ui) : ui(ui) {}
  4. void undo_stack::release()
  5. {
  6. for (auto f : undo_items)
  7. if (f.d)
  8. f.d(true);
  9. for (auto f : redo_items)
  10. if (f.d)
  11. f.d(false);
  12. }
  13. void undo_stack::add_action(const QString &name, undo_redo_cb undo,
  14. undo_redo_cb redo, std::string undo_data,
  15. std::string redo_data, func d)
  16. {
  17. undo_redo_t n = {name, undo_data, redo_data, undo, redo, d};
  18. undo_items.push_front(n);
  19. clear_redo();
  20. ui->actionMainUndo->setText(QTStr("Undo.Item.Undo").arg(name));
  21. ui->actionMainUndo->setEnabled(true);
  22. ui->actionMainRedo->setText(QTStr("Undo.Redo"));
  23. ui->actionMainRedo->setDisabled(true);
  24. }
  25. void undo_stack::undo()
  26. {
  27. if (undo_items.size() == 0 || disabled)
  28. return;
  29. undo_redo_t temp = undo_items.front();
  30. temp.undo(temp.undo_data);
  31. redo_items.push_front(temp);
  32. undo_items.pop_front();
  33. ui->actionMainRedo->setText(QTStr("Undo.Item.Redo").arg(temp.name));
  34. ui->actionMainRedo->setEnabled(true);
  35. if (undo_items.size() == 0) {
  36. ui->actionMainUndo->setDisabled(true);
  37. ui->actionMainUndo->setText(QTStr("Undo.Undo"));
  38. } else {
  39. ui->actionMainUndo->setText(
  40. QTStr("Undo.Item.Undo").arg(undo_items.front().name));
  41. }
  42. }
  43. void undo_stack::redo()
  44. {
  45. if (redo_items.size() == 0 || disabled)
  46. return;
  47. undo_redo_t temp = redo_items.front();
  48. temp.redo(temp.redo_data);
  49. undo_items.push_front(temp);
  50. redo_items.pop_front();
  51. ui->actionMainUndo->setText(QTStr("Undo.Item.Undo").arg(temp.name));
  52. ui->actionMainUndo->setEnabled(true);
  53. if (redo_items.size() == 0) {
  54. ui->actionMainRedo->setDisabled(true);
  55. ui->actionMainRedo->setText(QTStr("Undo.Redo"));
  56. } else {
  57. ui->actionMainRedo->setText(
  58. QTStr("Undo.Item.Redo").arg(redo_items.front().name));
  59. }
  60. }
  61. void undo_stack::enable_undo_redo()
  62. {
  63. disabled = false;
  64. ui->actionMainUndo->setDisabled(false);
  65. ui->actionMainRedo->setDisabled(false);
  66. }
  67. void undo_stack::disable_undo_redo()
  68. {
  69. disabled = true;
  70. ui->actionMainUndo->setDisabled(true);
  71. ui->actionMainRedo->setDisabled(true);
  72. }
  73. void undo_stack::clear_redo()
  74. {
  75. for (auto f : redo_items)
  76. if (f.d)
  77. f.d(false);
  78. redo_items.clear();
  79. }