diff options
Diffstat (limited to 'lib/addressbar/completer.cpp')
-rw-r--r-- | lib/addressbar/completer.cpp | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/lib/addressbar/completer.cpp b/lib/addressbar/completer.cpp new file mode 100644 index 0000000..9b95ac0 --- /dev/null +++ b/lib/addressbar/completer.cpp @@ -0,0 +1,68 @@ +/* + * This file is part of smolbote. It's copyrighted by the contributors recorded + * in the version control history of the file, available from its original + * location: https://neueland.iserlohn-fortress.net/smolbote.hg + * + * SPDX-License-Identifier: GPL-3.0 + */ + +#include "completer.h" +#include <QKeyEvent> + +Completer::Completer(QWidget *parent) + : QListView(parent) +{ + setWindowFlags(Qt::ToolTip); +} + +bool Completer::updateItems(const QStringList &list) +{ + if(list.isEmpty()) + return false; + + auto *model = new QStringListModel(list, this); + setModel(model); + + delete completionModel; + completionModel = model; + + return true; +} + +bool Completer::keyPressed(QKeyEvent *event) +{ + if(isHidden()) + return false; + + Q_CHECK_PTR(completionModel); + + int count = completionModel->rowCount(); + const QModelIndex currentIndex = this->currentIndex(); + + switch(event->key()) { + case Qt::Key_Down: + if(currentIndex.row() + 1 >= count) { + setCurrentIndex(completionModel->index(0, 0)); + } else { + setCurrentIndex(completionModel->index(currentIndex.row() + 1, 0)); + } + break; + + case Qt::Key_Up: + if(currentIndex.row() == 0) { + setCurrentIndex(completionModel->index(count - 1, 0)); + } else { + setCurrentIndex(completionModel->index(currentIndex.row() - 1, 0)); + } + break; + + case Qt::Key_Escape: + hide(); + break; + + default: + break; + } + + return true; +} |