OSDN Git Service

UIスレッド外からの未読状態の更新と同時に未読発言へ移動するとエラーが発生する不具合を修正 (thx @nue_of_k!)
authorKimura Youichi <kim.upsilon@bucyou.net>
Mon, 17 Oct 2016 12:47:42 +0000 (21:47 +0900)
committerKimura Youichi <kim.upsilon@bucyou.net>
Mon, 17 Oct 2016 13:02:33 +0000 (22:02 +0900)
未読状態を UI スレッド外から操作する機能:

 * 新着時に未読をクリアする
 * Favoritesイベント受信の際に書き込みを未読に戻す

foundTab が確定するタイミングで参照した NextUnreadIndex と、その後 idx にセット
する NextUnreadIndex の値が別スレッドからの操作によって変化している可能性がある

https://ja.osdn.net/ticket/browse.php?group_id=6526&tid=36686

Fixes: 1b6dd99e ("タブ内の発言を検索するためにVirtualListSizeを参照している箇所をTabModel.AllCountに置き換える")

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

index 67efe31..97f09ba 100644 (file)
@@ -4,6 +4,7 @@
  * FIX: 発言詳細部のプロフィール画像に誤ったユーザーの画像が表示されることがある不具合を修正
  * FIX: ツイートURLのコピー時に余分な改行文字が末尾に付く不具合を修正
  * FIX: Bing翻訳機能が使用できなくなっていた問題を修正
+ * FIX: 未読発言への移動時にエラーが発生する不具合を修正 (thx @nue_of_k!)
 
 ==== Ver 1.3.5(2016/10/01)
  * NEW: 140文字を越えるツイートの表示に対応しました
index 1ae4d3a..ae079be 100644 (file)
@@ -5485,6 +5485,8 @@ namespace OpenTween
                 return;
 
             TabModel foundTab = null;
+            int foundIndex = 0;
+
             DetailsListView lst = null;
 
             //現在タブから最終タブまで探索
@@ -5492,11 +5494,13 @@ namespace OpenTween
             {
                 var tabPage = this.ListTab.TabPages[i];
                 var tab = this._statuses.Tabs[tabPage.Text];
+                var unreadIndex = tab.NextUnreadIndex;
 
-                if (tab.NextUnreadIndex != -1)
+                if (unreadIndex != -1)
                 {
                     ListTab.SelectedIndex = i;
                     foundTab = tab;
+                    foundIndex = unreadIndex;
                     lst = (DetailsListView)tabPage.Tag;
                     break;
                 }
@@ -5509,23 +5513,20 @@ namespace OpenTween
                 {
                     var tabPage = this.ListTab.TabPages[i];
                     var tab = this._statuses.Tabs[tabPage.Text];
+                    var unreadIndex = tab.NextUnreadIndex;
 
-                    if (tab.NextUnreadIndex != -1)
+                    if (unreadIndex != -1)
                     {
                         ListTab.SelectedIndex = i;
                         foundTab = tab;
+                        foundIndex = unreadIndex;
                         lst = (DetailsListView)tabPage.Tag;
                         break;
                     }
                 }
             }
 
-            int idx;
-            if (foundTab != null)
-            {
-                idx = foundTab.NextUnreadIndex;
-            }
-            else
+            if (foundTab == null)
             {
                 //全部調べたが未読見つからず→先頭タブの最新発言へ
                 ListTab.SelectedIndex = 0;
@@ -5536,30 +5537,30 @@ namespace OpenTween
                     return;
 
                 if (_statuses.SortOrder == SortOrder.Ascending)
-                    idx = tab.AllCount - 1;
+                    foundIndex = tab.AllCount - 1;
                 else
-                    idx = 0;
+                    foundIndex = 0;
 
                 lst = (DetailsListView)tabPage.Tag;
             }
 
-            SelectListItem(lst, idx);
+            SelectListItem(lst, foundIndex);
 
             if (_statuses.SortMode == ComparerMode.Id)
             {
-                if (_statuses.SortOrder == SortOrder.Ascending && lst.Items[idx].Position.Y > lst.ClientSize.Height - _iconSz - 10 ||
-                    _statuses.SortOrder == SortOrder.Descending && lst.Items[idx].Position.Y < _iconSz + 10)
+                if (_statuses.SortOrder == SortOrder.Ascending && lst.Items[foundIndex].Position.Y > lst.ClientSize.Height - _iconSz - 10 ||
+                    _statuses.SortOrder == SortOrder.Descending && lst.Items[foundIndex].Position.Y < _iconSz + 10)
                 {
                     MoveTop();
                 }
                 else
                 {
-                    lst.EnsureVisible(idx);
+                    lst.EnsureVisible(foundIndex);
                 }
             }
             else
             {
-                lst.EnsureVisible(idx);
+                lst.EnsureVisible(foundIndex);
             }
 
             lst.Focus();