diff --git a/.gitignore b/.gitignore index c05b547b..39c58680 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,7 @@ vendor/include/* vendor/lib/* .vscode/* +.cursor *.log diff --git a/libimageviewer/quickprint/printimageloader.cpp b/libimageviewer/quickprint/printimageloader.cpp index ef2e4fb4..8153b713 100644 --- a/libimageviewer/quickprint/printimageloader.cpp +++ b/libimageviewer/quickprint/printimageloader.cpp @@ -20,12 +20,14 @@ static const int s_SingleFrame = -1; PrintImageLoader::PrintImageLoader(QObject *parent) : QObject(parent) { + qInfo() << "PrintImageLoader initialized"; connect(this, &PrintImageLoader::asyncLoadError, this, &PrintImageLoader::onLoadError); } PrintImageLoader::~PrintImageLoader() { if (isLoading()) { + qInfo() << "PrintImageLoader destroyed while still loading, cancelling..."; cancel(); } } @@ -39,6 +41,7 @@ PrintImageLoader::~PrintImageLoader() bool PrintImageLoader::loadImageList(const QStringList &fileList, bool async) { if (fileList.isEmpty() || loaderState != Stopped) { + qWarning() << "Failed to start loading: fileList is empty or loader is busy"; return false; } @@ -47,15 +50,18 @@ bool PrintImageLoader::loadImageList(const QStringList &fileList, bool async) loaderState = Preloading; if (async) { - // 开始异步预加载 + qDebug() << "Starting async preload for" << fileList.size() << "files"; asyncPreload(fileList); } else { + qDebug() << "Starting sync preload for" << fileList.size() << "files"; if (!syncPreload(fileList)) { + qWarning() << "Sync preload failed"; return false; } loaderState = Loading; if (!syncLoad(loadData)) { + qWarning() << "Sync load failed"; return false; } @@ -117,49 +123,55 @@ PrintDataList PrintImageLoader::takeLoadData() */ PrintDataList PrintImageLoader::preloadImageData(const QString &filePath) { + qDebug() << "Preloading image:" << filePath; + // 判断文件是否存在,是否有权限读取 QFileInfo info(filePath); if (!info.exists()) { + qWarning() << "File does not exist:" << filePath; PrintImageData::Ptr notExistsPtr(new PrintImageData(filePath)); notExistsPtr->state = NotExists; - return {notExistsPtr}; + return { notExistsPtr }; } if (!info.permission(QFile::ReadUser)) { + qWarning() << "No read permission for file:" << filePath; PrintImageData::Ptr permissionPtr(new PrintImageData(filePath)); permissionPtr->state = NoPermission; - return {permissionPtr}; + return { permissionPtr }; } // 根据文件类型区分处理 PrintDataList dataList; const imageViewerSpace::ImageType type = LibUnionImage_NameSpace::getImageType(filePath); + qDebug() << "Image type:" << type << "for file:" << filePath; + switch (type) { - case imageViewerSpace::ImageTypeSvg: - Q_FALLTHROUGH(); - case imageViewerSpace::ImageTypeStatic: { - // 单张图片处理 - dataList.append(PrintImageData::Ptr(new PrintImageData(filePath))); - break; - } + case imageViewerSpace::ImageTypeSvg: + Q_FALLTHROUGH(); + case imageViewerSpace::ImageTypeStatic: { + // 单张图片处理 + dataList.append(PrintImageData::Ptr(new PrintImageData(filePath))); + break; + } - case imageViewerSpace::ImageTypeDynamic: - Q_FALLTHROUGH(); - case imageViewerSpace::ImageTypeMulti: { - // Note: 由于 QGifHandler 没有实现 jumpToImage() 接口,因此动图直接进行加载 - dataList = preloadMultiImage(filePath, bool(imageViewerSpace::ImageTypeDynamic == type)); - break; - } + case imageViewerSpace::ImageTypeDynamic: + Q_FALLTHROUGH(); + case imageViewerSpace::ImageTypeMulti: { + // Note: 由于 QGifHandler 没有实现 jumpToImage() 接口,因此动图直接进行加载 + dataList = preloadMultiImage(filePath, bool(imageViewerSpace::ImageTypeDynamic == type)); + break; + } - case imageViewerSpace::ImageTypeDamaged: { - PrintImageData::Ptr damangePtr(new PrintImageData(filePath)); - damangePtr->state = ContentError; - dataList.append(damangePtr); - break; - } + case imageViewerSpace::ImageTypeDamaged: { + PrintImageData::Ptr damangePtr(new PrintImageData(filePath)); + damangePtr->state = ContentError; + dataList.append(damangePtr); + break; + } - default: - return {}; + default: + return {}; } return dataList; @@ -249,12 +261,16 @@ PrintDataList PrintImageLoader::preloadMultiImage(const QString &filePath, bool */ bool PrintImageLoader::loadImageData(PrintImageData::Ptr &imagePtr) { + qDebug() << "Loading image data for:" << imagePtr->filePath << "frame:" << imagePtr->frame; + // 动图数据在预加载流程加载 if (Loaded == imagePtr->state) { + qDebug() << "Image already loaded, skipping"; return true; } if (!QFileInfo::exists(imagePtr->filePath)) { + qWarning() << "File no longer exists:" << imagePtr->filePath; imagePtr->state = NotExists; return false; } @@ -263,9 +279,10 @@ bool PrintImageLoader::loadImageData(PrintImageData::Ptr &imagePtr) QImageReader reader(imagePtr->filePath); // jumpToImage 可能返回 false, 但数据正常读取 if (s_SingleFrame != imagePtr->frame) { + qDebug() << "Jumping to frame:" << imagePtr->frame; reader.jumpToImage(imagePtr->frame); } - + if (!reader.canRead()) { qWarning() << QString("Load multi frame image failed(jump to image): %1").arg(reader.errorString()); imagePtr->state = ContentError; @@ -279,6 +296,9 @@ bool PrintImageLoader::loadImageData(PrintImageData::Ptr &imagePtr) return false; } + qDebug() << "Successfully loaded image:" << imagePtr->filePath << "frame:" << imagePtr->frame + << "size:" << imagePtr->data.size(); + } catch (const std::exception &e) { // 图片读取,考虑未界定异常 qCritical() << qPrintable("Exception: load image failed!") << qPrintable(e.what()); @@ -327,10 +347,10 @@ void PrintImageLoader::asyncPreload(const QStringList &fileList) // 按*顺序*插入数据 QFuture asyncData = QtConcurrent::mappedReduced( - fileList, - preloadMapedFunc, - [](PrintDataList &result, const PrintDataList &parsed) { result.append(parsed); }, - (QtConcurrent::OrderedReduce | QtConcurrent::SequentialReduce)); + fileList, + preloadMapedFunc, + [](PrintDataList &result, const PrintDataList &parsed) { result.append(parsed); }, + (QtConcurrent::OrderedReduce | QtConcurrent::SequentialReduce)); // 仅在调用时绑定信号 connect(&preloadWatcher, &QFutureWatcherBase::finished, this, &PrintImageLoader::onAsyncLoadFinished); @@ -375,26 +395,26 @@ void PrintImageLoader::asyncLoad(PrintDataList &dataList) void PrintImageLoader::onAsyncLoadFinished() { switch (loaderState) { - case Preloading: - qInfo() << "Async print image preload finished."; - // 清理缓存的数据, 继续加载数据 - loadData = preloadWatcher.result(); - disconnect(&preloadWatcher, &QFutureWatcherBase::finished, this, &PrintImageLoader::onAsyncLoadFinished); - preloadWatcher.setFuture(QFuture()); - loaderState = Loading; - asyncLoad(loadData); - break; - - case Loading: - qInfo() << "Async print image load finished."; - disconnect(&loadWatcher, &QFutureWatcherBase::finished, this, &PrintImageLoader::onAsyncLoadFinished); - loaderState = Stopped; - Q_EMIT loadFinished(false, {}); - break; - - default: - qWarning() << QString("Async load state error %1").arg(loaderState); - break; + case Preloading: + qInfo() << "Async print image preload finished."; + // 清理缓存的数据, 继续加载数据 + loadData = preloadWatcher.result(); + disconnect(&preloadWatcher, &QFutureWatcherBase::finished, this, &PrintImageLoader::onAsyncLoadFinished); + preloadWatcher.setFuture(QFuture()); + loaderState = Loading; + asyncLoad(loadData); + break; + + case Loading: + qInfo() << "Async print image load finished."; + disconnect(&loadWatcher, &QFutureWatcherBase::finished, this, &PrintImageLoader::onAsyncLoadFinished); + loaderState = Stopped; + Q_EMIT loadFinished(false, {}); + break; + + default: + qWarning() << QString("Async load state error %1").arg(loaderState); + break; } } diff --git a/libimageviewer/quickprint/quickprint.cpp b/libimageviewer/quickprint/quickprint.cpp index 9b582d8e..5d5803b2 100644 --- a/libimageviewer/quickprint/quickprint.cpp +++ b/libimageviewer/quickprint/quickprint.cpp @@ -26,6 +26,7 @@ QuickPrintPrivate::QuickPrintPrivate(QuickPrint *q) : q_ptr(q) , imageLoader(new PrintImageLoader) { + qDebug() << "QuickPrint initialized"; // 快速打印可能无需加载主窗体,单独加载动态库翻译信息 Libutils::base::loadLibTransaltor(); @@ -45,6 +46,7 @@ QuickPrintPrivate::QuickPrintPrivate(QuickPrint *q) void QuickPrintPrivate::startLoadSpinnerTimer() { if (!procSpinnerTimer.isActive()) { + qDebug() << "Starting load spinner timer"; procSpinnerTimer.start(s_LoadSpinnerTimeOut, this); } } @@ -55,6 +57,7 @@ void QuickPrintPrivate::startLoadSpinnerTimer() void QuickPrintPrivate::startSpinner() { if (!spinner) { + qDebug() << "Creating and showing load spinner"; spinner.reset(new DSpinner); spinner->setObjectName("QuickPrint_Spinner"); @@ -83,10 +86,12 @@ void QuickPrintPrivate::startSpinner() void QuickPrintPrivate::stopSpinner() { if (procSpinnerTimer.isActive()) { + qDebug() << "Stopping load spinner timer"; procSpinnerTimer.stop(); } if (spinner) { + qDebug() << "Stopping and hiding load spinner"; spinner->stop(); spinner->hide(); } @@ -97,6 +102,7 @@ void QuickPrintPrivate::stopSpinner() */ void QuickPrintPrivate::showWarningNotify(const QString &errorString) { + qDebug() << "Showing print warning dialog:" << errorString; // 错误信息预留 Q_UNUSED(errorString) @@ -116,9 +122,11 @@ void QuickPrintPrivate::showWarningNotify(const QString &errorString) int QuickPrintPrivate::showPrintDialog(QWidget *parentWidget) { if (loadDataList.isEmpty()) { + qWarning() << "Cannot show print dialog: no images loaded"; return QDialog::Rejected; } + qInfo() << "Showing print dialog for" << loadDataList.size() << "images"; DPrintPreviewDialog printDialog(parentWidget); printDialog.setObjectName("QuickPrint_PrintDialog"); printDialog.setAsynPreview(loadDataList.size()); @@ -138,6 +146,7 @@ int QuickPrintPrivate::showPrintDialog(QWidget *parentWidget) */ void QuickPrintPrivate::asyncPrint(DPrinter *printer, const QVector &pageRange) { + qDebug() << "Starting async print for pages:" << pageRange; QPainter painter(printer); painter.setRenderHint(QPainter::Antialiasing); painter.setRenderHint(QPainter::SmoothPixmapTransform); @@ -179,6 +188,7 @@ void QuickPrintPrivate::timerEvent(QTimerEvent *e) if (e->timerId() == procSpinnerTimer.timerId()) { procSpinnerTimer.stop(); if (imageLoader->isLoading()) { + qDebug() << "Load timeout reached, showing spinner"; startSpinner(); } } @@ -190,12 +200,14 @@ void QuickPrintPrivate::timerEvent(QTimerEvent *e) bool QuickPrintPrivate::setPrintImage(const QStringList &fileList) { if (fileList.isEmpty()) { + qWarning() << "Cannot set print images: file list is empty"; return false; } /// todo:判断MTP文件代理 bool async = checkNeedAsyncLoadData(fileList); + qInfo() << "Setting print images, async mode:" << async << "file count:" << fileList.size(); return imageLoader->loadImageList(fileList, async); } @@ -212,6 +224,7 @@ bool QuickPrintPrivate::checkNeedAsyncLoadData(const QStringList &fileList) bool async = true; if (QThread::idealThreadCount() <= s_ThreadLimit) { // Note: 部分环境(服务器/云桌面)可用线程较少,使用多线程处理会出现异常 + qDebug() << "Using sync mode: thread count" << QThread::idealThreadCount() << "is below limit" << s_ThreadLimit; async = false; } else if (fileList.size() <= s_FileCountLimit) { qint64 fileSizeCount = 0; @@ -220,6 +233,8 @@ bool QuickPrintPrivate::checkNeedAsyncLoadData(const QStringList &fileList) } if (fileSizeCount < s_FileSizeLimitMB) { + qDebug() << "Using sync mode: total file size" << (fileSizeCount / 1024 / 1024) << "MB is below limit" + << (s_FileSizeLimitMB / 1024 / 1024) << "MB"; async = false; } } @@ -232,6 +247,7 @@ bool QuickPrintPrivate::checkNeedAsyncLoadData(const QStringList &fileList) */ void QuickPrintPrivate::printLoadFinished(bool error, const QString &errorString) { + qDebug() << "Print load finished, error:" << error << "message:" << errorString; this->stopSpinner(); int ret = QDialog::Rejected; @@ -239,8 +255,8 @@ void QuickPrintPrivate::printLoadFinished(bool error, const QString &errorString this->showWarningNotify(errorString); } else { loadDataList = imageLoader->takeLoadData(); - // 在此处弹出打印窗口 + qDebug() << "Successfully loaded" << loadDataList.size() << "images for printing"; ret = this->showPrintDialog(this->parentWidget); } @@ -255,6 +271,7 @@ bool QuickPrintPrivate::waitLoadFinished() { bool ret = true; if (imageLoader->isLoading()) { + qDebug() << "Waiting for print load to finish"; QEventLoop loop; connect(this, &QuickPrintPrivate::notifyLoadFinished, this, [&ret, &loop](int, bool error) { ret = !error; @@ -278,9 +295,13 @@ QuickPrint::QuickPrint(QObject *parent) : QObject(parent) , dd_ptr(new QuickPrintPrivate(this)) { + qDebug() << "QuickPrint instance created"; } -QuickPrint::~QuickPrint() {} +QuickPrint::~QuickPrint() +{ + qDebug() << "QuickPrint instance destroyed"; +} /** @brief 执行同步打印文件 \a fileList (指此函数在此使用 EventLoop 等待),阻塞当前函数处理。 @@ -288,6 +309,7 @@ QuickPrint::~QuickPrint() {} */ bool QuickPrint::showPrintDialog(const QStringList &fileList, QWidget *parentWidget) { + qDebug() << "Starting sync print dialog for" << fileList.size() << "files"; Q_D(QuickPrint); if (!showPrintDialogAsync(fileList, parentWidget)) { @@ -303,11 +325,13 @@ bool QuickPrint::showPrintDialog(const QStringList &fileList, QWidget *parentWid */ bool QuickPrint::showPrintDialogAsync(const QStringList &fileList, QWidget *parentWidget) { + qDebug() << "Starting async print dialog for" << fileList.size() << "files"; Q_D(QuickPrint); d->startLoadSpinnerTimer(); d->parentWidget = parentWidget; if (!d->setPrintImage(fileList)) { + qWarning() << "Failed to set print images"; return false; } // 等待 loadFinished() 信号,触发展示打印窗口 @@ -327,6 +351,7 @@ bool QuickPrint::isLoading() */ void QuickPrint::cancel() { + qInfo() << "Cancelling print operation"; Q_D(QuickPrint); d->stopSpinner(); @@ -341,6 +366,7 @@ extern "C" { */ bool quickPrintDialog(const QStringList &fileList, QWidget *parentWidget) { + qDebug() << "Starting C-style print dialog for" << fileList.size() << "files"; QuickPrint print; return print.showPrintDialog(fileList, parentWidget); } diff --git a/libimageviewer/service/aimodelservice.cpp b/libimageviewer/service/aimodelservice.cpp index e44ebbcc..5353091f 100644 --- a/libimageviewer/service/aimodelservice.cpp +++ b/libimageviewer/service/aimodelservice.cpp @@ -46,22 +46,22 @@ AIModelServiceData::AIModelServiceData(AIModelService *q) : qptr(q) { supportNameToModel = initDBusModelList(); - qInfo() << qPrintable("Support image enhance models:") << supportNameToModel; + qInfo() << "Support image enhance models:" << supportNameToModel; // QTemporaryDir::isValid() 会创建临时文件路径,在没有模型数据时不进行路径判断 if (!supportNameToModel.isEmpty()) { enhanceTemp.reset(new QTemporaryDir); if (!enhanceTemp->isValid()) { - qWarning() << qPrintable("Create enhance temp dir failed") << enhanceTemp->errorString(); + qWarning() << "Create enhance temp dir failed:" << enhanceTemp->errorString(); } else { - qInfo() << qPrintable("Enhance temp dir:") << enhanceTemp->path(); + qDebug() << "Enhance temp dir:" << enhanceTemp->path(); } convertTemp.reset(new QTemporaryDir); if (!convertTemp->isValid()) { - qWarning() << qPrintable("Create convert temp dir failed") << convertTemp->errorString(); + qWarning() << "Create convert temp dir failed:" << convertTemp->errorString(); } else { - qInfo() << qPrintable("Convert temp dir:") << convertTemp->path(); + qDebug() << "Convert temp dir:" << convertTemp->path(); } } } @@ -71,6 +71,7 @@ AIModelServiceData::AIModelServiceData(AIModelService *q) */ QList> AIModelServiceData::initDBusModelList() { + qDebug() << "Initializing DBus model list"; // 预期的模型项顺序 QStringList sortModelList = {s_ModelColoring, s_ModelSuperResol, @@ -87,10 +88,11 @@ QList> AIModelServiceData::initDBusModelList() if (modelList.isEmpty()) { auto error = interface.lastError(); - qInfo() << QString("[Enhance DBus] No AI models on device? Get model list failed, %1: %2").arg(error.name()).arg(error.message()); + qWarning() << QString("[Enhance DBus] No AI models on device? Get model list failed, %1: %2").arg(error.name()).arg(error.message()); return {}; } + qDebug() << "Available models from DBus:" << modelList; // 调整模型顺序, 模型-名称排序列表 QList> mapModelList; for (const QString &model : sortModelList) { @@ -195,17 +197,20 @@ AIModelService::AIModelService(QObject *parent) : QObject(parent) , dptr(new AIModelServiceData(this)) { + qDebug() << "AIModelService initialized"; connect(&dptr->enhanceWatcher, &QFutureWatcherBase::finished, this, [this]() { EnhancePtr ptr = dptr->enhanceWatcher.result(); if (ptr.isNull()) { + qWarning() << "Enhance result is null"; return; } auto curState = static_cast(ptr->state.loadAcquire()); if (AIModelService::Cancel == curState) { - // 处理中断,不继续处理 + qDebug() << "Enhance process cancelled"; return; } else if (AIModelService::LoadFailed == curState) { + qWarning() << "Enhance process failed"; Q_EMIT enhanceEnd(ptr->source, ptr->output, curState); } else { // Note: 备用的超时机制 @@ -224,8 +229,7 @@ AIModelService::AIModelService(QObject *parent) this, SLOT(onDBusEnhanceEnd(const QString &, int))); if (!conn) { - qWarning() - << QString("[Enhance DBus] Connect dbus %1 signal %2 failed").arg(s_EnhanceInterface).arg(s_EnhanceFinishSignal); + qWarning() << QString("[Enhance DBus] Connect dbus %1 signal %2 failed").arg(s_EnhanceInterface).arg(s_EnhanceFinishSignal); } } @@ -332,9 +336,11 @@ AIModelService::Error AIModelService::modelEnabled(int modelID, const QString &f QString AIModelService::imageProcessing(const QString &filePath, int modelID, const QImage &image) { if (!dptr->mapModelInfo.contains(modelID)) { + qWarning() << "Invalid model ID:" << modelID; return {}; } + qInfo() << "Starting image processing for file:" << filePath << "with model:" << modelID; resetProcess(); // 如果图片已是增强后的图片,则获取源图片进行处理 @@ -343,6 +349,7 @@ QString AIModelService::imageProcessing(const QString &filePath, int modelID, co // 生命周期交由子线程维护 QImage caputureImage = image.copy(); if (!dptr->enhanceTemp) { + qWarning() << "Enhance temp directory not available"; return {}; } dptr->lastOutput = dptr->enhanceTemp->filePath(QString("%1.png").arg(dptr->enhanceCache.size())); @@ -357,18 +364,21 @@ QString AIModelService::imageProcessing(const QString &filePath, int modelID, co QFuture f = QtConcurrent::run([=]() -> EnhancePtr { if (AIModelService::Cancel == ptr->state.loadAcquire()) { + qDebug() << "Enhance process cancelled before start"; return ptr; } // 写入文件移动到子线程。 QString tmpSrcFile = checkConvertFile(sourceFile, caputureImage); if (tmpSrcFile.isEmpty()) { + qDebug() << "Using original source file:" << sourceFile; tmpSrcFile = ptr->source; } // 若DBus调用失败,则直接返回错误 bool ret = AIModelServiceData::sendImageEnhance(tmpSrcFile, ptr->output, ptr->model); if (!ret) { + qWarning() << "DBus enhance call failed"; ptr->state.storeRelease(LoadFailed); } @@ -388,9 +398,11 @@ void AIModelService::reloadImageProcessing(const QString &filePath) // 仅允许最后一次调用 EnhancePtr ptr = dptr->enhanceCache.value(filePath); if (ptr.isNull() || ptr->index != dptr->enhanceCache.size() - 1) { + qWarning() << "Cannot reload: invalid file path or not the last processed image"; return; } + qInfo() << "Reloading image processing for:" << filePath; resetProcess(); // 如果图片已是增强后的图片,则获取源图片进行处理 @@ -400,18 +412,21 @@ void AIModelService::reloadImageProcessing(const QString &filePath) QFuture f = QtConcurrent::run([=]() -> EnhancePtr { if (AIModelService::Cancel == ptr->state.loadAcquire()) { + qDebug() << "Reload process cancelled before start"; return ptr; } // 已处理过的数据,一般存在缓存 QString tmpSrcFile = checkConvertFile(sourceFile, QImage()); if (tmpSrcFile.isEmpty()) { + qDebug() << "Using original source file for reload:" << sourceFile; tmpSrcFile = ptr->source; } // 若 DBus 调用失败,则直接返回错误 bool ret = AIModelServiceData::sendImageEnhance(tmpSrcFile, ptr->output, ptr->model); if (!ret) { + qWarning() << "DBus enhance call failed during reload"; ptr->state.storeRelease(LoadFailed); } @@ -429,6 +444,7 @@ void AIModelService::reloadImageProcessing(const QString &filePath) void AIModelService::resetProcess() { if (dptr->enhanceWatcher.isRunning()) { + qDebug() << "Cancelling running enhance process"; dptr->enhanceWatcher.cancel(); } // 清理之前的图像增强状态 @@ -440,13 +456,14 @@ void AIModelService::resetProcess() */ void AIModelService::cancelProcess(const QString &output) { + qDebug() << "Cancelling process for output:" << output; resetProcess(); // 标记当前处理图片状态为Cancel if (dptr->enhanceCache.contains(output)) { EnhancePtr ptr = dptr->enhanceCache.value(output); if (!ptr.isNull() && Loading == ptr->state.loadAcquire()) { ptr->state.storeRelease(Cancel); - + qDebug() << "Process cancelled successfully"; Q_EMIT enhanceEnd(ptr->source, ptr->output, Cancel); } } @@ -797,18 +814,20 @@ void AIModelService::onDBusEnhanceEnd(const QString &output, int error) // 多实例,可能传入其它实例的任务 EnhancePtr ptr = dptr->enhanceCache.value(output); if (ptr.isNull()) { + qWarning() << "Received enhance end for unknown output:" << output; return; } qInfo() << QString("Receive DBus enhance result: %1 (%2)").arg(output).arg(error); // 只允许最新的图片更新 if ((ptr->index != dptr->enhanceCache.size() - 1) && (output == dptr->lastOutput)) { + qDebug() << "Ignoring enhance result for outdated process"; return; } State state = static_cast(ptr->state.loadAcquire()); if (Cancel == state || LoadTimeout == state) { - // 处理终止,不继续处理 + qDebug() << "Ignoring enhance result for cancelled/timeout process"; return; } else if (Loading != state) { qWarning() << qPrintable("[Enhance DBus] Reentrant enhance image process! ") << output << state; @@ -822,19 +841,21 @@ void AIModelService::onDBusEnhanceEnd(const QString &output, int error) qWarning() << qPrintable("[Enhance DBus] Create enhance image failed! ") << output; state = LoadFailed; } else { + qDebug() << "Enhance process completed successfully"; state = LoadSucc; } break; } case AIModelServiceData::DBusNoPortrait: + qWarning() << "No portrait detected in image"; state = NotDetectPortrait; break; default: + qWarning() << "Enhance process failed with error:" << error; state = LoadFailed; break; } ptr->state.storeRelease(state); - Q_EMIT enhanceEnd(ptr->source, output, state); } diff --git a/libimageviewer/service/commonservice.cpp b/libimageviewer/service/commonservice.cpp index 4bc1b93d..900c23ba 100644 --- a/libimageviewer/service/commonservice.cpp +++ b/libimageviewer/service/commonservice.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include "imageengine.h" @@ -15,6 +16,7 @@ LibCommonService *LibCommonService::m_commonService = nullptr; LibCommonService *LibCommonService::instance() { if (m_commonService == nullptr) { + qDebug() << "Creating new LibCommonService instance"; m_commonService = new LibCommonService; } @@ -23,6 +25,7 @@ LibCommonService *LibCommonService::instance() void LibCommonService::setImgViewerType(imageViewerSpace::ImgViewerType type) { + qDebug() << "Setting image viewer type:" << type; m_imgViewerType = type; } @@ -33,6 +36,7 @@ imageViewerSpace::ImgViewerType LibCommonService::getImgViewerType() void LibCommonService::setImgSavePath(QString path) { + qDebug() << "Setting image save path:" << path; m_imgSavePath = path; } @@ -45,6 +49,9 @@ imageViewerSpace::ItemInfo LibCommonService::getImgInfoByPath(QString path) { QMutexLocker locker(&m_mutex); QMap m_tempInfoMap = m_allInfoMap; + if (!m_tempInfoMap.contains(path)) { + qWarning() << "Image info not found for path:" << path; + } return m_tempInfoMap[path]; } @@ -55,6 +62,7 @@ imageViewerSpace::ItemInfo LibCommonService::getImgInfoByPath(QString path) void LibCommonService::reName(const QString &oldPath, const QString &newPath) { + qDebug() << "Renaming image from" << oldPath << "to" << newPath; QMutexLocker locker(&m_mutex); imageViewerSpace::ItemInfo info = m_allInfoMap[oldPath]; info.path = newPath; @@ -65,6 +73,7 @@ void LibCommonService::reName(const QString &oldPath, const QString &newPath) void LibCommonService::slotSetImgInfoByPath(QString path, imageViewerSpace::ItemInfo itemInfo) { + qDebug() << "Setting image info for path:" << path; QMutexLocker locker(&m_mutex); m_allInfoMap[path] = itemInfo; emit ImageEngine::instance()->sigOneImgReady(path, itemInfo); @@ -72,6 +81,7 @@ void LibCommonService::slotSetImgInfoByPath(QString path, imageViewerSpace::Item LibCommonService::LibCommonService(QObject *parent) : QObject(parent) { + qDebug() << "LibCommonService constructor called"; qApp->installEventFilter(this); } @@ -79,6 +89,7 @@ bool LibCommonService::eventFilter(QObject *obj, QEvent *event) { if (event->type() == QEvent::MouseButtonPress) { if (dynamic_cast(event)->button() == Qt::RightButton) { + qDebug() << "Right mouse button pressed"; emit sigRightMousePress(); } } diff --git a/libimageviewer/service/configsetter.cpp b/libimageviewer/service/configsetter.cpp index d168ccdd..e1999339 100644 --- a/libimageviewer/service/configsetter.cpp +++ b/libimageviewer/service/configsetter.cpp @@ -16,17 +16,22 @@ const QString DB_PATH = QDir::homePath() + LibConfigSetter::LibConfigSetter(QObject *parent) : QObject(parent) { - if (!QFileInfo(CONFIG_PATH).exists()) + qDebug() << "Initializing LibConfigSetter"; + + if (!QFileInfo(CONFIG_PATH).exists()) { + qInfo() << "Config file does not exist, removing old database:" << DB_PATH; QProcess::startDetached(QString("rm %1").arg(DB_PATH)); + } m_settings = new QSettings(CONFIG_PATH, QSettings::IniFormat, this); - qDebug() << "Setting file:" << m_settings->fileName(); + qDebug() << "Settings file initialized:" << m_settings->fileName(); } LibConfigSetter *LibConfigSetter::m_setter = nullptr; LibConfigSetter *LibConfigSetter::instance() { if (! m_setter) { + qDebug() << "Creating new LibConfigSetter instance"; m_setter = new LibConfigSetter(); } @@ -36,8 +41,8 @@ LibConfigSetter *LibConfigSetter::instance() void LibConfigSetter::setValue(const QString &group, const QString &key, const QVariant &value) { -// QMutexLocker locker(&m_mutex); - + qDebug() << "Setting config value - Group:" << group << "Key:" << key << "Value:" << value; + m_settings->beginGroup(group); m_settings->setValue(key, value); m_settings->endGroup(); diff --git a/libimageviewer/service/ffmpegvideothumbnailer.cpp b/libimageviewer/service/ffmpegvideothumbnailer.cpp index 71013d08..5d35f11d 100644 --- a/libimageviewer/service/ffmpegvideothumbnailer.cpp +++ b/libimageviewer/service/ffmpegvideothumbnailer.cpp @@ -41,19 +41,23 @@ static bool resolveSuccessed = false; */ static QString libPath(const QString &strlib) { + qDebug() << "Searching for library:" << strlib; QDir dir; QString path = QLibraryInfo::location(QLibraryInfo::LibrariesPath); dir.setPath(path); QStringList list = dir.entryList(QStringList() << (strlib + "*"), QDir::NoDotAndDotDot | QDir::Files); //filter name with strlib if (list.contains(strlib)) { + qDebug() << "Found exact library match:" << strlib; return strlib; } else { list.sort(); } if (list.size() > 0) { + qDebug() << "Found library variant:" << list.last(); return list.last(); } else { + qWarning() << "No library found matching pattern:" << strlib; return QString(); } } @@ -68,9 +72,11 @@ static QString libPath(const QString &strlib) bool initFFmpegVideoThumbnailer() { if (resolveSuccessed) { + qDebug() << "FFmpeg video thumbnailer already initialized"; return true; } + qInfo() << "Initializing FFmpeg video thumbnailer"; // 没有显式调用 unload() ,动态库会保存在内存中,直到程序结束。resolve() 在内部会自动调用 load() 加载。 QLibrary library("libffmpegthumbnailer.so.4"); if (!library.load()) { @@ -94,6 +100,7 @@ bool initFFmpegVideoThumbnailer() } } + qDebug() << "Loading FFmpeg thumbnailer functions"; m_creat_video_thumbnailer = reinterpret_cast(library.resolve("video_thumbnailer_create")); m_mvideo_thumbnailer_destroy = reinterpret_cast(library.resolve("video_thumbnailer_destroy")); m_mvideo_thumbnailer_create_image_data = reinterpret_cast(library.resolve("video_thumbnailer_create_image_data")); @@ -117,6 +124,7 @@ bool initFFmpegVideoThumbnailer() } resolveSuccessed = true; + qInfo() << "FFmpeg video thumbnailer initialized successfully"; return true; } @@ -127,9 +135,11 @@ bool initFFmpegVideoThumbnailer() QImage runFFmpegVideoThumbnailer(const QUrl &url) { if (!resolveSuccessed) { + qWarning() << "Cannot generate thumbnail: FFmpeg video thumbnailer not initialized"; return QImage(); } + qDebug() << "Generating video thumbnail for:" << url.toString(); m_video_thumbnailer->thumbnail_size = static_cast(400 * qApp->devicePixelRatio()); image_data *image_data = m_mvideo_thumbnailer_create_image_data(); QString file = QFileInfo(url.toLocalFile()).absoluteFilePath(); @@ -137,6 +147,13 @@ QImage runFFmpegVideoThumbnailer(const QUrl &url) QImage img = QImage::fromData(image_data->image_data_ptr, static_cast(image_data->image_data_size), "png"); m_mvideo_thumbnailer_destroy_image_data(image_data); image_data = nullptr; + + if (img.isNull()) { + qWarning() << "Failed to create QImage from thumbnail data for:" << file; + } else { + qDebug() << "Successfully generated thumbnail for:" << file << "Size:" << img.size(); + } + return img; } diff --git a/libimageviewer/service/imagedataservice.cpp b/libimageviewer/service/imagedataservice.cpp index ad8b6331..28131c1e 100644 --- a/libimageviewer/service/imagedataservice.cpp +++ b/libimageviewer/service/imagedataservice.cpp @@ -28,6 +28,7 @@ LibImageDataService *LibImageDataService::instance(QObject *parent) Q_UNUSED(parent); std::call_once(dataServiceFlag, []() { + qInfo() << "Creating new LibImageDataService instance"; s_ImageDataService = new LibImageDataService(); }); @@ -36,12 +37,14 @@ LibImageDataService *LibImageDataService::instance(QObject *parent) LibImageDataService::~LibImageDataService() { + qDebug() << "LibImageDataService destructor called"; stopReadThumbnail(); } bool LibImageDataService::add(const QStringList &paths) { QMutexLocker locker(&m_imgDataMutex); + qDebug() << "Adding" << paths.size() << "paths to request queue"; // FIXME: 虽然这样修改将后续的数据优先添加,但也会导致边缘变更单独更新的数据被优先读取,变成非中心加载而是偏向一侧加载。 // 反向添加,尾部数据在之后添加,QList两侧都有预留分配,非共享差异不大 std::for_each(paths.rbegin(), paths.rend(), [this](const QString &path){ @@ -58,6 +61,7 @@ bool LibImageDataService::add(const QString &path) QMutexLocker locker(&m_imgDataMutex); if (!path.isEmpty()) { if (!m_AllImageMap.contains(path)) { + qDebug() << "Adding single path to request queue:" << path; // 后添加的单一数据优先加载 m_requestQueue.prepend(path); } @@ -68,10 +72,13 @@ bool LibImageDataService::add(const QString &path) QString LibImageDataService::pop() { QMutexLocker locker(&m_imgDataMutex); - if (m_requestQueue.empty()) + if (m_requestQueue.empty()) { + qDebug() << "Request queue is empty"; return QString(); + } QString res = m_requestQueue.first(); m_requestQueue.pop_front(); + qDebug() << "Popped path from request queue:" << res; return res; } @@ -91,6 +98,7 @@ bool LibImageDataService::readThumbnailByPaths(const QString &thumbnailPath, con Q_UNUSED(thumbnailPath) Q_UNUSED(remake) + qInfo() << "Starting thumbnail generation for" << files.size() << "files"; LibImageDataService::instance()->add(files); int threadCounts = static_cast(readThreadGroup.size()); @@ -99,12 +107,16 @@ bool LibImageDataService::readThumbnailByPaths(const QString &thumbnailPath, con int needCoreCounts = qBound(1, files.size(), recommendThreadCounts); int curActivateThreads = 0; + qDebug() << "Thread configuration - Recommended:" << recommendThreadCounts + << "Needed:" << needCoreCounts << "Current:" << threadCounts; + // 激活已有的线程 for (int i = 0; i < threadCounts && i < needCoreCounts; ++i) { auto thread = readThreadGroup.at(static_cast(i)); if (!thread->isRunning()) { thread->start(); curActivateThreads++; + qDebug() << "Activated existing thread" << i; } } @@ -113,6 +125,7 @@ bool LibImageDataService::readThumbnailByPaths(const QString &thumbnailPath, con int requesetThreads = needCoreCounts - curActivateThreads; int addThreads = qMin(avaliableThreads, requesetThreads); for (int i = 0; i < addThreads; ++i) { + qDebug() << "Creating new thumbnail thread" << (i + 1) << "of" << addThreads; LibReadThumbnailThread *thread = new LibReadThumbnailThread; thread->start(); readThreadGroup.push_back(thread); @@ -126,8 +139,9 @@ void LibImageDataService::addImage(const QString &path, const QImage &image) { QMutexLocker locker(&m_imgDataMutex); m_AllImageMap[path] = image; - qDebug() << "------------m_requestQueue.size = " << m_requestQueue.size(); - qDebug() << "------------m_AllImageMap.size = " << m_AllImageMap.size(); + qDebug() << "Added image to cache - Path:" << path + << "Queue size:" << m_requestQueue.size() + << "Cache size:" << m_AllImageMap.size(); // emit ImageEngine::instance()->sigOneImgReady(path, info); @@ -146,6 +160,7 @@ void LibImageDataService::addMovieDurationStr(const QString &path, const QString { QMutexLocker locker(&m_imgDataMutex); m_movieDurationStrMap[path] = durationStr; + qDebug() << "Added movie duration for:" << path << "Duration:" << durationStr; } QString LibImageDataService::getMovieDurationStrByPath(const QString &path) @@ -192,6 +207,7 @@ LibImageDataService::LibImageDataService(QObject *parent) void LibImageDataService::stopReadThumbnail() { if (!readThreadGroup.empty()) { + qInfo() << "Stopping" << readThreadGroup.size() << "thumbnail threads"; for (auto &thread : readThreadGroup) { thread->setQuit(true); } @@ -202,6 +218,7 @@ void LibImageDataService::stopReadThumbnail() } readThreadGroup.clear(); + qDebug() << "All thumbnail threads stopped and cleaned up"; } } @@ -215,11 +232,13 @@ LibReadThumbnailThread::LibReadThumbnailThread(QObject *parent) void LibReadThumbnailThread::readThumbnail(QString path) { if (!QFileInfo(path).exists()) { + qWarning() << "File does not exist:" << path; return; } + + qDebug() << "Reading thumbnail for:" << path; //新增,增加缓存 imageViewerSpace::ItemInfo itemInfo; - itemInfo.path = path; QImage tImg; @@ -233,6 +252,7 @@ void LibReadThumbnailThread::readThumbnail(QString path) } if (imageType == imageViewerSpace::ImageTypeSvg) { + qDebug() << "Processing SVG file:" << path; QSvgRenderer renderer(path); QImage tImg(128, 128, QImage::Format_ARGB32); tImg.fill(0); @@ -243,12 +263,17 @@ void LibReadThumbnailThread::readThumbnail(QString path) itemInfo.image = tImg; } else { if (!LibUnionImage_NameSpace::loadStaticImageFromFile(path, tImg, errMsg)) { - qDebug() << errMsg; + qWarning() << "Failed to load image:" << path << "Error:" << errMsg; //损坏图片也需要缓存更新 itemInfo.imageType = imageViewerSpace::ImageTypeDamaged; LibCommonService::instance()->slotSetImgInfoByPath(path, itemInfo); return; } + + qDebug() << "Successfully loaded image:" << path + << "Size:" << tImg.size() + << "Format:" << tImg.format(); + //读取图片,给长宽重新赋值 itemInfo.imgOriginalWidth = tImg.width(); itemInfo.imgOriginalHeight = tImg.height(); @@ -283,8 +308,12 @@ void LibReadThumbnailThread::readThumbnail(QString path) } if (itemInfo.image.isNull()) { + qWarning() << "Generated thumbnail is null for:" << path; itemInfo.imageType = imageViewerSpace::ImageTypeDamaged; } else { + qDebug() << "Successfully generated thumbnail for:" << path + << "Size:" << itemInfo.image.size() + << "Type:" << itemInfo.imageType; //获取图片类型 itemInfo.imageType = imageType; } @@ -308,8 +337,10 @@ imageViewerSpace::PathType LibReadThumbnailThread::getPathType(const QString &im void LibReadThumbnailThread::run() { + qDebug() << "Thumbnail thread started"; while (!LibImageDataService::instance()->isRequestQueueEmpty()) { if (m_quit) { + qDebug() << "Thumbnail thread received quit signal"; break; } QString res = LibImageDataService::instance()->pop(); @@ -317,5 +348,6 @@ void LibReadThumbnailThread::run() readThumbnail(res); } } + qDebug() << "Thumbnail thread finished"; emit LibImageDataService::instance()->sigeUpdateListview(); } diff --git a/libimageviewer/service/mtpfileproxy.cpp b/libimageviewer/service/mtpfileproxy.cpp index 65274aa0..b43a77d5 100644 --- a/libimageviewer/service/mtpfileproxy.cpp +++ b/libimageviewer/service/mtpfileproxy.cpp @@ -31,6 +31,7 @@ static QString realPath(const QStringList &paths, const QString &filePath) static void fileOperateCallbackFunc(bool ret, void *data) { if (data) { + qDebug() << "File operation callback received - Success:" << ret; MtpFileProxy::instance()->loadFinished(*reinterpret_cast(data), ret); } } @@ -38,13 +39,16 @@ static void fileOperateCallbackFunc(bool ret, void *data) MtpFileProxy::MtpFileProxy() { #ifdef USE_DFM_IO - qInfo() << qPrintable("Use dfm-io copy MTP file."); + qInfo() << "Initializing MtpFileProxy with dfm-io support"; #else - qInfo() << qPrintable("Use QFile copy MTP file."); + qInfo() << "Initializing MtpFileProxy with QFile support"; #endif } -MtpFileProxy::~MtpFileProxy() {} +MtpFileProxy::~MtpFileProxy() +{ + qDebug() << "MtpFileProxy destructor called"; +} MtpFileProxy *MtpFileProxy::instance() { @@ -68,12 +72,14 @@ bool MtpFileProxy::isValid() const bool MtpFileProxy::checkAndCreateProxyFile(QStringList &paths, QString &firstPath) { firstPath = realPath(paths, firstPath); + qDebug() << "Checking file for MTP device:" << firstPath; + if (MtpFileProxy::instance()->checkFileDeviceIsMtp(firstPath)) { firstPath = MtpFileProxy::instance()->createPorxyFile(firstPath); paths.clear(); paths.append(firstPath); - qInfo() << qPrintable("Detect MTP mount file."); + qInfo() << "MTP mount file detected and proxy created:" << firstPath; return true; } @@ -87,14 +93,15 @@ bool MtpFileProxy::checkAndCreateProxyFile(QStringList &paths, QString &firstPat bool MtpFileProxy::checkFileDeviceIsMtp(const QString &filePath) { QStorageInfo storage(filePath); + qDebug() << "Checking storage device for:" << filePath << "Device:" << storage.device(); + if (storage.device().startsWith("gvfs") || storage.device().startsWith("cifs")) { // /run/user/1000/gvfs/mtp: /run/user/1000/gvfs/gphoto2: QString absoluteFilePath = QFileInfo(filePath).absoluteFilePath(); if (absoluteFilePath.contains(QRegularExpression("fs/(mtp|gphoto2):"))) { - // 判断是否为图片文件 - if (ImageEngine::instance()->isImage(filePath)) { - return true; - } + bool isImage = ImageEngine::instance()->isImage(filePath); + qDebug() << "File is on MTP device:" << isImage; + return isImage; } } @@ -108,26 +115,29 @@ bool MtpFileProxy::submitChangesToMTP(const QString &proxyFile) { if (isValid() && proxyCache.contains(proxyFile)) { auto infoPtr = proxyCache.value(proxyFile); + qDebug() << "Submitting changes to MTP file:" << proxyFile << "->" << infoPtr->originFileName; // 提交临时文件变更到 MTP 原始文件目录 #ifdef USE_DFM_IO DOperator copyOpt(QUrl::fromLocalFile(proxyFile)); if (!copyOpt.copyFile(QUrl::fromLocalFile(infoPtr->originFileName), DFile::CopyFlag::kOverwrite)) { - qWarning() - << QString("Submit changes to MTP mount file failed! DOperator error:%!").arg(copyOpt.lastError().errorMsg()); + qWarning() << "Failed to submit changes to MTP file using DOperator. Error:" + << copyOpt.lastError().errorMsg(); return false; } #else QFile copyFile(proxyFile); if (!copyFile.copy(infoPtr->originFileName)) { - qWarning() << QString("Submit changes to MTP mount file failed! QFile error:%!").arg(copyFile.errorString()); + qWarning() << "Failed to submit changes to MTP file using QFile. Error:" + << copyFile.errorString(); return false; } #endif - + qInfo() << "Successfully submitted changes to MTP file"; return true; } + qWarning() << "Cannot submit changes: Invalid proxy file or cache not found:" << proxyFile; return false; } @@ -175,6 +185,8 @@ MtpFileProxy::FileState MtpFileProxy::state(const QString &proxyFile) const */ QString MtpFileProxy::createPorxyFile(const QString &filePath) { + qDebug() << "Creating proxy file for:" << filePath; + auto findItr = std::find_if(proxyCache.begin(), proxyCache.end(), [&](const QSharedPointer &info) { return info->originFileName == filePath; }); @@ -183,14 +195,16 @@ QString MtpFileProxy::createPorxyFile(const QString &filePath) // 同一路径文件已变更,移除之前缓存信息 QFileInfo current(filePath); if (findItr.value()->lastModified == current.lastModified()) { + qDebug() << "Using existing proxy file:" << findItr.key(); return findItr.key(); } + qDebug() << "Removing outdated proxy file:" << findItr.key(); proxyCache.erase(findItr); } QSharedPointer infoPtr = QSharedPointer(new ProxyInfo); if (!infoPtr->tempDir.isValid()) { - qWarning() << qPrintable("Cannot create temporary dir for MTP mount device."); + qWarning() << "Failed to create temporary directory for MTP file"; return filePath; } @@ -203,6 +217,7 @@ QString MtpFileProxy::createPorxyFile(const QString &filePath) proxyCache.insert(proxyFile, infoPtr); // 异步拷贝文件到临时目录 + qDebug() << "Created new proxy file:" << proxyFile; copyFileFromMtpAsync(infoPtr); return proxyFile; @@ -228,11 +243,15 @@ void MtpFileProxy::loadFinished(const QString &proxyFile, bool ret) { if (proxyCache.contains(proxyFile)) { if (!ret) { - qWarning() << qPrintable("Copy MTP mount file to tmp folder failed!"); + qWarning() << "Failed to copy MTP file to temporary folder:" << proxyFile; + } else { + qDebug() << "Successfully copied MTP file to temporary folder:" << proxyFile; } proxyCache.value(proxyFile)->fileState = ret ? LoadSucc : LoadFailed; Q_EMIT createProxyFileFinished(proxyFile, ret); + } else { + qWarning() << "Received load finished for unknown proxy file:" << proxyFile; } } @@ -241,11 +260,14 @@ void MtpFileProxy::loadFinished(const QString &proxyFile, bool ret) */ void MtpFileProxy::triggerOriginFileChanged(const QString &originFile) { + qDebug() << "Checking origin file changes:" << originFile; + auto findItr = std::find_if(proxyCache.begin(), proxyCache.end(), [&](const QSharedPointer &info) { return info->originFileName == originFile; }); if (findItr == proxyCache.end()) { + qDebug() << "No proxy found for origin file:" << originFile; return; } @@ -254,20 +276,23 @@ void MtpFileProxy::triggerOriginFileChanged(const QString &originFile) if (!info.exists()) { // 文件已被移除 + qInfo() << "Origin file has been deleted:" << originFile; if (QFile::rename(proxyPtr->proxyFileName, proxyPtr->proxyFileName + ".delete")) { proxyPtr->fileState = FileDelete; } else { - qWarning() << qPrintable("For delete, rename MTP cached file failed!"); + qWarning() << "Failed to rename proxy file for deletion:" << proxyPtr->proxyFileName; } } else if (FileDelete == findItr.value()->fileState) { // 文件恢复 + qInfo() << "Origin file has been restored:" << originFile; if (QFile::rename(proxyPtr->proxyFileName + ".delete", proxyPtr->proxyFileName)) { proxyPtr->fileState = LoadSucc; } else { - qWarning() << qPrintable("For restore, rename MTP cached file failed!"); + qWarning() << "Failed to rename proxy file for restoration:" << proxyPtr->proxyFileName; } } else if (info.lastModified() != findItr.value()->lastModified) { // 文件变更 + qInfo() << "Origin file has been modified:" << originFile; copyFileFromMtpAsync(proxyPtr); proxyPtr->lastModified = info.lastModified(); } @@ -300,7 +325,7 @@ void MtpFileProxy::copyFileFromMtpAsync(const QSharedPointerproxyFileName); if (!ret) { - qWarning() << QString("Copy from MTP mount file failed! QFile error:%!").arg(copyFile.errorString()); + qWarning() << "Failed to copy MTP file using QFile. Error:" << copyFile.errorString(); } loadFinished(proxyPtr->proxyFileName, ret); diff --git a/libimageviewer/service/permissionconfig.cpp b/libimageviewer/service/permissionconfig.cpp index 6eb62b70..94d5fc7f 100644 --- a/libimageviewer/service/permissionconfig.cpp +++ b/libimageviewer/service/permissionconfig.cpp @@ -92,15 +92,19 @@ bool activateWindowFromDock(quintptr winId) PermissionConfig::PermissionConfig(QObject *parent) : QObject(parent) { + qDebug() << "Initializing PermissionConfig"; #ifndef DTKWIDGET_CLASS_DWaterMarkHelper - qWarning() << qPrintable("Current version is not support read watermark"); + qWarning() << "Current version does not support watermark functionality"; #endif } /** @brief 析构函数 */ -PermissionConfig::~PermissionConfig() {} +PermissionConfig::~PermissionConfig() +{ + qDebug() << "PermissionConfig destructor called"; +} /** @return 返回权限控制单实例 @@ -116,6 +120,7 @@ PermissionConfig *PermissionConfig::instance() */ bool PermissionConfig::isValid() const { + qDebug() << "Checking permission config validity:" << valid; return valid; } @@ -124,7 +129,11 @@ bool PermissionConfig::isValid() const */ bool PermissionConfig::isCurrentIsTargetImage() const { - return isValid() && currentImagePath == targetImagePath; + bool isTarget = isValid() && currentImagePath == targetImagePath; + qDebug() << "Checking if current image is target:" << isTarget + << "Current:" << currentImagePath + << "Target:" << targetImagePath; + return isTarget; } /** @@ -134,10 +143,15 @@ bool PermissionConfig::isCurrentIsTargetImage() const bool PermissionConfig::isPrintable(const QString &fileName) const { if (checkAuthInvalid(fileName)) { + qDebug() << "File is not under permission control:" << fileName; return true; } - return !!printLimitCount; + bool printable = !!printLimitCount; + qDebug() << "Checking print permission for:" << fileName + << "Printable:" << printable + << "Remaining count:" << printLimitCount; + return printable; } /** @@ -164,10 +178,12 @@ bool PermissionConfig::hasPrintWaterMark() const void PermissionConfig::triggerPrint(const QString &fileName) { if (checkAuthInvalid(fileName)) { + qDebug() << "Skipping print trigger for unauthorized file:" << fileName; return; } // 减少打印计数 + qInfo() << "Triggering print for file:" << fileName; reduceOnePrintCount(); QJsonObject data{{g_KeyTid, TidPrint}, {g_KeyOperate, "print"}, {g_KeyFilePath, fileName}, {g_KeyRemaining, printCount()}}; @@ -200,14 +216,16 @@ bool PermissionConfig::isUnlimitPrint() const void PermissionConfig::reduceOnePrintCount() { if (g_UnlimitPrintCount == printLimitCount) { + qDebug() << "Print count is unlimited, no reduction needed"; return; } if (printLimitCount > 0) { printLimitCount--; + qInfo() << "Reduced print count, remaining:" << printLimitCount; Q_EMIT printCountChanged(); } else { - qWarning() << qPrintable("Escape print authorise check!"); + qWarning() << "Attempted to reduce print count when already at zero"; } } @@ -218,6 +236,7 @@ void PermissionConfig::reduceOnePrintCount() void PermissionConfig::triggerAction(TidType tid, const QString &fileName) { if (checkAuthInvalid(fileName)) { + qDebug() << "Skipping action trigger for unauthorized file:" << fileName; return; } @@ -225,6 +244,7 @@ void PermissionConfig::triggerAction(TidType tid, const QString &fileName) switch (tid) { case TidOpen: if (NotOpen != status) { + qDebug() << "Skipping open action - invalid status:" << status; return; } status = Open; @@ -232,12 +252,12 @@ void PermissionConfig::triggerAction(TidType tid, const QString &fileName) break; case TidClose: if (Open != status) { + qDebug() << "Skipping close action - invalid status:" << status; return; } status = Close; // Note: 授权文件关闭后(关闭窗口或打开其他图片),权限控制无效化 valid = false; - optName = "close"; break; case TidEdit: @@ -266,6 +286,7 @@ void PermissionConfig::triggerAction(TidType tid, const QString &fileName) return; } + qInfo() << "Triggering action:" << optName << "for file:" << fileName; QJsonObject data{{g_KeyTid, tid}, {g_KeyOperate, optName}, {g_KeyFilePath, fileName}}; triggerNotify(data); } @@ -275,6 +296,7 @@ void PermissionConfig::triggerAction(TidType tid, const QString &fileName) */ void PermissionConfig::triggerNotify(const QJsonObject &data) { + qDebug() << "Sending permission notification:" << data; enum ReportMode { Broadcast = 1, Report = 2, ReportAndBroadcast = Broadcast | Report }; QJsonObject sendData; sendData.insert("policy", QJsonObject{{"reportMode", ReportAndBroadcast}}); @@ -322,9 +344,11 @@ bool PermissionConfig::eventFilter(QObject *watched, QEvent *event) void PermissionConfig::setCurrentImagePath(const QString &fileName) { if (!valid) { + qDebug() << "Permission config not valid, skipping current image path update"; return; } + qInfo() << "Setting current image path:" << fileName; currentImagePath = fileName; // 通知当前展示的图片变更 @@ -483,6 +507,7 @@ void PermissionConfig::activateProcess(qint64 pid) void PermissionConfig::initFromArguments(const QStringList &arguments) { if (valid) { + qDebug() << "Permission config already initialized, skipping"; return; } @@ -496,16 +521,18 @@ void PermissionConfig::initFromArguments(const QStringList &arguments) QString filePath = info.absoluteFilePath(); if (ImageEngine::instance()->isImage(filePath) || info.suffix() == "dsps") { targetImagePath = filePath; + qInfo() << "Found target image path:" << targetImagePath; break; } } if (targetImagePath.isEmpty()) { - qWarning() << qPrintable("Authorise config with no target image path."); + qWarning() << "No valid target image path found in arguments"; return; } + QByteArray jsonData = QByteArray::fromBase64(configParam.toUtf8()); - qInfo() << QString("Parse authorise config, data: %1").arg(QString(jsonData)); + qDebug() << "Decoded config data:" << QString(jsonData); QJsonParseError error; QJsonDocument doc = QJsonDocument::fromJson(jsonData, &error); @@ -516,27 +543,27 @@ void PermissionConfig::initFromArguments(const QStringList &arguments) #ifdef DTKWIDGET_CLASS_DWaterMarkHelper initReadWaterMark(root.value("readWatermark").toObject()); initPrintWaterMark(root.value("printWatermark").toObject()); -#endif // DTKWIDGET_CLASS_DWaterMarkHelper - - qInfo() << qPrintable("Current Enable permission") << authFlags; +#endif + qInfo() << "Permission config initialized successfully. Enabled flags:" << authFlags; } else { - qWarning() - << QString("Parse authorise config error at pos: %1, details: %2").arg(error.offset).arg(error.errorString()); + qWarning() << "Failed to parse permission config JSON. Error at position:" + << error.offset << "Details:" << error.errorString(); } #ifdef DTKWIDGET_CLASS_DWaterMarkHelper // 存在打印水印设置时,检测是否存在打印水印插件,若存在则通过设置环境变量调用打印插件而不是手动设置 if (authFlags.testFlag(EnablePrintWaterMark)) { + qDebug() << "Checking for watermark plugin"; detectWaterMarkPluginExists(); } -#endif // DTKWIDGET_CLASS_DWaterMarkHelper +#endif // 只要传入参数、图片即认为有效,无论参数是否正常解析 valid = true; // 首次触发打开图片 triggerAction(TidOpen, targetImagePath); } else { - qWarning() << qPrintable("Parse authorise config is empty."); + qWarning() << "Failed to parse permission config arguments"; } if (valid) { @@ -545,9 +572,9 @@ void PermissionConfig::initFromArguments(const QStringList &arguments) bool connRet = connection.connect( "com.wps.cryptfs", "/com/wps/cryptfs", "cryptfs.method.Type", "activateProcess", this, SLOT(activateProcess(qint64))); if (!connRet) { - qWarning() << qPrintable("DBus connect activateProcess failed!"); + qWarning() << "Failed to connect DBus activateProcess signal"; } else { - qInfo() << qPrintable("DBus connect activateProcess success!"); + qInfo() << "Successfully connected DBus activateProcess signal"; } } } @@ -598,11 +625,12 @@ bool PermissionConfig::parseConfigOption(const QStringList &arguments, QString & void PermissionConfig::initAuthorise(const QJsonObject ¶m) { if (param.isEmpty()) { - qInfo() << qPrintable("Authorise config not contains authorise data."); + qInfo() << "No authorization data in config"; return; } // 屏蔽 delete / rename ,默认无此功能 + qDebug() << "Initializing authorization from config"; authFlags.setFlag(EnableEdit, param.value("edit").toBool(false)); authFlags.setFlag(EnableCopy, param.value("copy").toBool(false)); authFlags.setFlag(EnableSwitch, param.value("pictureSwitch").toBool(false)); @@ -611,17 +639,20 @@ void PermissionConfig::initAuthorise(const QJsonObject ¶m) // Internal 内部使用,默认均为false ignoreDevicePixelRatio = param.value("ignoreDevicePixelRatio").toBool(false); breakPrintSpacingLimit = param.value("breakPrintSpacingLimit").toBool(false); + if (ignoreDevicePixelRatio) { - qInfo() << qPrintable("Enable internal property: ignore device pixel ratio."); + qInfo() << "Device pixel ratio will be ignored"; } if (breakPrintSpacingLimit) { - qInfo() << qPrintable("Enable internal property: break print spacing limit."); + qInfo() << "Print spacing limits will be ignored"; } printLimitCount = param.value("printCount").toInt(0); if (printLimitCount < g_UnlimitPrintCount) { + qWarning() << "Invalid print count in config:" << printLimitCount << "Setting to 0"; printLimitCount = 0; } + qInfo() << "Print limit count set to:" << printLimitCount; } #ifdef DTKWIDGET_CLASS_DWaterMarkHelper diff --git a/libimageviewer/slideshow/imageanimation.cpp b/libimageviewer/slideshow/imageanimation.cpp index 1f95eaa1..fe0b8734 100644 --- a/libimageviewer/slideshow/imageanimation.cpp +++ b/libimageviewer/slideshow/imageanimation.cpp @@ -294,22 +294,25 @@ LibImageAnimationPrivate::LibImageAnimationPrivate(LibImageAnimation *qq) : m_singleanimationTimer(nullptr), m_continuousanimationTimer(nullptr), m_staticTimer(nullptr), q_ptr(qq) { Q_UNUSED(m_padding2); + qDebug() << "Initializing LibImageAnimationPrivate"; } LibImageAnimationPrivate::~LibImageAnimationPrivate() { - + qDebug() << "Destroying LibImageAnimationPrivate"; } void LibImageAnimationPrivate::effectPainter(QPainter *painter, const QRect &rect) { if (m_pixmap1.isNull() || m_pixmap2.isNull()) { + qWarning() << "Cannot paint effect: One or both pixmaps are null"; return; } else if (!m_isAnimationIng) { painter->drawPixmap(0, 0, m_pixmap2); return; } centrePoint = rect.center(); + qDebug() << "Painting effect type:" << m_animationType; switch (m_animationType) { case 0: fadeEffect(painter, rect, m_factor, m_pixmap1, m_pixmap2); @@ -327,6 +330,7 @@ void LibImageAnimationPrivate::effectPainter(QPainter *painter, const QRect &rec moveLeftToRightEffect(painter, rect, m_factor, m_pixmap1, m_pixmap2); break; default: + qWarning() << "Unknown animation type:" << m_animationType; break; } painter->end(); @@ -513,6 +517,7 @@ const QString LibImageAnimationPrivate::getCurrentPath() void LibImageAnimationPrivate::setPathList(const QString &first, const QStringList &list) { + qDebug() << "Setting path list with first image:" << first << "Total images:" << list.size(); queue = QSharedPointer(new LoopQueue(first, list)); setImage1(queue->last()); setImage2(queue->first()); @@ -520,6 +525,7 @@ void LibImageAnimationPrivate::setPathList(const QString &first, const QStringLi void LibImageAnimationPrivate::startAnimation() { + qDebug() << "Starting animation"; std::srand(static_cast(QTime(0, 0, 0).secsTo(QTime::currentTime()))); m_animationType = static_cast(std::rand() % (3)); if (!m_continuousanimationTimer) { @@ -536,7 +542,9 @@ void LibImageAnimationPrivate::startAnimation() void LibImageAnimationPrivate::startSingleNextAnimation() { + qDebug() << "Starting single next animation"; if (m_isAnimationIng) { + qDebug() << "Animation already in progress, stopping"; m_isAnimationIng = false; } else { setImage1(m_imageName2); @@ -547,7 +555,9 @@ void LibImageAnimationPrivate::startSingleNextAnimation() void LibImageAnimationPrivate::startSinglePreAnimation() { + qDebug() << "Starting single previous animation"; if (m_isAnimationIng) { + qDebug() << "Animation already in progress, stopping"; m_isAnimationIng = false; } else { setImage1(m_imageName2); @@ -558,6 +568,7 @@ void LibImageAnimationPrivate::startSinglePreAnimation() void LibImageAnimationPrivate::startStatic() { + qDebug() << "Starting static display"; if (!m_staticTimer) { m_staticTimer = new QTimer(this); m_staticTimer->setSingleShot(true); @@ -575,6 +586,7 @@ void LibImageAnimationPrivate::onContinuousAnimationTimer() if (m_factor + 0.005f > 1) m_factor = 1.0f; if (m_funval > 1.0f) { + qDebug() << "Animation completed, factor:" << m_factor; m_isAnimationIng = false; if (m_PlayOrStatue == LibImageAnimation::PlayStatue && m_SliderModel == LibImageAnimation::AutoPlayModel) { m_continuousanimationTimer->stop(); @@ -590,8 +602,8 @@ void LibImageAnimationPrivate::onContinuousAnimationTimer() void LibImageAnimationPrivate::onStaticTimer() { - qDebug() << "ImageAnimationPrivate::onStaticTimer m_PlayOrStatue = " << LibImageAnimation::PlayStatue; - qDebug() << "ImageAnimationPrivate::onStaticTimer m_SliderModel = " << LibImageAnimation::AutoPlayModel; + qDebug() << "Static timer triggered - Play status:" << m_PlayOrStatue + << "Slide model:" << m_SliderModel; if (m_PlayOrStatue == LibImageAnimation::PlayStatue && m_SliderModel == LibImageAnimation::AutoPlayModel) { std::srand(static_cast(QTime(0, 0, 0).secsTo(QTime::currentTime()))); @@ -604,6 +616,7 @@ void LibImageAnimationPrivate::onStaticTimer() void LibImageAnimationPrivate::setImage1(const QString &imageName1_bar) { + qDebug() << "Setting image 1:" << imageName1_bar; m_imageName1 = imageName1_bar; QImage tImg; QString errMsg; @@ -631,6 +644,8 @@ void LibImageAnimationPrivate::setImage1(const QString &imageName1_bar) #endif // 多屏显示问题,定位当前屏幕 + qDebug() << "Screen geometry for image 1:" << screenGeometry; + if (p1.width() >= p1.height()) { m_pixmap1 = QPixmap(screenGeometry.size()); QPainter pa1(&m_pixmap1); @@ -668,6 +683,7 @@ void LibImageAnimationPrivate::setImage1(const QString &imageName1_bar) void LibImageAnimationPrivate::setImage2(const QString &imageName2_bar) { + qDebug() << "Setting image 2:" << imageName2_bar; m_imageName2 = imageName2_bar; int beginX = 0, beginY = 0; QImage tImg; @@ -680,7 +696,6 @@ void LibImageAnimationPrivate::setImage2(const QString &imageName2_bar) if (auto screen = QGuiApplication::primaryScreen()) { screenGeometry = screen->geometry(); } - #else // 双屏下或者多屏下 int number = QApplication::desktop()->screenNumber(q_ptr); @@ -691,9 +706,10 @@ void LibImageAnimationPrivate::setImage2(const QString &imageName2_bar) if (auto screen = QGuiApplication::screens().at(number)) { screenGeometry = screen->geometry(); } - #endif + qDebug() << "Screen geometry for image 2:" << screenGeometry; + if (p2.width() >= p2.height()) { m_pixmap2 = QPixmap(screenGeometry.size()); QPainter pa2(&m_pixmap2); @@ -734,6 +750,7 @@ void LibImageAnimationPrivate::setImage2(const QString &imageName2_bar) LibImageAnimation::LibImageAnimation(QWidget *parent) : QWidget(parent), current_target(EffectPlay), d_ptr(new LibImageAnimationPrivate(this)) { + qDebug() << "Initializing LibImageAnimation"; setAttribute(Qt::WA_TransparentForMouseEvents, true); setAttribute(Qt::WA_StyledBackground, true); QPalette pal(palette()); @@ -744,16 +761,17 @@ LibImageAnimation::LibImageAnimation(QWidget *parent) : LibImageAnimation::~LibImageAnimation() { + qDebug() << "Destroying LibImageAnimation"; Q_D(LibImageAnimation); delete d; } void LibImageAnimation::startSlideShow(const QString &beginPath, const QStringList &pathlist) { + qInfo() << "Starting slideshow with" << pathlist.size() << "images, beginning with:" << beginPath; Q_D(LibImageAnimation); setPaintTarget(EffectPlay); d->setPathList(beginPath, pathlist); -// d->startAnimation(); d->setPlayOrStatue(LibImageAnimation::PlayStatue); d->setSlideModel(LibImageAnimation::AutoPlayModel); d->startStatic(); @@ -761,12 +779,14 @@ void LibImageAnimation::startSlideShow(const QString &beginPath, const QStringLi void LibImageAnimation::endSlider() { + qDebug() << "Ending slideshow"; Q_D(LibImageAnimation); d->endSlide(); } void LibImageAnimation::playAndNext() { + qDebug() << "Playing next image"; Q_D(LibImageAnimation); d->setPlayOrStatue(LibImageAnimation::PlayStatue); d->setSlideModel(LibImageAnimation::ManualPlayModel); @@ -776,6 +796,7 @@ void LibImageAnimation::playAndNext() void LibImageAnimation::playAndPre() { + qDebug() << "Playing previous image"; Q_D(LibImageAnimation); d->setPlayOrStatue(LibImageAnimation::PlayStatue); d->setSlideModel(LibImageAnimation::ManualPlayModel); @@ -785,6 +806,7 @@ void LibImageAnimation::playAndPre() void LibImageAnimation::pauseAndNext() { + qDebug() << "Pausing and moving to next image"; Q_D(LibImageAnimation); d->setPlayOrStatue(LibImageAnimation::StopStatue); d->setSlideModel(LibImageAnimation::ManualPlayModel); @@ -795,6 +817,7 @@ void LibImageAnimation::pauseAndNext() void LibImageAnimation::ifPauseAndContinue() { + qDebug() << "Resuming slideshow from pause"; Q_D(LibImageAnimation); d->setPlayOrStatue(LibImageAnimation::PlayStatue); d->setSlideModel(LibImageAnimation::AutoPlayModel); diff --git a/libimageviewer/slideshow/slideshowpanel.cpp b/libimageviewer/slideshow/slideshowpanel.cpp index 1d373381..7d683f0c 100644 --- a/libimageviewer/slideshow/slideshowpanel.cpp +++ b/libimageviewer/slideshow/slideshowpanel.cpp @@ -18,6 +18,7 @@ #endif #include #include +#include namespace { const int DELAY_HIDE_CURSOR_INTERVAL = 3000; @@ -36,6 +37,7 @@ const int HEIGHT = 81; SlideShowBottomBar::SlideShowBottomBar(QWidget *parent) : DFloatingWidget(parent) { + qDebug() << "Initializing SlideShowBottomBar"; setCursor(Qt::ArrowCursor); setFixedSize(WIDTH, HEIGHT); QHBoxLayout *hb = new QHBoxLayout(); @@ -93,6 +95,7 @@ SlideShowBottomBar::SlideShowBottomBar(QWidget *parent) : DFloatingWidget(parent void SlideShowBottomBar::onPreButtonClicked() { + qDebug() << "Previous button clicked"; //todo屏蔽了全局信号 // emit dApp->signalM->updatePauseButton(); // emit dApp->signalM->updateButton(); @@ -104,6 +107,7 @@ void SlideShowBottomBar::onPreButtonClicked() void SlideShowBottomBar::onPlaypauseButtonClicked() { if (!isStop) { + qDebug() << "Pausing slideshow"; m_playpauseButton->setIcon(QIcon::fromTheme("dcc_play_normal")); m_playpauseButton->setToolTip(tr("Play")); isStop = true; @@ -111,6 +115,7 @@ void SlideShowBottomBar::onPlaypauseButtonClicked() // emit dApp->signalM->updateButton(); emit showPause(); } else { + qDebug() << "Resuming slideshow"; m_playpauseButton->setIcon(QIcon::fromTheme("dcc_suspend_normal")); m_playpauseButton->setToolTip(tr("Pause")); isStop = false; @@ -136,6 +141,7 @@ void SlideShowBottomBar::onInitSlideShowButton() void SlideShowBottomBar::onNextButtonClicked() { + qDebug() << "Next button clicked"; //todo屏蔽了全局信号 // emit dApp->signalM->updatePauseButton(); // emit dApp->signalM->updateButton(); @@ -146,6 +152,7 @@ void SlideShowBottomBar::onNextButtonClicked() void SlideShowBottomBar::onCancelButtonClicked() { + qDebug() << "Cancel button clicked"; emit showCancel(); } diff --git a/libimageviewer/unionimage/baseutils.cpp b/libimageviewer/unionimage/baseutils.cpp index afa58abc..a111ada9 100755 --- a/libimageviewer/unionimage/baseutils.cpp +++ b/libimageviewer/unionimage/baseutils.cpp @@ -51,6 +51,7 @@ const QString DATETIME_FORMAT_EXIF = "yyyy:MM:dd HH:mm:ss"; QPixmap renderSVG(const QString &filePath, const QSize &size) { + qDebug() << "Rendering SVG file:" << filePath << "with size:" << size; QImageReader reader; QPixmap pixmap; @@ -61,7 +62,9 @@ QPixmap renderSVG(const QString &filePath, const QSize &size) reader.setScaledSize(size * ratio); pixmap = QPixmap::fromImage(reader.read()); pixmap.setDevicePixelRatio(ratio); + qDebug() << "SVG rendered successfully with ratio:" << ratio; } else { + qWarning() << "Failed to read SVG file:" << filePath; pixmap.load(filePath); } @@ -124,10 +127,12 @@ QDateTime stringToDateTime(const QString &time) void showInFileManager(const QString &path) { if (path.isEmpty() || !QFile::exists(path)) { + qWarning() << "Cannot show in file manager: path is empty or file does not exist:" << path; return; } #if 1 + qDebug() << "Showing file in file manager:" << path; QUrl url = QUrl::fromLocalFile(QFileInfo(path).absoluteFilePath()); #else QUrl url = QUrl::fromLocalFile(path); @@ -172,9 +177,11 @@ void showInFileManager(const QString &path) void copyImageToClipboard(const QStringList &paths, const QImage &sourceImage) { if (paths.isEmpty()) { + qWarning() << "Cannot copy to clipboard: path list is empty"; return; } + qDebug() << "Copying" << paths.size() << "images to clipboard"; // Get clipboard QClipboard *cb = qApp->clipboard(); @@ -217,11 +224,15 @@ void copyImageToClipboard(const QStringList &paths, const QImage &sourceImage) QString getFileContent(const QString &file) { + qDebug() << "Reading content from file:" << file; QFile f(file); QString fileContent = ""; if (f.open(QFile::ReadOnly)) { fileContent = QLatin1String(f.readAll()); f.close(); + qDebug() << "Successfully read file content, size:" << fileContent.size(); + } else { + qWarning() << "Failed to open file for reading:" << file; } return fileContent; } @@ -241,6 +252,7 @@ QString getFileContent(const QString &file) QString getNotExistsTrashFileName(const QString &fileName) { + qDebug() << "Generating unique trash filename for:" << fileName; QByteArray name = fileName.toUtf8(); int index = name.lastIndexOf('/'); @@ -278,6 +290,7 @@ QString getNotExistsTrashFileName(const QString &fileName) bool trashFile(const QString &file) { #ifdef QT_GUI_LIB + qDebug() << "Moving file to trash:" << file; QString trashPath; QString trashInfoPath; QString trashFilesPath; @@ -290,15 +303,17 @@ bool trashFile(const QString &file) trashInfoPath = trashPath + "/info"; trashFilesPath = trashPath + "/files"; if (! QDir(trashFilesPath).exists()) { + qDebug() << "Creating trash files directory:" << trashFilesPath; QDir().mkpath(trashFilesPath); } if (! QDir(trashInfoPath).exists()) { + qDebug() << "Creating trash info directory:" << trashInfoPath; QDir().mkpath(trashInfoPath); } QFileInfo originalInfo(file); if (! originalInfo.exists()) { - qWarning() << "File doesn't exists, can't move to trash"; + qWarning() << "File doesn't exist, can't move to trash:" << file; return false; } // Info for restore @@ -328,11 +343,12 @@ bool trashFile(const QString &file) infoFile.close(); if (!QDir().rename(originalInfo.absoluteFilePath(), filepath)) { - qWarning() << "move to trash failed!"; + qWarning() << "Failed to move file to trash:" << file; return false; } + qDebug() << "Successfully moved file to trash:" << file; } else { - qDebug() << "Move to trash failed! Could not write *.trashinfo!"; + qWarning() << "Failed to write trash info file:" << infopath; return false; } // Remove thumbnail @@ -340,7 +356,7 @@ bool trashFile(const QString &file) return true; #else Q_UNUSED(file); - qWarning() << "Trash in server-mode not supported"; + qWarning() << "Trash operation not supported in server mode"; return false; #endif } @@ -384,6 +400,7 @@ bool trashFile(const QString &file) QString SpliteText(const QString &text, const QFont &font, int nLabelSize, bool bReturn) { + qDebug() << "Splitting text with label size:" << nLabelSize << "return:" << bReturn; QFontMetrics fm(font); int nTextSize = fm.horizontalAdvance(text); if (nTextSize > nLabelSize) { @@ -427,17 +444,20 @@ QString SpliteText(const QString &text, const QFont &font, int nLabelSize, bool QString hash(const QString &str) { + qDebug() << "Generating MD5 hash for string"; return QString(QCryptographicHash::hash(str.toUtf8(), QCryptographicHash::Md5).toHex()); } bool onMountDevice(const QString &path) { + qDebug() << "Checking if path is on mount device:" << path; return (path.startsWith("/media/") || path.startsWith("/run/media/")); } bool mountDeviceExist(const QString &path) { + qDebug() << "Checking if mount device exists for path:" << path; QString mountPoint; if (path.startsWith("/media/")) { const int sp = path.indexOf("/", 7) + 1; @@ -455,11 +475,14 @@ bool mountDeviceExist(const QString &path) bool checkCommandExist(const QString &command) { + qDebug() << "Checking if command exists:" << command; try { QString path = QStandardPaths::findExecutable(command); - return !path.isEmpty(); + bool exists = !path.isEmpty(); + qDebug() << "Command" << command << (exists ? "exists" : "does not exist"); + return exists; } catch (std::logic_error &e) { - qWarning() << e.what(); + qWarning() << "Error checking command existence:" << e.what(); return false; } } @@ -470,14 +493,17 @@ static bool g_IsWaylandEnv = false; */ bool initCheckWaylandEnv() { + qDebug() << "Initializing Wayland environment check"; auto e = QProcessEnvironment::systemEnvironment(); QString XDG_SESSION_TYPE = e.value(QStringLiteral("XDG_SESSION_TYPE")); QString WAYLAND_DISPLAY = e.value(QStringLiteral("WAYLAND_DISPLAY")); if (XDG_SESSION_TYPE == QLatin1String("wayland") || WAYLAND_DISPLAY.contains(QLatin1String("wayland"), Qt::CaseInsensitive)) { g_IsWaylandEnv = true; + qInfo() << "Running in Wayland environment"; return true; } else { + qInfo() << "Not running in Wayland environment"; return false; } } @@ -499,9 +525,11 @@ static bool g_LoadTranslator = false; bool loadLibTransaltor() { if (g_LoadTranslator) { + qDebug() << "Translator already loaded"; return true; } + qDebug() << "Loading library translator"; QDir dir(PLUGIN_QM_TRANS_PATH); if (dir.exists()) { QDirIterator qmIt(PLUGIN_QM_TRANS_PATH, QStringList() << QString("*%1.qm").arg(QLocale::system().name()), QDir::Files); @@ -511,7 +539,10 @@ bool loadLibTransaltor() QFileInfo finfo = qmIt.fileInfo(); QTranslator *translator = new QTranslator(qApp); if (translator->load(finfo.baseName(), finfo.absolutePath())) { + qDebug() << "Loaded translator:" << finfo.baseName(); qApp->installTranslator(translator); + } else { + qWarning() << "Failed to load translator:" << finfo.baseName(); } } @@ -533,9 +564,11 @@ bool loadLibTransaltor() } g_LoadTranslator = true; + qInfo() << "Library translator loaded successfully"; return true; } + qWarning() << "Translator directory does not exist:" << PLUGIN_QM_TRANS_PATH; return false; } diff --git a/libimageviewer/unionimage/imageutils.cpp b/libimageviewer/unionimage/imageutils.cpp index e949ff62..c203b043 100755 --- a/libimageviewer/unionimage/imageutils.cpp +++ b/libimageviewer/unionimage/imageutils.cpp @@ -33,18 +33,21 @@ namespace image { const QImage scaleImage(const QString &path, const QSize &size) { + qDebug() << "Scaling image:" << path << "to size:" << size; if (!imageSupportRead(path)) { + qWarning() << "Image format not supported for reading:" << path; return QImage(); } QImageReader reader(path); reader.setAutoTransform(true); if (! reader.canRead()) { - qDebug() << "Can't read image: " << path; + qWarning() << "Cannot read image:" << path; return QImage(); } QSize tSize = reader.size(); if (! tSize.isValid()) { + qDebug() << "Image size not valid, trying to get from metadata"; QStringList rl = getAllMetaData(path).value("Dimension").split("x"); if (rl.length() == 2) { tSize = QSize(QString(rl.first()).toInt(), @@ -57,24 +60,30 @@ const QImage scaleImage(const QString &path, const QSize &size) // Some format does not support scaling if (tImg.width() > size.width() || tImg.height() > size.height()) { if (tImg.isNull()) { + qWarning() << "Failed to read scaled image:" << path; return QImage(); } else { + qDebug() << "Image format does not support scaling, converting to PNG"; // Save as supported format and scale it again const QString tmp = QDir::tempPath() + "/scale_tmp_image.png"; QFile::remove(tmp); if (tImg.save(tmp, "png", 50)) { return scaleImage(tmp, size); } else { + qWarning() << "Failed to save temporary PNG for scaling:" << path; return QImage(); } } - } else + } else { + qDebug() << "Successfully scaled image:" << path; return tImg; + } } const QDateTime getCreateDateTime(const QString &path) { - QDateTime dt; /*= libexif::getCreateDateTime(path);*/ + qDebug() << "Getting creation date time for:" << path; + QDateTime dt; // fallback to metadata. if (!dt.isValid()) { @@ -84,6 +93,7 @@ const QDateTime getCreateDateTime(const QString &path) s = getAllMetaData(path).value("DateTimeDigitized"); } if (s.isEmpty()) { + qDebug() << "No metadata date found, using current time"; s = QDateTime::currentDateTime().toString(); } dt = QDateTime::fromString(s, "yyyy.MM.dd HH:mm:ss"); @@ -91,12 +101,14 @@ const QDateTime getCreateDateTime(const QString &path) // fallback to file create time. if (!dt.isValid()) { + qDebug() << "No valid metadata date, using file creation time"; QFileInfo finfo(path); dt = finfo.birthTime(); } // fallback to today. if (!dt.isValid()) { + qDebug() << "No valid file creation time, using current time"; dt = QDateTime::currentDateTime(); } @@ -105,6 +117,7 @@ const QDateTime getCreateDateTime(const QString &path) bool imageSupportRead(const QString &path) { + qDebug() << "Checking if image format is supported for reading:" << path; const QString suffix = QFileInfo(path).suffix(); if (suffix == "icns") return true; // take them here for good. @@ -112,6 +125,7 @@ bool imageSupportRead(const QString &path) errorList << "X3F"; if (errorList.indexOf(suffix.toUpper()) != -1) { + qWarning() << "Unsupported image format:" << suffix; return false; } return (suffix == "svg"); @@ -119,9 +133,11 @@ bool imageSupportRead(const QString &path) bool imageSupportSave(const QString &path) { + qDebug() << "Checking if image format is supported for saving:" << path; const QString suffix = QFileInfo(path).suffix(); //J2K格式暂时不支持 if (suffix.toUpper() == "J2K") { + qWarning() << "J2K format is not supported for saving"; return false; } // RAW image decode is too slow, and most of these does not support saving @@ -153,8 +169,13 @@ bool imageSupportSave(const QString &path) bool rotate(const QString &path, int degree) { + qDebug() << "Rotating image:" << path << "by" << degree << "degrees"; QString erroMsg; - return LibUnionImage_NameSpace::rotateImageFIle(degree, path, erroMsg); + bool result = LibUnionImage_NameSpace::rotateImageFIle(degree, path, erroMsg); + if (!result) { + qWarning() << "Failed to rotate image:" << erroMsg; + } + return result; } /*! @@ -165,6 +186,7 @@ bool rotate(const QString &path, int degree) */ const QPixmap cutSquareImage(const QPixmap &pixmap) { + qDebug() << "Cutting square image from pixmap"; return Libutils::image::cutSquareImage(pixmap, pixmap.size()); } @@ -177,6 +199,7 @@ const QPixmap cutSquareImage(const QPixmap &pixmap) */ const QPixmap cutSquareImage(const QPixmap &pixmap, const QSize &size) { + qDebug() << "Cutting square image from pixmap with size:" << size; const qreal ratio = qApp->devicePixelRatio(); QImage img = pixmap.toImage().scaled(size * ratio, Qt::KeepAspectRatioByExpanding, @@ -218,6 +241,7 @@ const QPixmap cutSquareImage(const QPixmap &pixmap, const QSize &size) */ const QFileInfoList getImagesInfo(const QString &dir, bool recursive) { + qDebug() << "Getting image info from directory:" << dir << "recursive:" << recursive; QFileInfoList infos; if (! recursive) { @@ -227,6 +251,7 @@ const QFileInfoList getImagesInfo(const QString &dir, bool recursive) infos << info; } } + qDebug() << "Found" << infos.size() << "images in directory"; return infos; } @@ -237,23 +262,25 @@ const QFileInfoList getImagesInfo(const QString &dir, bool recursive) dirIterator.next(); if (imageSupportRead(dirIterator.fileInfo().absoluteFilePath())) { infos << dirIterator.fileInfo(); -#include "imageutils.h" } } + qDebug() << "Found" << infos.size() << "images in directory and subdirectories"; return infos; } int getOrientation(const QString &path) { + qDebug() << "Getting image orientation for:" << path; return LibUnionImage_NameSpace::getOrientation(path); } const QImage loadTga(QString filePath, bool &success) { + qDebug() << "Loading TGA image:" << filePath; QImage img; if (!img.load(filePath)) { - + qDebug() << "Standard TGA loading failed, trying custom loader"; // open the file std::fstream fsPicture(filePath.toUtf8().constData(), std::ios::in | std::ios::binary); @@ -385,8 +412,7 @@ const QImage loadTga(QString filePath, bool &success) */ const QImage getRotatedImage(const QString &path) { - - + qDebug() << "Getting rotated image for:" << path; QImage tImg; QString format = DetectImageFormat(path); if (format.isEmpty()) { @@ -401,9 +427,7 @@ const QImage getRotatedImage(const QString &path) if (readerF.canRead()) { tImg = readerF.read(); } else { - qWarning() << "can't read image:" << readerF.errorString() - << format; - + qWarning() << "Cannot read image:" << readerF.errorString() << "format:" << format; tImg = QImage(path); } } @@ -442,6 +466,7 @@ QString size2HumanT(const qlonglong bytes) const QMap getAllMetaData(const QString &path) { + qDebug() << "Getting all metadata for:" << path; QMap admMap; //移除秒  2020/6/5 DJH @@ -472,6 +497,7 @@ const QMap getAllMetaData(const QString &path) const QPixmap cachePixmap(const QString &path) { + qDebug() << "Caching pixmap for:" << path; QPixmap pp; if (! QPixmapCache::find(path, &pp)) { pp = QPixmap(path); @@ -482,6 +508,7 @@ const QPixmap cachePixmap(const QString &path) const QString toMd5(const QByteArray &data) { + qDebug() << "Generating MD5 hash for data"; return QCryptographicHash::hash(data, QCryptographicHash::Md5).toHex(); } @@ -493,6 +520,7 @@ const QString toMd5(const QByteArray &data) */ QMap thumbnailAttribute(const QUrl &url) { + qDebug() << "Getting thumbnail attributes for:" << url.toString(); QMap set; if (url.isLocalFile()) { @@ -518,6 +546,7 @@ QMap thumbnailAttribute(const QUrl &url) const QString thumbnailCachePath() { + qDebug() << "Getting thumbnail cache path"; QString cacheP; QStringList systemEnvs = QProcess::systemEnvironment(); @@ -542,6 +571,7 @@ const QString thumbnailCachePath() QMutex mutex; const QPixmap getThumbnail(const QString &path, bool cacheOnly) { + qDebug() << "Getting thumbnail for:" << path << "cacheOnly:" << cacheOnly; QMutexLocker locker(&mutex); //优先读取自身缓存的图片 // if (dApp->m_imagemap.value(path).isNull()) { @@ -575,6 +605,7 @@ const QPixmap getThumbnail(const QString &path, bool cacheOnly) */ bool generateThumbnail(const QString &path) { + qDebug() << "Generating thumbnail for:" << path; const QUrl url = QUrl::fromLocalFile(path); const QString md5 = toMd5(url.toString(QUrl::FullyEncoded).toLocal8Bit()); const auto attributes = thumbnailAttribute(url); @@ -592,6 +623,7 @@ bool generateThumbnail(const QString &path) // Create filed thumbnail if (lImg.isNull() || nImg.isNull()) { + qWarning() << "Failed to generate thumbnail images for:" << path; const QString failedP = cacheP + "/fail/" + md5 + ".png"; QImage img(1, 1, QImage::Format_ARGB32_Premultiplied); const auto keys = attributes.keys(); @@ -599,8 +631,7 @@ bool generateThumbnail(const QString &path) img.setText(key, attributes[key]); } - qDebug() << "Save failed thumbnail:" << img.save(failedP, "png") - << failedP << url; + qDebug() << "Saving failed thumbnail:" << failedP; return false; } else { for (QString key : attributes.keys()) { @@ -610,8 +641,10 @@ bool generateThumbnail(const QString &path) const QString largeP = cacheP + "/large/" + md5 + ".png"; const QString normalP = cacheP + "/normal/" + md5 + ".png"; if (lImg.save(largeP, "png", 50) && nImg.save(normalP, "png", 50)) { + qDebug() << "Successfully generated thumbnails for:" << path; return true; } else { + qWarning() << "Failed to save thumbnails for:" << path; return false; } } @@ -641,6 +674,7 @@ const QString thumbnailPath(const QString &path, ThumbnailType type) void removeThumbnail(const QString &path) { + qDebug() << "Removing thumbnails for:" << path; QFile(thumbnailPath(path, ThumbLarge)).remove(); QFile(thumbnailPath(path, ThumbNormal)).remove(); QFile(thumbnailPath(path, ThumbFail)).remove(); @@ -648,10 +682,8 @@ void removeThumbnail(const QString &path) bool thumbnailExist(const QString &path, ThumbnailType type) { - if (QFileInfo(thumbnailPath(path, type)).exists() -// || QFileInfo(thumbnailPath(path, ThumbNormal)).exists() -// || QFileInfo(thumbnailPath(path, ThumbFail)).exists() - ) { + qDebug() << "Checking if thumbnail exists for:" << path << "type:" << type; + if (QFileInfo(thumbnailPath(path, type)).exists()) { return true; } else { return false; @@ -682,7 +714,8 @@ static QStringList fromByteArrayList(const QByteArrayList &list) QStringList supportedImageFormats() { - QStringList list ; + qDebug() << "Getting supported image formats"; + QStringList list; for (auto str : LibUnionImage_NameSpace::unionImageSupportFormat()) { str = "*." + str; list += str; @@ -698,6 +731,7 @@ QStringList supportedImageFormats() //直接搬运文管代码 bool imageSupportWallPaper(const QString &path) { + qDebug() << "Checking if image supports wallpaper:" << path; QMimeDatabase db; QMimeType mt = db.mimeTypeForFile(path, QMimeDatabase::MatchDefault); return mt.name().startsWith("image") @@ -715,6 +749,7 @@ bool imageSupportWallPaper(const QString &path) */ bool imageSupportGreeterDirect(const QString &path) { + qDebug() << "Checking if image supports direct greeter:" << path; static qint64 s_maxFileSize = 5 * 1024 * 1024; if (QFileInfo(path).size() > s_maxFileSize) { return false;