mirror of
https://github.com/WarmUpTill/SceneSwitcher.git
synced 2026-03-21 17:34:57 -05:00
This could happen when adding the variable tab as a dock. The problem is visible in the OBS log: QAction::event: Ambiguous shortcut overload: Del
167 lines
4.7 KiB
C++
167 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);
|
|
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
|