2026-04-06 00:20:51 -05:00

432 lines
15 KiB
C++

#include <UI/Dialogs/DialogExtender.h>
#include <UI/Widgets/AdaptixWidget.h>
#include <Utils/CustomElements.h>
#include <Utils/NonBlockingDialogs.h>
#include <Client/Extender.h>
#include <Client/AuthProfile.h>
#include <UI/MainUI.h>
#include <MainAdaptix.h>
DialogExtender::DialogExtender(Extender* e)
{
extender = e;
this->createUI();
connect(tableView, &QTableView::customContextMenuRequested, this, &DialogExtender::handleMenu);
connect(tableView, &QTableView::clicked, this, [this](const QModelIndex &index) { onRowSelect(index.row(), index.column()); });
connect(tableView->selectionModel(), &QItemSelectionModel::selectionChanged, this, [this](const QItemSelection &selected, const QItemSelection &deselected){
Q_UNUSED(selected)
Q_UNUSED(deselected)
tableView->setFocus();
});
connect(serverTableWidget, &QTableView::customContextMenuRequested, this, &DialogExtender::handleServerMenu);
connect(serverTableWidget, &QTableView::clicked, this, [this](const QModelIndex &index) { onServerRowSelect(index.row(), index.column()); });
connect(serverTableWidget->selectionModel(), &QItemSelectionModel::selectionChanged, this, [this](const QItemSelection &selected, const QItemSelection &deselected){
Q_UNUSED(selected)
Q_UNUSED(deselected)
serverTableWidget->setFocus();
});
connect(serverProjectCombo, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &DialogExtender::onProjectChanged);
connect(buttonClose, &QPushButton::clicked, this, &DialogExtender::close);
}
DialogExtender::~DialogExtender() = default;
static QTableView* createScriptTable(QWidget* parent, QStandardItemModel* model, int columnCount)
{
model->setColumnCount(columnCount);
auto* table = new QTableView(parent);
table->setModel(model);
table->setHorizontalHeader(new BoldHeaderView(Qt::Horizontal, table));
table->setContextMenuPolicy(Qt::CustomContextMenu);
table->setAutoFillBackground(false);
table->setShowGrid(false);
table->setSortingEnabled(true);
table->setWordWrap(true);
table->setCornerButtonEnabled(false);
table->setSelectionBehavior(QAbstractItemView::SelectRows);
table->setFocusPolicy(Qt::NoFocus);
table->setAlternatingRowColors(true);
table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
table->horizontalHeader()->setCascadingSectionResizes(true);
table->horizontalHeader()->setHighlightSections(false);
table->verticalHeader()->setVisible(false);
table->setItemDelegate(new PaddingDelegate(table));
return table;
}
void DialogExtender::createUI()
{
this->setWindowTitle("AxScript manager");
this->resize(1200, 700);
this->setProperty("Main", "base");
/// Local Scripts
tableModel = new QStandardItemModel(this);
tableView = createScriptTable(this, tableModel, 4);
tableModel->setHorizontalHeaderItem(0, new QStandardItem("Name"));
tableModel->setHorizontalHeaderItem(1, new QStandardItem("Path"));
tableModel->setHorizontalHeaderItem(2, new QStandardItem("Status"));
tableModel->setHorizontalHeaderItem(3, new QStandardItem("Description"));
tableView->hideColumn(3);
textComment = new QTextEdit(this);
textComment->setReadOnly(true);
splitter = new QSplitter(Qt::Vertical, this);
splitter->setContentsMargins(0, 0, 0, 0);
splitter->setHandleWidth(3);
splitter->addWidget(tableView);
splitter->addWidget(textComment);
splitter->setSizes(QList<int>({500, 140}));
/// Server Scripts
serverTab = new QWidget(this);
serverProjectCombo = new QComboBox(serverTab);
serverProjectCombo->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
serverTableModel = new QStandardItemModel(serverTab);
serverTableWidget = createScriptTable(serverTab, serverTableModel, 3);
serverTableModel->setHorizontalHeaderItem(0, new QStandardItem("Name"));
serverTableModel->setHorizontalHeaderItem(1, new QStandardItem("Status"));
serverTableModel->setHorizontalHeaderItem(2, new QStandardItem("Description"));
serverTableWidget->hideColumn(2);
serverTextComment = new QTextEdit(serverTab);
serverTextComment->setReadOnly(true);
serverSplitter = new QSplitter(Qt::Vertical, serverTab);
serverSplitter->setContentsMargins(0, 0, 0, 0);
serverSplitter->setHandleWidth(3);
serverSplitter->addWidget(serverTableWidget);
serverSplitter->addWidget(serverTextComment);
serverSplitter->setSizes(QList<int>({500, 140}));
auto* serverLayout = new QVBoxLayout(serverTab);
serverLayout->setContentsMargins(4, 4, 4, 4);
serverLayout->setSpacing(4);
serverLayout->addWidget(serverProjectCombo);
serverLayout->addWidget(serverSplitter, 1);
tabWidget = new QTabWidget(this);
tabWidget->addTab(splitter, "Local Scripts");
tabWidget->addTab(serverTab, "Server Scripts");
spacer1 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
spacer2 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
buttonClose = new QPushButton("Close", this);
buttonClose->setFixedWidth(180);
layout = new QGridLayout(this);
layout->setContentsMargins(4, 4, 4, 4);
layout->addWidget(tabWidget, 0, 0, 1, 3);
layout->addItem( spacer1, 1, 0, 1, 1);
layout->addWidget(buttonClose, 1, 1, 1, 1);
layout->addItem( spacer2, 1, 2, 1, 1);
this->setLayout(layout);
}
void DialogExtender::AddExtenderItem(const ExtensionFile &extenderItem) const
{
auto item_Name = new QStandardItem(extenderItem.Name);
auto item_Path = new QStandardItem(extenderItem.FilePath);
auto item_Desc = new QStandardItem(extenderItem.Description);
auto item_Status = new QStandardItem("");
item_Name->setFlags( item_Name->flags() & ~Qt::ItemIsEditable );
item_Path->setFlags( item_Path->flags() & ~Qt::ItemIsEditable );
item_Status->setFlags( item_Status->flags() & ~Qt::ItemIsEditable );
item_Status->setTextAlignment( Qt::AlignCenter );
if ( extenderItem.Enabled ) {
item_Status->setText("Enable");
item_Status->setForeground(QColor(COLOR_NeonGreen));
}
else {
if (extenderItem.Message.isEmpty()) {
item_Status->setText("Disable");
item_Status->setForeground(QColor(COLOR_BrightOrange));
}
else {
item_Status->setText("Failed");
item_Status->setForeground(QColor(COLOR_ChiliPepper));
}
}
if( tableModel->rowCount() < 1 )
tableModel->setRowCount( 1 );
else
tableModel->setRowCount( tableModel->rowCount() + 1 );
bool isSortingEnabled = tableView->isSortingEnabled();
tableView->setSortingEnabled( false );
tableModel->setItem( tableModel->rowCount() - 1, 0, item_Name );
tableModel->setItem( tableModel->rowCount() - 1, 1, item_Path );
tableModel->setItem( tableModel->rowCount() - 1, 2, item_Status );
tableModel->setItem( tableModel->rowCount() - 1, 3, item_Desc );
tableView->setSortingEnabled( isSortingEnabled );
tableView->horizontalHeader()->setSectionResizeMode( 0, QHeaderView::ResizeToContents );
tableView->horizontalHeader()->setSectionResizeMode( 2, QHeaderView::ResizeToContents );
}
void DialogExtender::UpdateExtenderItem(const ExtensionFile &extenderItem) const
{
for (int row = 0; row < tableModel->rowCount(); ++row) {
QStandardItem *item = tableModel->item(row, 1);
if ( item && item->text() == extenderItem.FilePath ) {
tableModel->item(row, 0)->setText(extenderItem.Name);
tableModel->item(row, 3)->setText(extenderItem.Description);
if ( extenderItem.Enabled ) {
tableModel->item(row, 2)->setText("Enable");
tableModel->item(row, 2)->setForeground(QColor(COLOR_NeonGreen));
}
else {
if (extenderItem.Message.isEmpty()) {
tableModel->item(row, 2)->setText("Disable");
tableModel->item(row, 2)->setForeground(QColor(COLOR_BrightOrange));
}
else {
tableModel->item(row, 2)->setText("Failed");
tableModel->item(row, 2)->setForeground(QColor(COLOR_ChiliPepper));
}
}
break;
}
}
}
void DialogExtender::RemoveExtenderItem(const ExtensionFile &extenderItem) const
{
for (int row = 0; row < tableModel->rowCount(); ++row) {
QStandardItem *item = tableModel->item(row, 1);
if ( item && item->text() == extenderItem.FilePath ) {
tableModel->removeRow(row);
break;
}
}
}
/// SLOTS
void DialogExtender::handleMenu(const QPoint &pos ) const
{
QMenu menu = QMenu();
menu.addAction("Load new", this, &DialogExtender::onActionLoad );
menu.addAction("Reload", this, &DialogExtender::onActionReload );
menu.addSeparator();
menu.addAction("Enable", this, &DialogExtender::onActionEnable );
menu.addAction("Disable", this, &DialogExtender::onActionDisable );
menu.addSeparator();
menu.addAction("Remove", this, &DialogExtender::onActionRemove );
QPoint globalPos = tableView->mapToGlobal(pos);
menu.exec(globalPos);
}
void DialogExtender::onActionLoad() const
{
QString baseDir;
if (GlobalClient && GlobalClient->mainUI) {
if (auto profile = GlobalClient->mainUI->GetCurrentProfile())
baseDir = profile->GetProjectDir();
}
NonBlockingDialogs::getOpenFileName(const_cast<DialogExtender*>(this), "Load Script", baseDir, "AxScript Files (*.axs)",
[this](const QString& filePath) {
if (filePath.isEmpty())
return;
extender->LoadFromFile(filePath, true);
});
}
void DialogExtender::onActionReload() const
{
for( int rowIndex = 0 ; rowIndex < tableModel->rowCount() ; rowIndex++ ) {
if ( tableView->selectionModel()->isSelected(tableModel->index(rowIndex, 0)) ) {
auto filePath = tableModel->item( rowIndex, 1 )->text();
extender->RemoveExtension(filePath);
extender->LoadFromFile(filePath, true);
}
}
}
void DialogExtender::onActionEnable() const
{
for( int rowIndex = 0 ; rowIndex < tableModel->rowCount() ; rowIndex++ ) {
if ( tableView->selectionModel()->isSelected(tableModel->index(rowIndex, 0)) ) {
auto filePath = tableModel->item( rowIndex, 1 )->text();
extender->EnableExtension(filePath);
}
}
}
void DialogExtender::onActionDisable() const
{
for( int rowIndex = 0 ; rowIndex < tableModel->rowCount() ; rowIndex++ ) {
if ( tableView->selectionModel()->isSelected(tableModel->index(rowIndex, 0)) ) {
auto filePath = tableModel->item( rowIndex, 1 )->text();
extender->DisableExtension(filePath);
}
}
}
void DialogExtender::onActionRemove() const
{
QStringList FilesList;
for( int rowIndex = 0 ; rowIndex < tableModel->rowCount() ; rowIndex++ ) {
if ( tableView->selectionModel()->isSelected(tableModel->index(rowIndex, 0)) ) {
auto filePath = tableModel->item( rowIndex, 1 )->text();
FilesList.append(filePath);
}
}
for(auto filePath : FilesList)
extender->RemoveExtension(filePath);
textComment->clear();
}
void DialogExtender::onRowSelect(const int row, int column) const { textComment->setText(tableModel->item(row,3)->text()); }
/// Server Scripts
void DialogExtender::SetMainUI(MainUI* ui)
{
mainUI = ui;
RefreshProjectsList();
}
void DialogExtender::RefreshProjectsList()
{
serverProjectCombo->blockSignals(true);
serverProjectCombo->clear();
if (!mainUI) {
serverProjectCombo->blockSignals(false);
return;
}
auto projects = mainUI->GetAdaptixProjects();
for (auto* widget : projects) {
if (widget && widget->GetProfile()) {
QString projectName = widget->GetProfile()->GetProject();
serverProjectCombo->addItem(projectName, QVariant::fromValue(static_cast<void*>(widget)));
}
}
serverProjectCombo->blockSignals(false);
if (serverProjectCombo->count() > 0) {
serverProjectCombo->setCurrentIndex(0);
onProjectChanged(0);
} else {
currentAdaptixWidget = nullptr;
RefreshServerScripts();
}
}
void DialogExtender::onProjectChanged(int index)
{
if (index < 0 || !serverProjectCombo) {
currentAdaptixWidget = nullptr;
} else {
currentAdaptixWidget = static_cast<AdaptixWidget*>(serverProjectCombo->itemData(index).value<void*>());
}
RefreshServerScripts();
}
void DialogExtender::RefreshServerScripts()
{
serverTableModel->setRowCount(0);
serverTextComment->clear();
if (!currentAdaptixWidget)
return;
QList<ServerScriptInfo> scripts = currentAdaptixWidget->GetServerScripts();
for (const ServerScriptInfo &entry : scripts) {
auto item_Name = new QStandardItem(entry.name);
auto item_Status = new QStandardItem("");
auto item_Desc = new QStandardItem(entry.description);
item_Name->setFlags(item_Name->flags() & ~Qt::ItemIsEditable);
item_Status->setFlags(item_Status->flags() & ~Qt::ItemIsEditable);
item_Status->setTextAlignment(Qt::AlignCenter);
if (entry.enabled) {
item_Status->setText("Enable");
item_Status->setForeground(QColor(COLOR_NeonGreen));
} else {
item_Status->setText("Disable");
item_Status->setForeground(QColor(COLOR_BrightOrange));
}
int row = serverTableModel->rowCount();
serverTableModel->setRowCount(row + 1);
bool isSortingEnabled = serverTableWidget->isSortingEnabled();
serverTableWidget->setSortingEnabled(false);
serverTableModel->setItem(row, 0, item_Name);
serverTableModel->setItem(row, 1, item_Status);
serverTableModel->setItem(row, 2, item_Desc);
serverTableWidget->setSortingEnabled(isSortingEnabled);
}
serverTableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
serverTableWidget->horizontalHeader()->setSectionResizeMode(1, QHeaderView::ResizeToContents);
}
void DialogExtender::handleServerMenu(const QPoint &pos)
{
QMenu menu;
menu.addAction("Enable", this, &DialogExtender::onServerActionEnable);
menu.addAction("Disable", this, &DialogExtender::onServerActionDisable);
QPoint globalPos = serverTableWidget->mapToGlobal(pos);
menu.exec(globalPos);
}
void DialogExtender::onServerActionEnable()
{
if (!currentAdaptixWidget)
return;
for (int row = 0; row < serverTableModel->rowCount(); ++row) {
if (serverTableWidget->selectionModel()->isSelected(serverTableModel->index(row, 0))) {
QString name = serverTableModel->item(row, 0)->text();
currentAdaptixWidget->EnableServerScript(name);
}
}
RefreshServerScripts();
}
void DialogExtender::onServerActionDisable()
{
if (!currentAdaptixWidget)
return;
for (int row = 0; row < serverTableModel->rowCount(); ++row) {
if (serverTableWidget->selectionModel()->isSelected(serverTableModel->index(row, 0))) {
QString name = serverTableModel->item(row, 0)->text();
currentAdaptixWidget->DisableServerScript(name);
}
}
RefreshServerScripts();
}
void DialogExtender::onServerRowSelect(const int row, int column) const
{
QStandardItem* item = serverTableModel->item(row, 2);
if (item)
serverTextComment->setText(item->text());
}