56 lines
1.9 KiB
C
56 lines
1.9 KiB
C
|
//
|
||
|
// Created by grimmauld on 09.03.24.
|
||
|
//
|
||
|
|
||
|
#ifndef SWAYMUX_JUMPOUTPUTKEYLISTENER_H
|
||
|
#define SWAYMUX_JUMPOUTPUTKEYLISTENER_H
|
||
|
|
||
|
#include <QTreeView>
|
||
|
#include <iostream>
|
||
|
#include <QGuiApplication>
|
||
|
#include "AbstractKeyListener.h"
|
||
|
#include "../tree/SwayTreeModel.h"
|
||
|
#include "../sway_bindings/swayoutputs.h"
|
||
|
|
||
|
class JumpOutputKeyListener : public AbstractKeyListener {
|
||
|
public:
|
||
|
explicit JumpOutputKeyListener(SwayTreeModel *swayTreeModel, QTreeView *treeView) : swayTreeModel(
|
||
|
swayTreeModel), treeView(treeView) {};
|
||
|
|
||
|
void handleKeyEvent(const QKeyEvent *keyEvent) const override {
|
||
|
auto current = treeView->selectionModel()->currentIndex();
|
||
|
auto *selected = swayTreeModel->getSelectedNode(current);
|
||
|
if (selected == nullptr)
|
||
|
return;
|
||
|
|
||
|
auto *output = selected->findOutput();
|
||
|
if (output == nullptr) {
|
||
|
if (selected->node.type == NodeType::root)
|
||
|
output = selected->child(0);
|
||
|
else
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (output->parentItem() == nullptr)
|
||
|
return;
|
||
|
|
||
|
auto *toFocus = output->parentItem()->child(output->row() + getOffset(selected));
|
||
|
if (toFocus == nullptr) // happens if index out of bounds
|
||
|
return;
|
||
|
|
||
|
auto focusIndex = swayTreeModel->findIndexByNode(toFocus);
|
||
|
auto modifiers = QGuiApplication::queryKeyboardModifiers();
|
||
|
treeView->selectionModel()->setCurrentIndex(focusIndex, modifiers.testFlag(Qt::ControlModifier)
|
||
|
? QItemSelectionModel::Current
|
||
|
: QItemSelectionModel::ClearAndSelect);
|
||
|
}
|
||
|
|
||
|
[[nodiscard]] inline virtual int getOffset(const SwayTreeNode* selected) const = 0;
|
||
|
|
||
|
private:
|
||
|
SwayTreeModel *swayTreeModel;
|
||
|
QTreeView *treeView;
|
||
|
};
|
||
|
|
||
|
#endif //SWAYMUX_JUMPOUTPUTKEYLISTENER_H
|