var ret = this.tabinfo.AddTab(tab);
Assert.True(ret);
- Assert.Same(tab, this.tabinfo.Tabs.Values.Last());
+ Assert.Same(tab, this.tabinfo.Tabs.Last());
}
[Fact]
{
_sts = TabInformations.GetInstance();
ListTabs.Items.Clear();
- foreach (var tab in this._sts.Tabs.Values)
+ foreach (var tab in this._sts.Tabs)
{
if (tab.TabType == MyCommon.TabUsageType.Mute)
continue;
--- /dev/null
+// OpenTween - Client of Twitter
+// Copyright (c) 2019 kim_upsilon (@kim_upsilon) <https://upsilo.net/~upsilon/>
+// All rights reserved.
+//
+// This file is part of OpenTween.
+//
+// This program is free software; you can redistribute it and/or modify it
+// under the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 3 of the License, or (at your option)
+// any later version.
+//
+// This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this program. If not, see <http://www.gnu.org/licenses/>, or write to
+// the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
+// Boston, MA 02110-1301, USA.
+
+using System.Collections.ObjectModel;
+
+namespace OpenTween.Models
+{
+ public class TabCollection : KeyedCollection<string, TabModel>
+ {
+ public bool TryGetValue(string tabName, out TabModel tab)
+ => this.Dictionary.TryGetValue(tabName, out tab);
+
+ protected override string GetKeyForItem(TabModel tab)
+ => tab.TabName;
+ }
+}
public sealed class TabInformations
{
//個別タブの情報をDictionaryで保持
- public Dictionary<string, TabModel> Tabs { get; } = new Dictionary<string, TabModel>();
+ public TabCollection Tabs { get; } = new TabCollection();
public ConcurrentDictionary<long, PostClass> Posts { get; } = new ConcurrentDictionary<long, PostClass>();
private Dictionary<long, PostClass> _quotes = new Dictionary<long, PostClass>();
{
lock (this.LockObj)
{
- if (this.Tabs.ContainsKey(tab.TabName))
+ if (this.Tabs.Contains(tab.TabName))
return false;
- this.Tabs.Add(tab.TabName, tab);
+ this.Tabs.Add(tab);
tab.SetSortMode(this.SortMode, this.SortOrder);
return true;
var exist = false;
var Id = tb.GetStatusIdAt(idx);
if (Id < 0) continue;
- foreach (var tab in this.Tabs.Values)
+ foreach (var tab in this.Tabs)
{
if (tab != tb && tab != dmTab)
{
}
public bool ContainsTab(string TabText)
- => this.Tabs.ContainsKey(TabText);
+ => this.Tabs.Contains(TabText);
public bool ContainsTab(TabModel ts)
- => this.Tabs.ContainsValue(ts);
+ => this.Tabs.Contains(ts);
public void SelectTab(string tabName)
{
- if (!this.Tabs.ContainsKey(tabName))
+ if (!this.Tabs.Contains(tabName))
throw new ArgumentException($"{tabName} does not exist.", nameof(tabName));
this.SelectedTabName = tabName;
throw new TabException(message);
}
- public Dictionary<string, TabModel>.KeyCollection KeysTab
- => this.Tabs.Keys;
-
public SortOrder SortOrder { get; private set; }
public ComparerMode SortMode { get; private set; }
this.SortMode = mode;
this.SortOrder = sortOrder;
- foreach (var tab in this.Tabs.Values)
+ foreach (var tab in this.Tabs)
tab.SetSortMode(mode, sortOrder);
}
public void RemovePostFromAllTabs(long statusId, bool setIsDeleted)
{
- foreach (var tab in this.Tabs.Values)
+ foreach (var tab in this.Tabs)
{
tab.EnqueueRemovePost(statusId, setIsDeleted);
}
var currentNotifyPriority = -1;
- foreach (var tab in this.Tabs.Values)
+ foreach (var tab in this.Tabs)
{
// 振分確定 (各タブに反映)
var addedIds = tab.AddSubmit();
foreach (var removedId in removedIdsAll.Distinct())
{
var orphaned = true;
- foreach (var tab in this.Tabs.Values)
+ foreach (var tab in this.Tabs)
{
if (tab.Contains(removedId))
{
{
lock (LockObj)
{
- foreach (var tab in this.Tabs.Values)
+ foreach (var tab in this.Tabs)
{
if (!tab.Contains(statusId))
continue;
var tb = this.Tabs[Original];
this.Tabs.Remove(Original);
tb.TabName = NewName;
- this.Tabs.Add(NewName, tb);
+ this.Tabs.Add(tb);
}
}
var homeTab = GetTabByType(MyCommon.TabUsageType.Home);
var detachedIdsAll = Enumerable.Empty<long>();
- foreach (var tab in this.Tabs.Values.OfType<FilterTabModel>().ToArray())
+ foreach (var tab in this.Tabs.OfType<FilterTabModel>().ToArray())
{
if (tab.TabType == MyCommon.TabUsageType.Mute)
continue;
foreach (var id in detachedIdsAll)
{
var hit = false;
- foreach (var tbTemp in this.Tabs.Values.ToArray())
+ foreach (var tbTemp in this.Tabs.ToArray())
{
if (!tbTemp.IsDistributableTabType)
continue;
foreach (var Id in tb.StatusIds)
{
var Hit = false;
- foreach (var tab in this.Tabs.Values)
+ foreach (var tab in this.Tabs)
{
if (tab.Contains(Id))
{
//合致しなければnullを返す
lock (LockObj)
{
- return this.Tabs.Values
- .FirstOrDefault(x => x.TabType.HasFlag(tabType));
+ return this.Tabs.FirstOrDefault(x => x.TabType.HasFlag(tabType));
}
}
public T GetTabByType<T>() where T : TabModel
{
lock (this.LockObj)
- return this.Tabs.Values.OfType<T>().FirstOrDefault();
+ return this.Tabs.OfType<T>().FirstOrDefault();
}
public TabModel[] GetTabsByType(MyCommon.TabUsageType tabType)
{
lock (LockObj)
{
- return this.Tabs.Values
+ return this.Tabs
.Where(x => x.TabType.HasFlag(tabType))
.ToArray();
}
public T[] GetTabsByType<T>() where T : TabModel
{
lock (this.LockObj)
- return this.Tabs.Values.OfType<T>().ToArray();
+ return this.Tabs.OfType<T>().ToArray();
}
public TabModel[] GetTabsInnerStorageType()
{
lock (LockObj)
{
- return this.Tabs.Values
+ return this.Tabs
.Where(x => x.IsInnerStorageTabType)
.ToArray();
}
<Compile Include="Models\PostClass.cs" />
<Compile Include="Models\PublicSearchTabModel.cs" />
<Compile Include="Models\RelatedPostsTabModel.cs" />
+ <Compile Include="Models\TabCollection.cs" />
<Compile Include="Models\TabModel.cs" />
<Compile Include="Models\TabInformations.cs" />
<Compile Include="Models\TabUsageTypeExt.cs" />
});
}
- foreach (var (name, tab) in this.TabInfo.Tabs)
+ foreach (var tab in this.TabInfo.Tabs)
{
if (!tab.IsDistributableTabType) continue;
this.TabList.Items.Add(new TabListItem
{
- Label = name,
+ Label = tab.TabName,
Tab = tab,
});
}
if (this._statuses.GetTabByType<MuteTabModel>() == null)
this._statuses.AddTab(new MuteTabModel());
- foreach (var tab in _statuses.Tabs.Values)
+ foreach (var tab in _statuses.Tabs)
{
// ミュートタブは表示しない
if (tab.TabType == MyCommon.TabUsageType.Mute)
var inReplyToId = currentPost.InReplyToStatusId.Value;
var inReplyToUser = currentPost.InReplyToUser;
- var inReplyToPosts = from tab in _statuses.Tabs.Values
+ var inReplyToPosts = from tab in _statuses.Tabs
orderby tab != curTabClass
from post in tab.Posts.Values
where post.StatusId == inReplyToId
if (currentPost.InReplyToStatusId != null)
{
var posts = from t in _statuses.Tabs
- from p in t.Value.Posts
+ from p in t.Posts
where p.Value.StatusId != currentPost.StatusId && p.Value.InReplyToStatusId == currentPost.InReplyToStatusId
- let indexOf = t.Value.IndexOf(p.Value.StatusId)
+ let indexOf = t.IndexOf(p.Value.StatusId)
where indexOf > -1
orderby isForward ? indexOf : indexOf * -1
- orderby t.Value != curTabClass
- select new {Tab = t.Value, Post = p.Value, Index = indexOf};
+ orderby t != curTabClass
+ select new {Tab = t, Post = p.Value, Index = indexOf};
try
{
var postList = posts.ToList();
if (replyChains == null || replyChains.Count < 1)
{
var posts = from t in _statuses.Tabs
- from p in t.Value.Posts
+ from p in t.Posts
where p.Value.InReplyToStatusId == currentPost.StatusId
- let indexOf = t.Value.IndexOf(p.Value.StatusId)
+ let indexOf = t.IndexOf(p.Value.StatusId)
where indexOf > -1
orderby indexOf
- orderby t.Value != curTabClass
- select new {Tab = t.Value, Index = indexOf};
+ orderby t != curTabClass
+ select new {Tab = t, Index = indexOf};
try
{
var post = posts.First();
if (chainHead.InReplyToId == currentPost.StatusId)
{
var tab = chainHead.OriginalTab;
- if (!this._statuses.Tabs.ContainsValue(tab))
+ if (!this._statuses.Tabs.Contains(tab))
{
replyChains = null;
}
this.selectPostChains.Pop();
var (tab, post) = this.selectPostChains.Peek();
- if (!this._statuses.Tabs.ContainsValue(tab))
+ if (!this._statuses.Tabs.Contains(tab))
continue; // 該当タブが存在しないので無視
if (post != null)
{
if (statusId == 0) return false;
- var tab = this._statuses.Tabs.Values
+ var tab = this._statuses.Tabs
.Where(x => x.TabType != MyCommon.TabUsageType.DirectMessage)
.Where(x => x.Contains(statusId))
.FirstOrDefault();
SettingManager.Common.DispLatestPost != MyCommon.DispTitleEnum.Ver &&
SettingManager.Common.DispLatestPost != MyCommon.DispTitleEnum.OwnStatus)
{
- foreach (var tab in _statuses.Tabs.Values)
+ foreach (var tab in _statuses.Tabs)
{
ur += tab.UnreadCount;
al += tab.AllCount;
StringBuilder slbl = new StringBuilder(256);
try
{
- foreach (var tab in _statuses.Tabs.Values)
+ foreach (var tab in _statuses.Tabs)
{
ur += tab.UnreadCount;
al += tab.AllCount;
// 関連発言なら既存のタブを置き換える
tb.TabName = relatedTab.TabName;
this.ClearTab(tb.TabName, false);
- _statuses.Tabs[tb.TabName] = tb;
+ _statuses.Tabs.Remove(tb.TabName);
+ _statuses.Tabs.Add(tb);
for (int i = 0; i < ListTab.TabPages.Count; i++)
{