diff --git a/osu.Game/Database/ArchiveModelManager.cs b/osu.Game/Database/ArchiveModelManager.cs
index 50cb9dac8b..ccaba99427 100644
--- a/osu.Game/Database/ArchiveModelManager.cs
+++ b/osu.Game/Database/ArchiveModelManager.cs
@@ -29,7 +29,7 @@ namespace osu.Game.Database
///
/// The model type.
/// The associated file join type.
- public abstract class ArchiveModelManager : ICanAcceptFiles, IModelManager
+ public abstract class ArchiveModelManager : ICanAcceptFiles, IModelManager
where TModel : class, IHasFiles, IHasPrimaryKey, ISoftDelete
where TFileModel : INamedFileInfo, new()
{
@@ -44,7 +44,7 @@ namespace osu.Game.Database
/// Fired when a new becomes available in the database.
/// This is not guaranteed to run on the update thread.
///
- public event ItemAddedDelegate ItemAdded;
+ public event Action ItemAdded;
///
/// Fired when a is removed from the database.
diff --git a/osu.Game/Overlays/Direct/DownloadState.cs b/osu.Game/Online/DownloadState.cs
similarity index 89%
rename from osu.Game/Overlays/Direct/DownloadState.cs
rename to osu.Game/Online/DownloadState.cs
index a301c6a3bd..72efbc286e 100644
--- a/osu.Game/Overlays/Direct/DownloadState.cs
+++ b/osu.Game/Online/DownloadState.cs
@@ -1,7 +1,7 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
-namespace osu.Game.Overlays.Direct
+namespace osu.Game.Online
{
public enum DownloadState
{
diff --git a/osu.Game/Overlays/Direct/DownloadTrackingComposite.cs b/osu.Game/Online/DownloadTrackingComposite.cs
similarity index 63%
rename from osu.Game/Overlays/Direct/DownloadTrackingComposite.cs
rename to osu.Game/Online/DownloadTrackingComposite.cs
index c1ff6ecb60..157211e6c2 100644
--- a/osu.Game/Overlays/Direct/DownloadTrackingComposite.cs
+++ b/osu.Game/Online/DownloadTrackingComposite.cs
@@ -7,18 +7,21 @@ using osu.Framework.Allocation;
using osu.Framework.Bindables;
using osu.Framework.Graphics.Containers;
using osu.Game.Beatmaps;
+using osu.Game.Database;
using osu.Game.Online.API;
-namespace osu.Game.Overlays.Direct
+namespace osu.Game.Online
{
///
/// A component which tracks a beatmap through potential download/import/deletion.
///
- public abstract class DownloadTrackingComposite : CompositeDrawable
+ public abstract class DownloadTrackingComposite : CompositeDrawable
+ where TModel : class
+ where TModelManager : class, IDownloadModelManager
{
- public readonly Bindable BeatmapSet = new Bindable();
+ public readonly Bindable ModelInfo = new Bindable();
- private BeatmapManager beatmaps;
+ private TModelManager manager;
///
/// Holds the current download state of the beatmap, whether is has already been downloaded, is in progress, or is not downloaded.
@@ -27,34 +30,34 @@ namespace osu.Game.Overlays.Direct
protected readonly Bindable Progress = new Bindable();
- protected DownloadTrackingComposite(BeatmapSetInfo beatmapSet = null)
+ protected DownloadTrackingComposite(TModel model = null)
{
- BeatmapSet.Value = beatmapSet;
+ ModelInfo.Value = model;
}
[BackgroundDependencyLoader(true)]
- private void load(BeatmapManager beatmaps)
+ private void load(TModelManager manager)
{
- this.beatmaps = beatmaps;
+ this.manager = manager;
- BeatmapSet.BindValueChanged(setInfo =>
+ ModelInfo.BindValueChanged(modelInfo =>
{
- if (setInfo.NewValue == null)
+ if (modelInfo.NewValue == null)
attachDownload(null);
- else if (beatmaps.GetAllUsableBeatmapSetsEnumerable().Any(s => s.OnlineBeatmapSetID == setInfo.NewValue.OnlineBeatmapSetID))
+ else if (manager.IsAvailableLocally(modelInfo.NewValue))
State.Value = DownloadState.LocallyAvailable;
else
- attachDownload(beatmaps.GetExistingDownload(setInfo.NewValue));
+ attachDownload(manager.GetExistingDownload(modelInfo.NewValue));
}, true);
- beatmaps.DownloadBegan += download =>
+ manager.DownloadBegan += download =>
{
- if (download.Info.OnlineBeatmapSetID == BeatmapSet.Value?.OnlineBeatmapSetID)
+ if (download.Info.Equals(ModelInfo.Value))
attachDownload(download);
};
- beatmaps.ItemAdded += setAdded;
- beatmaps.ItemRemoved += setRemoved;
+ manager.ItemAdded += itemAdded;
+ manager.ItemRemoved += itemRemoved;
}
#region Disposal
@@ -63,10 +66,10 @@ namespace osu.Game.Overlays.Direct
{
base.Dispose(isDisposing);
- if (beatmaps != null)
+ if (manager != null)
{
- beatmaps.DownloadBegan -= attachDownload;
- beatmaps.ItemAdded -= setAdded;
+ manager.DownloadBegan -= attachDownload;
+ manager.ItemAdded -= itemAdded;
}
State.UnbindAll();
@@ -76,9 +79,9 @@ namespace osu.Game.Overlays.Direct
#endregion
- private ArchiveDownloadModelRequest attachedRequest;
+ private ArchiveDownloadModelRequest attachedRequest;
- private void attachDownload(ArchiveDownloadModelRequest request)
+ private void attachDownload(ArchiveDownloadModelRequest request)
{
if (attachedRequest != null)
{
@@ -118,13 +121,13 @@ namespace osu.Game.Overlays.Direct
private void onRequestFailure(Exception e) => Schedule(() => attachDownload(null));
- private void setAdded(BeatmapSetInfo s, bool existing) => setDownloadStateFromManager(s, DownloadState.LocallyAvailable);
+ private void itemAdded(TModel s, bool existing) => setDownloadStateFromManager(s, DownloadState.LocallyAvailable);
- private void setRemoved(BeatmapSetInfo s) => setDownloadStateFromManager(s, DownloadState.NotDownloaded);
+ private void itemRemoved(TModel s) => setDownloadStateFromManager(s, DownloadState.NotDownloaded);
- private void setDownloadStateFromManager(BeatmapSetInfo s, DownloadState state) => Schedule(() =>
+ private void setDownloadStateFromManager(TModel s, DownloadState state) => Schedule(() =>
{
- if (s.OnlineBeatmapSetID != BeatmapSet.Value?.OnlineBeatmapSetID)
+ if (s.Equals(ModelInfo.Value))
return;
State.Value = state;
diff --git a/osu.Game/Overlays/BeatmapSet/Buttons/DownloadButton.cs b/osu.Game/Overlays/BeatmapSet/Buttons/DownloadButton.cs
index 0a159507fe..3e8a5a8324 100644
--- a/osu.Game/Overlays/BeatmapSet/Buttons/DownloadButton.cs
+++ b/osu.Game/Overlays/BeatmapSet/Buttons/DownloadButton.cs
@@ -11,6 +11,7 @@ using osu.Game.Beatmaps;
using osu.Game.Graphics;
using osu.Game.Graphics.Containers;
using osu.Game.Graphics.Sprites;
+using osu.Game.Online;
using osu.Game.Online.API;
using osu.Game.Overlays.Direct;
using osu.Game.Users;
@@ -19,7 +20,7 @@ using osuTK.Graphics;
namespace osu.Game.Overlays.BeatmapSet.Buttons
{
- public class DownloadButton : DownloadTrackingComposite, IHasTooltip
+ public class DownloadButton : BeatmapDownloadTrackingComposite, IHasTooltip
{
private readonly bool noVideo;
diff --git a/osu.Game/Overlays/BeatmapSet/Header.cs b/osu.Game/Overlays/BeatmapSet/Header.cs
index a0f71d05c0..d0c6e4aa62 100644
--- a/osu.Game/Overlays/BeatmapSet/Header.cs
+++ b/osu.Game/Overlays/BeatmapSet/Header.cs
@@ -13,6 +13,7 @@ using osu.Game.Beatmaps.Drawables;
using osu.Game.Graphics;
using osu.Game.Graphics.Sprites;
using osu.Game.Graphics.UserInterface;
+using osu.Game.Online;
using osu.Game.Overlays.BeatmapSet.Buttons;
using osu.Game.Overlays.Direct;
using osuTK;
@@ -21,7 +22,7 @@ using DownloadButton = osu.Game.Overlays.BeatmapSet.Buttons.DownloadButton;
namespace osu.Game.Overlays.BeatmapSet
{
- public class Header : DownloadTrackingComposite
+ public class Header : BeatmapDownloadTrackingComposite
{
private const float transition_duration = 200;
private const float tabs_height = 50;
diff --git a/osu.Game/Overlays/Direct/BeatmapDownloadTrackingComposite.cs b/osu.Game/Overlays/Direct/BeatmapDownloadTrackingComposite.cs
new file mode 100644
index 0000000000..67fc5b48bd
--- /dev/null
+++ b/osu.Game/Overlays/Direct/BeatmapDownloadTrackingComposite.cs
@@ -0,0 +1,16 @@
+using osu.Framework.Bindables;
+using osu.Game.Beatmaps;
+using osu.Game.Online;
+
+namespace osu.Game.Overlays.Direct
+{
+ public abstract class BeatmapDownloadTrackingComposite : DownloadTrackingComposite
+ {
+ public Bindable BeatmapSet => ModelInfo;
+
+ public BeatmapDownloadTrackingComposite(BeatmapSetInfo set = null)
+ : base(set)
+ {
+ }
+ }
+}
diff --git a/osu.Game/Overlays/Direct/DownloadButton.cs b/osu.Game/Overlays/Direct/DownloadButton.cs
index 3f44d854e5..348ce427bd 100644
--- a/osu.Game/Overlays/Direct/DownloadButton.cs
+++ b/osu.Game/Overlays/Direct/DownloadButton.cs
@@ -9,11 +9,12 @@ using osu.Game.Beatmaps;
using osu.Game.Graphics;
using osu.Game.Graphics.Containers;
using osu.Game.Graphics.UserInterface;
+using osu.Game.Online;
using osuTK;
namespace osu.Game.Overlays.Direct
{
- public class DownloadButton : DownloadTrackingComposite
+ public class DownloadButton : BeatmapDownloadTrackingComposite
{
private readonly bool noVideo;
private readonly SpriteIcon icon;
diff --git a/osu.Game/Overlays/Direct/DownloadProgressBar.cs b/osu.Game/Overlays/Direct/DownloadProgressBar.cs
index 57500b3531..a6cefaae84 100644
--- a/osu.Game/Overlays/Direct/DownloadProgressBar.cs
+++ b/osu.Game/Overlays/Direct/DownloadProgressBar.cs
@@ -7,11 +7,12 @@ using osu.Framework.Graphics;
using osu.Game.Beatmaps;
using osu.Game.Graphics;
using osu.Game.Graphics.UserInterface;
+using osu.Game.Online;
using osuTK.Graphics;
namespace osu.Game.Overlays.Direct
{
- public class DownloadProgressBar : DownloadTrackingComposite
+ public class DownloadProgressBar : BeatmapDownloadTrackingComposite
{
private readonly ProgressBar progressBar;