59 lines
2.1 KiB
C++
59 lines
2.1 KiB
C++
#include "breadcrumbview.h"
|
|
using namespace Xybrid::UI;
|
|
|
|
#include <QDebug>
|
|
#include <QHeaderView>
|
|
|
|
BreadcrumbView::BreadcrumbView(QWidget* parent) : QTableView (parent) {
|
|
mdl = new BreadcrumbModel(this);
|
|
setModel(mdl);
|
|
|
|
horizontalHeader()->setVisible(false);
|
|
verticalHeader()->setVisible(false);
|
|
horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
|
|
|
|
connect(selectionModel(), &QItemSelectionModel::currentColumnChanged, this, [this](const QModelIndex& index, const QModelIndex&) {
|
|
//qDebug() << "breadcrumb change" << index;
|
|
size_t idx = static_cast<size_t>(index.column());
|
|
if (mdl->actions.size() <= idx) return;
|
|
mdl->actions[idx]->trigger();
|
|
if (shrinkOnSelect) mdl->actions.resize(idx+1);
|
|
emit mdl->layoutChanged();
|
|
});
|
|
}
|
|
|
|
void BreadcrumbView::clear() {
|
|
mdl->actions.clear();
|
|
emit mdl->layoutChanged();
|
|
this->setCurrentIndex(mdl->index(-1, -1));
|
|
}
|
|
|
|
void BreadcrumbView::push(const QString& text, QObject* bind, std::function<void ()> action) {
|
|
mdl->actions.resize(std::min(mdl->actions.size(), static_cast<size_t>(currentIndex().column()) + 1));
|
|
mdl->actions.push_back(std::make_unique<QAction>(text, bind));
|
|
emit mdl->layoutChanged();
|
|
connect(mdl->actions.back().get(), &QAction::triggered, bind, action);
|
|
this->setCurrentIndex(mdl->index(0, static_cast<int>(mdl->actions.size()) - 1));
|
|
}
|
|
|
|
BreadcrumbModel::BreadcrumbModel(QWidget* parent) : QAbstractTableModel(parent) {
|
|
//actions.push_back(std::make_unique<QAction>("Root Graph", this));
|
|
}
|
|
|
|
int BreadcrumbModel::rowCount(const QModelIndex&) const {
|
|
return 1;
|
|
}
|
|
|
|
int BreadcrumbModel::columnCount(const QModelIndex&) const {
|
|
return static_cast<int>(actions.size());
|
|
}
|
|
|
|
QVariant BreadcrumbModel::data(const QModelIndex& index, int role) const {
|
|
if (actions.size() <= static_cast<size_t>(index.column())) return QVariant(); // safety
|
|
if (role == Qt::DisplayRole) {
|
|
return actions[static_cast<size_t>(index.column())]->text();
|
|
}
|
|
if (role == Qt::TextAlignmentRole) return Qt::AlignHCenter + Qt::AlignVCenter;
|
|
return QVariant();
|
|
}
|