SceneSwitcher/lib/utils/resource-table.cpp
2026-01-18 12:30:07 +01:00

168 lines
4.7 KiB
C++

#include "resource-table.hpp"
#include "plugin-state-helpers.hpp"
#include "ui-helpers.hpp"
#include <QGridLayout>
#include <QHeaderView>
#include <QShortcut>
namespace advss {
ResourceTable::ResourceTable(QWidget *parent, const QString &help,
const QString &addToolTip,
const QString &removeToolTip,
const QStringList &headers,
const std::function<void()> &openSettings)
: QWidget(parent),
_table(new QTableWidget()),
_add(new QToolButton()),
_remove(new QToolButton()),
_help(new QLabel(help))
{
_add->setProperty("themeID",
QVariant(QString::fromUtf8("addIconSmall")));
_add->setProperty("class", QVariant(QString::fromUtf8("icon-plus")));
_add->setToolTip(addToolTip);
_remove->setProperty("themeID",
QVariant(QString::fromUtf8("removeIconSmall")));
_remove->setProperty("class",
QVariant(QString::fromUtf8("icon-trash")));
_remove->setToolTip(removeToolTip);
_help->setWordWrap(true);
_help->setAlignment(Qt::AlignCenter);
_table->setColumnCount(headers.size());
_table->horizontalHeader()->setSectionResizeMode(
QHeaderView::ResizeMode::Interactive);
_table->setHorizontalHeaderLabels(headers);
_table->verticalHeader()->hide();
_table->setCornerButtonEnabled(false);
_table->setShowGrid(false);
_table->setEditTriggers(QAbstractItemView::NoEditTriggers);
_table->setSelectionBehavior(QAbstractItemView::SelectRows);
auto helpAndTableLayout = new QGridLayout();
helpAndTableLayout->setContentsMargins(0, 0, 0, 0);
helpAndTableLayout->addWidget(_table, 0, 0);
helpAndTableLayout->addWidget(_help, 0, 0, Qt::AlignCenter);
auto controlLayout = new QHBoxLayout;
controlLayout->setContentsMargins(0, 0, 0, 0);
controlLayout->addWidget(_add);
controlLayout->addWidget(_remove);
controlLayout->addStretch();
auto layout = new QVBoxLayout();
layout->addLayout(helpAndTableLayout);
layout->addLayout(controlLayout);
layout->setContentsMargins(0, 0, 0, 0);
setLayout(layout);
QWidget::connect(_add, SIGNAL(clicked()), this, SLOT(Add()));
QWidget::connect(_remove, SIGNAL(clicked()), this, SLOT(Remove()));
QWidget::connect(_table, &QTableWidget::cellDoubleClicked,
[openSettings]() { openSettings(); });
auto settingsShortcut = new QShortcut(QKeySequence("F2"), this);
settingsShortcut->setContext(Qt::WidgetWithChildrenShortcut);
QWidget::connect(settingsShortcut, &QShortcut::activated, this,
openSettings);
auto removeShortcut = new QShortcut(QKeySequence("Del"), this);
removeShortcut->setContext(Qt::WidgetWithChildrenShortcut);
QWidget::connect(removeShortcut, &QShortcut::activated, this,
[this]() { Remove(); });
auto newShortcut = new QShortcut(QKeySequence("Ctrl+N"), this);
newShortcut->setContext(Qt::WidgetWithChildrenShortcut);
QWidget::connect(newShortcut, &QShortcut::activated, this,
[this]() { Add(); });
}
void ResourceTable::SetHelpVisible(bool visible) const
{
_help->setVisible(visible);
}
void ResourceTable::HighlightAddButton(bool enable)
{
if (_highlightConnection) {
_highlightConnection->deleteLater();
_highlightConnection = nullptr;
}
if (enable && HighlightUIElementsEnabled()) {
_highlightConnection = HighlightWidget(_add, QColor(Qt::green));
}
}
void ResourceTable::resizeEvent(QResizeEvent *)
{
const auto columnCount = _table->columnCount();
const auto columnSize = (_table->width() - 1) / columnCount;
for (int i = 0; i < columnCount; ++i) {
_table->horizontalHeader()->resizeSection(i, columnSize);
}
}
void AddItemTableRow(QTableWidget *table, const QStringList &cellLabels)
{
int row = table->rowCount();
table->setRowCount(row + 1);
int col = 0;
for (const auto &cellLabel : cellLabels) {
auto *item = new QTableWidgetItem(cellLabel);
item->setToolTip(cellLabel);
table->setItem(row, col, item);
col++;
}
table->sortByColumn(0, Qt::AscendingOrder);
}
void UpdateItemTableRow(QTableWidget *table, int row,
const QStringList &cellLabels)
{
int col = 1; // Skip the name cell
for (const auto &cellLabel : cellLabels) {
auto item = table->item(row, col);
item->setText(cellLabel);
item->setToolTip(cellLabel);
col++;
}
}
void RenameItemTableRow(QTableWidget *table, const QString &oldName,
const QString &newName)
{
for (int row = 0; row < table->rowCount(); row++) {
auto item = table->item(row, 0);
if (!item) {
continue;
}
if (item->text() == oldName) {
item->setText(newName);
table->sortByColumn(0, Qt::AscendingOrder);
return;
}
}
assert(false);
}
void RemoveItemTableRow(QTableWidget *table, const QString &name)
{
for (int row = 0; row < table->rowCount(); ++row) {
auto item = table->item(row, 0);
if (item && item->text() == name) {
table->removeRow(row);
return;
}
}
table->sortByColumn(0, Qt::AscendingOrder);
}
} // namespace advss