ObjEditor.hx 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package hide.comp.cdb;
  2. class ObjEditor extends Editor {
  3. public var fileView : hide.view.FileView;
  4. var obj : {};
  5. var structureWasChanged = false;
  6. var fileReference : String;
  7. public function new( sheet : cdb.Sheet, props, obj : {}, fileReference, ?parent : Element ) {
  8. this.displayMode = AllProperties;
  9. this.obj = obj;
  10. this.fileReference = fileReference;
  11. // track changes in columns and props (structure changes made within local editor)
  12. function makeStructSign() {
  13. var sheets = [for( s in sheet.base.sheets ) Reflect.copy(@:privateAccess s.sheet)];
  14. for( s in sheets ) {
  15. s.separators = null;
  16. s.lines = null;
  17. s.linesData = null;
  18. }
  19. return haxe.crypto.Md5.encode(haxe.Serializer.run(sheets)).substr(0,16);
  20. }
  21. var api = {
  22. load : function(v:Any) {
  23. var obj2 = haxe.Json.parse((v:String).substr(16));
  24. for( f in Reflect.fields(obj) )
  25. Reflect.deleteField(obj,f);
  26. for( f in Reflect.fields(obj2) )
  27. Reflect.setField(obj, f, Reflect.field(obj2,f));
  28. },
  29. copy : function() return ((makeStructSign() + haxe.Json.stringify(obj)) : Any),
  30. save : function() {
  31. // allow save in case structure was changed
  32. ide.saveDatabase();
  33. }
  34. };
  35. super(props, api);
  36. sheet = makePseudoSheet(sheet);
  37. show(sheet, parent);
  38. }
  39. override function beginChanges( ?structure ) {
  40. if( structure && fileView != null ) {
  41. /*
  42. We are about to change structure, but our prefab will not see its data changed...
  43. Let's save first our file and reload it in DataFiles so the changes gets applied to it
  44. */
  45. if( fileView.modified ) {
  46. fileView.save();
  47. @:privateAccess DataFiles.reload();
  48. }
  49. structureWasChanged = true;
  50. }
  51. super.beginChanges(structure);
  52. }
  53. override function endChanges() {
  54. super.endChanges();
  55. if( structureWasChanged && changesDepth == 0 ) {
  56. structureWasChanged = false;
  57. // force reload if was changed on disk because of structural change
  58. @:privateAccess if( fileView.currentSign == null || fileView.currentSign != fileView.makeSign() ) {
  59. fileView.modified = false;
  60. fileView.onFileChanged(false);
  61. }
  62. }
  63. }
  64. override function show(sheet:cdb.Sheet, ?parent:Element) {
  65. super.show(sheet, parent);
  66. element.addClass("cdb-obj-editor");
  67. }
  68. override function isUniqueID( sheet : cdb.Sheet, obj : {}, id : String ) {
  69. // we don't know yet how to make sure that our object view
  70. // is the same as the object in CDB indexed data
  71. return true;
  72. }
  73. override function syncSheet(?base:cdb.Database, ?name:String) {
  74. super.syncSheet(base, name);
  75. currentSheet = makePseudoSheet(currentSheet);
  76. }
  77. function makePseudoSheet( sheet : cdb.Sheet ) {
  78. var sheetData = Reflect.copy(@:privateAccess sheet.sheet);
  79. sheetData.linesData = null;
  80. sheetData.lines = [for( i in 0...sheetData.columns.length ) obj];
  81. sheetData.separators = [0];
  82. sheetData.props = { separatorTitles: [fileReference] };
  83. var s = new cdb.Sheet(sheet.base, sheetData);
  84. s.realSheet = sheet;
  85. return s;
  86. }
  87. override function changeObject(line:Line, column:cdb.Data.Column, value:Dynamic) {
  88. super.changeObject(line, column, value);
  89. onChange(column.name);
  90. }
  91. public dynamic function onChange(propName : String) {}
  92. }