mirror of
https://git.do.srb2.org/STJr/UltimateZoneBuilder.git
synced 2024-11-29 07:01:55 +00:00
957bec7f43
Added autosaving of the current map. Autosaving happens in intervals when the map is changed. It will not overwrite the current map, but rather create new files, just like backups. Autosaving interval and number of files can be configured in the "Recovery" tab of the preferences. Autosaving can also be disabled there (not recommended). Autosaves will not have their nodes built for performance reason.
120 lines
3.5 KiB
C#
120 lines
3.5 KiB
C#
#region ================== Copyright (c) 2023 Boris Iwanski
|
|
|
|
/*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
*
|
|
* it under the terms of the GNU General Public License as published by
|
|
*
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
*
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
|
|
*
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program.If not, see<http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#endregion
|
|
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace CodeImp.DoomBuilder
|
|
{
|
|
internal enum AutosaveResult
|
|
{
|
|
Success,
|
|
Error,
|
|
NoFileName
|
|
}
|
|
|
|
internal class AutoSaver
|
|
{
|
|
private static long lasttime;
|
|
private static System.Windows.Forms.Timer timer;
|
|
|
|
/// <summary>
|
|
/// Initialized and starts the autosave timer.
|
|
/// </summary>
|
|
internal void InitializeTimer()
|
|
{
|
|
if(timer != null)
|
|
{
|
|
timer.Tick -= TryAutosave;
|
|
timer.Dispose();
|
|
timer = null;
|
|
}
|
|
|
|
if (General.Settings.Autosave)
|
|
{
|
|
lasttime = Clock.CurrentTime;
|
|
timer = new System.Windows.Forms.Timer() { Interval = 1000 };
|
|
timer.Tick += TryAutosave;
|
|
timer.Enabled = true;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Stops the autosave timer.
|
|
/// </summary>
|
|
internal void StopTimer()
|
|
{
|
|
if (timer != null) timer.Enabled = false;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Resets the autosave timer to the current time.
|
|
/// </summary>
|
|
internal void ResetTimer()
|
|
{
|
|
lasttime = Clock.CurrentTime;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Makes the autosave timer aware of a clock reset, so that the interval until the next autosave is unaffected.
|
|
/// </summary>
|
|
internal void BeforeClockReset()
|
|
{
|
|
lasttime = -(Clock.CurrentTime - lasttime);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tries to perform the autosave.
|
|
/// </summary>
|
|
/// <param name="sender">The sender</param>
|
|
/// <param name="args">The event arguments</param>
|
|
private static void TryAutosave(object sender, EventArgs args)
|
|
{
|
|
if (Clock.CurrentTime > lasttime + General.Settings.AutosaveInterval * 60 * 1000 && General.Map != null && General.Map.Map != null && General.Map.Map.IsSafeToAccess && General.Map.IsChanged)
|
|
{
|
|
// Check if the current editing mode prevents autosaving. If it does return without setting the time,
|
|
// so that autosaving will be retried ASAP
|
|
if (!General.Editing.Mode.OnAutoSaveBegin())
|
|
return;
|
|
|
|
lasttime = Clock.CurrentTime;
|
|
|
|
long start = Clock.CurrentTime;
|
|
AutosaveResult success = General.Map.AutoSave();
|
|
long duration = Clock.CurrentTime - start;
|
|
|
|
// Show a toast appropriate for the result of the autosave
|
|
if (success == AutosaveResult.Success)
|
|
General.ToastManager.ShowToast("autosave", ToastType.INFO, "Autosave", $"Autosave completed successfully in {duration} ms.");
|
|
else if (success == AutosaveResult.Error)
|
|
General.ToastManager.ShowToast("autosave", ToastType.ERROR, "Autosave", "Autosave failed.");
|
|
else if (success == AutosaveResult.NoFileName)
|
|
General.ToastManager.ShowToast("autosave", ToastType.WARNING, "Autosave", "Could not autosave because this is a new WAD that wasn't saved yet.");
|
|
}
|
|
}
|
|
}
|
|
}
|