From fa8189b816b380aeaea3a97f82c4e00a0a5669b9 Mon Sep 17 00:00:00 2001 From: parker Date: Thu, 17 Jul 2025 03:47:04 +0100 Subject: [PATCH] feat(tab menu): add selection/keyboard navigation --- src/Gui/Network/TabMenu.cpp | 96 ++++++++++++++++++++++++++++++++++--- src/Gui/Network/TabMenu.h | 11 +++++ 2 files changed, 100 insertions(+), 7 deletions(-) diff --git a/src/Gui/Network/TabMenu.cpp b/src/Gui/Network/TabMenu.cpp index fb3324d..a240b4f 100644 --- a/src/Gui/Network/TabMenu.cpp +++ b/src/Gui/Network/TabMenu.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include enzo::ui::TabMenu::TabMenu(QWidget *parent, Qt::WindowFlags f) @@ -53,6 +54,14 @@ enzo::ui::TabMenu::TabMenu(QWidget *parent, Qt::WindowFlags f) border-radius: 8px; } + QPushButton#TabMenuButton[selected="true"] { + background-color: #3d3d3d; + } + + QPushButton#TabMenuButton[selected="false"] { + background-color: transparent; + } + QPushButton#TabMenuButton:hover { background-color: #3d3d3d; color: white; @@ -129,16 +138,28 @@ enzo::ui::TabMenu::TabMenu(QWidget *parent, Qt::WindowFlags f) void enzo::ui::TabMenu::textChanged(const QString &text) { - for(auto button : buttons_) + selectionIndex_ = 0; + bool selectionMade = false; + visibleButtons_.clear(); + for(size_t i=0; isetVisible(true); - continue; - } - if(button->getDisplayText().toLower().contains(text.toLower())) + auto button = buttons_.at(i); + if(text=="" || button->getDisplayText().toLower().contains(text.toLower())) { + // make selection + if(!selectionMade) + { + std::cout << "selecting: " << button->getDisplayText().toStdString() << "\n"; + button->setSelected(true); + } + else + { + std::cout << "deselecting: " << button->getDisplayText().toStdString() << "\n"; + button->setSelected(false); + } + visibleButtons_.push_back(button); button->setVisible(true); + selectionMade = true; } else { @@ -162,6 +183,7 @@ void enzo::ui::TabMenu::showOnMouse(float dx, float dy) std::cout << "showing\n"; QPoint cursorPos = mapToParent(mapFromGlobal(QCursor::pos())); searchBar_->clear(); + textChanged(""); move(cursorPos + QPoint(dx, dy)); show(); adjustSize(); @@ -200,6 +222,23 @@ bool enzo::ui::TabMenu::event(QEvent *event) focusOutEvent(static_cast(event)); return true; } + else if(key==Qt::Key_Enter || key==Qt::Key_Return) + { + if(visibleButtons_.size()==0) return true; + if(selectionIndex_>=visibleButtons_.size()) selectionIndex_=visibleButtons_.size()-1; + auto button = visibleButtons_.at(selectionIndex_); + static_cast(parentWidget())->createNode(op::OperatorTable::getOpConstructor(button->nodeName)); + doHide(); + return true; + } + else if(key==Qt::Key_Up) + { + moveSelection(SelectionDirection::DOWN); + } + else if(key==Qt::Key_Down) + { + moveSelection(SelectionDirection::UP); + } // std::cout << "key pressed: " << static_cast(event)->text().toStdString() << "\n"; } // else if(event->type() == QEvent::KeyRelease) @@ -213,9 +252,44 @@ bool enzo::ui::TabMenu::event(QEvent *event) } +void enzo::ui::TabMenu::moveSelection(SelectionDirection direction) +{ + if(direction==SelectionDirection::UP) + { + if(selectionIndex_+1>=visibleButtons_.size()) + { + return; + } + selectionIndex_++; + } + else if(direction==SelectionDirection::DOWN) + { + if(selectionIndex_<=0) + { + return; + } + selectionIndex_--; + std::cout << "selection index: " << selectionIndex_ << "\n"; + } + + for(size_t i=0; isetSelected(true); + } + else + { + button->setSelected(false); + } + } +} + enzo::ui::TabMenuButton::TabMenuButton(const QString &text, QWidget *parent) : QPushButton(parent) { + setSelected(false); setObjectName("TabMenuButton"); displayText_ = text; @@ -239,6 +313,14 @@ enzo::ui::TabMenuButton::TabMenuButton(const QString &text, QWidget *parent) } +void enzo::ui::TabMenuButton::setSelected(bool selected) +{ + setProperty("selected", selected); + style()->polish(this); + update(); +} + + // enzo::ui::TabMenuSearch::TabMenuSearch(QWidget *parent) // : QLineEdit(parent) // { diff --git a/src/Gui/Network/TabMenu.h b/src/Gui/Network/TabMenu.h index 3b8c7e0..33e7a4c 100644 --- a/src/Gui/Network/TabMenu.h +++ b/src/Gui/Network/TabMenu.h @@ -19,6 +19,7 @@ public: TabMenuButton(const QString &text, QWidget *parent = nullptr); std::string nodeName; QString getDisplayText() {return displayText_;} + void setSelected(bool selected); private: QHBoxLayout* mainLayout_; QLabel* textLabel_; @@ -35,6 +36,12 @@ public: void showOnMouse(float dx=0, float dy=0); private: + enum class SelectionDirection + { + UP, + DOWN + }; + QVBoxLayout* mainLayout_; QLineEdit* searchBar_; QScrollArea* nodeScrollArea_; @@ -43,6 +50,10 @@ private: void doHide(); void textChanged(const QString &text); std::vector buttons_; + std::vector visibleButtons_; + unsigned int selectionIndex_ = 0; + void moveSelection(SelectionDirection direction); + protected: void focusOutEvent(QFocusEvent *event) override; bool event(QEvent *event) override;