mirror of
https://github.com/x-tools-author/x-tools.git
synced 2025-09-15 15:28:40 +08:00
chore: import file merge module to project
This commit is contained in:
parent
dbe58c21cb
commit
ef1e52e87e
4
Source/Assistants/FileMerge/CMakeLists.txt
Normal file
4
Source/Assistants/FileMerge/CMakeLists.txt
Normal 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")
|
||||||
186
Source/Assistants/FileMerge/Source/xToolsFileMergeAssistant.cpp
Normal file
186
Source/Assistants/FileMerge/Source/xToolsFileMergeAssistant.cpp
Normal 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);
|
||||||
|
}
|
||||||
@ -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();
|
||||||
|
};
|
||||||
112
Source/Assistants/FileMerge/Source/xToolsFileMergeAssistant.ui
Normal file
112
Source/Assistants/FileMerge/Source/xToolsFileMergeAssistant.ui
Normal 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>
|
||||||
16
Source/Assistants/FileMerge/main.cpp
Normal file
16
Source/Assistants/FileMerge/main.cpp
Normal 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);
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user