OSDN Git Service

MediaSelectorに代替テキストの入力欄を追加
authorKimura Youichi <kim.upsilon@bucyou.net>
Fri, 27 May 2016 18:57:48 +0000 (03:57 +0900)
committerKimura Youichi <kim.upsilon@bucyou.net>
Fri, 27 May 2016 19:43:00 +0000 (04:43 +0900)
OpenTween.Tests/MediaSelectorTest.cs
OpenTween/MediaSelector.Designer.cs
OpenTween/MediaSelector.cs
OpenTween/MediaSelector.en.resx
OpenTween/MediaSelector.resx
OpenTween/Resources/ChangeLog.txt

index 68eb5fe..f530d34 100644 (file)
@@ -46,6 +46,9 @@ namespace OpenTween
                 // ページ番号が初期化された状態
                 var pages = mediaSelector.ImagePageCombo.Items;
                 Assert.Equal(new[] { "1" }, pages.Cast<object>().Select(x => x.ToString()));
+
+                // 代替テキストの入力欄が表示された状態
+                Assert.True(mediaSelector.AlternativeTextPanel.Visible);
             }
         }
 
@@ -64,6 +67,9 @@ namespace OpenTween
                 // ページ番号が初期化された状態
                 var pages = mediaSelector.ImagePageCombo.Items;
                 Assert.Equal(new[] { "1" }, pages.Cast<object>().Select(x => x.ToString()));
+
+                // 代替テキストの入力欄が非表示の状態
+                Assert.False(mediaSelector.AlternativeTextPanel.Visible);
             }
         }
 
@@ -271,6 +277,42 @@ namespace OpenTween
         }
 
         [Fact]
+        public void PageChange_AlternativeTextTest()
+        {
+            using (var twitter = new Twitter())
+            using (var mediaSelector = new MediaSelector { Visible = false, Enabled = false })
+            {
+                twitter.Initialize("", "", "", 0L);
+                mediaSelector.Initialize(twitter, TwitterConfiguration.DefaultConfiguration(), "Twitter");
+
+                var images = new[] { "Resources/re.gif", "Resources/re1.png" };
+                mediaSelector.BeginSelection(images);
+
+                // 1 ページ目
+                mediaSelector.ImagePageCombo.SelectedIndex = 0;
+                mediaSelector.AlternativeTextBox.Text = "Page 1";
+
+                // 2 ページ目
+                mediaSelector.ImagePageCombo.SelectedIndex = 1;
+                mediaSelector.AlternativeTextBox.Text = "Page 2";
+
+                // 3 ページ目 (新規ページ)
+                mediaSelector.ImagePageCombo.SelectedIndex = 2;
+                mediaSelector.AlternativeTextBox.Text = "Page 3";
+
+                mediaSelector.ImagePageCombo.SelectedIndex = 0;
+                Assert.Equal("Page 1", mediaSelector.AlternativeTextBox.Text);
+
+                mediaSelector.ImagePageCombo.SelectedIndex = 1;
+                Assert.Equal("Page 2", mediaSelector.AlternativeTextBox.Text);
+
+                // 画像が指定されていないページは入力した代替テキストも保持されない
+                mediaSelector.ImagePageCombo.SelectedIndex = 2;
+                Assert.Equal("", mediaSelector.AlternativeTextBox.Text);
+            }
+        }
+
+        [Fact]
         public void PageChange_ImageDisposeTest()
         {
             using (var twitter = new Twitter())
index 6a15cd8..d4c3a84 100644 (file)
@@ -29,7 +29,6 @@
         private void InitializeComponent()
         {
             System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MediaSelector));
-            this.ImageSelectedPicture = new OpenTween.OTPictureBox();
             this.ImagePathPanel = new System.Windows.Forms.Panel();
             this.ImagefilePathText = new System.Windows.Forms.TextBox();
             this.ImagePageCombo = new System.Windows.Forms.ComboBox();
             this.Label2 = new System.Windows.Forms.Label();
             this.ImageServiceCombo = new System.Windows.Forms.ComboBox();
             this.ImageCancelButton = new System.Windows.Forms.Button();
-            ((System.ComponentModel.ISupportInitialize)(this.ImageSelectedPicture)).BeginInit();
+            this.AlternativeTextPanel = new System.Windows.Forms.Panel();
+            this.AlternativeTextBox = new System.Windows.Forms.TextBox();
+            this.AlternativeTextLabel = new System.Windows.Forms.Label();
+            this.ImageSelectedPicture = new OpenTween.OTPictureBox();
             this.ImagePathPanel.SuspendLayout();
+            this.AlternativeTextPanel.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.ImageSelectedPicture)).BeginInit();
             this.SuspendLayout();
             // 
-            // ImageSelectedPicture
-            // 
-            resources.ApplyResources(this.ImageSelectedPicture, "ImageSelectedPicture");
-            this.ImageSelectedPicture.Name = "ImageSelectedPicture";
-            this.ImageSelectedPicture.TabStop = false;
-            // 
             // ImagePathPanel
             // 
             this.ImagePathPanel.Controls.Add(this.ImagefilePathText);
             this.ImageCancelButton.UseVisualStyleBackColor = true;
             this.ImageCancelButton.Click += new System.EventHandler(this.ImageCancelButton_Click);
             // 
+            // AlternativeTextPanel
+            // 
+            resources.ApplyResources(this.AlternativeTextPanel, "AlternativeTextPanel");
+            this.AlternativeTextPanel.Controls.Add(this.AlternativeTextBox);
+            this.AlternativeTextPanel.Controls.Add(this.AlternativeTextLabel);
+            this.AlternativeTextPanel.Name = "AlternativeTextPanel";
+            // 
+            // AlternativeTextBox
+            // 
+            resources.ApplyResources(this.AlternativeTextBox, "AlternativeTextBox");
+            this.AlternativeTextBox.Name = "AlternativeTextBox";
+            this.AlternativeTextBox.TextChanged += new System.EventHandler(this.AlternativeTextBox_TextChanged);
+            // 
+            // AlternativeTextLabel
+            // 
+            resources.ApplyResources(this.AlternativeTextLabel, "AlternativeTextLabel");
+            this.AlternativeTextLabel.Name = "AlternativeTextLabel";
+            // 
+            // ImageSelectedPicture
+            // 
+            resources.ApplyResources(this.ImageSelectedPicture, "ImageSelectedPicture");
+            this.ImageSelectedPicture.Name = "ImageSelectedPicture";
+            this.ImageSelectedPicture.TabStop = false;
+            // 
             // MediaSelector
             // 
             resources.ApplyResources(this, "$this");
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
             this.Controls.Add(this.ImageSelectedPicture);
+            this.Controls.Add(this.AlternativeTextPanel);
             this.Controls.Add(this.ImagePathPanel);
             this.Name = "MediaSelector";
-            ((System.ComponentModel.ISupportInitialize)(this.ImageSelectedPicture)).EndInit();
             this.ImagePathPanel.ResumeLayout(false);
             this.ImagePathPanel.PerformLayout();
+            this.AlternativeTextPanel.ResumeLayout(false);
+            this.AlternativeTextPanel.PerformLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.ImageSelectedPicture)).EndInit();
             this.ResumeLayout(false);
+            this.PerformLayout();
 
         }
 
         internal System.Windows.Forms.Label Label2;
         internal System.Windows.Forms.ComboBox ImageServiceCombo;
         internal System.Windows.Forms.Button ImageCancelButton;
+        internal System.Windows.Forms.Panel AlternativeTextPanel;
+        internal System.Windows.Forms.TextBox AlternativeTextBox;
+        internal System.Windows.Forms.Label AlternativeTextLabel;
     }
 }
index a4ce913..2a3b97d 100644 (file)
@@ -138,6 +138,8 @@ namespace OpenTween
                 }
             }
 
+            public string AltText => this.Item?.AltText ?? "";
+
             public override string ToString()
             {
                 return this.Text;
@@ -262,6 +264,7 @@ namespace OpenTween
             if (count == 1)
             {
                 ImagefilePathText.Text = items[0].Path;
+                AlternativeTextBox.Text = items[0].AltText;
                 ImageFromSelectedFile(items[0], false);
             }
             else
@@ -269,7 +272,11 @@ namespace OpenTween
                 for (int i = 0; i < count; i++)
                 {
                     var index = ImagePageCombo.Items.Count - 1;
-                    if (index == 0) ImagefilePathText.Text = items[i].Path;
+                    if (index == 0)
+                    {
+                        ImagefilePathText.Text = items[i].Path;
+                        AlternativeTextBox.Text = items[i].AltText;
+                    }
                     ImageFromSelectedFile(index, items[i], false);
                 }
             }
@@ -432,6 +439,7 @@ namespace OpenTween
                 media.Item = null;
 
                 item = CreateFileMediaItem(path, noMsgBox);
+                item.AltText = AlternativeTextBox.Text;
             }
 
             ImagefilePathText.Text = path;
@@ -663,8 +671,13 @@ namespace OpenTween
             {
                 ImageServiceCombo.SelectedIndex = 0;
             }
+
+            this.UpdateAltTextPanelVisible();
         }
 
+        private void UpdateAltTextPanelVisible()
+            => this.AlternativeTextPanel.Visible = this.SelectedService.CanUseAltText;
+
         private void ImageServiceCombo_SelectedIndexChanged(object sender, EventArgs e)
         {
             if (this.Visible)
@@ -672,6 +685,8 @@ namespace OpenTween
                 var imageService = this.SelectedService;
                 if (imageService != null)
                 {
+                    this.UpdateAltTextPanelVisible();
+
                     if (ImagePageCombo.Items.Count > 0)
                     {
                         // 画像が選択された投稿先に対応しているかをチェックする
@@ -743,6 +758,7 @@ namespace OpenTween
 
                 ImagePageCombo.Items.Add(media);
                 ImagefilePathText.Text = media.Path;
+                AlternativeTextBox.Text = media.AltText;
 
                 ImagePageCombo.SelectedIndex = 0;
             }
@@ -802,7 +818,11 @@ namespace OpenTween
             media.Item = null;
             media.Type = MyCommon.UploadFileType.Invalid;
 
-            if (index == selectedIndex) ImagefilePathText.Text = "";
+            if (index == selectedIndex)
+            {
+                ImagefilePathText.Text = "";
+                AlternativeTextBox.Text = "";
+            }
         }
 
         private void ValidateSelectedImagePage()
@@ -811,6 +831,7 @@ namespace OpenTween
             var media = (SelectedMedia)ImagePageCombo.Items[idx];
             ImageServiceCombo.Enabled = (idx == 0);  // idx == 0 以外では投稿先サービスを選べないようにする
             ImagefilePathText.Text = media.Path;
+            AlternativeTextBox.Text = media.AltText;
             ImageFromSelectedFile(media.Item, true);
         }
 
@@ -818,5 +839,14 @@ namespace OpenTween
         {
             ValidateSelectedImagePage();
         }
+
+        private void AlternativeTextBox_TextChanged(object sender, EventArgs e)
+        {
+            var selectedMedia = (SelectedMedia)this.ImagePageCombo.SelectedItem;
+            if (selectedMedia.Item == null)
+                return;
+
+            selectedMedia.Item.AltText = this.AlternativeTextBox.Text;
+        }
     }
 }
index 5ee02f6..fd51a0b 100644 (file)
   <data name="Label2.Text" xml:space="preserve">
     <value>Service</value>
   </data>
+  <data name="AlternativeTextLabel.Text" xml:space="preserve">
+    <value>&amp;Alternative text:</value>
+  </data>
 </root>
\ No newline at end of file
index a8e2876..c73dead 100644 (file)
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
   <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
-  <data name="ImageSelectedPicture.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
-    <value>Fill</value>
-  </data>
-  <data name="ImageSelectedPicture.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
-    <value>NoControl</value>
-  </data>
-  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-  <data name="ImageSelectedPicture.Location" type="System.Drawing.Point, System.Drawing">
-    <value>0, 0</value>
-  </data>
-  <data name="ImageSelectedPicture.Size" type="System.Drawing.Size, System.Drawing">
-    <value>608, 252</value>
-  </data>
-  <data name="ImageSelectedPicture.SizeMode" type="System.Windows.Forms.PictureBoxSizeMode, System.Windows.Forms">
-    <value>Zoom</value>
-  </data>
-  <assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
-  <data name="ImageSelectedPicture.TabIndex" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
-  <data name="&gt;&gt;ImageSelectedPicture.Name" xml:space="preserve">
-    <value>ImageSelectedPicture</value>
-  </data>
-  <data name="&gt;&gt;ImageSelectedPicture.Type" xml:space="preserve">
-    <value>OpenTween.OTPictureBox, OpenTween, Version=0.1.0.0, Culture=neutral, PublicKeyToken=null</value>
-  </data>
-  <data name="&gt;&gt;ImageSelectedPicture.Parent" xml:space="preserve">
-    <value>$this</value>
-  </data>
-  <data name="&gt;&gt;ImageSelectedPicture.ZOrder" xml:space="preserve">
-    <value>0</value>
-  </data>
   <data name="ImagefilePathText.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
     <value>Fill</value>
   </data>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
   <data name="ImagefilePathText.Location" type="System.Drawing.Point, System.Drawing">
     <value>61, 3</value>
   </data>
   <data name="ImagefilePathText.Size" type="System.Drawing.Size, System.Drawing">
     <value>297, 19</value>
   </data>
+  <assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
   <data name="ImagefilePathText.TabIndex" type="System.Int32, mscorlib">
     <value>1</value>
   </data>
     <value>$this</value>
   </data>
   <data name="&gt;&gt;ImagePathPanel.ZOrder" xml:space="preserve">
+    <value>2</value>
+  </data>
+  <data name="AlternativeTextPanel.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="AlternativeTextBox.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Left, Right</value>
+  </data>
+  <data name="AlternativeTextBox.Location" type="System.Drawing.Point, System.Drawing">
+    <value>109, 3</value>
+  </data>
+  <data name="AlternativeTextBox.Size" type="System.Drawing.Size, System.Drawing">
+    <value>496, 19</value>
+  </data>
+  <data name="AlternativeTextBox.TabIndex" type="System.Int32, mscorlib">
+    <value>1</value>
+  </data>
+  <data name="&gt;&gt;AlternativeTextBox.Name" xml:space="preserve">
+    <value>AlternativeTextBox</value>
+  </data>
+  <data name="&gt;&gt;AlternativeTextBox.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;AlternativeTextBox.Parent" xml:space="preserve">
+    <value>AlternativeTextPanel</value>
+  </data>
+  <data name="&gt;&gt;AlternativeTextBox.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="AlternativeTextLabel.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Bottom, Left</value>
+  </data>
+  <data name="AlternativeTextLabel.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
+  </data>
+  <data name="AlternativeTextLabel.Location" type="System.Drawing.Point, System.Drawing">
+    <value>3, 3</value>
+  </data>
+  <data name="AlternativeTextLabel.Size" type="System.Drawing.Size, System.Drawing">
+    <value>100, 19</value>
+  </data>
+  <data name="AlternativeTextLabel.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="AlternativeTextLabel.Text" xml:space="preserve">
+    <value>代替テキスト(&amp;A):</value>
+  </data>
+  <data name="AlternativeTextLabel.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
+    <value>MiddleRight</value>
+  </data>
+  <data name="&gt;&gt;AlternativeTextLabel.Name" xml:space="preserve">
+    <value>AlternativeTextLabel</value>
+  </data>
+  <data name="&gt;&gt;AlternativeTextLabel.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;AlternativeTextLabel.Parent" xml:space="preserve">
+    <value>AlternativeTextPanel</value>
+  </data>
+  <data name="&gt;&gt;AlternativeTextLabel.ZOrder" xml:space="preserve">
     <value>1</value>
   </data>
+  <data name="AlternativeTextPanel.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+    <value>Bottom</value>
+  </data>
+  <data name="AlternativeTextPanel.Location" type="System.Drawing.Point, System.Drawing">
+    <value>0, 227</value>
+  </data>
+  <data name="AlternativeTextPanel.Size" type="System.Drawing.Size, System.Drawing">
+    <value>608, 25</value>
+  </data>
+  <data name="AlternativeTextPanel.TabIndex" type="System.Int32, mscorlib">
+    <value>2</value>
+  </data>
+  <data name="AlternativeTextPanel.Visible" type="System.Boolean, mscorlib">
+    <value>False</value>
+  </data>
+  <data name="&gt;&gt;AlternativeTextPanel.Name" xml:space="preserve">
+    <value>AlternativeTextPanel</value>
+  </data>
+  <data name="&gt;&gt;AlternativeTextPanel.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;AlternativeTextPanel.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;AlternativeTextPanel.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="ImageSelectedPicture.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+    <value>Fill</value>
+  </data>
+  <data name="ImageSelectedPicture.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
+  </data>
+  <data name="ImageSelectedPicture.Location" type="System.Drawing.Point, System.Drawing">
+    <value>0, 0</value>
+  </data>
+  <data name="ImageSelectedPicture.Size" type="System.Drawing.Size, System.Drawing">
+    <value>608, 227</value>
+  </data>
+  <data name="ImageSelectedPicture.SizeMode" type="System.Windows.Forms.PictureBoxSizeMode, System.Windows.Forms">
+    <value>Zoom</value>
+  </data>
+  <data name="ImageSelectedPicture.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="&gt;&gt;ImageSelectedPicture.Name" xml:space="preserve">
+    <value>ImageSelectedPicture</value>
+  </data>
+  <data name="&gt;&gt;ImageSelectedPicture.Type" xml:space="preserve">
+    <value>OpenTween.OTPictureBox, OpenTween, Version=0.1.0.0, Culture=neutral, PublicKeyToken=null</value>
+  </data>
+  <data name="&gt;&gt;ImageSelectedPicture.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;ImageSelectedPicture.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
   <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>True</value>
   </metadata>
index 4ce5a1a..fa1d568 100644 (file)
@@ -3,6 +3,8 @@
 ==== Ver 1.3.3-dev(2016/xx/xx)
  * NEW: twemoji V2 に対応しました
   - 「絵文字を画像で表示する(Twemoji)」が有効な場合に Unicode 8.0 で追加された絵文字が表示されるようになります
+ * NEW: pic.twitter.com の画像アップロード時に代替テキストを送信できるようになりました
+  - 代替テキストについては https://blog.twitter.com/ja/2016/0330alt を参照して下さい
 
 ==== Ver 1.3.2(2016/04/12)
  * NEW: touch.pixiv.net のサムネイル表示に対応 (pixiv.net は既に対応しています)