OSDN Git Service

IMediaItem.IsDisposed プロパティを追加
authorKimura Youichi <kim.upsilon@bucyou.net>
Wed, 18 Jan 2023 22:45:19 +0000 (07:45 +0900)
committerKimura Youichi <kim.upsilon@bucyou.net>
Thu, 19 Jan 2023 01:00:39 +0000 (10:00 +0900)
OpenTween.Tests/MediaSelectorTest.cs
OpenTween/MediaItem.cs
OpenTween/MediaSelector.cs

index e8e101a..1e4ae34 100644 (file)
@@ -176,10 +176,12 @@ namespace OpenTween
 
             mediaSelector.AddMediaItemFromFilePath(new[] { "Resources/re.gif" });
 
+            var mediaItems = mediaSelector.MediaItems.ToArray();
             var thumbnailImages = mediaSelector.ThumbnailList.ToArray(); // 表示中の画像
 
             mediaSelector.ClearMediaItems();
 
+            Assert.True(mediaItems.All(x => x.IsDisposed));
             Assert.True(thumbnailImages.All(x => x.IsDisposed));
         }
 
index f775223..15a0ee7 100644 (file)
@@ -30,7 +30,7 @@ using System.Threading;
 
 namespace OpenTween
 {
-    public interface IMediaItem
+    public interface IMediaItem : IDisposable
     {
         /// <summary>
         /// メディアのID
@@ -38,6 +38,11 @@ namespace OpenTween
         Guid Id { get; }
 
         /// <summary>
+        /// メディアが既に破棄されているかを示す真偽値
+        /// </summary>
+        bool IsDisposed { get; }
+
+        /// <summary>
         /// メディアへの絶対パス
         /// </summary>
         string Path { get; }
@@ -108,6 +113,8 @@ namespace OpenTween
 
         public Guid Id { get; } = Guid.NewGuid();
 
+        public bool IsDisposed { get; private set; } = false;
+
         public string Path
             => this.FileInfo.FullName;
 
@@ -137,6 +144,14 @@ namespace OpenTween
             using var fs = this.FileInfo.OpenRead();
             fs.CopyTo(stream);
         }
+
+        public void Dispose()
+        {
+            if (this.IsDisposed)
+                return;
+
+            this.IsDisposed = true;
+        }
     }
 
     /// <summary>
@@ -145,7 +160,7 @@ namespace OpenTween
     /// <remarks>
     /// 用途の関係上、メモリ使用量が大きくなるため、不要になればできるだけ破棄すること
     /// </remarks>
-    public class MemoryImageMediaItem : IMediaItem, IDisposable
+    public class MemoryImageMediaItem : IMediaItem
     {
         public const string PathPrefix = "<>MemoryImage://";
         private static int fileNumber = 0;
index 943fc02..607b53d 100644 (file)
@@ -213,7 +213,7 @@ namespace OpenTween
             this.MediaItems.Clear();
 
             foreach (var mediaItem in mediaItems)
-                this.DisposeMediaItem(mediaItem);
+                mediaItem.Dispose();
 
             var thumbnailImages = this.ThumbnailList.ToList();
             this.ThumbnailList.Clear();
@@ -267,12 +267,6 @@ namespace OpenTween
             }
         }
 
-        private void DisposeMediaItem(IMediaItem? item)
-        {
-            var disposableItem = item as IDisposable;
-            disposableItem?.Dispose();
-        }
-
         public void SetSelectedMediaAltText(string altText)
         {
             var selectedMedia = this.SelectedMediaItem;