Add option for truecase username autocompletion (#1883)
Co-authored-by: Rasmus Karlsson <rasmus.karlsson@pajlada.com>
This commit is contained in:
@@ -67,7 +67,7 @@ void ChannelChatters::addPartedUser(const QString &user)
|
||||
|
||||
void ChannelChatters::setChatters(UsernameSet &&set)
|
||||
{
|
||||
*this->chatters_.access() = set;
|
||||
this->chatters_.access()->merge(std::move(set));
|
||||
}
|
||||
|
||||
const QColor ChannelChatters::getUserColor(const QString &user)
|
||||
|
||||
@@ -4,6 +4,30 @@
|
||||
|
||||
namespace chatterino {
|
||||
|
||||
namespace {
|
||||
|
||||
std::pair<UsernameSet::Iterator, bool> findOrErase(
|
||||
std::set<QString, CaseInsensitiveLess> &set, const QString &value)
|
||||
{
|
||||
if (!value.isLower())
|
||||
{
|
||||
auto iter = set.find(value);
|
||||
if (iter != set.end())
|
||||
{
|
||||
if (QString::compare(*iter, value, Qt::CaseSensitive) != 0)
|
||||
{
|
||||
set.erase(iter);
|
||||
}
|
||||
else
|
||||
{
|
||||
return {iter, false};
|
||||
}
|
||||
}
|
||||
}
|
||||
return {set.end(), true};
|
||||
}
|
||||
} // namespace
|
||||
|
||||
//
|
||||
// UsernameSet
|
||||
//
|
||||
@@ -43,15 +67,25 @@ std::set<QString>::size_type UsernameSet::size() const
|
||||
|
||||
std::pair<UsernameSet::Iterator, bool> UsernameSet::insert(const QString &value)
|
||||
{
|
||||
this->insertPrefix(value);
|
||||
auto pair = findOrErase(this->items, value);
|
||||
if (!pair.second)
|
||||
{
|
||||
return pair;
|
||||
}
|
||||
|
||||
this->insertPrefix(value);
|
||||
return this->items.insert(value);
|
||||
}
|
||||
|
||||
std::pair<UsernameSet::Iterator, bool> UsernameSet::insert(QString &&value)
|
||||
{
|
||||
this->insertPrefix(value);
|
||||
auto pair = findOrErase(this->items, value);
|
||||
if (!pair.second)
|
||||
{
|
||||
return pair;
|
||||
}
|
||||
|
||||
this->insertPrefix(value);
|
||||
return this->items.insert(std::move(value));
|
||||
}
|
||||
|
||||
@@ -68,6 +102,24 @@ bool UsernameSet::contains(const QString &value) const
|
||||
return this->items.count(value) == 1;
|
||||
}
|
||||
|
||||
void UsernameSet::merge(UsernameSet &&set)
|
||||
{
|
||||
for (auto it = this->items.begin(); it != this->items.end();)
|
||||
{
|
||||
auto iter = set.items.find(*it);
|
||||
if (iter == set.items.end())
|
||||
{
|
||||
it = this->items.erase(it);
|
||||
}
|
||||
else
|
||||
{
|
||||
++it;
|
||||
}
|
||||
}
|
||||
this->items.merge(set.items);
|
||||
this->firstKeyForPrefix = set.firstKeyForPrefix;
|
||||
}
|
||||
|
||||
//
|
||||
// Range
|
||||
//
|
||||
|
||||
@@ -77,6 +77,7 @@ public:
|
||||
std::pair<Iterator, bool> insert(QString &&value);
|
||||
|
||||
bool contains(const QString &value) const;
|
||||
void merge(UsernameSet &&set);
|
||||
|
||||
private:
|
||||
void insertPrefix(const QString &string);
|
||||
|
||||
@@ -804,6 +804,7 @@ void TwitchChannel::fetchDisplayName()
|
||||
.arg(channel->getName())
|
||||
.arg(user.displayName));
|
||||
}
|
||||
channel->addRecentChatter(channel->getDisplayName());
|
||||
channel->displayNameChanged.invoke();
|
||||
},
|
||||
[] {});
|
||||
|
||||
Reference in New Issue
Block a user