using OpenTween.Connection;
using OpenTween.Models;
using OpenTween.OpenTweenCustomControl;
+using OpenTween.Setting;
using OpenTween.Thumbnail;
namespace OpenTween
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();
ImageSelector.Initialize(tw, this.tw.Configuration, _cfgCommon.UseImageServiceName, _cfgCommon.UseImageService);
//ハッシュタグ/@id関連
- AtIdSupl = new AtIdSupplement(SettingAtIdList.Load().AtIdList, "@");
+ AtIdSupl = new AtIdSupplement(SettingManager.AtIdList.AtIdList, "@");
HashSupl = new AtIdSupplement(_cfgCommon.HashTags, "#");
HashMgr = new HashtagManage(HashSupl,
_cfgCommon.HashTags.ToArray(),
private void LoadConfig()
{
- _cfgCommon = SettingCommon.Load();
- SettingCommon.Instance = this._cfgCommon;
- if (_cfgCommon.UserAccounts == null || _cfgCommon.UserAccounts.Count == 0)
- {
- _cfgCommon.UserAccounts = new List<UserAccount>();
- if (!string.IsNullOrEmpty(_cfgCommon.UserName))
- {
- UserAccount account = new UserAccount();
- account.Username = _cfgCommon.UserName;
- account.UserId = _cfgCommon.UserId;
- account.Token = _cfgCommon.Token;
- account.TokenSecret = _cfgCommon.TokenSecret;
+ SettingManager.LoadAll();
- _cfgCommon.UserAccounts.Add(account);
- }
- }
-
- _cfgLocal = SettingLocal.Load();
+ this._cfgCommon = SettingManager.Common;
+ this._cfgLocal = SettingManager.Local;
// v1.2.4 以前の設定には ScaleDimension の項目がないため、現在の DPI と同じとして扱う
if (_cfgLocal.ScaleDimension.IsEmpty)
_cfgLocal.ScaleDimension = this.CurrentAutoScaleDimensions;
- var tabsSetting = SettingTabs.Load().Tabs;
- foreach (var tabSetting in tabsSetting)
+ var tabSettings = SettingManager.Tabs;
+ foreach (var tabSetting in tabSettings.Tabs)
{
TabModel tab;
switch (tabSetting.TabType)
// 現在表示中のタブのスクロール位置を退避
var curListScroll = this.SaveListViewScroll(this._curList, curTabModel);
- // 現在表示中のタブのリスト上の選択位置などを退避
- var curListSelection = this.SaveListViewSelection(this._curList, curTabModel);
+ // 各タブのリスト上の選択位置などを退避
+ var listSelections = this.SaveListViewSelection();
//更新確定
PostClass[] notifyPosts;
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();
+
+ try
+ {
+ // リスト件数更新
+ listView.VirtualListSize = tabModel.AllCount;
+ }
+ catch (NullReferenceException ex)
+ {
+ // WinForms 内部で ListView.set_TopItem が発生させている例外
+ // https://ja.osdn.net/ticket/browse.php?group_id=6526&tid=36588
+ MyCommon.TraceOut(ex, $"TabType: {tabModel.TabType}, Count: {tabModel.AllCount}, ListSize: {listView.VirtualListSize}");
+ }
+
+ // 選択位置などを復元
+ this.RestoreListViewSelection(listView, tabModel, listSelections[tabModel.TabName]);
+ }
+ }
+ }
+
if (addCount > 0)
{
if (this._cfgCommon.TabIconDisp)
}
}
- // リストに反映&選択状態復元
- 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);
if (listScroll.ScrollLockMode == ScrollLockMode.FixedToItem)
{
- var topItem = listView.TopItem;
- if (topItem != null)
- listScroll.TopItemStatusId = tab.GetStatusIdAt(topItem.Index);
+ var topItemIndex = listView.TopItem?.Index ?? -1;
+ if (topItemIndex != -1 && topItemIndex < tab.AllCount)
+ listScroll.TopItemStatusId = tab.GetStatusIdAt(topItemIndex);
}
return listScroll;
private long? GetFocusedStatusId(DetailsListView listView, TabModel tab)
{
- var focusedItem = listView.FocusedItem;
+ var index = listView.FocusedItem?.Index ?? -1;
- return focusedItem != null ? tab.GetStatusIdAt(focusedItem.Index) : (long?)null;
+ return index != -1 && index < tab.AllCount ? tab.GetStatusIdAt(index) : (long?)null;
}
private long? GetSelectionMarkStatusId(DetailsListView listView, TabModel tab)
{
- var selectionMarkIndex = listView.SelectionMark;
+ var index = listView.SelectionMark;
- return selectionMarkIndex != -1 ? tab.GetStatusIdAt(selectionMarkIndex) : (long?)null;
+ return index != -1 && index < tab.AllCount ? tab.GetStatusIdAt(index) : (long?)null;
}
/// <summary>
TwitterApiConnection.RestApiHost = this._cfgCommon.TwitterApiHost;
Networking.DefaultTimeout = TimeSpan.FromSeconds(this._cfgCommon.DefaultTimeOut);
+ Networking.UploadImageTimeout = TimeSpan.FromSeconds(this._cfgCommon.UploadImageTimeout);
Networking.SetWebProxy(this._cfgLocal.ProxyType,
this._cfgLocal.ProxyAddress, this._cfgLocal.ProxyPort,
this._cfgLocal.ProxyUser, this._cfgLocal.ProxyPassword);
if (_ignoreConfigSave || !this._cfgCommon.UseAtIdSupplement && AtIdSupl == null) return;
ModifySettingAtId = false;
- SettingAtIdList cfgAtId = new SettingAtIdList(AtIdSupl.GetItemList());
- cfgAtId.Save();
+ SettingManager.AtIdList.AtIdList = this.AtIdSupl.GetItemList();
+ SettingManager.SaveAtIdList();
}
private void SaveConfigsCommon()
_cfgCommon.UseImageService = ImageSelector.ServiceIndex;
_cfgCommon.UseImageServiceName = ImageSelector.ServiceName;
- _cfgCommon.Save();
+ SettingManager.SaveCommon();
}
}
_cfgLocal.FontInputFont = _fntInputFont;
if (_ignoreConfigSave) return;
- _cfgLocal.Save();
+ SettingManager.SaveLocal();
}
}
private void SaveConfigsTabs()
{
- var tabsSetting = new SettingTabs();
+ var tabSettingList = new List<SettingTabs.SettingTabItem>();
var tabs = this.ListTab.TabPages.Cast<TabPage>()
.Select(x => this._statuses.Tabs[x.Text])
if (listTab != null)
tabSetting.ListInfo = listTab.ListInfo;
- tabsSetting.Tabs.Add(tabSetting);
+ tabSettingList.Add(tabSetting);
}
- tabsSetting.Save();
+ SettingManager.Tabs.Tabs = tabSettingList;
+ SettingManager.SaveTabs();
}
private async void OpenURLFileMenuItem_Click(object sender, EventArgs e)
}
var tabPage = this.ListTab.TabPages.Cast<TabPage>()
- .First(x => x.Text == origTabName);
-
- ListViewScroll scrollInfo;
- if (this.listViewScroll.TryGetValue(origTabName, out scrollInfo))
- {
- this.listViewScroll.Remove(origTabName);
- this.listViewScroll[newTabName] = scrollInfo;
- }
+ .FirstOrDefault(x => x.Text == origTabName);
- ListViewSelection selectionInfo;
- if (this.listViewSelection.TryGetValue(origTabName, out selectionInfo))
- {
- this.listViewSelection.Remove(origTabName);
- this.listViewSelection[newTabName] = selectionInfo;
- }
+ // タブ名を変更
+ if (tabPage != null)
+ tabPage.Text = newTabName;
- //タブ名を変更
- tabPage.Text = newTabName;
_statuses.RenameTab(origTabName, newTabName);
SaveConfigsCommon();
{
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];