Add logic for selecting currently active window at startup
This commit is contained in:
parent
da05b706e4
commit
4ba62a63ee
6 changed files with 50 additions and 5 deletions
|
@ -4,6 +4,7 @@
|
||||||
#include "tree/SwayTreeModel.h"
|
#include "tree/SwayTreeModel.h"
|
||||||
#include <QScreen>
|
#include <QScreen>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
MainWindow::MainWindow(QWidget *parent)
|
MainWindow::MainWindow(QWidget *parent)
|
||||||
: QMainWindow(parent), ui(new Ui::MainWindow) {
|
: QMainWindow(parent), ui(new Ui::MainWindow) {
|
||||||
|
@ -18,6 +19,9 @@ MainWindow::MainWindow(QWidget *parent)
|
||||||
ui->treeView->setModel(model);
|
ui->treeView->setModel(model);
|
||||||
ui->treeView->expandAll();
|
ui->treeView->expandAll();
|
||||||
|
|
||||||
|
ui->treeView->setSelectionMode(QAbstractItemView::ExtendedSelection);
|
||||||
|
ui->treeView->selectionModel()->select(model->getFocused(), QItemSelectionModel::ClearAndSelect);
|
||||||
|
|
||||||
for (int c = 0; c < model->columnCount(); ++c)
|
for (int c = 0; c < model->columnCount(); ++c)
|
||||||
ui->treeView->resizeColumnToContents(c);
|
ui->treeView->resizeColumnToContents(c);
|
||||||
}
|
}
|
||||||
|
@ -29,5 +33,6 @@ MainWindow::~MainWindow() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::update() {
|
void MainWindow::update() {
|
||||||
|
std::cout << ui->treeView->currentIndex().parent().row() << "\n";
|
||||||
// model->update();
|
// model->update();
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,8 +12,7 @@
|
||||||
template<class T>
|
template<class T>
|
||||||
class AbstractTreeModel : public QAbstractItemModel {
|
class AbstractTreeModel : public QAbstractItemModel {
|
||||||
static_assert(std::is_base_of<AbstractTreeNode<T>, T>::value,
|
static_assert(std::is_base_of<AbstractTreeNode<T>, T>::value,
|
||||||
"Tree model subject class is not derived from AbstractTreeNode");
|
"Tree node subject class is not derived from AbstractTreeNode");
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Q_DISABLE_COPY_MOVE(AbstractTreeModel)
|
Q_DISABLE_COPY_MOVE(AbstractTreeModel)
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@ public:
|
||||||
|
|
||||||
explicit AbstractTreeNode(T *parent = nullptr) : parent(parent) {}
|
explicit AbstractTreeNode(T *parent = nullptr) : parent(parent) {}
|
||||||
|
|
||||||
[[nodiscard]] T *parentItem() { return parent; };
|
[[nodiscard]] T *parentItem() const { return parent; };
|
||||||
|
|
||||||
[[nodiscard]] size_t childCount() const { return children.size(); };
|
[[nodiscard]] size_t childCount() const { return children.size(); };
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ public:
|
||||||
|
|
||||||
[[nodiscard]] virtual int columnCount() const = 0;
|
[[nodiscard]] virtual int columnCount() const = 0;
|
||||||
|
|
||||||
[[nodiscard]] int row() {
|
[[nodiscard]] int row() const {
|
||||||
if (parent == nullptr)
|
if (parent == nullptr)
|
||||||
return 0;
|
return 0;
|
||||||
const auto it = std::find_if(parent->children.cbegin(), parent->children.cend(),
|
const auto it = std::find_if(parent->children.cbegin(), parent->children.cend(),
|
||||||
|
@ -46,7 +46,7 @@ public:
|
||||||
|
|
||||||
void appendChild(std::unique_ptr<T> &child) { children.push_back(std::move(child)); }
|
void appendChild(std::unique_ptr<T> &child) { children.push_back(std::move(child)); }
|
||||||
|
|
||||||
[[nodiscard]] T* findChild(std::function<bool(const T &)> test) {
|
[[nodiscard]] T *findChild(std::function<bool(const T &)> test) const {
|
||||||
|
|
||||||
for (int i = 0; i < childCount(); ++i) {
|
for (int i = 0; i < childCount(); ++i) {
|
||||||
auto* c = child(i);
|
auto* c = child(i);
|
||||||
|
@ -56,6 +56,19 @@ public:
|
||||||
return nullptr;
|
return nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
[[nodiscard]] const T *findChildRecursive(std::function<bool(const T *)> test) const {
|
||||||
|
if (test((const T *) this))
|
||||||
|
return (const T*) this;
|
||||||
|
|
||||||
|
for (int i = 0; i < childCount(); ++i) {
|
||||||
|
auto *c = child(i);
|
||||||
|
const T *r = c->findChildRecursive(test);
|
||||||
|
if (r != nullptr)
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
void removeChild(int i) {
|
void removeChild(int i) {
|
||||||
if (i >= 0 && i < childCount()) {
|
if (i >= 0 && i < childCount()) {
|
||||||
children.erase(std::next(children.begin(), i));
|
children.erase(std::next(children.begin(), i));
|
||||||
|
|
|
@ -3,3 +3,24 @@
|
||||||
//
|
//
|
||||||
|
|
||||||
#include "SwayTreeModel.h"
|
#include "SwayTreeModel.h"
|
||||||
|
|
||||||
|
QModelIndex SwayTreeModel::getFocused() const {
|
||||||
|
|
||||||
|
std::function<bool(const SwayTreeNode *)> test = [](const SwayTreeNode *node) {
|
||||||
|
return node->node.focused;
|
||||||
|
};
|
||||||
|
const SwayTreeNode *focused = rootItem->findChildRecursive(test);
|
||||||
|
|
||||||
|
std::vector<int> indices;
|
||||||
|
for (const auto *head = focused; head != nullptr; head = head->parentItem()) {
|
||||||
|
indices.insert(indices.cbegin(), head->row());
|
||||||
|
}
|
||||||
|
|
||||||
|
// weirdness, idk... ask QT
|
||||||
|
QModelIndex idx = this->index(indices.size() < 2 ? 0 : indices[1], 0);
|
||||||
|
for (int i = 2; i < indices.size(); ++i) {
|
||||||
|
idx = this->index(indices[i], 0, idx);
|
||||||
|
}
|
||||||
|
|
||||||
|
return idx;
|
||||||
|
}
|
||||||
|
|
|
@ -42,6 +42,9 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
[[nodiscard]] QModelIndex getFocused() const;
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SwayTreeNode * rootItem;
|
SwayTreeNode * rootItem;
|
||||||
};
|
};
|
||||||
|
|
|
@ -114,6 +114,10 @@ struct SwayRecord {
|
||||||
[[nodiscard]] bool operator==(const SwayRecord &other) const {
|
[[nodiscard]] bool operator==(const SwayRecord &other) const {
|
||||||
return this->id == other.id;
|
return this->id == other.id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] bool isFocused() const {
|
||||||
|
return focused;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class SwayTreeNode : public AbstractTreeNode<SwayTreeNode> {
|
class SwayTreeNode : public AbstractTreeNode<SwayTreeNode> {
|
||||||
|
|
Loading…
Reference in a new issue