diff --git a/src/CompletionProxyModel.cpp b/src/CompletionProxyModel.cpp
index fa5b3c2d..35b8d0a9 100644
--- a/src/CompletionProxyModel.cpp
+++ b/src/CompletionProxyModel.cpp
@@ -6,8 +6,11 @@
#include "Logging.h"
#include "Utils.h"
-CompletionProxyModel::CompletionProxyModel(QAbstractItemModel *model, QObject *parent)
+CompletionProxyModel::CompletionProxyModel(QAbstractItemModel *model,
+ int max_mistakes,
+ QObject *parent)
: QAbstractProxyModel(parent)
+ , maxMistakes_(max_mistakes)
{
setSourceModel(model);
QRegularExpression splitPoints("\\s+|-");
@@ -59,7 +62,7 @@ CompletionProxyModel::invalidate()
{
auto key = searchString.toUcs4();
beginResetModel();
- mapping = trie_.search(key, 7);
+ mapping = trie_.search(key, 7, maxMistakes_);
endResetModel();
std::string temp;
diff --git a/src/CompletionProxyModel.h b/src/CompletionProxyModel.h
index 1517505f..fc419702 100644
--- a/src/CompletionProxyModel.h
+++ b/src/CompletionProxyModel.h
@@ -54,19 +54,19 @@ struct trie
}
std::vector<Value> search(const QVector<Key> &keys, //< TODO(Nico): replace this with a span
- size_t limit,
- size_t max_distance = 2) const
+ size_t result_count_limit,
+ size_t max_edit_distance = 2) const
{
std::vector<Value> ret;
- if (!limit)
+ if (!result_count_limit)
return ret;
if (keys.isEmpty())
- return valuesAndSubvalues(limit);
+ return valuesAndSubvalues(result_count_limit);
- auto append = [&ret, limit](std::vector<Value> &&in) {
+ auto append = [&ret, result_count_limit](std::vector<Value> &&in) {
for (auto &&v : in) {
- if (ret.size() >= limit)
+ if (ret.size() >= result_count_limit)
return;
if (std::find(ret.begin(), ret.end(), v) == ret.end()) {
@@ -76,11 +76,12 @@ struct trie
};
if (auto e = this->next.find(keys[0]); e != this->next.end()) {
- append(e->second.search(keys.mid(1), limit, max_distance));
+ append(
+ e->second.search(keys.mid(1), result_count_limit, max_edit_distance));
}
- if (max_distance && ret.size() < limit) {
- max_distance -= 1;
+ if (max_edit_distance && ret.size() < result_count_limit) {
+ max_edit_distance -= 1;
// swap chars case
if (keys.size() >= 2) {
@@ -95,27 +96,31 @@ struct trie
}
if (t) {
- append(t->search(
- keys.mid(2), (limit - ret.size()) * 2, max_distance));
+ append(t->search(keys.mid(2),
+ (result_count_limit - ret.size()) * 2,
+ max_edit_distance));
}
}
// delete character case
- append(this->search(keys.mid(1), (limit - ret.size()) * 2, max_distance));
+ append(this->search(
+ keys.mid(1), (result_count_limit - ret.size()) * 2, max_edit_distance));
// substitute and insert cases
for (const auto &[k, t] : this->next) {
- if (k == keys[0] || ret.size() >= limit)
+ if (k == keys[0] || ret.size() >= result_count_limit)
break;
// substitute
- append(t.search(keys.mid(1), limit - ret.size(), max_distance));
+ append(t.search(
+ keys.mid(1), result_count_limit - ret.size(), max_edit_distance));
- if (ret.size() >= limit)
+ if (ret.size() >= result_count_limit)
break;
// insert
- append(t.search(keys, limit - ret.size(), max_distance));
+ append(t.search(
+ keys, result_count_limit - ret.size(), max_edit_distance));
}
}
@@ -128,7 +133,9 @@ class CompletionProxyModel : public QAbstractProxyModel
Q_OBJECT
public:
- CompletionProxyModel(QAbstractItemModel *model, QObject *parent = nullptr);
+ CompletionProxyModel(QAbstractItemModel *model,
+ int max_mistakes = 2,
+ QObject *parent = nullptr);
void invalidate();
@@ -156,4 +163,5 @@ private:
QString searchString;
trie<uint, int> trie_;
std::vector<int> mapping;
+ int maxMistakes_;
};
diff --git a/src/timeline/InputBar.cpp b/src/timeline/InputBar.cpp
index 5ef38ac7..ab0fc3d7 100644
--- a/src/timeline/InputBar.cpp
+++ b/src/timeline/InputBar.cpp
@@ -174,28 +174,6 @@ InputBar::nextText()
return text();
}
-QObject *
-InputBar::completerFor(QString completerName)
-{
- if (completerName == "user") {
- auto userModel = new UsersModel(room->roomId().toStdString());
- auto proxy = new CompletionProxyModel(userModel);
- userModel->setParent(proxy);
- return proxy;
- } else if (completerName == "emoji") {
- auto emojiModel = new emoji::EmojiModel();
- auto proxy = new CompletionProxyModel(emojiModel);
- emojiModel->setParent(proxy);
- return proxy;
- } else if (completerName == "room") {
- auto roomModel = new RoomsModel(true);
- auto proxy = new CompletionProxyModel(roomModel);
- roomModel->setParent(proxy);
- return proxy;
- }
- return nullptr;
-}
-
void
InputBar::send()
{
diff --git a/src/timeline/InputBar.h b/src/timeline/InputBar.h
index 696a0dd9..678d953d 100644
--- a/src/timeline/InputBar.h
+++ b/src/timeline/InputBar.h
@@ -51,8 +51,6 @@ public slots:
bool uploading() const { return uploading_; }
void message(QString body, MarkdownOverride useMarkdown = MarkdownOverride::NOT_SPECIFIED);
- QObject *completerFor(QString completerName);
-
private slots:
void startTyping();
void stopTyping();
diff --git a/src/timeline/TimelineViewManager.cpp b/src/timeline/TimelineViewManager.cpp
index 7d74496d..04af7060 100644
--- a/src/timeline/TimelineViewManager.cpp
+++ b/src/timeline/TimelineViewManager.cpp
@@ -577,7 +577,7 @@ TimelineViewManager::completerFor(QString completerName, QString roomId)
return proxy;
} else if (completerName == "room") {
auto roomModel = new RoomsModel(false);
- auto proxy = new CompletionProxyModel(roomModel);
+ auto proxy = new CompletionProxyModel(roomModel, 4);
roomModel->setParent(proxy);
return proxy;
} else if (completerName == "roomAliases") {
|