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