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();
private void RefreshTimeline()
{
+ var curTabModel = this._statuses.Tabs[this._curTab.Text];
+
// 現在表示中のタブのスクロール位置を退避
- var curListScroll = this.SaveListViewScroll(this._curList, this._statuses.Tabs[this._curTab.Text]);
+ var curListScroll = this.SaveListViewScroll(this._curList, curTabModel);
- // 各タブのリスト上の選択位置などを退避
- var listSelections = this.SaveListViewSelection();
+ // 現在表示中のタブのリスト上の選択位置などを退避
+ var curListSelection = this.SaveListViewSelection(this._curList, curTabModel);
//更新確定
PostClass[] notifyPosts;
if (MyCommon._endingFlag) return;
- //リストに反映&選択状態復元
try
{
foreach (TabPage tab in ListTab.TabPages)
{
- DetailsListView lst = (DetailsListView)tab.Tag;
TabModel tabInfo = _statuses.Tabs[tab.Text];
- if (isDelete || lst.VirtualListSize != tabInfo.AllCount)
- {
- using (ControlTransaction.Update(lst))
- {
- if (lst.Equals(_curList))
- {
- this.PurgeListViewItemCache();
- }
- try
- {
- lst.VirtualListSize = tabInfo.AllCount; //リスト件数更新
- }
- catch (Exception)
- {
- //アイコン描画不具合あり?
- }
- // 選択位置などを復元
- this.RestoreListViewSelection(lst, tabInfo, listSelections[tabInfo.TabName]);
- }
- }
if (tabInfo.UnreadCount > 0)
if (this._cfgCommon.TabIconDisp)
if (tab.ImageIndex == -1) tab.ImageIndex = 0; //タブアイコン
//throw;
}
- // スクロール位置を復元
- this.RestoreListViewScroll(this._curList, this._statuses.Tabs[this._curTab.Text], curListScroll);
+ // リストに反映&選択状態復元
+ 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);
+ }
//新着通知
NotifyNewPosts(notifyPosts, soundFile, addCount, newMentionOrDm);
{
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];