Skip to content

Commit

Permalink
発言一覧の選択状態等の更新処理をv1.3.2相当のコードに戻す
Browse files Browse the repository at this point in the history
TweenMain.CreateCacheとかでエラー報告が多発している原因がこれな気がしているのでしばらく戻す

Fixes: ce713ec ("RefreshTimelineでListViewの更新を現在表示中のリストに対してのみ行う")
  • Loading branch information
upsilon committed Nov 20, 2016
1 parent 2b92fa1 commit ecfbc1b
Showing 1 changed file with 27 additions and 65 deletions.
92 changes: 27 additions & 65 deletions OpenTween/Tween.cs
Original file line number Diff line number Diff line change
Expand Up @@ -260,10 +260,6 @@ public bool TryGetValue(int index, out ListViewItem item, out PostClass post)
private PostClass _curPost;
private bool _isColumnChanged = false;

// 各タブの発言一覧のスクロール位置・選択状態を保持するフィールド
private IDictionary<string, ListViewScroll> listViewScroll = new Dictionary<string, ListViewScroll>();
private IDictionary<string, ListViewSelection> listViewSelection = new Dictionary<string, ListViewSelection>();

private const int MAX_WORKER_THREADS = 20;
private SemaphoreSlim workerSemaphore = new SemaphoreSlim(MAX_WORKER_THREADS);
private CancellationTokenSource workerCts = new CancellationTokenSource();
Expand Down Expand Up @@ -1413,8 +1409,8 @@ private void RefreshTimeline()
// 現在表示中のタブのスクロール位置を退避
var curListScroll = this.SaveListViewScroll(this._curList, curTabModel);

// 現在表示中のタブのリスト上の選択位置などを退避
var curListSelection = this.SaveListViewSelection(this._curList, curTabModel);
// 各タブのリスト上の選択位置などを退避
var listSelections = this.SaveListViewSelection();

//更新確定
PostClass[] notifyPosts;
Expand All @@ -1426,6 +1422,28 @@ private void RefreshTimeline()

if (MyCommon._endingFlag) return;

// リストに反映&選択状態復元
foreach (var tabPage in this.ListTab.TabPages.Cast<TabPage>())
{
var listView = (DetailsListView)tabPage.Tag;
var tabModel = this._statuses.Tabs[tabPage.Text];

if (listView.VirtualListSize != tabModel.AllCount || isDelete)
{
using (ControlTransaction.Update(listView))
{
if (listView == this._curList)
this.PurgeListViewItemCache();

// リスト件数更新
listView.VirtualListSize = tabModel.AllCount;

// 選択位置などを復元
this.RestoreListViewSelection(listView, tabModel, listSelections[tabModel.TabName]);
}
}
}

if (addCount > 0)
{
if (this._cfgCommon.TabIconDisp)
Expand All @@ -1443,24 +1461,8 @@ private void RefreshTimeline()
}
}

// リストに反映&選択状態復元
if (this._curList.VirtualListSize != curTabModel.AllCount || isDelete)
{
using (ControlTransaction.Update(this._curList))
{
this.PurgeListViewItemCache();

// リスト件数更新
this._curList.VirtualListSize = curTabModel.AllCount;

// 選択位置などを復元
this.RestoreListViewSelection(this._curList, curTabModel, curListSelection);
}

// スクロール位置の復元は Begin/EndUpdate の外で行う
// 参照: https://github.com/opentween/OpenTween/commit/7dbf6491
this.RestoreListViewScroll(this._curList, curTabModel, curListScroll);
}
// スクロール位置を復元
this.RestoreListViewScroll(this._curList, curTabModel, curListScroll);

//新着通知
NotifyNewPosts(notifyPosts, soundFile, addCount, newMentionOrDm);
Expand Down Expand Up @@ -7470,25 +7472,9 @@ public bool TabRename(string origTabName, out string newTabName)
var tabPage = this.ListTab.TabPages.Cast<TabPage>()
.FirstOrDefault(x => x.Text == origTabName);

// タブ名を変更
if (tabPage != null)
{
ListViewScroll scrollInfo;
if (this.listViewScroll.TryGetValue(origTabName, out scrollInfo))
{
this.listViewScroll.Remove(origTabName);
this.listViewScroll[newTabName] = scrollInfo;
}

ListViewSelection selectionInfo;
if (this.listViewSelection.TryGetValue(origTabName, out selectionInfo))
{
this.listViewSelection.Remove(origTabName);
this.listViewSelection[newTabName] = selectionInfo;
}

//タブ名を変更
tabPage.Text = newTabName;
}

_statuses.RenameTab(origTabName, newTabName);

Expand Down Expand Up @@ -9890,35 +9876,11 @@ private void ListTabSelect(TabPage _tab)
{
SetListProperty();

if (this._curList != null)
{
var beforeSelectedList = this._curList;
var beforeSelectedTabModel = this._statuses.Tabs[this._curTab.Text];

// 発言一覧のスクロール位置・選択状態を退避
this.listViewScroll[beforeSelectedTabModel.TabName] = this.SaveListViewScroll(beforeSelectedList, beforeSelectedTabModel);
this.listViewSelection[beforeSelectedTabModel.TabName] = this.SaveListViewSelection(beforeSelectedList, beforeSelectedTabModel);
}

this.PurgeListViewItemCache();

_curTab = _tab;
_curList = (DetailsListView)_tab.Tag;

var curTabModel = this._statuses.Tabs[this._curTab.Text];

this._curList.VirtualListSize = curTabModel.AllCount;

// 発言一覧のスクロール位置を復元
ListViewScroll scrollInfo;
if (this.listViewScroll.TryGetValue(curTabModel.TabName, out scrollInfo))
this.RestoreListViewScroll(this._curList, curTabModel, scrollInfo);

// 発言一覧の選択状態を復元
ListViewSelection selectionInfo;
if (this.listViewSelection.TryGetValue(curTabModel.TabName, out selectionInfo))
this.RestoreListViewSelection(this._curList, curTabModel, selectionInfo);

if (_curList.SelectedIndices.Count > 0)
{
_curItemIndex = _curList.SelectedIndices[0];
Expand Down

0 comments on commit ecfbc1b

Please sign in to comment.