326 lines
9.3 KiB
C++
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);
|
|
} |