OSDN Git Service

発言詳細部の表示パフォーマンスを改善
authorKimura Youichi <kim.upsilon@bucyou.net>
Mon, 16 Jun 2014 16:08:15 +0000 (01:08 +0900)
committerKimura Youichi <kim.upsilon@bucyou.net>
Mon, 16 Jun 2014 16:30:18 +0000 (01:30 +0900)
 * Control.Text の変更は一回で済ませる (Control.Text += ... のような書き方をしない)
 * PostBrowser.get_DocumentText は負担が大きいため比較に使用しない
 * 更新中に PostBrowser を非表示にする処理を除去
 * 表示するサムネイルが無い場合の TweetThumbnail の負担を極力減らす

OpenTween/Resources/ChangeLog.txt
OpenTween/Tween.Designer.cs
OpenTween/Tween.cs
OpenTween/TweetThumbnail.Designer.cs
OpenTween/TweetThumbnail.cs

index 9060b46..62c71da 100644 (file)
@@ -4,6 +4,7 @@
  * NEW: pic.twitter.com への複数枚画像の投稿に対応しました
   - 投稿先に Twitter を選択し、左端のコンボボックスを切り替えることで、最大 4 枚まで選択可能です
   - 投稿するファイルの数・サイズによっては、投稿完了までに若干の時間がかかります
+ * CHG: 発言詳細部の更新時のパフォーマンスを改善
  * FIX: 一部クライアントから投稿されたツイートの読み込み時にエラーが発生する問題の修正
  * FIX: 短縮URL生成時のエラーが適切に処理されない問題を修正
 
index e312511..1ace565 100644 (file)
             this.SourceLinkLabel.AutoEllipsis = true;
             this.SourceLinkLabel.ContextMenuStrip = this.ContextMenuSource;
             this.SourceLinkLabel.Name = "SourceLinkLabel";
-            this.SourceLinkLabel.TabStop = true;
             this.ToolTip1.SetToolTip(this.SourceLinkLabel, resources.GetString("SourceLinkLabel.ToolTip"));
             this.SourceLinkLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.SourceLinkLabel_LinkClicked);
             this.SourceLinkLabel.MouseEnter += new System.EventHandler(this.SourceLinkLabel_MouseEnter);
index a85ec33..b998b28 100644 (file)
@@ -6038,7 +6038,7 @@ namespace OpenTween
             DispSelectedPost(false);
         }
 
-        private static PostClass displaypost = new PostClass();
+        private PostClass displayPost = new PostClass();
 
         /// <summary>
         /// サムネイルの表示処理を表すタスク
@@ -6055,10 +6055,12 @@ namespace OpenTween
             if (_curList.SelectedIndices.Count == 0 || _curPost == null)
                 return;
 
-            if (!forceupdate && _curPost.Equals(displaypost))
+            var oldDisplayPost = this.displayPost;
+            this.displayPost = this._curPost;
+
+            if (!forceupdate && this._curPost.Equals(oldDisplayPost))
                 return;
 
-            displaypost = _curPost;
             if (displayItem != null)
             {
                 displayItem.ImageDownloaded -= this.DisplayItemImage_Downloaded;
@@ -6067,61 +6069,54 @@ namespace OpenTween
             displayItem = (ImageListViewItem)_curList.Items[_curList.SelectedIndices[0]];
             displayItem.ImageDownloaded += this.DisplayItemImage_Downloaded;
 
-            string dTxt = createDetailHtml(_curPost.IsDeleted ? "(DELETED)" : _curPost.Text);
-            if (_curPost.IsDm)
-            {
-                SourceLinkLabel.Tag = null;
-                SourceLinkLabel.Text = "";
-            }
-            else
+            var sourceText = "";
+            string sourceUrl = null;
+            if (!_curPost.IsDm)
             {
-                Match mc = Regex.Match(_curPost.SourceHtml, "<a href=\"(?<sourceurl>.+?)\"");
+                var mc = Regex.Match(_curPost.SourceHtml, "<a href=\"(?<sourceurl>.+?)\"");
                 if (mc.Success)
                 {
-                    string src = mc.Groups["sourceurl"].Value;
-                    SourceLinkLabel.Tag = mc.Groups["sourceurl"].Value;
-                    mc = Regex.Match(src, "^https?://");
-                    if (!mc.Success)
-                    {
-                        src = src.Insert(0, "https://twitter.com");
-                    }
-                    SourceLinkLabel.Tag = src;
-                }
-                else
-                {
-                    SourceLinkLabel.Tag = null;
-                }
-                if (string.IsNullOrEmpty(_curPost.Source))
-                {
-                    SourceLinkLabel.Text = "";
-                    //SourceLinkLabel.Visible = false;
-                }
-                else
-                {
-                    SourceLinkLabel.Text = _curPost.Source;
-                    //SourceLinkLabel.Visible = true;
+                    var src = mc.Groups["sourceurl"].Value;
+                    if (Regex.IsMatch(src, "^https?://"))
+                        sourceUrl = src;
+                    else
+                        sourceUrl = "https://twitter.com/" + src;
                 }
-            }
-            SourceLinkLabel.TabStop = false;
 
-            if (_statuses.Tabs[_curTab.Text].TabType == MyCommon.TabUsageType.DirectMessage && !_curPost.IsOwl)
-            {
-                NameLabel.Text = "DM TO -> ";
+                if (_curPost.Source != null)
+                    sourceText = _curPost.Source;
             }
-            else if (_statuses.Tabs[_curTab.Text].TabType == MyCommon.TabUsageType.DirectMessage)
+            SourceLinkLabel.Text = sourceText;
+            SourceLinkLabel.Tag = sourceUrl;
+            SourceLinkLabel.TabStop = false; // Text を更新すると勝手に true にされる
+
+            string nameText;
+            if (_curPost.IsDm)
             {
-                NameLabel.Text = "DM FROM <- ";
+                if (_curPost.IsOwl)
+                    nameText = "DM FROM <- ";
+                else
+                    nameText = "DM TO -> ";
             }
             else
             {
-                NameLabel.Text = "";
+                nameText = "";
             }
-            NameLabel.Text += _curPost.ScreenName + "/" + _curPost.Nickname;
+            nameText += _curPost.ScreenName + "/" + _curPost.Nickname;
+            if (_curPost.RetweetedId != null)
+                nameText += " (RT:" + _curPost.RetweetedBy + ")";
+
+            NameLabel.Text = nameText;
             NameLabel.Tag = _curPost.ScreenName;
-            if (!string.IsNullOrEmpty(_curPost.RetweetedBy))
-            {
-                NameLabel.Text += " (RT:" + _curPost.RetweetedBy + ")";
-            }
+
+            var nameForeColor = SystemColors.ControlText;
+            if (_curPost.IsOwl && (this.SettingDialog.OneWayLove || _curPost.IsDm))
+                nameForeColor = this._clOWL;
+            if (_curPost.RetweetedId != null)
+                nameForeColor = this._clRetweet;
+            if (_curPost.IsFav)
+                nameForeColor = this._clFav;
+            NameLabel.ForeColor = nameForeColor;
 
             this.ClearUserPicture();
 
@@ -6138,11 +6133,7 @@ namespace OpenTween
                 }
             }
 
-            NameLabel.ForeColor = System.Drawing.SystemColors.ControlText;
             DateTimeLabel.Text = _curPost.CreatedAt.ToString();
-            if (_curPost.IsOwl && (SettingDialog.OneWayLove || _statuses.Tabs[_curTab.Text].TabType == MyCommon.TabUsageType.DirectMessage)) NameLabel.ForeColor = _clOWL;
-            if (_curPost.RetweetedId != null) NameLabel.ForeColor = _clRetweet;
-            if (_curPost.IsFav) NameLabel.ForeColor = _clFav;
 
             if (DumpPostClassToolStripMenuItem.Checked)
             {
@@ -6164,7 +6155,7 @@ namespace OpenTween
                 sb.AppendFormat("IsProtect      : {0}<br>", _curPost.IsProtect.ToString());
                 sb.AppendFormat("IsRead         : {0}<br>", _curPost.IsRead.ToString());
                 sb.AppendFormat("IsReply        : {0}<br>", _curPost.IsReply.ToString());
-            
+
                 foreach (string nm in _curPost.ReplyToList)
                 {
                     sb.AppendFormat("ReplyToList    : {0}<br>", nm);
@@ -6183,51 +6174,36 @@ namespace OpenTween
                 sb.AppendFormat("SearchTabName  : {0}<br>", _curPost.RelTabName);
                 sb.Append("-----End PostClass Dump<br>");
 
-                PostBrowser.Visible = false;
                 PostBrowser.DocumentText = detailHtmlFormatHeader + sb.ToString() + detailHtmlFormatFooter;
-                PostBrowser.Visible = true;
             }
             else
             {
-                try
+                // 同じIDのツイートであれば WebBrowser とサムネイルの更新を行わない
+                // (同一ツイートの RT は文面が同じであるため同様に更新しない)
+                if (_curPost.StatusId != oldDisplayPost.StatusId)
                 {
-                    if (PostBrowser.DocumentText != dTxt)
-                    {
-                        PostBrowser.Visible = false;
-                        PostBrowser.DocumentText = dTxt;
+                    this.PostBrowser.DocumentText =
+                        this.createDetailHtml(_curPost.IsDeleted ? "(DELETED)" : _curPost.Text);
 
-                        this.SplitContainer3.Panel2Collapsed = true;
+                    this.SplitContainer3.Panel2Collapsed = true;
 
-                        if (this.IsPreviewEnable)
+                    if (this.IsPreviewEnable)
+                    {
+                        if (this.thumbnailTokenSource != null)
                         {
-                            if (this.thumbnailTokenSource != null)
-                            {
-                                var oldTokenSource = this.thumbnailTokenSource;
+                            var oldTokenSource = this.thumbnailTokenSource;
 
-                                oldTokenSource.Cancel();
+                            oldTokenSource.Cancel();
 
-                                this.thumbnailTask.ContinueWith(_ => oldTokenSource.Dispose());
-                            }
+                            this.thumbnailTask.ContinueWith(_ => oldTokenSource.Dispose());
+                        }
 
-                            this.thumbnailTokenSource = new CancellationTokenSource();
+                        this.thumbnailTokenSource = new CancellationTokenSource();
 
-                            var token = this.thumbnailTokenSource.Token;
-                            this.thumbnailTask = this.tweetThumbnail1.ShowThumbnailAsync(_curPost, token);
-                        }
+                        var token = this.thumbnailTokenSource.Token;
+                        this.thumbnailTask = this.tweetThumbnail1.ShowThumbnailAsync(_curPost, token);
                     }
                 }
-                catch (System.Runtime.InteropServices.COMException)
-                {
-                    //原因不明
-                }
-                catch (UriFormatException)
-                {
-                    PostBrowser.DocumentText = dTxt;
-                }
-                finally
-                {
-                    PostBrowser.Visible = true;
-                }
             }
         }
 
index f9cd24a..b8043fc 100644 (file)
@@ -42,7 +42,7 @@
             // 
             resources.ApplyResources(this.scrollBar, "scrollBar");
             this.scrollBar.LargeChange = 1;
-            this.scrollBar.Maximum = 10;
+            this.scrollBar.Maximum = 0;
             this.scrollBar.Name = "scrollBar";
             this.toolTip.SetToolTip(this.scrollBar, resources.GetString("scrollBar.ToolTip"));
             this.scrollBar.ValueChanged += new System.EventHandler(this.scrollBar_ValueChanged);
index 5ac30a3..27ffcdc 100644 (file)
@@ -69,6 +69,12 @@ namespace OpenTween
 
             this.scrollBar.Enabled = false;
 
+            if (post.Media.Count == 0 && post.PostGeo.Lat == 0 && post.PostGeo.Lng == 0)
+            {
+                this.SetThumbnailCount(0);
+                return;
+            }
+
             var thumbnails = (await this.GetThumbailInfoAsync(post, cancelToken))
                 .ToArray();
 
@@ -123,7 +129,10 @@ namespace OpenTween
         /// <param name="count">表示するサムネイルの数</param>
         protected void SetThumbnailCount(int count)
         {
-            using (ControlTransaction.Layout(this, false))
+            if (count == 0 && this.pictureBox.Count == 0)
+                return;
+
+            using (ControlTransaction.Layout(this.panelPictureBox, false))
             {
                 this.panelPictureBox.Controls.Clear();
                 foreach (var picbox in this.pictureBox)