mirror of https://github.com/Nheko-Reborn/nheko
parent
0ce7f78446
commit
68c999e5f4
@ -1,141 +0,0 @@ |
||||
/*
|
||||
* nheko Copyright (C) 2017 Konstantinos Sideris <siderisk@auth.gr> |
||||
* |
||||
* 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/>.
|
||||
*/ |
||||
|
||||
#include <QCompleter> |
||||
#include <QPainter> |
||||
#include <QStringListModel> |
||||
#include <QStyleOption> |
||||
#include <QTimer> |
||||
#include <QtConcurrent> |
||||
|
||||
#include "Cache.h" |
||||
#include "QuickSwitcher.h" |
||||
#include "popups/SuggestionsPopup.h" |
||||
|
||||
Q_DECLARE_METATYPE(std::vector<RoomSearchResult>) |
||||
|
||||
RoomSearchInput::RoomSearchInput(QWidget *parent) |
||||
: TextField(parent) |
||||
{} |
||||
|
||||
void |
||||
RoomSearchInput::keyPressEvent(QKeyEvent *event) |
||||
{ |
||||
switch (event->key()) { |
||||
case Qt::Key_Tab: |
||||
case Qt::Key_Down: { |
||||
emit selectNextCompletion(); |
||||
event->accept(); |
||||
break; |
||||
} |
||||
case Qt::Key_Backtab: |
||||
case Qt::Key_Up: { |
||||
emit selectPreviousCompletion(); |
||||
event->accept(); |
||||
break; |
||||
} |
||||
default: |
||||
TextField::keyPressEvent(event); |
||||
} |
||||
} |
||||
|
||||
void |
||||
RoomSearchInput::hideEvent(QHideEvent *event) |
||||
{ |
||||
emit hiding(); |
||||
TextField::hideEvent(event); |
||||
} |
||||
|
||||
QuickSwitcher::QuickSwitcher(QWidget *parent) |
||||
: QWidget(parent) |
||||
{ |
||||
qRegisterMetaType<std::vector<RoomSearchResult>>(); |
||||
setMaximumWidth(450); |
||||
|
||||
QFont font; |
||||
font.setPointSizeF(font.pointSizeF() * 1.5); |
||||
|
||||
roomSearch_ = new RoomSearchInput(this); |
||||
roomSearch_->setFont(font); |
||||
roomSearch_->setPlaceholderText(tr("Search for a room...")); |
||||
|
||||
topLayout_ = new QVBoxLayout(this); |
||||
topLayout_->addWidget(roomSearch_); |
||||
|
||||
connect(this, |
||||
&QuickSwitcher::queryResults, |
||||
this, |
||||
[this](const std::vector<RoomSearchResult> &rooms) { |
||||
auto pos = mapToGlobal(roomSearch_->geometry().bottomLeft()); |
||||
|
||||
popup_.setFixedWidth(width()); |
||||
popup_.addRooms(rooms); |
||||
popup_.move(pos.x() - topLayout_->margin(), pos.y() + topLayout_->margin()); |
||||
popup_.show(); |
||||
}); |
||||
|
||||
connect(roomSearch_, &QLineEdit::textEdited, this, [this](const QString &query) { |
||||
if (query.isEmpty()) { |
||||
popup_.hide(); |
||||
return; |
||||
} |
||||
|
||||
QtConcurrent::run([this, query = query.toLower()]() { |
||||
try { |
||||
emit queryResults(cache::searchRooms(query.toStdString())); |
||||
} catch (const lmdb::error &e) { |
||||
qWarning() << "room search failed:" << e.what(); |
||||
} |
||||
}); |
||||
}); |
||||
|
||||
connect(roomSearch_, |
||||
&RoomSearchInput::selectNextCompletion, |
||||
&popup_, |
||||
&SuggestionsPopup::selectNextSuggestion); |
||||
connect(roomSearch_, |
||||
&RoomSearchInput::selectPreviousCompletion, |
||||
&popup_, |
||||
&SuggestionsPopup::selectPreviousSuggestion); |
||||
connect(&popup_, &SuggestionsPopup::itemSelected, this, [this](const QString &room_id) { |
||||
reset(); |
||||
emit roomSelected(room_id); |
||||
}); |
||||
connect(roomSearch_, &RoomSearchInput::hiding, this, [this]() { popup_.hide(); }); |
||||
connect(roomSearch_, &QLineEdit::returnPressed, this, [this]() { |
||||
reset(); |
||||
popup_.selectHoveredSuggestion(); |
||||
}); |
||||
} |
||||
|
||||
void |
||||
QuickSwitcher::paintEvent(QPaintEvent *) |
||||
{ |
||||
QStyleOption opt; |
||||
opt.init(this); |
||||
QPainter p(this); |
||||
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); |
||||
} |
||||
|
||||
void |
||||
QuickSwitcher::keyPressEvent(QKeyEvent *event) |
||||
{ |
||||
if (event->key() == Qt::Key_Escape) { |
||||
event->accept(); |
||||
reset(); |
||||
} |
||||
} |
@ -1,77 +0,0 @@ |
||||
/*
|
||||
* nheko Copyright (C) 2017 Konstantinos Sideris <siderisk@auth.gr> |
||||
* |
||||
* 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/>.
|
||||
*/ |
||||
|
||||
#pragma once |
||||
|
||||
#include <QAbstractItemView> |
||||
#include <QKeyEvent> |
||||
#include <QVBoxLayout> |
||||
#include <QWidget> |
||||
|
||||
#include "popups/SuggestionsPopup.h" |
||||
#include "ui/TextField.h" |
||||
|
||||
class RoomSearchInput : public TextField |
||||
{ |
||||
Q_OBJECT |
||||
public: |
||||
explicit RoomSearchInput(QWidget *parent = nullptr); |
||||
|
||||
signals: |
||||
void selectNextCompletion(); |
||||
void selectPreviousCompletion(); |
||||
void hiding(); |
||||
|
||||
protected: |
||||
void keyPressEvent(QKeyEvent *event) override; |
||||
void hideEvent(QHideEvent *event) override; |
||||
bool focusNextPrevChild(bool) override { return false; }; |
||||
}; |
||||
|
||||
class QuickSwitcher : public QWidget |
||||
{ |
||||
Q_OBJECT |
||||
|
||||
public: |
||||
QuickSwitcher(QWidget *parent = nullptr); |
||||
|
||||
signals: |
||||
void closing(); |
||||
void roomSelected(const QString &roomid); |
||||
void queryResults(const std::vector<RoomSearchResult> &rooms); |
||||
|
||||
protected: |
||||
void keyPressEvent(QKeyEvent *event) override; |
||||
void showEvent(QShowEvent *) override { roomSearch_->setFocus(); } |
||||
void paintEvent(QPaintEvent *event) override; |
||||
|
||||
private: |
||||
void reset() |
||||
{ |
||||
emit closing(); |
||||
roomSearch_->clear(); |
||||
} |
||||
|
||||
// Current highlighted selection from the completer.
|
||||
int selection_ = -1; |
||||
|
||||
QVBoxLayout *topLayout_; |
||||
RoomSearchInput *roomSearch_; |
||||
|
||||
//! Autocomplete popup box with the room suggestions.
|
||||
SuggestionsPopup popup_; |
||||
}; |
Loading…
Reference in new issue