UndoHistory.hx 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package hide.ui;
  2. enum HistoryElement {
  3. Field( obj : Dynamic, field : String, oldValue : Dynamic );
  4. Array( obj : Array<Dynamic>, field : Int, oldValue : Dynamic );
  5. Custom( undoRedo : Bool -> Void );
  6. }
  7. private typedef Elt = { h : HistoryElement, id : Int, callb : Void -> Void };
  8. class UndoHistory {
  9. var uidGen = 0;
  10. var undoElts : Array<Elt> = [];
  11. var redoElts : Array<Elt> = [];
  12. public var currentID(get, never) : Int;
  13. public function new() {
  14. }
  15. function get_currentID() {
  16. return undoElts.length == 0 ? 0 : undoElts[undoElts.length - 1].id;
  17. }
  18. public function change(h, ?callb) {
  19. undoElts.push({ h : h, id : ++uidGen, callb : callb });
  20. redoElts = [];
  21. onChange();
  22. }
  23. public function undo() {
  24. var h = undoElts.pop();
  25. return handleElement(h, redoElts);
  26. }
  27. public function redo() {
  28. var h = redoElts.pop();
  29. return handleElement(h, undoElts);
  30. }
  31. public function handleElement( e : Elt, other : Array<Elt> ) {
  32. if( e == null ) return false;
  33. switch( e.h ) {
  34. case Field(obj, field, value):
  35. var curValue = Reflect.field(obj, field);
  36. other.push({ h : Field(obj, field, curValue), id : e.id, callb : e.callb });
  37. Reflect.setProperty(obj, field, value);
  38. case Array(arr, index, value):
  39. var curValue = arr[index];
  40. other.push({ h : Array(arr, index, curValue), id : e.id, callb : e.callb });
  41. arr[index] = value;
  42. case Custom(f):
  43. other.push(e);
  44. f(other == redoElts);
  45. }
  46. if( e.callb != null ) e.callb();
  47. onChange();
  48. return true;
  49. }
  50. public dynamic function onChange() {
  51. }
  52. }