From 00f35ebe71c3cd483108b2cceae328fcbd37389c Mon Sep 17 00:00:00 2001 From: Oleg Sh Date: Sun, 3 Dec 2023 13:40:50 +0200 Subject: [PATCH] Refactor Undo and SaveLoad from disk. --- script/pages/editor/api/index.js | 2 + script/pages/editor/api/index.js.cache | 55 ++++++----- script/pages/editor/model/Application.js | 110 ++++------------------ script/pages/editor/model/DiskSaveLoad.js | 52 ++++++++++ script/pages/editor/model/UndoStack.js | 41 ++++++++ 5 files changed, 148 insertions(+), 112 deletions(-) create mode 100644 script/pages/editor/model/DiskSaveLoad.js create mode 100644 script/pages/editor/model/UndoStack.js diff --git a/script/pages/editor/api/index.js b/script/pages/editor/api/index.js index 759a114..d926a7d 100644 --- a/script/pages/editor/api/index.js +++ b/script/pages/editor/api/index.js @@ -37,6 +37,8 @@ include ("features/enum_vertices/EnumVertices.js"), include ("model/texts.js", modulDir), + include ("model/UndoStack.js", modulDir), + include ("model/DiskSaveLoad.js", modulDir), include ("model/Application.js", modulDir), include ("ui/ya_metrika.js", modulDir), include ("ui/editor.js", modulDir), diff --git a/script/pages/editor/api/index.js.cache b/script/pages/editor/api/index.js.cache index 9b1e1fe..934e6e6 100644 --- a/script/pages/editor/api/index.js.cache +++ b/script/pages/editor/api/index.js.cache @@ -1,5 +1,5 @@ -moduleLoader.beginCacheLoading(["/script/shared/utils.js?v=75","/script/entities/graph/api/index.js?v=75","/script/shared/point.js?v=75","/script/entities/edge/api/index.js?v=75","/script/entities/edge/model/BaseEdge.js?v=75","/script/entities/edge/model/EdgeModel.js?v=75","/script/entities/vertex/api/index.js?v=75","/script/entities/vertex/model/BaseVertex.js?v=75","/script/entities/vertex/model/VertexModel.js?v=75","/script/entities/graph/model/Graph.js?v=75","/script/features/draw_graph/api/index.js?v=75","/script/features/draw_graph/model/BaseBackgroundDrawer.js?v=75","/script/features/draw_graph/model/BaseEdgeDrawer.js?v=75","/script/features/draw_graph/model/BaseVertexDrawer.js?v=75","/script/features/algorithms/api/index.js?v=75","/script/features/algorithms/model/Algorithms.js?v=75","/script/features/algorithms/model/BaseTraversal.js?v=75","/script/features/base_handler/index.js?v=75","/script/features/default_handler/index.js?v=75","/script/features/add_vertices_handler/index.js?v=75","/script/features/connect_vertices_handler/index.js?v=75","/script/features/delete_objects_handler/index.js?v=75","/script/features/algorithm_handler/index.js?v=75","/script/features/serialization/api/index.js?v=75","/script/features/serialization/model/GraphMLCreator.js?v=75","/script/features/enum_vertices/EnumVertices.js?v=75","/script/pages/editor/model/texts.js?v=75","/script/pages/editor/model/Application.js?v=75","/script/pages/editor/ui/ya_metrika.js?v=75","/script/pages/editor/ui/editor.js?v=75","/script/pages/editor/ui/main.js?v=75",]);{function onloadEditor(){console.log("onload() call");doIncludeAsync([include("shared/canvas2svg.js"),include("features/group_rename_handler/index.js"),include("features/saved_graph_handler/index.js"),include("features/saved_graph_image_handler/index.js"),include("features/show_adjacency_matrix/index.js"),include("features/show_distance_matrix/index.js"),include("features/show_incidence_matrix/index.js"),include("features/setup_background_style/index.js"),include("features/setup_edge_style/index.js"),include("features/setup_vertex_style/index.js"),]);postLoadPage();} -let modulDir="pages/editor/";doInclude([include("shared/utils.js"),include("entities/graph/api/index.js"),include("features/draw_graph/api/index.js"),include("features/algorithms/api/index.js"),include("features/base_handler/index.js"),include("features/default_handler/index.js"),include("features/add_vertices_handler/index.js"),include("features/connect_vertices_handler/index.js"),include("features/delete_objects_handler/index.js"),include("features/algorithm_handler/index.js"),include("features/serialization/api/index.js"),include("features/enum_vertices/EnumVertices.js"),include("model/texts.js",modulDir),include("model/Application.js",modulDir),include("ui/ya_metrika.js",modulDir),include("ui/editor.js",modulDir),include("ui/main.js",modulDir)],onloadEditor);} +moduleLoader.beginCacheLoading(["/script/shared/utils.js?v=75","/script/entities/graph/api/index.js?v=75","/script/shared/point.js?v=75","/script/entities/edge/api/index.js?v=75","/script/entities/edge/model/BaseEdge.js?v=75","/script/entities/edge/model/EdgeModel.js?v=75","/script/entities/vertex/api/index.js?v=75","/script/entities/vertex/model/BaseVertex.js?v=75","/script/entities/vertex/model/VertexModel.js?v=75","/script/entities/graph/model/Graph.js?v=75","/script/features/draw_graph/api/index.js?v=75","/script/features/draw_graph/model/BaseBackgroundDrawer.js?v=75","/script/features/draw_graph/model/BaseEdgeDrawer.js?v=75","/script/features/draw_graph/model/BaseVertexDrawer.js?v=75","/script/features/algorithms/api/index.js?v=75","/script/features/algorithms/model/Algorithms.js?v=75","/script/features/algorithms/model/BaseTraversal.js?v=75","/script/features/base_handler/index.js?v=75","/script/features/default_handler/index.js?v=75","/script/features/add_vertices_handler/index.js?v=75","/script/features/connect_vertices_handler/index.js?v=75","/script/features/delete_objects_handler/index.js?v=75","/script/features/algorithm_handler/index.js?v=75","/script/features/serialization/api/index.js?v=75","/script/features/serialization/model/GraphMLCreator.js?v=75","/script/features/enum_vertices/EnumVertices.js?v=75","/script/pages/editor/model/texts.js?v=75","/script/pages/editor/model/UndoStack.js?v=75","/script/pages/editor/model/DiskSaveLoad.js?v=75","/script/pages/editor/model/Application.js?v=75","/script/pages/editor/ui/ya_metrika.js?v=75","/script/pages/editor/ui/editor.js?v=75","/script/pages/editor/ui/main.js?v=75",]);{function onloadEditor(){console.log("onload() call");doIncludeAsync([include("shared/canvas2svg.js"),include("features/group_rename_handler/index.js"),include("features/saved_graph_handler/index.js"),include("features/saved_graph_image_handler/index.js"),include("features/show_adjacency_matrix/index.js"),include("features/show_distance_matrix/index.js"),include("features/show_incidence_matrix/index.js"),include("features/setup_background_style/index.js"),include("features/setup_edge_style/index.js"),include("features/setup_vertex_style/index.js"),]);postLoadPage();} +let modulDir="pages/editor/";doInclude([include("shared/utils.js"),include("entities/graph/api/index.js"),include("features/draw_graph/api/index.js"),include("features/algorithms/api/index.js"),include("features/base_handler/index.js"),include("features/default_handler/index.js"),include("features/add_vertices_handler/index.js"),include("features/connect_vertices_handler/index.js"),include("features/delete_objects_handler/index.js"),include("features/algorithm_handler/index.js"),include("features/serialization/api/index.js"),include("features/enum_vertices/EnumVertices.js"),include("model/texts.js",modulDir),include("model/UndoStack.js",modulDir),include("model/DiskSaveLoad.js",modulDir),include("model/Application.js",modulDir),include("ui/ya_metrika.js",modulDir),include("ui/editor.js",modulDir),include("ui/main.js",modulDir)],onloadEditor);} function gEncodeToHTML(str) {if(typeof str!=='string') return str;return str.replace(/&/g,'&').replace(//g,'>').replace(/"/g,'"').replace(/'/g,''');} @@ -1321,8 +1321,27 @@ var g_findLongestPath="Find the longest path";var g_LengthOfLongestPathFrom="Len {g_textsSelectAndMove=document.getElementById("SelectAndMoveObject").innerHTML;g_moveCursorForMoving=document.getElementById("MoveCursorForMoving").innerHTML;g_clickToAddVertex=document.getElementById("clickToAddVertex").innerHTML;g_selectFirstVertexToConnect=document.getElementById("selectFisrtVertextToConnect").innerHTML;g_selectSecondVertexToConnect=document.getElementById("selectSecondVertextToConnect").innerHTML;g_selectStartVertexForShortPath=document.getElementById("selectStartShortPathVertex").innerHTML;g_selectFinishVertexForShortPath=document.getElementById("selectFinishShortPathVertex").innerHTML;g_shortestPathResult=document.getElementById("shortPathResult").innerHTML;g_pathNotExists=document.getElementById("pathNotExists").innerHTML;g_selectObjectToDelete=document.getElementById("selectObjectToDelete").innerHTML;g_addEdge=document.getElementById("AddEdge").innerHTML;g_orintEdge=document.getElementById("OrintEdge").innerHTML;g_notOrintEdge=document.getElementById("NotOrintdge").innerHTML;g_adjacencyMatrixText=document.getElementById("AdjacencyMatrixText").innerHTML;g_save=document.getElementById("Save").innerHTML;g_cancel=document.getElementById("Cancel").innerHTML;g_shortestDistance=document.getElementById("shortestDist").innerHTML;g_incidenceMatrixText=document.getElementById("IncidenceMatrixText").innerHTML;g_save_dialog=document.getElementById("saveDialogTitle").innerHTML;g_close=document.getElementById("closeButton").innerHTML;g_sickConnectedComponent=document.getElementById("sickConnectedComponentResult").innerHTML;g_connectedComponent=document.getElementById("connectedComponentResult").innerHTML;g_what_do_you_think=document.getElementById("whatDoYouThink").innerHTML;g_name=document.getElementById("name").innerHTML;g_feedback=document.getElementById("feedback").innerHTML;g_send=document.getElementById("send").innerHTML;g_write_to_us=document.getElementById("writeToUs").innerHTML;g_fixMatrix=document.getElementById("fixMatrixButton").innerHTML;g_readMatrixHelp=document.getElementById("matrixHelp").innerHTML;g_matrixWrongFormat=document.getElementById("wronMatrixTitle").innerHTML;g_save_image_dialog=document.getElementById("saveImageDialogTitle").innerHTML;g_fullReport=document.getElementById("fullReport").innerHTML;g_shortReport=document.getElementById("shortReport").innerHTML;g_hasEulerianLoop=document.getElementById("hasEulerianLoop").innerHTML;g_hasNotEulerianLoop=document.getElementById("hasNotEulerianLoop").innerHTML;g_processing=document.getElementById("processing").innerHTML;g_customEnumVertex=document.getElementById("customEnumVertex").innerHTML;g_addVertex=document.getElementById("addVertexText").innerHTML;g_renameVertex=document.getElementById("renameVertex").innerHTML;g_rename=document.getElementById("renameText").innerHTML;g_language=document.getElementById("currentLanguage").innerHTML;g_editWeight=document.getElementById("editWeight").innerHTML;g_noWeight=document.getElementById("noWeight").innerHTML;g_groupRename=document.getElementById("groupeRenameText").innerHTML;g_vote=document.getElementById("voteText").innerHTML;g_recommendAlgorithm=document.getElementById("recommend_algorithm").innerHTML;g_hasEulerianPath=document.getElementById("hasEulerianPath").innerHTML;g_hasNotEulerianPath=document.getElementById("hasNotEulerianPath").innerHTML;g_graphOfMinDist=document.getElementById("graphOfMinDist").innerHTML;g_checkToSave=document.getElementById("checkToSave").innerHTML;g_showDistMatrix=document.getElementById("showDistMatrix").innerHTML;g_minDistMatrixText=document.getElementById("distMatrixText").innerHTML;g_selectStartVertexForMaxFlow=document.getElementById("selectStartVertexForMaxFlow").innerHTML;g_selectFinishVertexForMaxFlow=document.getElementById("selectFinishVertexForMaxFlow").innerHTML;g_maxFlowResult=document.getElementById("maxFlowResult").innerHTML;g_flowNotExists=document.getElementById("flowNotExists").innerHTML;g_sourceVertex=document.getElementById("sourceVertex").innerHTML;g_sinkVertex=document.getElementById("sinkVertex").innerHTML;g_hasHamiltonianLoop=document.getElementById("hasHamiltonianLoop").innerHTML;g_hasNotHamiltonianLoop=document.getElementById("hasNotHamiltonianLoop").innerHTML;g_hasHamiltonianPath=document.getElementById("hasHamiltonianPath").innerHTML;g_hasNotHamiltonianPath=document.getElementById("hasNotHamiltonianPath").innerHTML;g_startTraversal=document.getElementById("startTraversal").innerHTML;g_traversalOrder=document.getElementById("traversalOrder").innerHTML;g_curveEdge=document.getElementById("curveEdge").innerHTML;g_Undo=document.getElementById("undoTranslate").innerHTML;g_save_graph=document.getElementById("saveGraph").innerHTML;g_default=document.getElementById("default").innerHTML;g_vertexDraw=document.getElementById("vertexDrawStyle").innerHTML;g_edgeDraw=document.getElementById("edgeDrawStyle").innerHTML;g_backgroundStyle=document.getElementById("backgroundStyle").innerHTML;g_GraphIsMultiMessage=document.getElementById("graphIsMultiMessage").innerHTML;g_GraphIsGeneralMessage=document.getElementById("graphIsGeneralMessage").innerHTML;g_DefaultWeightPreset=document.getElementById("defaultWeightPreset").innerHTML;var isMac=navigator.platform.toUpperCase().indexOf('MAC')>=0;if(isMac) g_selectGroupText=document.getElementById("selectGroupMac").innerHTML;else g_selectGroupText=document.getElementById("selectGroupWin").innerHTML;g_dragGroupText=document.getElementById("dragSelectedGroup").innerHTML;g_copyGroupeButton=document.getElementById("copySelectedGroup").innerHTML;g_removeGroupeButton=document.getElementById("removeSelectedGroup").innerHTML;g_BFSName=document.getElementById("BFSName").innerHTML;g_ColoringName=document.getElementById("ColoringName").innerHTML;g_findConnectedComponent=document.getElementById("findConnectedComponent").innerHTML;g_DFSName=document.getElementById("DFSName").innerHTML;g_EulerinLoopName=document.getElementById("EulerinLoopName").innerHTML;g_EulerinPath=document.getElementById("EulerinPath").innerHTML;g_FloidName=document.getElementById("FloidName").innerHTML;g_GraphReorder=document.getElementById("GraphReorder").innerHTML;g_HamiltoianCycleName=document.getElementById("HamiltoianCycleName").innerHTML;g_HamiltonianPath=document.getElementById("HamiltonianPath").innerHTML;g_MaxFlowName=document.getElementById("MaxFlowName").innerHTML;g_minimumSpanningTree=document.getElementById("minimumSpanningTree").innerHTML;g_modernGraphStyleName=document.getElementById("modernGraphStyleName").innerHTML;g_RadiusAndDiameter=document.getElementById("RadiusAndDiameter").innerHTML;g_findShortPathName=document.getElementById("findShortPathName").innerHTML;g_VerticesDegreeName=document.getElementById("VerticesDegreeName").innerHTML;g_SpanningTreeResult=document.getElementById("MinSpanningTreeResult").innerHTML;g_SpanningTreeIgnoreDir=document.getElementById("MinSpanningIgnoreDir").innerHTML;g_SpanningTreeNotConnected=document.getElementById("MinSpanningNotConnected").innerHTML;g_selectFirstGraphIsomorphismCheck=document.getElementById("SelectFirstGraphIsomorphismCheck").innerHTML;g_selectSecondGraphIsomorphismCheck=document.getElementById("SelectSecondGraphIsomorphismCheck").innerHTML;g_selectFirstGraphPatternCheck=document.getElementById("SelectFirstGraphPatternCheck").innerHTML;g_selectSecondGraphForSearchSubgraph=document.getElementById("SelectSecondGraphForSearchSubgraph").innerHTML;g_graphsIsomorph=document.getElementById("GraphsIsomorph").innerHTML;g_graphsNotIsomorph=document.getElementById("GraphsNotIsomorph").innerHTML;g_numberOfIsomorphSubgraphIs=document.getElementById("NumberOfIsomorphSubgraphIs").innerHTML;g_graphHasNoIsomorphSubgraph=document.getElementById("GraphHasNoIsomorphSubgraph").innerHTML;g_searchIsomorphSubgraph=document.getElementById("SearchIsomorphSubgraph").innerHTML;g_subgraphNo=document.getElementById("SubgraphNo").innerHTML;g_graphHasNoAtleast2Graphs=document.getElementById("GraphHasNoAtleast2Graphs").innerHTML;g_IsomorphismCheck=document.getElementById("IsomorphismCheck").innerHTML;g_graphIsDisconnected=document.getElementById("GraphIsDisconnected").innerHTML;g_graphIsTrivial=document.getElementById("GraphIsTrivial").innerHTML;g_graphRadius=document.getElementById("GraphRadius").innerHTML;g_graphDiameter=document.getElementById("GraphDiameter").innerHTML;g_vertexCentral=document.getElementById("VertexCentral").innerHTML;g_vertexPeripheral=document.getElementById("VertexPeripheral").innerHTML;g_maximumDegreeOfGraph=document.getElementById("MaximumDegreeOfGraph").innerHTML;g_colorNumber=document.getElementById("ColorNumber").innerHTML;g_done=document.getElementById("Done").innerHTML;g_action=document.getElementById("ActionText").innerHTML;g_commonEdgeStyle=document.getElementById("CommonEdgeStyleText").innerHTML;g_selectedEdgeStyle=document.getElementById("SelectedEdgeStyleText").innerHTML;g_commonVertexStyle=document.getElementById("CommonVertexStyleText").innerHTML;g_selectedVertexStyle=document.getElementById("SelectedVertexStyleText").innerHTML;g_findAllPathes=document.getElementById("FindAllPathes").innerHTML;g_numberOfPathesFrom=document.getElementById("NumberOfPathesFrom").innerHTML;g_to=document.getElementById("To").innerHTML;g_are=document.getElementById("Are").innerHTML;g_pathN=document.getElementById("PathN").innerHTML;g_selectFinishVertex=document.getElementById("SelectFinishVertex").innerHTML;g_selectStartVertex=document.getElementById("SelectStartVertex").innerHTML;g_findAllPathesFromVertex=document.getElementById("findAllPathsFromVertex").innerHTML;g_distanceFrom=document.getElementById("distanceFrom").innerHTML;g_pathTo=document.getElementById("pathTo").innerHTML;g_useContextMenuText=document.getElementById("UseContextMenuText").innerHTML;g_findLongestPath=document.getElementById("findLongestPath").innerHTML;g_LengthOfLongestPathFrom=document.getElementById("LengthOfLongestPathFrom").innerHTML;g_additionalActions=document.getElementById("additionlActions").innerHTML;g_reverseAllEdges=document.getElementById("reverseAllEdges").innerHTML;g_makeAllUndirected=document.getElementById("makeAllUndirected").innerHTML;g_makeAllDirected=document.getElementById("makeAllDirected").innerHTML;g_pairWrongFormat=document.getElementById("pairWrongFormat").innerHTML;g_fix=document.getElementById("fixButton").innerHTML;g_reuseSavedEdge=document.getElementById("reuseSavedEdge").innerHTML;g_MaxClique=document.getElementById("maxClique").innerHTML;g_MaxCliqueNotFound=document.getElementById("maxCliqueNotFound").innerHTML;g_MaxCliqueSizeIs=document.getElementById("maxCliqueSizeIs").innerHTML;g_MaxCliqueContains=document.getElementById("maxCliqueContains").innerHTML;g_wrongImageFormatPNGAndJPEG=document.getElementById("wrongImageFormatPNGAndJPEG").innerHTML;g_wrongImageSizeP1=document.getElementById("wrongImageSizeP1").innerHTML;} +function UndoStack(maxUndoStackSize){this.undoStack=[];this.maxUndoStackSize=maxUndoStackSize;} +UndoStack.prototype.PushToStack=function(actionName,dataToSave) +{var object={};object.actionName=actionName;object.data=dataToSave;this.undoStack.push(object);while(this.undoStack.length>this.maxUndoStackSize) +{this.undoStack.shift();}} +UndoStack.prototype.Undo=function() +{if(this.IsUndoStackEmpty()) +return null;var state=this.undoStack.pop();return state.data;} +UndoStack.prototype.ClearUndoStack=function() +{this.undoStack=[];} +UndoStack.prototype.IsUndoStackEmpty=function() +{return(this.undoStack.length<=0);} +var DiskSaveLoad=function(){};DiskSaveLoad.LoadGraphFromDisk=function(graphName,callback) +{$.ajax({type:"GET",url:"/"+SiteDir+"cgi-bin/loadGraph.php?name="+graphName}).done(callback);} +DiskSaveLoad.SaveSVGGraphOnDisk=function(imageName,svgText,callback) +{$.ajax({type:"POST",url:"/"+SiteDir+"cgi-bin/saveSvg.php?name="+imageName,data:{svgdata:svgText},dataType:"text",success:callback});return imageName;} +DiskSaveLoad.SaveGraphOnDisk=function(savedGraphName,graphAsString,callback) +{$.ajax({type:"POST",url:"/"+SiteDir+"cgi-bin/saveGraph.php?name="+savedGraphName,data:graphAsString,dataType:"text"}).done(callback);} +DiskSaveLoad.SaveGraphImageOnDisk=function(imageName,rectParams,imageBase64Data,callback) +{$.ajax({type:"POST",url:"/"+SiteDir+"cgi-bin/saveImage.php?name="+imageName+rectParams,data:{base64data:imageBase64Data},dataType:"text",success:callback});} var globalApplication=null;function Application(document,window,listener) -{this.document=document;this.listener=listener;this.canvas=this.document.getElementById('canvas');this.handler=new DefaultHandler(this);this.savedGraphName="";this.currentEnumVerticesType=new BaseEnumVertices(this,1);this.findPathReport=1;this.isTimerRender=false;globalApplication=this;this.renderPath=[];this.renderTimer=0;this.renderPathLength=0;this.renderPathCounter=0;this.renderPathLoops=0;this.enumVerticesTextList=[new BaseEnumVertices(this,1),new BaseEnumVertices(this,0),new TextEnumVertices(this),new TextEnumVerticesCyr(this),new TextEnumVerticesGreek(this),new TextEnumVerticesCustom(this)];this.SetDefaultTransformations();this.algorithmsValues={};this.undoStack=[];this.edgeCommonStyle=new CommonEdgeStyle();this.isEdgeCommonStyleCustom=false;this.edgeSelectedStyles=FullArrayCopy(DefaultSelectedEdgeStyles);this.isEdgeSelectedStylesCustom=false;this.edgePrintCommonStyle=new CommonPrintEdgeStyle();this.edgePrintSelectedStyles=FullArrayCopy(DefaultPrintSelectedEdgeStyles);this.vertexCommonStyle=new CommonVertexStyle();this.isVertexCommonStyleCustom=false;this.vertexSelectedVertexStyles=FullArrayCopy(DefaultSelectedGraphStyles);this.isVertexSelectedVertexStylesCustom=false;this.vertexPrintCommonStyle=new CommonPrintVertexStyle();this.vertexPrintSelectedVertexStyles=FullArrayCopy(DefaultPrintSelectedGraphStyles);this.backgroundCommonStyle=new CommonBackgroundStyle();this.backgroundPrintStyle=new PrintBackgroundStyle();this.isBackgroundCommonStyleCustom=false;this.renderPathWithEdges=false;this.edgePresets=[1,3,5,7,11,42];this.maxEdgePresets=6;this.selectionRect=null;this.defaultVertexSize=null;this.defaultEdgeWidth=null;this.processEmscriptenFunction=null;this.defaultEdge=null;this.useDefaultEdge=false;};Application.prototype.graph=new Graph();Application.prototype.dragObject=-1;Application.prototype.handler=null;Application.prototype.status={};Application.prototype.graphNameLength=16;Application.prototype.maxUndoStackSize=8;Application.prototype.getMousePos=function(canvas,e) +{this.document=document;this.listener=listener;this.canvas=this.document.getElementById('canvas');this.handler=new DefaultHandler(this);this.savedGraphName="";this.currentEnumVerticesType=new BaseEnumVertices(this,1);this.findPathReport=1;this.isTimerRender=false;globalApplication=this;this.renderPath=[];this.renderTimer=0;this.renderPathLength=0;this.renderPathCounter=0;this.renderPathLoops=0;this.enumVerticesTextList=[new BaseEnumVertices(this,1),new BaseEnumVertices(this,0),new TextEnumVertices(this),new TextEnumVerticesCyr(this),new TextEnumVerticesGreek(this),new TextEnumVerticesCustom(this)];this.SetDefaultTransformations();this.algorithmsValues={};this.undoStack=new UndoStack(this.maxUndoStackSize);this.edgeCommonStyle=new CommonEdgeStyle();this.isEdgeCommonStyleCustom=false;this.edgeSelectedStyles=FullArrayCopy(DefaultSelectedEdgeStyles);this.isEdgeSelectedStylesCustom=false;this.edgePrintCommonStyle=new CommonPrintEdgeStyle();this.edgePrintSelectedStyles=FullArrayCopy(DefaultPrintSelectedEdgeStyles);this.vertexCommonStyle=new CommonVertexStyle();this.isVertexCommonStyleCustom=false;this.vertexSelectedVertexStyles=FullArrayCopy(DefaultSelectedGraphStyles);this.isVertexSelectedVertexStylesCustom=false;this.vertexPrintCommonStyle=new CommonPrintVertexStyle();this.vertexPrintSelectedVertexStyles=FullArrayCopy(DefaultPrintSelectedGraphStyles);this.backgroundCommonStyle=new CommonBackgroundStyle();this.backgroundPrintStyle=new PrintBackgroundStyle();this.isBackgroundCommonStyleCustom=false;this.renderPathWithEdges=false;this.edgePresets=[1,3,5,7,11,42];this.maxEdgePresets=6;this.selectionRect=null;this.defaultVertexSize=null;this.defaultEdgeWidth=null;this.processEmscriptenFunction=null;this.defaultEdge=null;this.useDefaultEdge=false;};Application.prototype.graph=new Graph();Application.prototype.dragObject=-1;Application.prototype.handler=null;Application.prototype.status={};Application.prototype.graphNameLength=16;Application.prototype.maxUndoStackSize=8;Application.prototype.getMousePos=function(canvas,e) {var rect=canvas.getBoundingClientRect();return{x:(e.clientX-rect.left)/this.canvasScale-this.canvasPosition.x,y:(e.clientY-rect.top)/this.canvasScale-this.canvasPosition.y};} Application.prototype.redrawGraph=function() {if(!this.isTimerRender) @@ -1525,7 +1544,7 @@ else if(mode=="setupEdgeStyleSelected") else if(mode=="setupBackgroundStyle") {var setupBackgroundStyle=new SetupBackgroundStyle(this);setupBackgroundStyle.show();} else if(mode=="graphUndo") -{if(!this.IsUndoStackEmpty()) +{if(!this.undoStack.IsUndoStackEmpty()) this.Undo();} else if(g_AlgorithmIds.indexOf(mode)>=0) {this.handler=new AlgorithmGraphHandler(this,g_Algorithms[g_AlgorithmIds.indexOf(mode)](this.graph,this));} @@ -1556,7 +1575,7 @@ if(!wasLoad) {graphName=document.cookie.replace(/(?:(?:^|.*;\s*)graphName\s*\=\s*([^;]*).*$)|^.*$/,"$1");} if(graphName.length>0) {userAction("LoadGraphFromDisk");this.LoadGraphFromDisk(graphName);}} -if(this.IsUndoStackEmpty()) +if(this.undoStack.IsUndoStackEmpty()) document.getElementById('GraphUndo').style.display='none';this.updateMessage();this.redrawGraph();} Application.prototype.onLoad=function() {this.canvas=this.document.getElementById('canvas');this.SetDefaultHandler() @@ -1620,26 +1639,26 @@ else {res=false;} return res;} Application.prototype.SaveGraphOnDisk=function() -{var graphAsString=this.graph.SaveToXML(this.SaveUserSettings());var styleSave=this.SaveUserSettings();if(this.savedGraphName.length<=0) +{var graphAsString=this.graph.SaveToXML(this.SaveUserSettings());if(this.savedGraphName.length<=0) {this.savedGraphName=this.GetNewGraphName();} -var app=this;$.ajax({type:"POST",url:"/"+SiteDir+"cgi-bin/saveGraph.php?name="+this.savedGraphName,data:graphAsString,dataType:"text"}).done(function(msg) +var app=this;DiskSaveLoad.SaveGraphOnDisk(this.savedGraphName,graphAsString,function(msg) {document.cookie="graphName="+app.savedGraphName;});} Application.prototype.SaveGraphImageOnDisk=function(showDialogCallback) {var imageName=this.GetNewName();this.stopRenderTimer();this.redrawGraph();var bbox=this.graph.getGraphBBox();var rectParams="";if(this.IsGraphFitOnViewport()) {var canvasWidth=this.GetRealWidth();var canvasHeight=this.GetRealHeight();var canvasPositionInverse=this.canvasPosition.inverse();var pos=bbox.minPoint.subtract(canvasPositionInverse);rectParams="&x="+Math.round(pos.x*this.canvasScale)+"&y="+Math.round(pos.y*this.canvasScale) +"&width="+Math.round(bbox.size().x*this.canvasScale)+"&height="+Math.round(bbox.size().y*this.canvasScale);} -var imageBase64Data=this.canvas.toDataURL();$.ajax({type:"POST",url:"/"+SiteDir+"cgi-bin/saveImage.php?name="+imageName+rectParams,data:{base64data:imageBase64Data},dataType:"text",success:function(data){showDialogCallback();}});return imageName;} +var imageBase64Data=this.canvas.toDataURL();DiskSaveLoad.SaveGraphImageOnDisk(imageName,rectParams,imageBase64Data,showDialogCallback);return imageName;} Application.prototype.SaveFullGraphImageOnDisk=function(showDialogCallback,forPrint) -{var imageName=this.GetNewName();this.stopRenderTimer();var canvas=forPrint?this._PrintRedrawGraph():this._OffscreenRedrawGraph();var bbox=this.graph.getGraphBBox();var rectParams="";rectParams="&x=0"+"&y=0"+"&width="+bbox.size().x+"&height="+bbox.size().y;var imageBase64Data=canvas.toDataURL();$.ajax({type:"POST",url:"/"+SiteDir+"cgi-bin/saveImage.php?name="+imageName+rectParams,data:{base64data:imageBase64Data},dataType:"text",success:function(data){showDialogCallback();}});return imageName;} +{var imageName=this.GetNewName();this.stopRenderTimer();var canvas=forPrint?this._PrintRedrawGraph():this._OffscreenRedrawGraph();var bbox=this.graph.getGraphBBox();var rectParams="";rectParams="&x=0"+"&y=0"+"&width="+bbox.size().x+"&height="+bbox.size().y;var imageBase64Data=canvas.toDataURL();DiskSaveLoad.SaveGraphImageOnDisk(imageName,rectParams,imageBase64Data,showDialogCallback);return imageName;} Application.prototype.SaveSVGGraphOnDisk=function(showDialogCallback) -{var imageName=this.GetNewName();this.stopRenderTimer();var svgText=this._printToSVG();var bbox=this.graph.getGraphBBox();var imageBase64Data=canvas.toDataURL();$.ajax({type:"POST",url:"/"+SiteDir+"cgi-bin/saveSvg.php?name="+imageName,data:{svgdata:svgText},dataType:"text",success:function(data){showDialogCallback();}});return imageName;} +{var imageName=this.GetNewName();this.stopRenderTimer();var svgText=this._printToSVG();DiskSaveLoad.SaveSVGGraphOnDisk(imageName,svgText,showDialogCallback);return imageName;} Application.prototype.LoadGraphFromString=function(str) {var graph=new Graph();var userSettings={};graph.LoadFromXML(str,userSettings);if(userSettings.hasOwnProperty("data")&&userSettings["data"].length>0) this.LoadUserSettings(userSettings["data"]);this.SetDefaultTransformations();this.graph=graph;if(this.graph.isNeedReposition()) {this.graph.VerticesReposition(new Point(this.GetRealWidth(),this.GetRealHeight()),this.graph.vertices);} this.AutoAdjustViewport();this.updateMessage();this.redrawGraph();} Application.prototype.LoadGraphFromDisk=function(graphName) -{var app=this;$.ajax({type:"GET",url:"/"+SiteDir+"cgi-bin/loadGraph.php?name="+graphName}).done(function(msg) +{var app=this;DiskSaveLoad.LoadGraphFromDisk(graphName,function(msg) {app.LoadGraphFromString(msg);});} Application.prototype.GetNewGraphName=function() {var name=this.GetNewName();if(this.isVertexCommonStyleCustom||this.isVertexSelectedVertexStylesCustom||this.isBackgroundCommonStyleCustom||this.isEdgeCommonStyleCustom||this.isEdgeSelectedStylesCustom) @@ -1696,18 +1715,12 @@ Application.prototype.SetCurrentValue=function(paramName,value) Application.prototype.IsGraphFitOnViewport=function() {res=true;graphBBox=this.graph.getGraphBBox();var canvasWidth=this.GetRealWidth();var canvasHeight=this.GetRealHeight();var canvasPositionInverse=this.canvasPosition.inverse();return(Math.floor(canvasPositionInverse.x)<=Math.floor(graphBBox.minPoint.x)&&Math.floor(canvasPositionInverse.y)<=Math.floor(graphBBox.minPoint.y)&&Math.floor(canvasPositionInverse.x+canvasWidth)>=Math.floor(graphBBox.maxPoint.x)&&Math.floor(canvasPositionInverse.y+canvasHeight)>=Math.floor(graphBBox.maxPoint.y));} Application.prototype.PushToStack=function(actionName) -{var object={};object.actionName=actionName;object.graphSave=this.graph.SaveToXML(this.SaveUserSettings());this.undoStack.push(object);while(this.undoStack.length>this.maxUndoStackSize) -{this.undoStack.shift();} -document.getElementById('GraphUndo').style.display='inline-block';} +{this.undoStack.PushToStack(actionName,this.graph.SaveToXML(this.SaveUserSettings()));document.getElementById('GraphUndo').style.display='inline-block';} Application.prototype.Undo=function() -{if(this.IsUndoStackEmpty()) -return;var state=this.undoStack.pop();this.graph=new Graph();var userSettings={};this.graph.LoadFromXML(state.graphSave,userSettings);if(userSettings.hasOwnProperty("data")&&userSettings["data"].length>0) -this.LoadUserSettings(userSettings["data"]);this.redrawGraph();if(this.IsUndoStackEmpty()) +{let data=this.undoStack.Undo();if(data==null) +return;this.graph=new Graph();var userSettings={};this.graph.LoadFromXML(data,userSettings);if(userSettings.hasOwnProperty("data")&&userSettings["data"].length>0) +this.LoadUserSettings(userSettings["data"]);this.redrawGraph();if(this.undoStack.IsUndoStackEmpty()) document.getElementById('GraphUndo').style.display='none';} -Application.prototype.ClearUndoStack=function() -{this.undoStack=[];} -Application.prototype.IsUndoStackEmpty=function() -{return(this.undoStack.length<=0);} Application.prototype.SaveUserSettings=function() {var res="{";var needEnd=false;var checkValue=[];checkValue.push({field:"edgeCommonStyle",value:this.edgeCommonStyle,check:this.isEdgeCommonStyleCustom});checkValue.push({field:"edgeSelectedStyles",value:this.edgeSelectedStyles,check:this.isEdgeSelectedStylesCustom});checkValue.push({field:"vertexCommonStyle",value:this.vertexCommonStyle,check:this.isVertexCommonStyleCustom});checkValue.push({field:"vertexSelectedVertexStyles",value:this.vertexSelectedVertexStyles,check:this.isVertexSelectedVertexStylesCustom});checkValue.push({field:"backgroundCommonStyle",value:this.backgroundCommonStyle,check:this.isBackgroundCommonStyleCustom});checkValue.push({field:"defaultVertexSize",value:this.defaultVertexSize,check:this.defaultVertexSize!=null});checkValue.push({field:"defaultEdgeWidth",value:this.defaultEdgeWidth,check:this.defaultEdgeWidth!=null});checkValue.forEach(function(entry){if(!entry.check) return;if(needEnd) diff --git a/script/pages/editor/model/Application.js b/script/pages/editor/model/Application.js index 02ed863..144a858 100644 --- a/script/pages/editor/model/Application.js +++ b/script/pages/editor/model/Application.js @@ -30,7 +30,7 @@ function Application(document, window, listener) this.SetDefaultTransformations(); this.algorithmsValues = {}; - this.undoStack = []; + this.undoStack = new UndoStack(this.maxUndoStackSize); this.edgeCommonStyle = new CommonEdgeStyle(); this.isEdgeCommonStyleCustom = false; @@ -782,7 +782,7 @@ Application.prototype.SetHandlerMode = function(mode) } else if (mode == "graphUndo") { - if (!this.IsUndoStackEmpty()) + if (!this.undoStack.IsUndoStackEmpty()) this.Undo(); } else if (g_AlgorithmIds.indexOf(mode) >= 0) @@ -892,7 +892,7 @@ Application.prototype.onPostLoadEvent = function() } } - if (this.IsUndoStackEmpty()) + if (this.undoStack.IsUndoStackEmpty()) document.getElementById('GraphUndo').style.display = 'none'; this.updateMessage(); @@ -1083,8 +1083,6 @@ Application.prototype.SetPairSmart = function (pair) Application.prototype.SaveGraphOnDisk = function () { var graphAsString = this.graph.SaveToXML(this.SaveUserSettings()); - - var styleSave = this.SaveUserSettings(); if (this.savedGraphName.length <= 0) { @@ -1092,16 +1090,11 @@ Application.prototype.SaveGraphOnDisk = function () } var app = this; - $.ajax({ - type: "POST", - url: "/" + SiteDir + "cgi-bin/saveGraph.php?name=" + this.savedGraphName, - data: graphAsString, - dataType: "text" - }) - .done(function( msg ) - { - document.cookie = "graphName=" + app.savedGraphName; - }); + + DiskSaveLoad.SaveGraphOnDisk(this.savedGraphName, graphAsString, function( msg ) + { + document.cookie = "graphName=" + app.savedGraphName; + }); } Application.prototype.SaveGraphImageOnDisk = function (showDialogCallback) @@ -1124,23 +1117,11 @@ Application.prototype.SaveGraphImageOnDisk = function (showDialogCallback) rectParams = "&x=" + Math.round(pos.x * this.canvasScale) + "&y=" + Math.round(pos.y * this.canvasScale) + "&width=" + Math.round(bbox.size().x * this.canvasScale) + "&height=" + Math.round(bbox.size().y * this.canvasScale); - - //console.log(rectParams); } var imageBase64Data = this.canvas.toDataURL(); - $.ajax({ - type: "POST", - url: "/" + SiteDir + "cgi-bin/saveImage.php?name=" + imageName + rectParams, - data: { - base64data : imageBase64Data - }, - dataType: "text", - success: function(data){ - showDialogCallback(); - } - }); + DiskSaveLoad.SaveGraphImageOnDisk(imageName, rectParams, imageBase64Data, showDialogCallback); return imageName; } @@ -1159,17 +1140,7 @@ Application.prototype.SaveFullGraphImageOnDisk = function (showDialogCallback, f var imageBase64Data = canvas.toDataURL(); - $.ajax({ - type: "POST", - url: "/" + SiteDir + "cgi-bin/saveImage.php?name=" + imageName + rectParams, - data: { - base64data : imageBase64Data - }, - dataType: "text", - success: function(data){ - showDialogCallback(); - } - }); + DiskSaveLoad.SaveGraphImageOnDisk(imageName, rectParams, imageBase64Data, showDialogCallback); return imageName; } @@ -1180,22 +1151,8 @@ Application.prototype.SaveSVGGraphOnDisk = function (showDialogCallback) this.stopRenderTimer(); var svgText = this._printToSVG(); - - var bbox = this.graph.getGraphBBox(); - - var imageBase64Data = canvas.toDataURL(); - $.ajax({ - type: "POST", - url: "/" + SiteDir + "cgi-bin/saveSvg.php?name=" + imageName, - data: { - svgdata : svgText - }, - dataType: "text", - success: function(data){ - showDialogCallback(); - } - }); + DiskSaveLoad.SaveSVGGraphOnDisk(imageName, svgText, showDialogCallback); return imageName; } @@ -1223,19 +1180,13 @@ Application.prototype.LoadGraphFromString = function (str) Application.prototype.LoadGraphFromDisk = function (graphName) { - var app = this; - - $.ajax({ - type: "GET", - url: "/" + SiteDir + "cgi-bin/loadGraph.php?name=" + graphName - }) - .done(function( msg ) + var app = this; + DiskSaveLoad.LoadGraphFromDisk(graphName, function( msg ) { app.LoadGraphFromString(msg); }); } - Application.prototype.GetNewGraphName = function() { var name = this.GetNewName(); @@ -1428,53 +1379,30 @@ Application.prototype.IsGraphFitOnViewport = function() Application.prototype.PushToStack = function(actionName) { - var object = {}; - object.actionName = actionName; - object.graphSave = this.graph.SaveToXML(this.SaveUserSettings()); - - this.undoStack.push(object); - - while (this.undoStack.length > this.maxUndoStackSize) - { - this.undoStack.shift(); - } - - //console.log("push undo:" + object.actionName + " size =" + this.undoStack.length); + this.undoStack.PushToStack(actionName, this.graph.SaveToXML(this.SaveUserSettings())); document.getElementById('GraphUndo').style.display = 'inline-block'; } Application.prototype.Undo = function() { - if (this.IsUndoStackEmpty()) + let data = this.undoStack.Undo(); + + if (data == null) return; - var state = this.undoStack.pop(); this.graph = new Graph(); - var userSettings = {}; - this.graph.LoadFromXML(state.graphSave, userSettings); + this.graph.LoadFromXML(data, userSettings); if (userSettings.hasOwnProperty("data") && userSettings["data"].length > 0) this.LoadUserSettings(userSettings["data"]); this.redrawGraph(); - //console.log("undo:" + state.actionName + " size =" + this.undoStack.length); - - if (this.IsUndoStackEmpty()) + if (this.undoStack.IsUndoStackEmpty()) document.getElementById('GraphUndo').style.display = 'none'; } -Application.prototype.ClearUndoStack = function() -{ - this.undoStack = []; -} - -Application.prototype.IsUndoStackEmpty = function() -{ - return (this.undoStack.length <= 0); -} - Application.prototype.SaveUserSettings = function() { var res = "{"; diff --git a/script/pages/editor/model/DiskSaveLoad.js b/script/pages/editor/model/DiskSaveLoad.js new file mode 100644 index 0000000..585240e --- /dev/null +++ b/script/pages/editor/model/DiskSaveLoad.js @@ -0,0 +1,52 @@ +// Disk save load + + +var DiskSaveLoad = function () {}; + +DiskSaveLoad.LoadGraphFromDisk = function (graphName, callback) +{ + $.ajax({ + type: "GET", + url: "/" + SiteDir + "cgi-bin/loadGraph.php?name=" + graphName + }) + .done(callback); +} + +DiskSaveLoad.SaveSVGGraphOnDisk = function (imageName, svgText, callback) +{ + $.ajax({ + type: "POST", + url: "/" + SiteDir + "cgi-bin/saveSvg.php?name=" + imageName, + data: { + svgdata : svgText + }, + dataType: "text", + success: callback + }); + + return imageName; +} + +DiskSaveLoad.SaveGraphOnDisk = function (savedGraphName, graphAsString, callback) +{ + $.ajax({ + type: "POST", + url: "/" + SiteDir + "cgi-bin/saveGraph.php?name=" + savedGraphName, + data: graphAsString, + dataType: "text" + }) + .done(callback); +} + +DiskSaveLoad.SaveGraphImageOnDisk = function (imageName, rectParams, imageBase64Data, callback) +{ + $.ajax({ + type: "POST", + url: "/" + SiteDir + "cgi-bin/saveImage.php?name=" + imageName + rectParams, + data: { + base64data : imageBase64Data + }, + dataType: "text", + success: callback + }); +} \ No newline at end of file diff --git a/script/pages/editor/model/UndoStack.js b/script/pages/editor/model/UndoStack.js new file mode 100644 index 0000000..da67850 --- /dev/null +++ b/script/pages/editor/model/UndoStack.js @@ -0,0 +1,41 @@ +// Undo Stack + + + +function UndoStack(maxUndoStackSize) { + this.undoStack = []; + this.maxUndoStackSize = maxUndoStackSize; +} + +UndoStack.prototype.PushToStack = function(actionName, dataToSave) +{ + var object = {}; + object.actionName = actionName; + object.data = dataToSave; + + this.undoStack.push(object); + + while (this.undoStack.length > this.maxUndoStackSize) + { + this.undoStack.shift(); + } +} + +UndoStack.prototype.Undo = function() +{ + if (this.IsUndoStackEmpty()) + return null; + + var state = this.undoStack.pop(); + return state.data; +} + +UndoStack.prototype.ClearUndoStack = function() +{ + this.undoStack = []; +} + +UndoStack.prototype.IsUndoStackEmpty = function() +{ + return (this.undoStack.length <= 0); +}