mirror of
https://git.do.srb2.org/STJr/UltimateZoneBuilder.git
synced 2025-02-17 09:32:34 +00:00
@ Better undo/redo fix
This commit is contained in:
parent
29b797b4f3
commit
dcce76ac77
2 changed files with 29 additions and 29 deletions
|
@ -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);
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in a new issue