diff --git a/src/ChatPage.cc b/src/ChatPage.cc
index 43b1f0d3..55933d25 100644
--- a/src/ChatPage.cc
+++ b/src/ChatPage.cc
@@ -32,6 +32,7 @@
#include "CreateEventContent.h"
#include "HistoryVisibilityEventContent.h"
#include "JoinRulesEventContent.h"
+#include "MainWindow.h"
#include "MemberEventContent.h"
#include "NameEventContent.h"
#include "PowerLevelsEventContent.h"
@@ -563,6 +564,41 @@ void ChatPage::loadStateFromCache()
sync_timer_->start(sync_interval_);
}
+void ChatPage::keyPressEvent(QKeyEvent *event)
+{
+ if (event->key() == Qt::Key_K) {
+ if (event->modifiers() == Qt::ControlModifier)
+ showQuickSwitcher();
+ }
+}
+
+void ChatPage::showQuickSwitcher()
+{
+ if (quickSwitcher_ == nullptr) {
+ quickSwitcher_ = new QuickSwitcher(this);
+
+ connect(quickSwitcher_, &QuickSwitcher::roomSelected, room_list_, &RoomList::highlightSelectedRoom);
+ connect(quickSwitcher_, &QuickSwitcher::closing, this, [=]() {
+ if (this->quickSwitcherModal_ != nullptr)
+ this->quickSwitcherModal_->fadeOut();
+ });
+ }
+
+ if (quickSwitcherModal_ == nullptr) {
+ quickSwitcherModal_ = new OverlayModal(MainWindow::instance(), quickSwitcher_);
+ quickSwitcherModal_->setDuration(0);
+ quickSwitcherModal_->setColor(QColor(30, 30, 30, 170));
+ }
+
+ QMap<QString, QString> rooms;
+
+ for (auto it = state_manager_.constBegin(); it != state_manager_.constEnd(); ++it)
+ rooms.insert(it.value().getName(), it.key());
+
+ quickSwitcher_->setRoomList(rooms);
+ quickSwitcherModal_->fadeIn();
+}
+
ChatPage::~ChatPage()
{
sync_timer_->stop();
diff --git a/src/QuickSwitcher.cc b/src/QuickSwitcher.cc
new file mode 100644
index 00000000..3bdd26ea
--- /dev/null
+++ b/src/QuickSwitcher.cc
@@ -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();
+ }
+}
diff --git a/src/RoomList.cc b/src/RoomList.cc
index 042391a2..a35ef2f8 100644
--- a/src/RoomList.cc
+++ b/src/RoomList.cc
@@ -166,8 +166,12 @@ void RoomList::highlightSelectedRoom(const QString &room_id)
calculateUnreadMessageCount();
for (auto it = rooms_.constBegin(); it != rooms_.constEnd(); it++) {
- if (it.key() != room_id)
+ if (it.key() != room_id) {
it.value()->setPressedState(false);
+ } else {
+ it.value()->setPressedState(true);
+ scrollArea_->ensureWidgetVisible(qobject_cast<QWidget *>(it.value().data()));
+ }
}
}
|