public void RestoreFromBackups()
        {
            CloseDatafiles();

            foreach (var texturesFilePath in DataFiles.Keys)
            {
                string tableFilePath   = Path.Combine(Path.GetDirectoryName(texturesFilePath), Path.GetFileName(texturesFilePath).Replace("textures", "texture_table"));
                string backupTablePath = Path.Combine(Settings.FileName(Path.ChangeExtension(Path.GetFileName(tableFilePath), ".bak")));
                if (File.Exists(backupTablePath))
                {
                    File.Copy(backupTablePath, tableFilePath, true);
                    long size = Settings.GetFileSize(texturesFilePath);
                    if (size != 0)
                    {
                        using FileStream file = File.OpenWrite(texturesFilePath);
                        file.SetLength(size);

                        var list         = Lists[texturesFilePath];
                        var originalList = new TextureList(tableFilePath, texturesFilePath);
                        foreach (var info in list)
                        {
                            if (info.offset >= size)
                            {
                                var previous = originalList.First(n => n.name == info.name);
                                info.offset = previous.offset;
                                info.length = previous.length;
                                OnTextureChangeDiscarded?.Invoke(info);
                            }
                        }
                    }
                }
            }

            nonOriginalCount = 0;
        }
 public void DiscardChange(TextureInfo info)
 {
     if (ImageChanges.ContainsKey(info.name))
     {
         ImageChanges.Remove(info.name);
         info.changed = false;
         OnTextureChangeDiscarded?.Invoke(info);
     }
 }
 public void DiscardChanges()
 {
     foreach (var list in Lists.Values)
     {
         foreach (var item in list)
         {
             item.changed = false;
             OnTextureChangeDiscarded?.Invoke(item);
         }
     }
     ImageChanges.Clear();
 }