diff --git a/script/Appilcation.js b/script/Appilcation.js
index 701b916..5394820 100644
--- a/script/Appilcation.js
+++ b/script/Appilcation.js
@@ -734,6 +734,11 @@ Application.prototype.SetHandlerMode = function(mode)
var setupBackgroundStyle = new SetupBackgroundStyle(this);
setupBackgroundStyle.show();
}
+ else if (mode == "graphUndo")
+ {
+ if (!this.IsUndoStackEmpty())
+ this.Undo();
+ }
else if (g_AlgorithmIds.indexOf(mode) >= 0)
{
this.handler = new AlgorithmGraphHandler(this, g_Algorithms[g_AlgorithmIds.indexOf(mode)](this.graph, this));
@@ -819,6 +824,9 @@ Application.prototype.onPostLoadEvent = function()
}
}
+ if (this.IsUndoStackEmpty())
+ document.getElementById('GraphUndo').style.display = 'none';
+
this.updateMessage();
this.redrawGraph();
}
@@ -1341,14 +1349,18 @@ Application.prototype.PushToStack = function(actionName)
{
var object = {};
object.actionName = actionName;
- object.graphSave = this.graph.SaveToXML("");
+ 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);
+
+ document.getElementById('GraphUndo').style.display = 'inline-block';
}
Application.prototype.Undo = function()
@@ -1358,9 +1370,18 @@ Application.prototype.Undo = function()
var state = this.undoStack.pop();
this.graph = new Graph();
- var empty;
- this.graph.LoadFromXML(state.graphSave, empty);
+
+ var userSettings = {};
+ this.graph.LoadFromXML(state.graphSave, 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())
+ document.getElementById('GraphUndo').style.display = 'none';
}
Application.prototype.ClearUndoStack = function()
diff --git a/script/BaseBackgroundDrawer.js b/script/BaseBackgroundDrawer.js
index e72ab9b..0b7934e 100644
--- a/script/BaseBackgroundDrawer.js
+++ b/script/BaseBackgroundDrawer.js
@@ -50,4 +50,4 @@ BaseBackgroundDrawer.prototype.Draw = function(style, width, height, position, s
context.fillRect(-rect.minPoint.x, -rect.minPoint.y, rect.size().x + 1, rect.size().y + 1);
context.globalAlpha = 1.0;
}
-}
+}
\ No newline at end of file
diff --git a/script/EnumVertices.js b/script/EnumVertices.js
index 22054d1..e029cbe 100755
--- a/script/EnumVertices.js
+++ b/script/EnumVertices.js
@@ -175,6 +175,8 @@ TextEnumVertexsCustom.prototype.ShowDialog = function(callback, buttonText, titl
var dialogButtons = {};
app = this.app;
dialogButtons[buttonText] = function() {
+ app.PushToStack("RenameVertex");
+
callback(new TextEnumTitle(app, $("#VertexTitle").val()));
$( this ).dialog( "close" );
};
diff --git a/script/EventHandlers.js b/script/EventHandlers.js
index 35e01c8..d743464 100644
--- a/script/EventHandlers.js
+++ b/script/EventHandlers.js
@@ -15,7 +15,7 @@ function BaseHandler(app)
this.app = app;
this.app.setRenderPath([]);
- this.app.ClearUndoStack();
+ //this.app.ClearUndoStack();
}
// Need redraw or nor.
@@ -212,6 +212,7 @@ function DefaultHandler(app)
this.groupingSelect = false;
this.selectedLogRect = false;
this.selectedLogCtrl = false;
+ this.saveUndo = false;
}
// inheritance.
@@ -225,12 +226,24 @@ DefaultHandler.prototype.MouseMove = function(pos)
{
if (this.dragObject)
{
+ if (!this.saveUndo)
+ {
+ this.app.PushToStack("Move");
+ this.saveUndo = true;
+ }
+
this.dragObject.position.x = pos.x;
this.dragObject.position.y = pos.y;
this.needRedraw = true;
}
else if (this.selectedObjects.length > 0 && this.pressed && !this.groupingSelect)
{
+ if (!this.saveUndo)
+ {
+ this.app.PushToStack("Move");
+ this.saveUndo = true;
+ }
+
var offset = (new Point(pos.x, pos.y)).subtract(this.prevPosition);
for (var i = 0; i < this.selectedObjects.length; i ++)
{
@@ -241,7 +254,7 @@ DefaultHandler.prototype.MouseMove = function(pos)
}
}
this.prevPosition = pos;
- this.needRedraw = true;
+ this.needRedraw = true;
}
else if (this.pressed)
{
@@ -332,6 +345,7 @@ DefaultHandler.prototype.RenameVertex = function(text)
DefaultHandler.prototype.MouseUp = function(pos)
{
+ this.saveUndo = false;
this.message = g_textsSelectAndMove + " " + g_selectGroupText + "";
this.dragObject = null;
this.pressed = false;
@@ -361,7 +375,7 @@ DefaultHandler.prototype.MouseUp = function(pos)
};
$('#message').unbind();
$('#message').on('click', '#renameButton', function(){
- var customEnum = new TextEnumVertexsCustom();
+ var customEnum = new TextEnumVertexsCustom(handler.app);
customEnum.ShowDialog(callback, g_rename, g_renameVertex, handler.selectedObject.mainText);
});
$('#message').on('click', '#changeCommonStyle', function(){
@@ -399,6 +413,8 @@ DefaultHandler.prototype.MouseUp = function(pos)
var dialogButtons = {};
dialogButtons[g_save] = function() {
+
+ handler.app.PushToStack("ChangeCurvelEdge");
handler.selectedObject.SetWeight(document.getElementById('EdgeWeight').value);
handler.selectedObject.SetUpText(document.getElementById('EdgeLable').value);
@@ -441,12 +457,16 @@ DefaultHandler.prototype.MouseUp = function(pos)
});
$('#message').on('click', '#incCurvel', function(){
+ handler.app.PushToStack("ChangeCurvelEdge");
+
handler.selectedObject.model.ChangeCurvedValue(DefaultHandler.prototype.curvedValue);
handler.needRedraw = true;
handler.app.redrawGraph();
userAction("Edge.Bend");
});
$('#message').on('click', '#decCurvel', function(){
+ handler.app.PushToStack("ChangeCurvelEdge");
+
handler.selectedObject.model.ChangeCurvedValue(-DefaultHandler.prototype.curvedValue);
handler.needRedraw = true;
handler.app.redrawGraph();
@@ -514,6 +534,8 @@ DefaultHandler.prototype.MouseUp = function(pos)
$('#message').unbind();
$('#message').on('click', '#DublicateSelected', function(){
+ handler.app.PushToStack("DublicateSelection");
+
userAction("GroupSelected.Dublicate");
var newSelected = [];
@@ -578,6 +600,8 @@ DefaultHandler.prototype.MouseUp = function(pos)
});
$('#message').on('click', '#RemoveSelected', function(){
+ handler.app.PushToStack("RemoveSelection");
+
userAction("GroupSelected.Remove");
for(var i = 0; i < handler.selectedObjects.length; i ++)
@@ -660,6 +684,8 @@ AddGraphHandler.prototype = Object.create(BaseHandler.prototype);
AddGraphHandler.prototype.MouseDown = function(pos)
{
+ this.app.PushToStack("Add");
+
this.app.CreateNewGraph(pos.x, pos.y);
this.needRedraw = true;
this.inited = false;
@@ -750,11 +776,13 @@ ConnectionGraphHandler.prototype.SelectVertex = function(selectedObject)
}
dialogButtons[g_orintEdge] = function() {
- handler.AddNewEdge(selectedObject, true);
+ handler.app.PushToStack("Connect");
+ handler.AddNewEdge(selectedObject, true);
$( this ).dialog( "close" );
};
dialogButtons[g_notOrintEdge] = function() {
- handler.AddNewEdge(selectedObject, false);
+ handler.app.PushToStack("Connect");
+ handler.AddNewEdge(selectedObject, false);
$( this ).dialog( "close" );
};
@@ -882,31 +910,6 @@ DeleteGraphHandler.prototype.MouseDown = function(pos)
this.app.PushToStack("Delete");
this.app.DeleteObject(selectedObject);
this.needRedraw = true;
-
- this.UpdateUndoButton();
-}
-
-DeleteGraphHandler.prototype.UpdateUndoButton = function()
-{
- if (!this.app.IsUndoStackEmpty())
- {
- this.message = g_selectObjectToDelete + "";
-
- var handler = this;
- $('#message').unbind();
- $('#message').on('click', '#undoDelete', function(){
- handler.app.Undo();
- userAction("Undo.Delete");
-
- handler.UpdateUndoButton();
- });
- }
- else
- {
- this.message = g_selectObjectToDelete;
- }
-
- this.app.updateMessage();
}
/**
@@ -923,6 +926,8 @@ DeleteAllHandler.prototype = Object.create(BaseHandler.prototype);
DeleteAllHandler.prototype.clear = function()
{
+ this.app.PushToStack("DeleteAll");
+
// Selected Graph.
this.app.graph = new Graph();
this.app.savedGraphName = "";
@@ -966,6 +971,7 @@ ShowAdjacencyMatrix.prototype.show = function()
});
dialogButtons[g_save] = function() {
+ handler.app.PushToStack("ChangeAdjacencyMatrix");
handler.app.SetAdjacencyMatrixSmart($( "#AdjacencyMatrixField" ).val());
$( this ).dialog( "close" );
};
@@ -1029,7 +1035,8 @@ ShowIncidenceMatrix.prototype.show = function()
});
dialogButtons[g_save] = function() {
- handler.app.SetIncidenceMatrixSmart($( "#IncidenceMatrixField" ).val());
+ handler.app.PushToStack("IncidenceMatrixChanged");
+ handler.app.SetIncidenceMatrixSmart($( "#IncidenceMatrixField" ).val());
$( this ).dialog( "close" );
};
dialogButtons[g_cancel] = function() {
@@ -1409,6 +1416,8 @@ GroupRenameVertices.prototype.show = function()
var app = this.app;
dialogButtons[g_save] = function() {
+ app.PushToStack("Rename");
+
var titlesList = $( "#VertextTitleList" ).val().split('\n');
for (i = 0; i < Math.min(graph.vertices.length, titlesList.length); i ++)
{
@@ -1622,6 +1631,8 @@ SetupVertexStyle.prototype.show = function(index, selectedVertexes)
class : "MarginLeft",
click : function() {
+ app.PushToStack("ChangeStyle");
+
applyDiameter(forAll ? (new VertexModel()).diameter : app.GetDefaultVertexSize());
var indexes = [];
@@ -1655,6 +1666,8 @@ SetupVertexStyle.prototype.show = function(index, selectedVertexes)
dialogButtons[g_save] = function() {
+ app.PushToStack("ChangeStyle");
+
applyDiameter(parseInt($( "#vertexSize" ).val()));
var indexes = [];
@@ -1915,6 +1928,8 @@ SetupEdgeStyle.prototype.show = function(index, selectedEdges)
text : g_default,
class : "MarginLeft",
click : function() {
+ app.PushToStack("ChangeStyle");
+
applyWidth(forAll ? (new EdgeModel()).width : app.GetDefaultEdgeWidth());
var indexes = [];
if (self.index == "all")
@@ -1947,6 +1962,8 @@ SetupEdgeStyle.prototype.show = function(index, selectedEdges)
dialogButtons[g_save] = function() {
+ app.PushToStack("ChangeStyle");
+
applyWidth(parseInt($( "#edgeWidth" ).val()));
var indexes = [];
@@ -2040,7 +2057,7 @@ SetupBackgroundStyle.prototype.show = function()
var dialogButtons = {};
var graph = this.app.graph;
var app = this.app;
- var style = Object.assign({}, app.backgroundCommonStyle);
+ var style = FullObjectCopy(app.backgroundCommonStyle);
var fillFields = function()
{
@@ -2069,6 +2086,9 @@ SetupBackgroundStyle.prototype.show = function()
text : g_default,
class : "MarginLeft",
click : function() {
+
+ app.PushToStack("ChangeBackground");
+
app.ResetBackgroundStyle();
app.redrawGraph();
$( this ).dialog( "close" );
@@ -2076,6 +2096,7 @@ SetupBackgroundStyle.prototype.show = function()
};
dialogButtons[g_save] = function() {
+ app.PushToStack("ChangeBackground");
app.SetBackgroundStyle(style);
app.redrawGraph();
$( this ).dialog( "close" );
diff --git a/script/main.js b/script/main.js
index 0d53ced..5cdca77 100644
--- a/script/main.js
+++ b/script/main.js
@@ -240,6 +240,8 @@ function postLoadPage()
var key = getChar(event);
var code = getCharCode(event);
console.log(key + " code=" + code);
+ var evtobj = window.event ? event : e;
+ var isCtrl = evtobj ? evtobj.ctrlKey : false;
var moveValue = 10;
if (code == 61 || code == 43) // +
@@ -289,6 +291,11 @@ function postLoadPage()
{
selectHandler('Default', 'default');
}
+ else if (code == 26 && isCtrl)
+ {
+ userAction("Key_GraphUndo");
+ application.SetHandlerMode("graphUndo");
+ }
}
$(document).keydown(function(event) {
@@ -463,6 +470,12 @@ function postLoadPage()
userAction(this.id);
application.SetHandlerMode("setupBackgroundStyle");
}
+
+ document.getElementById('GraphUndo').onclick = function ()
+ {
+ userAction(this.id);
+ application.SetHandlerMode("graphUndo");
+ }
document.getElementById('runUserScript').onclick = function ()
{
@@ -652,8 +665,6 @@ function postLoadPage()
});
-
-
var devTools = document.getElementById('developerTools');
devTools.style.left = 0;
resizeCanvas();
diff --git a/tpl/home.php b/tpl/home.php
index 8c5fadd..580cbc3 100755
--- a/tpl/home.php
+++ b/tpl/home.php
@@ -10,7 +10,7 @@
-
+