Files
2026-07-16 08:28:55 +08:00

326 lines
9.3 KiB
C++

#include "FileManageWidget.h"
#include "ui_FileManageWidget.h"
#include <QDebug>
#include "SysPara.h"
#include <QDir>
#include <QStringList>
#include <QFile>
#include <QFileInfo>
#include <QMessageBox>
#include <QTextStream>
FileManageWidget::FileManageWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::FileManageWidget)
{
ui->setupUi(this);
applyStyleSheet();
// 安装事件过滤器用于判断当前焦点位于系统文件列表还是U盘文件列表,高亮获得焦点的列表
ui->systemFileListView->installEventFilter(this);
ui->udiskFileListView->installEventFilter(this);
// 将各自列表所查找的根目录存放到各自的动态属性中
// updateFileListView方法将会从属性中获取对应的查找根路径用于更新文件列表
ui->systemFileListView->setProperty("searchPath", DOC_ROOT_DIR);
ui->udiskFileListView->setProperty("searchPath", UDISK_DOC_ROOT_DIR);
// 清理ui文件中,用于调试的item
ui->systemFileListView->clear();
ui->udiskFileListView->clear();
ui->systemFileListView->setMouseTracking(true);
ui->udiskFileListView->setMouseTracking(true);
connect(ui->systemFileListView, &QListWidget::itemSelectionChanged, this, &FileManageWidget::refreshButtonsStatus);
connect(ui->udiskFileListView, &QListWidget::itemSelectionChanged, this, &FileManageWidget::refreshButtonsStatus);
m_hasUDisk = checkUDiskPresent();
onUDiskStateChanged();
m_udiskCheckTimer = new QTimer(this);
connect(m_udiskCheckTimer, &QTimer::timeout, this, &FileManageWidget::onUDiskCheckTimeout);
m_udiskCheckTimer->start(1000);
m_focusedListView = ui->systemFileListView;
m_focusedListView->setFocus();
refreshButtonsStatus();
onFilterCBoxSelectChanged(ui->filterCBox->currentIndex());
}
FileManageWidget::~FileManageWidget()
{
m_udiskCheckTimer->stop();
ui->systemFileListView->removeEventFilter(this);
ui->udiskFileListView->removeEventFilter(this);
delete ui;
}
bool FileManageWidget::eventFilter(QObject *watched, QEvent *event)
{
// 仅处理系统文件列表或U盘文件列表
if(watched != ui->systemFileListView && watched != ui->udiskFileListView) {
return false;
}
if(event->type() != QEvent::FocusIn && event->type() != QEvent::MouseMove && event->type() != QEvent::MouseButtonPress) {
return false;
}
// 为获得焦点的列表视图改变边框色,高亮显示
if(m_focusedListView == watched) {
return false;
}
QWidget * backgroundPanel = dynamic_cast<QWidget *>(m_focusedListView->parent());
auto palette = backgroundPanel->palette();
palette.setColor(backgroundPanel->backgroundRole(), QColor("white"));
backgroundPanel->setPalette(palette);
m_focusedListView = dynamic_cast<QListWidget *>(watched);
backgroundPanel = dynamic_cast<QWidget *>(watched->parent());
palette = backgroundPanel->palette();
palette.setColor(backgroundPanel->backgroundRole(), "#5396C1");
backgroundPanel->setPalette(palette);
refreshButtonsStatus();
return false;
}
void FileManageWidget::onFilterCBoxSelectChanged(int i)
{
if(i < JobFile || i > All) {
qWarning() << "无效的过滤类型编号: " << i;
i = All;
ui->filterCBox->setCurrentIndex(i);
}
m_currFilterType = i;
refreshFileList(ui->systemFileListView);
if (m_hasUDisk) {
refreshFileList(ui->udiskFileListView);
}
}
void FileManageWidget::onExportBtnClicked()
{
copyFiles(ui->systemFileListView, ui->udiskFileListView);
refreshFileList(ui->udiskFileListView);
}
void FileManageWidget::onImportBtnClicked()
{
copyFiles(ui->udiskFileListView, ui->systemFileListView);
refreshFileList(ui->systemFileListView);
}
void FileManageWidget::onSelectAllBtnClicked()
{
if(!m_focusedListView)
return;
m_focusedListView->selectAll();
}
void FileManageWidget::onCancelAllBtnClicked()
{
if(!m_focusedListView)
return;
m_focusedListView->clearSelection();
}
void FileManageWidget::onDelSelectedBtnClicked()
{
if(!m_focusedListView)
return;
auto items = m_focusedListView->selectedItems();
for(auto item : items) {
auto filename = item->data(AbsPathRole).toString();
bool ret = QFile::remove(filename);
qInfo() << "Delete: " << filename << ", result: " << ret;
}
refreshFileList(m_focusedListView);
}
bool FileManageWidget::checkUDiskPresent()
{
QFile mountsFile("/proc/mounts");
if (mountsFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
QString mountsContent = QString::fromLocal8Bit(mountsFile.readAll());
mountsFile.close();
if (mountsContent.lastIndexOf("/udisk ") != -1) {
return true;
}
}
return false;
}
bool FileManageWidget::ensureUDiskDocDir()
{
QDir dir(UDISK_DOC_ROOT_DIR);
if (!dir.exists()) {
if (!dir.mkpath(UDISK_DOC_ROOT_DIR)) {
qCritical() << "Cannot create UDisk doc dir:" << UDISK_DOC_ROOT_DIR;
return false;
}
qInfo() << "Created UDisk doc dir:" << UDISK_DOC_ROOT_DIR;
}
return true;
}
void FileManageWidget::onUDiskCheckTimeout()
{
bool hasUDisk = checkUDiskPresent();
if (hasUDisk == m_hasUDisk) {
return;
}
m_hasUDisk = hasUDisk;
onUDiskStateChanged();
}
void FileManageWidget::onUDiskStateChanged()
{
ui->udiskSelectBox->clear();
if (m_hasUDisk) {
ui->udiskSelectBox->addItem(tr("U盘"));
ui->udiskSelectBox->setCurrentIndex(0);
if (ensureUDiskDocDir()) {
refreshFileList(ui->udiskFileListView);
} else {
ui->udiskFileListView->clear();
}
} else {
ui->udiskFileListView->clear();
}
}
void FileManageWidget::refreshButtonsStatus()
{
if(!m_focusedListView)
return;
auto selectedItems = m_focusedListView->selectedItems();
ui->cancelAllBtn->setEnabled(!selectedItems.isEmpty());
ui->delSelectedBtn->setEnabled(!selectedItems.isEmpty());
ui->importBtn->setEnabled(!selectedItems.isEmpty() && ui->udiskFileListView == m_focusedListView);
ui->exportBtn->setEnabled(!selectedItems.isEmpty() && ui->systemFileListView == m_focusedListView);
ui->selectAllBtn->setEnabled(m_focusedListView->count() != selectedItems.size());
}
int FileManageWidget::refreshFileList(QListWidget* listView)
{
QString searchPath = listView->property("searchPath").toString();
QDir dir(searchPath);
if (!dir.exists()) {
listView->clear();
return 0;
}
// 根据过滤类型设置过滤器字符串
QStringList filters;
switch(m_currFilterType) {
case JobFile:
filters << "*.xml";
break;
case Image:
filters << "*.png" << "*.jpeg" << "*.gif" << "*.jpg" << "*.bmp"<< "*.BMP";
break;
case Font:
filters << "*.ttf" << "*.otf";
break;
case All:
default:
filters << "*.xml" << "*.png" << "*.jpeg" << "*.gif" << "*.jpg" << "*.bmp"<< "*.BMP" << "*.html" << "*.ttf" << "*.otf";
break;
}
// 获取过滤后的文件集合
auto fileInfoList = dir.entryInfoList(filters, QDir::Files);
// 清理视图并为其重新添加文件列表
listView->clear();
for(const auto& fileInfo : fileInfoList) {
auto absPath = fileInfo.absoluteFilePath();
QListWidgetItem *item = new QListWidgetItem();
item->setText(fileInfo.fileName());
item->setData(AbsPathRole, absPath);
listView->addItem(item);
}
qInfo() << "Scan path: " << searchPath << ", files: " << fileInfoList.size() << ", target: " << listView->objectName();
return fileInfoList.size();
}
void FileManageWidget::copyFiles(QListWidget *from, QListWidget *to)
{
// 获取目的地目录
auto destPath = to->property("searchPath").toString();
auto items = from->selectedItems();
for(auto item : items) {
auto srcPath = item->data(AbsPathRole).toString();
auto destFilePath = destPath + QFileInfo(srcPath).fileName();
QFileInfo destFile(destFilePath);
if(destFile.exists()) {
QFile::remove(destFilePath);
}
bool ret = QFile::copy(srcPath, destFilePath);
qInfo() << "Copy: " << srcPath << " -> " << destFilePath << ", result: " << ret;
}
}
void FileManageWidget::applyStyleSheet()
{
QString styleSheet =
R"(
QPushButton#closeBtn {
background-color: #E6F7FF;
border: 1px solid #87CEEB;
border-radius: 4px;
font-size: 24px;
color: #228B22;
}
QPushButton#closeBtn:hover{
background-color: #D1E9FF;
}
QPushButton#closeBtn:pressed{
background-color: #BAE7FF;
}
QPushButton {
background-color: #5396C1;
color: #ffffff;
border: 1px solid #000000;
border-radius: 3px;
font-size: 18px;
width: 150px;
height: 50px;
}
QPushButton:hover {
background-color: #5396C1;
}
QPushButton:disabled {
background-color: #7C828E;
color: #606060;
border-color: #808080;
}
)";
this->setStyleSheet(styleSheet);
}