@ Better undo/redo fix

This commit is contained in:
codeimp 2009-02-22 10:13:09 +00:00
parent 29b797b4f3
commit dcce76ac77
2 changed files with 29 additions and 29 deletions

View file

@ -87,7 +87,7 @@ namespace CodeImp.DoomBuilder.Editing
// Start background thread // Start background thread
backgroundthread = new Thread(new ThreadStart(BackgroundThread)); backgroundthread = new Thread(new ThreadStart(BackgroundThread));
backgroundthread.Name = "Background Loader"; backgroundthread.Name = "Snapshot Compressor";
backgroundthread.Priority = ThreadPriority.Lowest; backgroundthread.Priority = ThreadPriority.Lowest;
backgroundthread.IsBackground = true; backgroundthread.IsBackground = true;
backgroundthread.Start(); backgroundthread.Start();
@ -374,16 +374,10 @@ namespace CodeImp.DoomBuilder.Editing
// Reset grouping // Reset grouping
lastgroup = UndoGroup.None; lastgroup = UndoGroup.None;
lock(u) // Change map set
{ MemoryStream data = u.GetMapData();
// Change map set General.Map.ChangeMapSet(new MapSet(data));
if(u.IsOnDisk) data.Dispose();
{
u.StoreOnDisk = false;
u.RestoreFromFile();
}
General.Map.ChangeMapSet(new MapSet(u.MapData));
}
// Remove selection // Remove selection
General.Map.Map.ClearAllMarks(false); General.Map.Map.ClearAllMarks(false);
@ -407,7 +401,7 @@ namespace CodeImp.DoomBuilder.Editing
// This performs a redo // This performs a redo
[BeginAction("redo")] [BeginAction("redo")]
internal void PerformRedo() public void PerformRedo()
{ {
UndoSnapshot u, r; UndoSnapshot u, r;
Cursor oldcursor = Cursor.Current; Cursor oldcursor = Cursor.Current;
@ -455,16 +449,10 @@ namespace CodeImp.DoomBuilder.Editing
// Reset grouping // Reset grouping
lastgroup = UndoGroup.None; lastgroup = UndoGroup.None;
lock(r) // Change map set
{ MemoryStream data = r.GetMapData();
// Change map set General.Map.ChangeMapSet(new MapSet(data));
if(r.IsOnDisk) data.Dispose();
{
r.StoreOnDisk = false;
r.RestoreFromFile();
}
General.Map.ChangeMapSet(new MapSet(r.MapData));
}
// Remove selection // Remove selection
General.Map.Map.ClearAllMarks(false); General.Map.Map.ClearAllMarks(false);

View file

@ -52,10 +52,9 @@ namespace CodeImp.DoomBuilder.Editing
#region ================== Properties #region ================== Properties
internal MemoryStream MapData { get { return mapdata; } }
public string Description { get { return description; } } public string Description { get { return description; } }
public int TicketID { get { return ticketid; } } public int TicketID { get { return ticketid; } }
public bool StoreOnDisk { get { return storeondisk; } set { storeondisk = value; } } internal bool StoreOnDisk { get { return storeondisk; } set { storeondisk = value; } }
public bool IsOnDisk { get { return isondisk; } } public bool IsOnDisk { get { return isondisk; } }
#endregion #endregion
@ -83,7 +82,7 @@ namespace CodeImp.DoomBuilder.Editing
} }
// Disposer // Disposer
public void Dispose() internal void Dispose()
{ {
lock(this) lock(this)
{ {
@ -99,8 +98,21 @@ namespace CodeImp.DoomBuilder.Editing
#region ================== Methods #region ================== Methods
// This returns the map data
internal MemoryStream GetMapData()
{
lock(this)
{
// Restore into memory if needed
if(isondisk) RestoreFromFile();
// Return a copy of the buffer
return new MemoryStream(mapdata.ToArray());
}
}
// This moves the snapshot from memory to harddisk // This moves the snapshot from memory to harddisk
public void WriteToFile() internal void WriteToFile()
{ {
lock(this) lock(this)
{ {
@ -117,7 +129,7 @@ namespace CodeImp.DoomBuilder.Editing
filename = General.MakeTempFilename(General.Map.TempPath, "snapshot"); filename = General.MakeTempFilename(General.Map.TempPath, "snapshot");
// Write data to file // Write data to file
File.WriteAllBytes(filename, outstream.GetBuffer()); File.WriteAllBytes(filename, outstream.ToArray());
// Remove data from memory // Remove data from memory
mapdata.Dispose(); mapdata.Dispose();
@ -127,7 +139,7 @@ namespace CodeImp.DoomBuilder.Editing
} }
// This loads the snapshot from harddisk into memory // This loads the snapshot from harddisk into memory
public void RestoreFromFile() internal void RestoreFromFile()
{ {
lock(this) lock(this)
{ {
@ -142,7 +154,7 @@ namespace CodeImp.DoomBuilder.Editing
MemoryStream outstream = new MemoryStream((int)instream.Length * 4); MemoryStream outstream = new MemoryStream((int)instream.Length * 4);
instream.Seek(0, SeekOrigin.Begin); instream.Seek(0, SeekOrigin.Begin);
BZip2.Decompress(instream, outstream); BZip2.Decompress(instream, outstream);
mapdata = new MemoryStream(outstream.GetBuffer()); mapdata = new MemoryStream(outstream.ToArray());
// Clean up // Clean up
instream.Dispose(); instream.Dispose();