OSDN Git Service

選択中の画像のMemoryImageをMediaSelectorで保持する
authorKimura Youichi <kim.upsilon@bucyou.net>
Wed, 18 Jan 2023 23:17:49 +0000 (08:17 +0900)
committerKimura Youichi <kim.upsilon@bucyou.net>
Thu, 19 Jan 2023 01:18:46 +0000 (10:18 +0900)
OpenTween.Tests/MediaSelectorTest.cs
OpenTween/MediaSelector.cs
OpenTween/MediaSelectorPanel.cs

index 1e4ae34..8e88d53 100644 (file)
@@ -247,6 +247,30 @@ namespace OpenTween
         }
 
         [Fact]
+        public void SelectedMediaItemChange_DisposeTest()
+        {
+            using var twitterApi = new TwitterApi(ApiKey.Create(""), ApiKey.Create(""));
+            using var twitter = new Twitter(twitterApi);
+            using var mediaSelector = new MediaSelector();
+            twitter.Initialize("", "", "", 0L);
+            mediaSelector.InitializeServices(twitter, TwitterConfiguration.DefaultConfiguration());
+            mediaSelector.SelectMediaService("Twitter");
+
+            var images = new[] { "Resources/re.gif", "Resources/re1.png" };
+            mediaSelector.AddMediaItemFromFilePath(images);
+
+            // 1 枚目
+            mediaSelector.SelectedMediaItemIndex = 0;
+            var firstImage = mediaSelector.SelectedMediaItemImage;
+
+            // 2 枚目
+            mediaSelector.SelectedMediaItemIndex = 1;
+            var secondImage = mediaSelector.SelectedMediaItemImage;
+
+            Assert.True(firstImage!.IsDisposed);
+        }
+
+        [Fact]
         public void SetSelectedMediaAltText_Test()
         {
             using var twitterApi = new TwitterApi(ApiKey.Create(""), ApiKey.Create(""));
index 607b53d..9d9bad9 100644 (file)
@@ -41,6 +41,7 @@ namespace OpenTween
         private readonly BindingList<IMediaItem> mediaItems = new();
         private string selectedMediaServiceName = "";
         private Guid? selectedMediaItemId = null;
+        private MemoryImage? selectedMediaItemImage = null;
 
         public bool IsDisposed { get; private set; } = false;
 
@@ -82,7 +83,14 @@ namespace OpenTween
         public Guid? SelectedMediaItemId
         {
             get => this.selectedMediaItemId;
-            set => this.SetProperty(ref this.selectedMediaItemId, value);
+            set
+            {
+                if (this.selectedMediaItemId == value)
+                    return;
+
+                this.SetProperty(ref this.selectedMediaItemId, value);
+                this.LoadSelectedMediaItemImage();
+            }
         }
 
         public IMediaItem? SelectedMediaItem
@@ -94,6 +102,12 @@ namespace OpenTween
             set => this.SelectedMediaItemId = value != -1 ? this.MediaItems[value].Id : null;
         }
 
+        public MemoryImage? SelectedMediaItemImage
+        {
+            get => this.selectedMediaItemImage;
+            set => this.SetProperty(ref this.selectedMediaItemImage, value);
+        }
+
         /// <summary>
         /// 指定された投稿先名から、作成済みの IMediaUploadService インスタンスを取得する。
         /// </summary>
@@ -267,6 +281,33 @@ namespace OpenTween
             }
         }
 
+        private void LoadSelectedMediaItemImage()
+        {
+            var previousImage = this.selectedMediaItemImage;
+
+            if (this.SelectedMediaItem == null)
+            {
+                this.SelectedMediaItemImage = null;
+                previousImage?.Dispose();
+                return;
+            }
+
+            this.SelectedMediaItemImage = this.CreateMediaItemImage(this.SelectedMediaItem);
+            previousImage?.Dispose();
+        }
+
+        private MemoryImage CreateMediaItemImage(IMediaItem media)
+        {
+            try
+            {
+                return media.CreateImage();
+            }
+            catch (InvalidImageException)
+            {
+                return MemoryImage.CopyFromImage(Properties.Resources.MultiMediaImage);
+            }
+        }
+
         public void SetSelectedMediaAltText(string altText)
         {
             var selectedMedia = this.SelectedMediaItem;
index 7521e23..cefbe5d 100644 (file)
@@ -161,6 +161,9 @@ namespace OpenTween
                 case nameof(MediaSelector.SelectedMediaItemId):
                     this.UpdateSelectedMedia();
                     break;
+                case nameof(MediaSelector.SelectedMediaItemImage):
+                    this.UpdateSelectedMediaImage();
+                    break;
                 default:
                     break;
             }
@@ -254,17 +257,18 @@ namespace OpenTween
                 {
                     this.AlternativeTextBox.Text = "";
                     this.AlternativeTextPanel.Enabled = false;
-                    this.ImageSelectedPicture.ShowInitialImage();
                 }
                 else
                 {
                     this.AlternativeTextBox.Text = selectedMedia.AltText;
                     this.AlternativeTextPanel.Enabled = true;
-                    this.ImageSelectedPicture.Image = selectedMedia.CreateImage();
                 }
             }
         }
 
+        private void UpdateSelectedMediaImage()
+            => this.ImageSelectedPicture.Image = this.Model.SelectedMediaItemImage;
+
         private void ImageServiceCombo_SelectedIndexChanged(object sender, EventArgs e)
             => this.Model.SelectedMediaServiceName = this.ImageServiceCombo.Text;