x-tools/Source/Tools/ToolsUI/xToolsTableModelToolUi.cpp
2024-03-30 13:34:28 +08:00

427 lines
13 KiB
C++

/***************************************************************************************************
* Copyright 2023-2024 x-tools-author(x-tools@outlook.com). All rights reserved.
*
* The file is encoded using "utf8 with bom", it is a part of xTools project.
*
* xTools is licensed according to the terms in the file LICENCE(GPL V3) in the root of the source
* code directory.
**************************************************************************************************/
#include "xToolsTableModelToolUi.h"
#include "ui_xToolsTableModelToolUi.h"
#include <QFile>
#include <QFileDialog>
#include <QJsonArray>
#include <QJsonDocument>
#include <QMessageBox>
#include <QStandardItemModel>
#include "xToolsMenu.h"
#include "xToolsSettings.h"
#include "xToolsTableModelTool.h"
#include "xToolsApplication.h"
xToolsTableModelToolUi::xToolsTableModelToolUi(QWidget *parent)
: xToolsBaseToolUi{parent}
, ui(new Ui::xToolsTableModelToolUi)
{
ui->setupUi(this);
QHeaderView *vHeaderView = ui->tableView->verticalHeader();
vHeaderView->hide();
connect(ui->pushButtonEdit,
&QPushButton::clicked,
this,
&xToolsTableModelToolUi::onPushButtonEditClicked);
connect(ui->pushButtonClear,
&QPushButton::clicked,
this,
&xToolsTableModelToolUi::onPushButtonClearClicked);
connect(ui->pushButtonDelete,
&QPushButton::clicked,
this,
&xToolsTableModelToolUi::onPushButtonDeleteClicked);
connect(ui->pushButtonImport,
&QPushButton::clicked,
this,
&xToolsTableModelToolUi::onPushButtonImportClicked);
connect(ui->pushButtonExport,
&QPushButton::clicked,
this,
&xToolsTableModelToolUi::onPushButtonExportClicked);
connect(ui->pushButtonAppend,
&QPushButton::clicked,
this,
&xToolsTableModelToolUi::onPushButtonAppendClicked);
connect(ui->tableView, &QTableView::doubleClicked, this, [=](const QModelIndex &index) {
Q_UNUSED(index)
onPushButtonEditClicked();
});
}
xToolsTableModelToolUi::~xToolsTableModelToolUi()
{
delete ui;
}
void xToolsTableModelToolUi::setStretchSections(QList<int> columns)
{
QTableView *tableView = ui->tableView;
QHeaderView *headerView = tableView->horizontalHeader();
for (int &column : columns) {
headerView->setSectionResizeMode(column, QHeaderView::Stretch);
}
}
void xToolsTableModelToolUi::setSectionResizeModeToStretch()
{
QTableView *tableView = ui->tableView;
QHeaderView *headerView = tableView->horizontalHeader();
headerView->setSectionResizeMode(QHeaderView::Stretch);
}
void xToolsTableModelToolUi::setColumnVisible(int column, bool visible)
{
QTableView *tableView = ui->tableView;
if (visible) {
tableView->showColumn(column);
} else {
tableView->hideColumn(column);
}
}
void xToolsTableModelToolUi::onBaseToolUiInitialized(xToolsBaseTool *tool, const QString &settingGroup)
{
if (!tool) {
qWarning() << "The value of tool is nullptr!";
return;
}
if (!tool->inherits("xToolsTableModelTool")) {
qWarning() << "The tool does not inherits xToolsTableModelTool!";
return;
}
mTableModelTool = qobject_cast<xToolsTableModelTool *>(tool);
if (!mTableModelTool) {
qWarning() << "The value of mTableModelTool is nullptr!";
return;
}
mTableModel = mTableModelTool->tableModel().value<QAbstractTableModel *>();
QTableView *tableView = ui->tableView;
QHeaderView *headerView = tableView->horizontalHeader();
int columnCount = mTableModel->columnCount();
QStringList headers;
QStringList rawHeaders;
for (int i = 0; i < columnCount; i++) {
auto orientation = Qt::Orientation::Horizontal;
QString str = mTableModel->headerData(i, orientation).toString();
rawHeaders.append(str);
str = mTableModelTool->cookHeaderString(str);
headers.append(str);
}
QStandardItemModel *headerViewModel = new QStandardItemModel(headerView);
tableView->setHorizontalHeader(headerView);
tableView->setModel(mTableModel);
headerViewModel->setColumnCount(headers.count());
headerViewModel->setHorizontalHeaderLabels(headers);
headerView->setModel(headerViewModel);
headerView->setDefaultAlignment(Qt::AlignLeft);
mMenu = new xToolsMenu(ui->pushButtonVisible);
ui->pushButtonVisible->setMenu(mMenu);
auto settings = xToolsSettings::instance();
auto hideColumns = defaultHideColumns();
for (int i = 0; i < headers.count(); i++) {
QAction *ret = mMenu->addAction(headers.at(i));
connect(ret, &QAction::triggered, this, [=]() {
if (ret->isChecked()) {
tableView->showColumn(i);
} else {
tableView->hideColumn(i);
}
settings->setValue(settingGroup + "/" + rawHeaders.at(i), ret->isChecked());
});
ret->setCheckable(true);
QVariant var = settings->value(settingGroup + "/" + rawHeaders.at(i));
if (var.isValid()) {
if (!var.toBool()) {
tableView->hideColumn(i);
}
ret->setChecked(var.toBool());
} else {
if (hideColumns.contains(i)) {
tableView->hideColumn(i);
ret->setChecked(false);
} else {
ret->setChecked(true);
}
}
}
mItemsKey = settingGroup + "/items";
QString items = settings->value(mItemsKey).toString();
QByteArray json = QByteArray::fromHex(items.toLatin1());
importFromJson(QJsonDocument::fromJson(json).toJson());
}
QList<int> xToolsTableModelToolUi::defaultHideColumns()
{
QList<int> list;
return list;
}
void xToolsTableModelToolUi::afterRowEdited(int row)
{
Q_UNUSED(row)
}
void xToolsTableModelToolUi::clear()
{
int rowCount = mTableModel->rowCount();
mTableModel->removeRows(0, rowCount);
}
void xToolsTableModelToolUi::remove(const QModelIndex &index)
{
if (index.isValid()) {
mTableModel->removeRow(index.row());
}
}
void xToolsTableModelToolUi::importFromJson(const QByteArray &json)
{
QJsonDocument jsonDoc = QJsonDocument::fromJson(json);
QJsonArray jsonArray = jsonDoc.array();
for (int i = 0; i < jsonArray.count(); i++) {
QJsonObject jsonObj = jsonArray.at(i).toObject();
QJsonDocument jd;
jd.setObject(jsonObj);
QString item = QString::fromUtf8(jd.toJson());
mTableModelTool->addItem(item);
}
}
QByteArray xToolsTableModelToolUi::exportAsJson()
{
auto items = mTableModelTool->itemsContext();
QJsonArray jsonArray = items.toJsonArray();
QJsonDocument jsonDoc;
jsonDoc.setArray(jsonArray);
QByteArray json = jsonDoc.toJson();
return json;
}
void xToolsTableModelToolUi::edit(const QModelIndex &index)
{
QVariant var = mTableModelTool->itemContext(index.row());
QJsonObject jsonObj = var.toJsonObject();
QDialog *editor = itemEditor();
QGenericReturnArgument ret;
QMetaObject::invokeMethod(editor,
"setParameters",
Qt::DirectConnection,
ret,
Q_ARG(QJsonObject, jsonObj));
qInfo() << "the parameter of setParameters() is:" << jsonObj;
Q_UNUSED(ret);
editor->show();
if (QDialog::Accepted == editor->exec()) {
QJsonObject params;
QMetaObject::invokeMethod(editor,
"parameters",
Qt::DirectConnection,
Q_RETURN_ARG(QJsonObject, params));
qInfo() << "the parameter of parameters() is:" << params;
QJsonDocument jsonDoc;
jsonDoc.setObject(params);
QString str = QString::fromUtf8(jsonDoc.toJson());
mTableModelTool->addItem(str, index.row());
afterRowEdited(index.row());
}
}
bool xToolsTableModelToolUi::append()
{
QJsonObject jsonObj = mTableModelTool->itemContext(-1).toJsonObject();
QDialog *editor = itemEditor();
QGenericReturnArgument ret;
QMetaObject::invokeMethod(editor,
"setParameters",
Qt::DirectConnection,
ret,
Q_ARG(QJsonObject, jsonObj));
qInfo() << "the parameter of setParameters() is:" << jsonObj;
Q_UNUSED(ret);
editor->show();
if (!(QDialog::Accepted == editor->exec())) {
return false;
}
QMetaObject::invokeMethod(editor,
"parameters",
Qt::DirectConnection,
Q_RETURN_ARG(QJsonObject, jsonObj));
qInfo() << "the parameter of parameters() is:" << jsonObj;
QJsonDocument jsonDoc;
jsonDoc.setObject(jsonObj);
QString str = QString::fromUtf8(jsonDoc.toJson());
mTableModelTool->addItem(str, -1);
return true;
}
QModelIndex xToolsTableModelToolUi::currentIndex()
{
QModelIndex index = ui->tableView->currentIndex();
if (!index.isValid()) {
QMessageBox::warning(xToolsApplication::mainWindow(),
tr("Please Select an Item"),
tr("Please select an tiem first,"
" then try again!"));
}
return index;
}
void xToolsTableModelToolUi::writeToSettingsFile()
{
QByteArray json = exportAsJson();
xToolsSettings::instance()->setValue(mItemsKey, QString::fromLatin1(json.toHex()));
}
bool xToolsTableModelToolUi::isInitialized()
{
if (!mTableModelTool) {
QMessageBox::warning(xToolsApplication::mainWindow(),
tr("Invalid Parameter"),
tr("The value of mTableModelTool is nullptr,"
" you must called initialize() first!"));
return false;
}
return true;
}
void xToolsTableModelToolUi::onPushButtonEditClicked()
{
if (!isInitialized()) {
return;
}
QModelIndex index = currentIndex();
if (index.isValid()) {
edit(index);
writeToSettingsFile();
}
}
void xToolsTableModelToolUi::onPushButtonClearClicked()
{
if (!isInitialized()) {
return;
}
int ret = QMessageBox::warning(xToolsApplication::mainWindow(),
tr("Clear Data"),
tr("The data will be empty from settings file, "
"please confrim the operation!"),
QMessageBox::Cancel | QMessageBox::Ok);
if (ret == QMessageBox::Ok) {
clear();
writeToSettingsFile();
}
}
void xToolsTableModelToolUi::onPushButtonDeleteClicked()
{
if (!isInitialized()) {
return;
}
int ret = QMessageBox::warning(xToolsApplication::mainWindow(),
tr("Delete Data"),
tr("The data will be delete from settings file, "
"please confrim the operation!"),
QMessageBox::Cancel | QMessageBox::Ok);
if (ret != QMessageBox::Ok) {
return;
}
QModelIndex index = currentIndex();
if (index.isValid()) {
remove(index);
writeToSettingsFile();
}
}
void xToolsTableModelToolUi::onPushButtonImportClicked()
{
if (!isInitialized()) {
return;
}
QString fileName = QFileDialog::getOpenFileName(xToolsApplication::mainWindow(),
tr("Import data"),
".",
tr("JSON (*.json);;All (*)"));
if (fileName.isEmpty()) {
return;
}
QFile file(fileName);
if (file.open(QFile::ReadOnly)) {
QByteArray json = file.readAll();
file.close();
;
importFromJson(json);
writeToSettingsFile();
} else {
qWarning() << "Can not open file:" << file.errorString();
}
}
void xToolsTableModelToolUi::onPushButtonExportClicked()
{
if (!isInitialized()) {
return;
}
QString fileName = QFileDialog::getSaveFileName(xToolsApplication::mainWindow(),
tr("Import data"),
".",
tr("JSON (*.json);;All (*); "));
if (fileName.isEmpty()) {
return;
}
QFile file(fileName);
if (file.open(QFile::WriteOnly)) {
QTextStream out(&file);
out << exportAsJson();
file.close();
} else {
qWarning() << "Can not open file:" << file.errorString();
}
}
void xToolsTableModelToolUi::onPushButtonAppendClicked()
{
if (!isInitialized()) {
return;
}
if (append()) {
writeToSettingsFile();
}
}