feat(tab menu): add selection/keyboard navigation
This commit is contained in:
@@ -20,6 +20,7 @@
|
||||
#include <QEvent>
|
||||
#include <QPainterPath>
|
||||
#include <QPushButton>
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
|
||||
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; i<buttons_.size(); ++i)
|
||||
{
|
||||
if(text=="")
|
||||
{
|
||||
button->setVisible(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<QFocusEvent*>(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<Network*>(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<QKeyEvent*>(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; i<visibleButtons_.size(); ++i)
|
||||
{
|
||||
TabMenuButton* button = visibleButtons_.at(i);
|
||||
if(i==selectionIndex_)
|
||||
{
|
||||
button->setSelected(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)
|
||||
// {
|
||||
|
||||
@@ -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<TabMenuButton*> buttons_;
|
||||
std::vector<TabMenuButton*> visibleButtons_;
|
||||
unsigned int selectionIndex_ = 0;
|
||||
void moveSelection(SelectionDirection direction);
|
||||
|
||||
protected:
|
||||
void focusOutEvent(QFocusEvent *event) override;
|
||||
bool event(QEvent *event) override;
|
||||
|
||||
Reference in New Issue
Block a user