/* * 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/gitea/aqua/smolbote * * SPDX-License-Identifier: GPL-3.0 */ #include "completer.h" #include Completer::Completer(QWidget *parent) : QListView(parent) { setObjectName("Completer"); setWindowFlags(Qt::ToolTip); setEditTriggers(QAbstractItemView::NoEditTriggers); connect(this, &Completer::activated, [=](const QModelIndex &index) { hide(); emit completionActivated(index.data().toString()); }); } 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; case Qt::Key_Enter: case Qt::Key_Return: hide(); if(currentIndex.row() >= 0) emit completionActivated(currentIndex.data().toString()); break; default: return false; } return true; }