forked from mirror/nheko
parent
69036967ff
commit
8d81489e05
@ -0,0 +1,58 @@ |
|||||||
|
/*
|
||||||
|
* 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 <QFrame> |
||||||
|
#include <QKeyEvent> |
||||||
|
#include <QVBoxLayout> |
||||||
|
|
||||||
|
#include "TextField.h" |
||||||
|
|
||||||
|
class RoomSearchInput : public TextField |
||||||
|
{ |
||||||
|
Q_OBJECT |
||||||
|
public: |
||||||
|
explicit RoomSearchInput(QWidget *parent = nullptr); |
||||||
|
|
||||||
|
protected: |
||||||
|
void keyPressEvent(QKeyEvent *event) override; |
||||||
|
bool focusNextPrevChild(bool next) override; |
||||||
|
}; |
||||||
|
|
||||||
|
class QuickSwitcher : public QFrame |
||||||
|
{ |
||||||
|
Q_OBJECT |
||||||
|
public: |
||||||
|
explicit QuickSwitcher(QWidget *parent = nullptr); |
||||||
|
|
||||||
|
void setRoomList(const QMap<QString, QString> &rooms); |
||||||
|
|
||||||
|
signals: |
||||||
|
void closing(); |
||||||
|
void roomSelected(const QString &roomid); |
||||||
|
|
||||||
|
protected: |
||||||
|
void keyPressEvent(QKeyEvent *event) override; |
||||||
|
void showEvent(QShowEvent *event) override; |
||||||
|
|
||||||
|
private: |
||||||
|
QVBoxLayout *topLayout_; |
||||||
|
RoomSearchInput *roomSearch_; |
||||||
|
|
||||||
|
QMap<QString, QString> rooms_; |
||||||
|
}; |
@ -0,0 +1,114 @@ |
|||||||
|
/*
|
||||||
|
* 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 <QAbstractItemView> |
||||||
|
#include <QCompleter> |
||||||
|
#include <QDebug> |
||||||
|
#include <QStringListModel> |
||||||
|
#include <QTimer> |
||||||
|
|
||||||
|
#include "QuickSwitcher.h" |
||||||
|
|
||||||
|
RoomSearchInput::RoomSearchInput(QWidget* parent) |
||||||
|
: TextField(parent) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
bool RoomSearchInput::focusNextPrevChild(bool next) |
||||||
|
{ |
||||||
|
Q_UNUSED(next); |
||||||
|
|
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
void RoomSearchInput::keyPressEvent(QKeyEvent* event) |
||||||
|
{ |
||||||
|
if (event->key() == Qt::Key_Tab) { |
||||||
|
auto completer = this->completer(); |
||||||
|
|
||||||
|
if (completer) { |
||||||
|
// Enable the current item if its valid.
|
||||||
|
completer->popup()->setCurrentIndex(completer->currentIndex()); |
||||||
|
|
||||||
|
if (!completer->setCurrentRow(completer->currentRow() + 1)) |
||||||
|
completer->setCurrentRow(0); |
||||||
|
} |
||||||
|
|
||||||
|
event->accept(); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
TextField::keyPressEvent(event); |
||||||
|
} |
||||||
|
|
||||||
|
QuickSwitcher::QuickSwitcher(QWidget* parent) |
||||||
|
: QFrame(parent) |
||||||
|
{ |
||||||
|
setMaximumWidth(400); |
||||||
|
setStyleSheet("background-color: #f9f9f9"); |
||||||
|
|
||||||
|
QFont font; |
||||||
|
font.setPixelSize(20); |
||||||
|
|
||||||
|
roomSearch_ = new RoomSearchInput(this); |
||||||
|
roomSearch_->setFont(font); |
||||||
|
roomSearch_->setPlaceholderText(tr("Find a room...")); |
||||||
|
|
||||||
|
QStringList wordList; |
||||||
|
QCompleter* completer = new QCompleter(wordList, this); |
||||||
|
completer->setCaseSensitivity(Qt::CaseInsensitive); |
||||||
|
|
||||||
|
roomSearch_->setCompleter(completer); |
||||||
|
|
||||||
|
topLayout_ = new QVBoxLayout(this); |
||||||
|
topLayout_->setMargin(20); |
||||||
|
topLayout_->setSpacing(0); |
||||||
|
topLayout_->addWidget(roomSearch_); |
||||||
|
|
||||||
|
connect(roomSearch_, &QLineEdit::returnPressed, this, [=]() { |
||||||
|
emit closing(); |
||||||
|
emit roomSelected(rooms_[this->roomSearch_->text().trimmed()]); |
||||||
|
|
||||||
|
roomSearch_->clear(); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
void QuickSwitcher::setRoomList(const QMap<QString, QString>& rooms) |
||||||
|
{ |
||||||
|
rooms_ = rooms; |
||||||
|
|
||||||
|
QStringList search_items = rooms.keys(); |
||||||
|
|
||||||
|
if (!roomSearch_->completer()) |
||||||
|
return; |
||||||
|
|
||||||
|
roomSearch_->completer()->setModel(new QStringListModel(search_items)); |
||||||
|
} |
||||||
|
|
||||||
|
void QuickSwitcher::showEvent(QShowEvent*) |
||||||
|
{ |
||||||
|
roomSearch_->setFocus(); |
||||||
|
} |
||||||
|
|
||||||
|
void QuickSwitcher::keyPressEvent(QKeyEvent* event) |
||||||
|
{ |
||||||
|
if (event->key() == Qt::Key_Escape) { |
||||||
|
roomSearch_->clear(); |
||||||
|
event->accept(); |
||||||
|
emit closing(); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue