mirror of
https://github.com/ppy/osu.git
synced 2025-02-13 23:53:21 +08:00
use Live<TModel>
Use RealmAccess only when needed
This commit is contained in:
parent
1f4da35c8d
commit
de21b4a2f7
@ -119,10 +119,7 @@ namespace osu.Game.Tests.Skins.IO
|
|||||||
var import1 = await loadSkinIntoOsu(osu, new ImportTask(createOskWithIni("name 1", "author 1"), "custom.osk"));
|
var import1 = await loadSkinIntoOsu(osu, new ImportTask(createOskWithIni("name 1", "author 1"), "custom.osk"));
|
||||||
assertCorrectMetadata(import1, "name 1 [custom]", "author 1", osu);
|
assertCorrectMetadata(import1, "name 1 [custom]", "author 1", osu);
|
||||||
|
|
||||||
await import1.PerformRead(async s =>
|
await new LegacySkinExporter(osu.Dependencies.Get<Storage>()).ExportToStreamAsync(import1, exportStream);
|
||||||
{
|
|
||||||
await new LegacySkinExporter(osu.Dependencies.Get<Storage>(), osu.Dependencies.Get<RealmAccess>()).ExportToStreamAsync(s, exportStream);
|
|
||||||
});
|
|
||||||
|
|
||||||
string exportFilename = import1.GetDisplayString();
|
string exportFilename = import1.GetDisplayString();
|
||||||
|
|
||||||
@ -203,7 +200,7 @@ namespace osu.Game.Tests.Skins.IO
|
|||||||
Assert.IsFalse(s.Protected);
|
Assert.IsFalse(s.Protected);
|
||||||
Assert.AreEqual(typeof(ArgonSkin), s.CreateInstance(skinManager).GetType());
|
Assert.AreEqual(typeof(ArgonSkin), s.CreateInstance(skinManager).GetType());
|
||||||
|
|
||||||
await new LegacySkinExporter(osu.Dependencies.Get<Storage>(), osu.Dependencies.Get<RealmAccess>()).ExportToStreamAsync(s, exportStream);
|
await new LegacySkinExporter(osu.Dependencies.Get<Storage>()).ExportToStreamAsync(skinManager.CurrentSkinInfo.Value, exportStream);
|
||||||
|
|
||||||
Assert.Greater(exportStream.Length, 0);
|
Assert.Greater(exportStream.Length, 0);
|
||||||
});
|
});
|
||||||
@ -236,7 +233,7 @@ namespace osu.Game.Tests.Skins.IO
|
|||||||
Assert.IsFalse(s.Protected);
|
Assert.IsFalse(s.Protected);
|
||||||
Assert.AreEqual(typeof(DefaultLegacySkin), s.CreateInstance(skinManager).GetType());
|
Assert.AreEqual(typeof(DefaultLegacySkin), s.CreateInstance(skinManager).GetType());
|
||||||
|
|
||||||
await new LegacySkinExporter(osu.Dependencies.Get<Storage>(), osu.Dependencies.Get<RealmAccess>()).ExportToStreamAsync(s, exportStream);
|
await new LegacySkinExporter(osu.Dependencies.Get<Storage>()).ExportToStreamAsync(skinManager.CurrentSkinInfo.Value, exportStream);
|
||||||
|
|
||||||
Assert.Greater(exportStream.Length, 0);
|
Assert.Greater(exportStream.Length, 0);
|
||||||
});
|
});
|
||||||
|
@ -79,7 +79,7 @@ namespace osu.Game.Beatmaps
|
|||||||
|
|
||||||
workingBeatmapCache = CreateWorkingBeatmapCache(audioManager, gameResources, userResources, defaultBeatmap, host);
|
workingBeatmapCache = CreateWorkingBeatmapCache(audioManager, gameResources, userResources, defaultBeatmap, host);
|
||||||
|
|
||||||
beatmapExporter = new LegacyBeatmapExporter(storage, realm)
|
beatmapExporter = new LegacyBeatmapExporter(storage)
|
||||||
{
|
{
|
||||||
PostNotification = obj => PostNotification?.Invoke(obj)
|
PostNotification = obj => PostNotification?.Invoke(obj)
|
||||||
};
|
};
|
||||||
@ -400,7 +400,7 @@ namespace osu.Game.Beatmaps
|
|||||||
public Task<Live<BeatmapSetInfo>?> ImportAsUpdate(ProgressNotification notification, ImportTask importTask, BeatmapSetInfo original) =>
|
public Task<Live<BeatmapSetInfo>?> ImportAsUpdate(ProgressNotification notification, ImportTask importTask, BeatmapSetInfo original) =>
|
||||||
beatmapImporter.ImportAsUpdate(notification, importTask, original);
|
beatmapImporter.ImportAsUpdate(notification, importTask, original);
|
||||||
|
|
||||||
public Task Export(BeatmapSetInfo beatmap) => beatmapExporter.ExportAsync(beatmap);
|
public Task Export(BeatmapSetInfo beatmap) => beatmapExporter.ExportAsync(beatmap, Realm);
|
||||||
|
|
||||||
private void updateHashAndMarkDirty(BeatmapSetInfo setInfo)
|
private void updateHashAndMarkDirty(BeatmapSetInfo setInfo)
|
||||||
{
|
{
|
||||||
|
@ -20,8 +20,8 @@ namespace osu.Game.Database
|
|||||||
public abstract class LegacyArchiveExporter<TModel> : LegacyModelExporter<TModel>
|
public abstract class LegacyArchiveExporter<TModel> : LegacyModelExporter<TModel>
|
||||||
where TModel : RealmObject, IHasNamedFiles, IHasGuidPrimaryKey
|
where TModel : RealmObject, IHasNamedFiles, IHasGuidPrimaryKey
|
||||||
{
|
{
|
||||||
protected LegacyArchiveExporter(Storage storage, RealmAccess realm)
|
protected LegacyArchiveExporter(Storage storage)
|
||||||
: base(storage, realm)
|
: base(storage)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,8 +8,8 @@ namespace osu.Game.Database
|
|||||||
{
|
{
|
||||||
public class LegacyBeatmapExporter : LegacyArchiveExporter<BeatmapSetInfo>
|
public class LegacyBeatmapExporter : LegacyArchiveExporter<BeatmapSetInfo>
|
||||||
{
|
{
|
||||||
public LegacyBeatmapExporter(Storage storage, RealmAccess realm)
|
public LegacyBeatmapExporter(Storage storage)
|
||||||
: base(storage, realm)
|
: base(storage)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,24 +31,35 @@ namespace osu.Game.Database
|
|||||||
private readonly Storage exportStorage;
|
private readonly Storage exportStorage;
|
||||||
protected virtual string GetFilename(TModel item) => item.GetDisplayString();
|
protected virtual string GetFilename(TModel item) => item.GetDisplayString();
|
||||||
|
|
||||||
private readonly RealmAccess realmAccess;
|
|
||||||
|
|
||||||
public Action<Notification>? PostNotification { get; set; }
|
public Action<Notification>? PostNotification { get; set; }
|
||||||
|
|
||||||
// Store the model being exporting.
|
// Store the model being exporting.
|
||||||
private static readonly List<TModel> exporting_models = new List<TModel>();
|
private static readonly List<Live<TModel>> exporting_models = new List<Live<TModel>>();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Construct exporter.
|
/// Construct exporter.
|
||||||
/// Create a new exporter for each export, otherwise it will cause confusing notifications.
|
/// Create a new exporter for each export, otherwise it will cause confusing notifications.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="storage">Storage for storing exported files. Basically it is used to provide export stream</param>
|
/// <param name="storage">Storage for storing exported files. Basically it is used to provide export stream</param>
|
||||||
/// <param name="realm">The RealmAccess used to provide the exported file.</param>
|
protected LegacyModelExporter(Storage storage)
|
||||||
protected LegacyModelExporter(Storage storage, RealmAccess realm)
|
|
||||||
{
|
{
|
||||||
exportStorage = storage.GetStorageForDirectory(@"exports");
|
exportStorage = storage.GetStorageForDirectory(@"exports");
|
||||||
UserFileStorage = storage.GetStorageForDirectory(@"files");
|
UserFileStorage = storage.GetStorageForDirectory(@"files");
|
||||||
realmAccess = realm;
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Export the model to default folder.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="model">The model should export.</param>
|
||||||
|
/// <param name="realm">Realm that convert model to Live.</param>
|
||||||
|
/// <param name="cancellationToken">
|
||||||
|
/// The Cancellation token that can cancel the exporting.
|
||||||
|
/// If specified CancellationToken, then use it. Otherwise use PostNotification's CancellationToken.
|
||||||
|
/// </param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public Task<bool> ExportAsync(TModel model, RealmAccess realm, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
return ExportAsync(model.ToLive(realm), cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -60,7 +71,7 @@ namespace osu.Game.Database
|
|||||||
/// If specified CancellationToken, then use it. Otherwise use PostNotification's CancellationToken.
|
/// If specified CancellationToken, then use it. Otherwise use PostNotification's CancellationToken.
|
||||||
/// </param>
|
/// </param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public async Task<bool> ExportAsync(TModel model, CancellationToken cancellationToken = default)
|
public async Task<bool> ExportAsync(Live<TModel> model, CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
// check if the model is being exporting already
|
// check if the model is being exporting already
|
||||||
if (!exporting_models.Contains(model))
|
if (!exporting_models.Contains(model))
|
||||||
@ -73,7 +84,8 @@ namespace osu.Game.Database
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
string itemFilename = GetFilename(model).GetValidFilename();
|
string itemFilename = model.PerformRead(s => GetFilename(s).GetValidFilename());
|
||||||
|
|
||||||
IEnumerable<string> existingExports =
|
IEnumerable<string> existingExports =
|
||||||
exportStorage
|
exportStorage
|
||||||
.GetFiles(string.Empty, $"{itemFilename}*{FileExtension}")
|
.GetFiles(string.Empty, $"{itemFilename}*{FileExtension}")
|
||||||
@ -128,15 +140,13 @@ namespace osu.Game.Database
|
|||||||
/// <param name="notification">The notification will displayed to the user</param>
|
/// <param name="notification">The notification will displayed to the user</param>
|
||||||
/// <param name="cancellationToken">The Cancellation token that can cancel the exporting.</param>
|
/// <param name="cancellationToken">The Cancellation token that can cancel the exporting.</param>
|
||||||
/// <returns>Whether the export was successful</returns>
|
/// <returns>Whether the export was successful</returns>
|
||||||
public Task<bool> ExportToStreamAsync(TModel model, Stream stream, ProgressNotification? notification = null, CancellationToken cancellationToken = default)
|
public Task<bool> ExportToStreamAsync(Live<TModel> model, Stream stream, ProgressNotification? notification = null, CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
Guid id = model.ID;
|
|
||||||
return Task.Run(() =>
|
return Task.Run(() =>
|
||||||
{
|
{
|
||||||
realmAccess.Run(r =>
|
model.PerformRead(s =>
|
||||||
{
|
{
|
||||||
TModel refetchModel = r.Find<TModel>(id);
|
ExportToStream(s, stream, notification, cancellationToken);
|
||||||
ExportToStream(refetchModel, stream, notification, cancellationToken);
|
|
||||||
});
|
});
|
||||||
}, cancellationToken).ContinueWith(t =>
|
}, cancellationToken).ContinueWith(t =>
|
||||||
{
|
{
|
||||||
|
@ -13,8 +13,7 @@ namespace osu.Game.Database
|
|||||||
{
|
{
|
||||||
public class LegacyScoreExporter : LegacyModelExporter<ScoreInfo>
|
public class LegacyScoreExporter : LegacyModelExporter<ScoreInfo>
|
||||||
{
|
{
|
||||||
public LegacyScoreExporter(Storage storage, RealmAccess realm)
|
public LegacyScoreExporter(Storage storage) : base(storage)
|
||||||
: base(storage, realm)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -28,7 +27,7 @@ namespace osu.Game.Database
|
|||||||
|
|
||||||
protected override string FileExtension => ".osr";
|
protected override string FileExtension => ".osr";
|
||||||
|
|
||||||
protected override void ExportToStream(ScoreInfo model, Stream stream, ProgressNotification notification, CancellationToken cancellationToken = default)
|
protected override void ExportToStream(ScoreInfo model, Stream stream, ProgressNotification? notification, CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
var file = model.Files.SingleOrDefault();
|
var file = model.Files.SingleOrDefault();
|
||||||
if (file == null)
|
if (file == null)
|
||||||
|
@ -8,8 +8,7 @@ namespace osu.Game.Database
|
|||||||
{
|
{
|
||||||
public class LegacySkinExporter : LegacyArchiveExporter<SkinInfo>
|
public class LegacySkinExporter : LegacyArchiveExporter<SkinInfo>
|
||||||
{
|
{
|
||||||
public LegacySkinExporter(Storage storage, RealmAccess realm)
|
public LegacySkinExporter(Storage storage) : base(storage)
|
||||||
: base(storage, realm)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -159,7 +159,7 @@ namespace osu.Game.Overlays.Settings.Sections
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
skins.CurrentSkinInfo.Value.PerformRead(s => skins.ExportSkin(s));
|
skins.ExportCurrentSkin();
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
@ -50,7 +50,7 @@ namespace osu.Game.Scoring
|
|||||||
PostNotification = obj => PostNotification?.Invoke(obj)
|
PostNotification = obj => PostNotification?.Invoke(obj)
|
||||||
};
|
};
|
||||||
|
|
||||||
scoreExporter = new LegacyScoreExporter(storage, realm)
|
scoreExporter = new LegacyScoreExporter(storage)
|
||||||
{
|
{
|
||||||
PostNotification = obj => PostNotification?.Invoke(obj)
|
PostNotification = obj => PostNotification?.Invoke(obj)
|
||||||
};
|
};
|
||||||
@ -193,7 +193,7 @@ namespace osu.Game.Scoring
|
|||||||
|
|
||||||
public Task<IEnumerable<Live<ScoreInfo>>> Import(ProgressNotification notification, ImportTask[] tasks, ImportParameters parameters = default) => scoreImporter.Import(notification, tasks);
|
public Task<IEnumerable<Live<ScoreInfo>>> Import(ProgressNotification notification, ImportTask[] tasks, ImportParameters parameters = default) => scoreImporter.Import(notification, tasks);
|
||||||
|
|
||||||
public Task Export(ScoreInfo score) => scoreExporter.ExportAsync(score);
|
public Task Export(ScoreInfo score) => scoreExporter.ExportAsync(score, Realm);
|
||||||
|
|
||||||
public Task<Live<ScoreInfo>> ImportAsUpdate(ProgressNotification notification, ImportTask task, ScoreInfo original) => scoreImporter.ImportAsUpdate(notification, task, original);
|
public Task<Live<ScoreInfo>> ImportAsUpdate(ProgressNotification notification, ImportTask task, ScoreInfo original) => scoreImporter.ImportAsUpdate(notification, task, original);
|
||||||
|
|
||||||
|
@ -123,7 +123,7 @@ namespace osu.Game.Skinning
|
|||||||
SourceChanged?.Invoke();
|
SourceChanged?.Invoke();
|
||||||
};
|
};
|
||||||
|
|
||||||
skinExporter = new LegacySkinExporter(storage, realm)
|
skinExporter = new LegacySkinExporter(storage)
|
||||||
{
|
{
|
||||||
PostNotification = obj => PostNotification?.Invoke(obj)
|
PostNotification = obj => PostNotification?.Invoke(obj)
|
||||||
};
|
};
|
||||||
@ -305,7 +305,9 @@ namespace osu.Game.Skinning
|
|||||||
public Task<Live<SkinInfo>> Import(ImportTask task, ImportParameters parameters = default, CancellationToken cancellationToken = default) =>
|
public Task<Live<SkinInfo>> Import(ImportTask task, ImportParameters parameters = default, CancellationToken cancellationToken = default) =>
|
||||||
skinImporter.Import(task, parameters, cancellationToken);
|
skinImporter.Import(task, parameters, cancellationToken);
|
||||||
|
|
||||||
public Task ExportSkin(SkinInfo skin) => skinExporter.ExportAsync(skin);
|
public Task ExportCurrentSkin() => ExportSkin(CurrentSkinInfo.Value);
|
||||||
|
|
||||||
|
public Task ExportSkin(Live<SkinInfo> skin) => skinExporter.ExportAsync(skin);
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user