TSI_Config/tmrrelayassociation.h

141 lines
4.5 KiB
C++

#ifndef TMRRELAYASSOCIATION_H
#define TMRRELAYASSOCIATION_H
#include <QDialog>
#include <QButtonGroup>
#include <QPushButton>
#include "data_config.h"
#include "config_mgr.h"
#include <QStandardItemModel> //数据模型类
#include <QTreeView>
#include "tmrrelayassociation_data.h"
namespace Ui {
class TMRRelayAssociation;
}
struct ExprNode {
QString value;
QList<ExprNode*> children;
};
struct ExprValidationResult {
bool isValid;
int errorPos;
QString errorMsg;
};
class DropTreeModel : public QStandardItemModel {
public:
using QStandardItemModel::QStandardItemModel;
QStringList mimeTypes() const override {
// 支持自定义类型和 QListWidget 默认类型
return { "application/x-custom", "application/x-qabstractitemmodeldatalist" };
}
bool dropMimeData(const QMimeData *data, Qt::DropAction action,
int row, int column, const QModelIndex &parent) override {
QStandardItem *parentItem = this->itemFromIndex(parent);
if (!parentItem)
parentItem = this->invisibleRootItem();
if (data->hasFormat("application/x-custom")) {
QByteArray rawData = data->data("application/x-custom");
QString customText = QString::fromUtf8(rawData);
QStandardItem *newItem = new QStandardItem(customText);
newItem->setData(customText, Qt::UserRole); // 假设 data 也就是内容
newItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable |
Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled);
if (row < 0)
parentItem->appendRow(newItem);
else
parentItem->insertRow(row, newItem);
return true;
}
if (data->hasFormat("application/x-qabstractitemmodeldatalist")) {
QByteArray encoded = data->data("application/x-qabstractitemmodeldatalist");
QDataStream stream(&encoded, QIODevice::ReadOnly);
while (!stream.atEnd()) {
int r, c;
QMap<int, QVariant> roleDataMap;
stream >> r >> c >> roleDataMap;
QString text = roleDataMap.value(Qt::DisplayRole).toString();
QVariant userData = roleDataMap.value(Qt::UserRole);
QStandardItem *newItem = new QStandardItem(text);
newItem->setData(userData, Qt::UserRole); // 保留附加数据
newItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable |
Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled);
if (row < 0)
parentItem->appendRow(newItem);
else
parentItem->insertRow(row, newItem);
}
return true;
}
return false;
}
Qt::DropActions supportedDropActions() const override {
return Qt::CopyAction | Qt::MoveAction;
}
};
class TMRRelayAssociation : public QDialog
{
Q_OBJECT
public:
explicit TMRRelayAssociation(int slot,int cardtype,QWidget *parent = nullptr);
~TMRRelayAssociation();
int slot_no;
CardType car_type;
private slots:
void on_pushButton_cancel_clicked();
void on_pushButton_confirm_clicked();
void onComboBoxIndexChanged(int index);
void OnButtonGroup(QAbstractButton *);
void on_pushButton_and_clicked();
void on_pushButton_or_clicked();
void on_treeView_Relay_customContextMenuRequested(const QPoint &pos);
void slotDeleteItem();
void on_checkBox_sgcc_stateChanged(int arg1);
void on_pushButton_logic_clicked();
private:
Ui::TMRRelayAssociation *ui;
QButtonGroup * btnGroup_slot = nullptr;
QListWidget *list_widget_available = nullptr;
int current_index;
QTreeView *treeView_relay;
QStandardItemModel *model_Relay;
std::shared_ptr<TmrrelayassociationData> relay_data = nullptr;
QMap<QString, QString> channelNameMap;
void Init();
void buildTreeFromExpression(QTreeView *treeView, const QString &expr);
ExprNode* parseExpression(const QString& expr, int& pos);
QStandardItem* buildItemTree(ExprNode* node);
void setExpressionToTreeView(QTreeView* treeView, const QString& expr);
QStandardItem* parseExpression(const QString &expr);
QString buildLogicExpression(QStandardItem *item);
ExprValidationResult validateLogicExpression(const QString& expr);
};
#endif // TMRRELAYASSOCIATION_H