From 6f1498d65cf5c7e41e28c1efbfea6367d2a732a2 Mon Sep 17 00:00:00 2001 From: LordGrimmauld Date: Thu, 7 Mar 2024 17:37:18 +0100 Subject: [PATCH] Add help menu list view, add toggle to get to help menu --- CMakeLists.txt | 5 ++++ Keys/AbstractKeyListener.h | 32 ++++++++++++++++++++++ Keys/CloseHelpKeyListener.h | 38 ++++++++++++++++++++++++++ Keys/HelpKeyListener.h | 37 +++++++++++++++++++++++++ Keys/KeyHandler.cpp | 19 +++++++++++++ Keys/KeyHandler.h | 25 +++++++++++++++++ mainwindow.cpp | 34 ++++++++++++++++------- mainwindow.h | 7 +++-- mainwindow.ui | 54 ++++++++++++++++++++++++++++--------- tree/swaytree.h | 2 +- 10 files changed, 228 insertions(+), 25 deletions(-) create mode 100644 Keys/AbstractKeyListener.h create mode 100644 Keys/CloseHelpKeyListener.h create mode 100644 Keys/HelpKeyListener.h create mode 100644 Keys/KeyHandler.cpp create mode 100644 Keys/KeyHandler.h diff --git a/CMakeLists.txt b/CMakeLists.txt index b8539af..8043144 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,6 +30,11 @@ set(PROJECT_SOURCES tree/AbstractTreeModel.h tree/SwayTreeModel.h tree/SwayTreeModel.cpp + Keys/KeyHandler.h + Keys/KeyHandler.cpp + Keys/AbstractKeyListener.h + Keys/HelpKeyListener.h + Keys/CloseHelpKeyListener.h ) if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) diff --git a/Keys/AbstractKeyListener.h b/Keys/AbstractKeyListener.h new file mode 100644 index 0000000..783cfb7 --- /dev/null +++ b/Keys/AbstractKeyListener.h @@ -0,0 +1,32 @@ +// +// Created by grimmauld on 07.03.24. +// + +#ifndef SWAYMUX_ABSTRACTKEYLISTENER_H +#define SWAYMUX_ABSTRACTKEYLISTENER_H + + +#include +#include +#include + +class AbstractKeyListener { +public: + virtual void handleKeyEvent(const QKeyEvent *keyEvent) const = 0; + + bool testAndInvoke(const QKeyEvent *keyEvent) const { + if (canAcceptKey(keyEvent->key())) { + handleKeyEvent(keyEvent); + return true; + } + return false; + } + + virtual std::string getDescription() = 0; + + virtual std::string getKeyText() = 0; + + [[nodiscard]] virtual bool canAcceptKey(int key) const = 0; +}; + +#endif //SWAYMUX_ABSTRACTKEYLISTENER_H diff --git a/Keys/CloseHelpKeyListener.h b/Keys/CloseHelpKeyListener.h new file mode 100644 index 0000000..8e7e8c7 --- /dev/null +++ b/Keys/CloseHelpKeyListener.h @@ -0,0 +1,38 @@ +// +// Created by grimmauld on 07.03.24. +// + +#ifndef SWAYMUX_CLOSEHELPKEYLISTENER_H +#define SWAYMUX_CLOSEHELPKEYLISTENER_H + +#include +#include "AbstractKeyListener.h" + +class CloseHelpKeyListener : public AbstractKeyListener { +public: + explicit CloseHelpKeyListener(QWidget *pWidget) : stackPage(pWidget) {} + + void handleKeyEvent(const QKeyEvent *keyEvent) const override { + auto* stackWidget = qobject_cast(stackPage->parent()); + if (stackWidget != nullptr) { + stackWidget->setCurrentWidget(stackPage); + } + } + + std::string getDescription() override { + return "Close help menu"; + } + + std::string getKeyText() override { + return "?, ESC, q"; + } + + [[nodiscard]] bool canAcceptKey(int key) const override { + return key == Qt::Key_Question || key == Qt::Key_Q || key == Qt::Key_Escape; + } + + QWidget *stackPage{}; +}; + + +#endif //SWAYMUX_CLOSEHELPKEYLISTENER_H diff --git a/Keys/HelpKeyListener.h b/Keys/HelpKeyListener.h new file mode 100644 index 0000000..20947eb --- /dev/null +++ b/Keys/HelpKeyListener.h @@ -0,0 +1,37 @@ +// +// Created by grimmauld on 07.03.24. +// + +#ifndef SWAYMUX_HELPKEYLISTENER_H +#define SWAYMUX_HELPKEYLISTENER_H + +#include "AbstractKeyListener.h" + +class HelpKeyListener : public AbstractKeyListener { +public: + explicit HelpKeyListener(QWidget *pWidget) : stackPage(pWidget) {} + + void handleKeyEvent(const QKeyEvent *keyEvent) const override { + auto* stackWidget = qobject_cast(stackPage->parent()); + if (stackWidget != nullptr) { + stackWidget->setCurrentWidget(stackPage); + } + } + + std::string getDescription() override { + return "View this help menu"; + } + + std::string getKeyText() override { + return "?"; + } + + [[nodiscard]] bool canAcceptKey(int key) const override { + return key == Qt::Key_Question; + } + + QWidget *stackPage; +}; + + +#endif //SWAYMUX_HELPKEYLISTENER_H diff --git a/Keys/KeyHandler.cpp b/Keys/KeyHandler.cpp new file mode 100644 index 0000000..8f8c9fc --- /dev/null +++ b/Keys/KeyHandler.cpp @@ -0,0 +1,19 @@ +// +// Created by grimmauld on 07.03.24. +// + +#include +#include "KeyHandler.h" + +bool KeyHandler::eventFilter(QObject *obj, QEvent *event) { + if (event->type() == QEvent::KeyPress) { + auto *key = dynamic_cast(event); + + return std::any_of(listeners.cbegin(), listeners.cend(), + [key](const auto *listener) { + return listener->testAndInvoke(key); + }); + } else { + return QObject::eventFilter(obj, event); + } +} \ No newline at end of file diff --git a/Keys/KeyHandler.h b/Keys/KeyHandler.h new file mode 100644 index 0000000..188d4a3 --- /dev/null +++ b/Keys/KeyHandler.h @@ -0,0 +1,25 @@ +// +// Created by grimmauld on 07.03.24. +// + +#ifndef SWAYMUX_KEYHANDLER_H +#define SWAYMUX_KEYHANDLER_H + + +#include +#include "AbstractKeyListener.h" + +class KeyHandler : public QObject { +Q_OBJECT + +public: + void addListener(AbstractKeyListener *listener) { listeners.push_back(listener); } + +protected: + bool eventFilter(QObject *obj, QEvent *event) override; + + std::vector listeners; +}; + + +#endif //SWAYMUX_KEYHANDLER_H diff --git a/mainwindow.cpp b/mainwindow.cpp index ee2410e..79762db 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -1,19 +1,20 @@ #include "mainwindow.h" #include "./ui_mainwindow.h" -#include "tree/PsTreeModel.h" #include "tree/SwayTreeModel.h" -#include +#include "Keys/HelpKeyListener.h" +#include "Keys/CloseHelpKeyListener.h" #include #include + MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); model = new SwayTreeModel(ui->treeView); - modelUpdateTimer = new QTimer(this); - connect(modelUpdateTimer, &QTimer::timeout, this, QOverload<>::of(&MainWindow::update)); - modelUpdateTimer->start(1000); + // modelUpdateTimer = new QTimer(this); + // connect(modelUpdateTimer, &QTimer::timeout, this, QOverload<>::of(&MainWindow::update)); + // modelUpdateTimer->start(1000); ui->statusbar->showMessage(QString::fromStdString("test test 123")); ui->treeView->setModel(model); @@ -24,15 +25,28 @@ MainWindow::MainWindow(QWidget *parent) for (int c = 0; c < model->columnCount(); ++c) ui->treeView->resizeColumnToContents(c); + + swayTreeKeyHandler = new KeyHandler(); + swayTreeKeyHandler->addListener(new HelpKeyListener(ui->help_page)); + + closeHelpKeyHandler = new KeyHandler(); + closeHelpKeyHandler->addListener(new CloseHelpKeyListener(ui->tree_page)); + + ui->stackedWidget->setCurrentIndex(0); + ui->treeView->installEventFilter(swayTreeKeyHandler); + ui->listView->installEventFilter(closeHelpKeyHandler); } MainWindow::~MainWindow() { delete ui; delete model; - delete modelUpdateTimer; + // delete modelUpdateTimer; + delete swayTreeKeyHandler; + delete closeHelpKeyHandler; } -void MainWindow::update() { - std::cout << ui->treeView->currentIndex().parent().row() << "\n"; - // model->update(); -} +void MainWindow::keyPressEvent(QKeyEvent *event) { + if (event->key() == Qt::Key_W) { + qDebug() << "hi"; + } +} \ No newline at end of file diff --git a/mainwindow.h b/mainwindow.h index 216a1e9..7e3821f 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -4,6 +4,7 @@ #include #include "tree/PsTreeModel.h" #include "tree/SwayTreeModel.h" +#include "Keys/KeyHandler.h" QT_BEGIN_NAMESPACE namespace Ui { @@ -19,11 +20,13 @@ public: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow() override; - void update() ; + void keyPressEvent(QKeyEvent *event) override; private: Ui::MainWindow *ui; SwayTreeModel* model; - QTimer* modelUpdateTimer; + // QTimer* modelUpdateTimer{}; + KeyHandler* swayTreeKeyHandler; + KeyHandler* closeHelpKeyHandler; }; #endif // MAINWINDOW_H diff --git a/mainwindow.ui b/mainwindow.ui index 45bb7e8..18673f0 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -21,25 +21,55 @@ - + 0 0 - - - 16777215 - 16777215 - - - - - - 20 - + + + 0 + + + + 0 + 0 + + + + + + + + 20 + + + + + + + + + + 0 + 0 + + + + + + + + 20 + + + + + + diff --git a/tree/swaytree.h b/tree/swaytree.h index 7915a12..e47f27a 100644 --- a/tree/swaytree.h +++ b/tree/swaytree.h @@ -86,7 +86,7 @@ struct SwayRecord { explicit SwayRecord(const json &rep) : id(rep["id"]), - name(rep["name"]), + name(rep["name"].is_null() ? "untitled container" : rep["name"]), type(NodeType::fromString(rep["type"])), border(rep["border"]), current_border_width(rep["current_border_width"]),