chore: import file merge module to project

This commit is contained in:
x-tools-author 2024-03-30 17:00:47 +08:00
parent dbe58c21cb
commit ef1e52e87e
5 changed files with 355 additions and 0 deletions

View File

@ -0,0 +1,4 @@
set(ASSISTANT_OWN_SOURCE "")
set(ASSISTANT_OWN_LIBS Qt${QT_VERSION_MAJOR}::Widgets)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/Source)
x_tools_add_assistant("FileMerge" "FileMergeAssistant")

View File

@ -0,0 +1,186 @@
/***************************************************************************************************
* Copyright 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 "xToolsFileMergeAssistant.h"
#include "ui_xToolsFileMergeAssistant.h"
#include <QDataStream>
#include <QFileDialog>
#include <QMessageBox>
#include "xToolsApplication.h"
xToolsFileMergeAssistant::xToolsFileMergeAssistant(QWidget *parent)
: QWidget(parent)
, ui(new Ui::xToolsFileMergeAssistant)
{
ui->setupUi(this);
ui->listWidget->setAlternatingRowColors(true);
ui->progressBar->hide();
connect(ui->pushButtonImport,
&QPushButton::clicked,
this,
&xToolsFileMergeAssistant::onImportPushButtonClicked);
connect(ui->pushButtonMerge,
&QPushButton::clicked,
this,
&xToolsFileMergeAssistant::onMergePushButtonClicked);
connect(ui->pushButtonClear,
&QPushButton::clicked,
this,
&xToolsFileMergeAssistant::onClearPushButtonClicked);
connect(ui->pushButtonUp,
&QPushButton::clicked,
this,
&xToolsFileMergeAssistant::onUpPushButtonClicked);
connect(ui->pushButtonDown,
&QPushButton::clicked,
this,
&xToolsFileMergeAssistant::onDownPushButtonClicked);
connect(ui->pushButtonRemove,
&QPushButton::clicked,
this,
&xToolsFileMergeAssistant::onRemovePushButtonClicked);
}
xToolsFileMergeAssistant::~xToolsFileMergeAssistant()
{
delete ui;
}
void xToolsFileMergeAssistant::onImportPushButtonClicked()
{
QString path = xToolsApplication::desktopPath();
auto files = QFileDialog::getOpenFileNames(this,
tr("Import Files"),
path,
tr("Bin file(*.bin);;All file(*)"));
if (files.isEmpty()) {
return;
}
ui->listWidget->clear();
for (const auto &file : files) {
ui->listWidget->addItem(file);
}
}
void xToolsFileMergeAssistant::onMergePushButtonClicked()
{
auto showOpenFileFailedMessageBox = [=](const QString &fileName, const QString &errorString) {
QMessageBox::warning(this,
tr("Open File Failed"),
tr("Open file(%1) failed:").arg(fileName) + errorString);
};
if (ui->listWidget->count() <= 0) {
QMessageBox::warning(this,
tr("Merge Files"),
tr("No file to merge, please import files first."));
return;
}
QString path = xToolsApplication::desktopPath();
auto fileName = QFileDialog::getSaveFileName(this,
tr("Save Files"),
path,
tr("Bin file(*.bin);;All file(*)"));
if (fileName.isEmpty()) {
return;
}
QFile outFile(fileName);
if (!outFile.open(QFile::WriteOnly | QFile::Truncate)) {
showOpenFileFailedMessageBox(fileName, outFile.errorString());
return;
}
setProgressBarRange();
ui->progressBar->show();
int mergedBytes = 0;
for (int i = 0; i < ui->listWidget->count(); ++i) {
QString fileName = ui->listWidget->item(i)->text();
QFile inFile(fileName);
if (!inFile.open(QFile::ReadOnly)) {
showOpenFileFailedMessageBox(fileName, inFile.errorString());
ui->progressBar->hide();
return;
}
QByteArray data = inFile.readAll();
inFile.close();
QDataStream out(&outFile);
out << data;
mergedBytes += data.size();
ui->progressBar->setValue(mergedBytes);
}
outFile.close();
ui->progressBar->hide();
QMessageBox::information(this, tr("Merge Files"), tr("Merge files successfully."));
}
void xToolsFileMergeAssistant::onClearPushButtonClicked()
{
ui->listWidget->clear();
}
void xToolsFileMergeAssistant::onUpPushButtonClicked()
{
auto items = ui->listWidget->selectedItems();
for (auto &item : items) {
int row = ui->listWidget->row(item);
int newRow = row - 1;
if (row >= 0) {
ui->listWidget->takeItem(row);
ui->listWidget->insertItem(newRow, item);
item->setSelected(true);
}
}
}
void xToolsFileMergeAssistant::onDownPushButtonClicked()
{
auto items = ui->listWidget->selectedItems();
for (auto &item : items) {
int row = ui->listWidget->row(item);
int newRow = row + 1;
if (row < ui->listWidget->count()) {
ui->listWidget->takeItem(row);
ui->listWidget->insertItem(newRow, item);
item->setSelected(true);
}
}
}
void xToolsFileMergeAssistant::onRemovePushButtonClicked()
{
auto items = ui->listWidget->selectedItems();
for (auto item : items) {
ui->listWidget->removeItemWidget(item);
delete item;
}
}
void xToolsFileMergeAssistant::setProgressBarRange()
{
int allBytes = 0;
for (int i = 0; i < ui->listWidget->count(); ++i) {
QString fileName = ui->listWidget->item(i)->text();
QFile file(fileName);
file.open(QFile::ReadOnly);
allBytes += file.size();
file.close();
}
ui->progressBar->setRange(0, allBytes);
}

View File

@ -0,0 +1,37 @@
/***************************************************************************************************
* Copyright 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.
**************************************************************************************************/
#pragma once
#include <QWidget>
namespace Ui {
class xToolsFileMergeAssistant;
}
class xToolsFileMergeAssistant : public QWidget
{
Q_OBJECT
public:
Q_INVOKABLE explicit xToolsFileMergeAssistant(QWidget *parent = nullptr);
~xToolsFileMergeAssistant();
private:
Ui::xToolsFileMergeAssistant *ui;
private:
void onImportPushButtonClicked();
void onMergePushButtonClicked();
void onClearPushButtonClicked();
void onUpPushButtonClicked();
void onDownPushButtonClicked();
void onRemovePushButtonClicked();
void setProgressBarRange();
};

View File

@ -0,0 +1,112 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>xToolsFileMergeAssistant</class>
<widget class="QWidget" name="xToolsFileMergeAssistant">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>735</width>
<height>320</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QGroupBox" name="groupBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>File list</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QListWidget" name="listWidget"/>
</item>
</layout>
</widget>
</item>
<item row="1" column="0">
<widget class="QProgressBar" name="progressBar">
<property name="value">
<number>0</number>
</property>
</widget>
</item>
<item row="2" column="0">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string notr="true"/>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButtonImport">
<property name="text">
<string>Import</string>
</property>
</widget>
</item>
<item>
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButtonUp">
<property name="text">
<string>Up</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButtonDown">
<property name="text">
<string>Down</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButtonRemove">
<property name="text">
<string>Remove</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButtonClear">
<property name="text">
<string>Clear</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButtonMerge">
<property name="text">
<string>Merge</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -0,0 +1,16 @@
/***************************************************************************************************
* Copyright 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 "xTools.h"
#include "xToolsFileMergeAssistant.h"
int main(int argc, char* argv[])
{
const QString appName = QObject::tr("File Merge Assistant");
return xToolsExec<xToolsFileMergeAssistant>(argc, argv, appName);
}