Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 26 additions & 3 deletions libimageviewer/imageengine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ class ImageEnginePrivate
ImageEnginePrivate::ImageEnginePrivate(ImageEngine *parent)
: q_ptr(parent)
{
qDebug() << "Initializing image engine private";
Q_Q(ImageEngine);
// 关联授权操作通知信号
QObject::connect(PermissionConfig::instance(), &PermissionConfig::authoriseNotify, q, &ImageEngine::sigAuthoriseNotify);
Expand All @@ -45,16 +46,21 @@ ImageEnginePrivate::ImageEnginePrivate(ImageEngine *parent)
//一张缩略图制作完成,发送到主线程
q->connect(m_worker, &LibImgOperate::sigOneImgReady, LibCommonService::instance(), &LibCommonService::slotSetImgInfoByPath);
workerThread->start();
qDebug() << "Image engine worker thread started";
}

ImageEnginePrivate::~ImageEnginePrivate() {}
ImageEnginePrivate::~ImageEnginePrivate()
{
qDebug() << "Destroying image engine private";
}

ImageEngine *ImageEngine::m_ImageEngine = nullptr;

ImageEngine *ImageEngine::instance(QObject *parent)
{
Q_UNUSED(parent);
if (!m_ImageEngine) {
qDebug() << "Creating new image engine instance";
m_ImageEngine = new ImageEngine();
}
return m_ImageEngine;
Expand All @@ -64,26 +70,34 @@ ImageEngine::ImageEngine(QWidget *parent)
: QObject(parent)
, d_ptr(new ImageEnginePrivate(this))
{
qDebug() << "Image engine constructed";
}

ImageEngine::~ImageEngine() {}
ImageEngine::~ImageEngine()
{
qDebug() << "Image engine destroyed";
}

/**
@brief 构造传入图像 `paths` 的缩略图到路径 `thumbnailSavePath` , `remake` 标识是否重新创建
@note 由于兼容性问题,此处的 `thumbnailSavePath` `paths` 没有调整为引用传递
*/
void ImageEngine::makeImgThumbnail(QString thumbnailSavePath, QStringList paths, int makeCount, bool remake)
{
qDebug() << "Making thumbnails for" << paths.size() << "images, save path:" << thumbnailSavePath << "remake:" << remake;
//执行子线程制作缩略图动作
Q_UNUSED(makeCount);
if (paths.count() > 0) {
LibImageDataService::instance()->readThumbnailByPaths(thumbnailSavePath, paths, remake);
} else {
qWarning() << "No paths provided for thumbnail generation";
}
}

//判断是否图片格式
bool ImageEngine::isImage(const QString &path)
{
qDebug() << "Checking if file is image:" << path;
bool bRet = false;
QMimeDatabase db;
QMimeType mt = db.mimeTypeForFile(path, QMimeDatabase::MatchContent);
Expand All @@ -92,25 +106,31 @@ bool ImageEngine::isImage(const QString &path)
mt1.name().startsWith("video/x-mng")) {
bRet = true;
}
qDebug() << "File" << path << "is" << (bRet ? "an image" : "not an image");
return bRet;
}

bool ImageEngine::isRotatable(const QString &path)
{
qDebug() << "Checking if image is rotatable:" << path;
// BUG#93143
//由于底层代码判断是否可旋转的依据是文件名后缀所代表的图片是否可保存
//因此文件是否存在的判断添加在这一层
QFileInfo info(path);
if (!info.isFile() || !info.exists() || !info.isWritable()) {
qWarning() << "File cannot be rotated - not a file, doesn't exist, or not writable:" << path;
return false;
} else {
return LibUnionImage_NameSpace::isImageSupportRotate(path);
bool rotatable = LibUnionImage_NameSpace::isImageSupportRotate(path);
qDebug() << "Image rotation support:" << rotatable;
return rotatable;
}
}

//根据文件路径制作md5
QString ImageEngine::makeMD5(const QString &path)
{
qDebug() << "Generating MD5 for file:" << path;
QFile file(path);
QString stHashValue;
if (file.open(QIODevice::ReadOnly)) { //只读方式打开
Expand All @@ -120,6 +140,9 @@ QString ImageEngine::makeMD5(const QString &path)
buf = buf.append(path.toUtf8());
hash.addData(buf); // 将数据添加到Hash中
stHashValue.append(hash.result().toHex());
qDebug() << "MD5 generated successfully";
} else {
qWarning() << "Failed to open file for MD5 generation:" << path;
}
return stHashValue;
}
29 changes: 27 additions & 2 deletions libimageviewer/imageviewer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,12 +51,13 @@ ImageViewerPrivate::ImageViewerPrivate(imageViewerSpace::ImgViewerType imgViewer
ImageViewer *parent)
: q_ptr(parent)
{
qDebug() << "Initializing image viewer private, viewer type:" << imgViewerType << "save path:" << savePath;
// 初始化检测wayland环境
Libutils::base::initCheckWaylandEnv();

// 在界面前初始化授权配置
if (!qApp) {
qWarning() << qPrintable("Must init authorise config after QApplication initialized!");
qWarning() << "Must init authorise config after QApplication initialized!";
} else {
PermissionConfig::instance()->initFromArguments(qApp->arguments());
}
Expand All @@ -71,6 +72,7 @@ ImageViewerPrivate::ImageViewerPrivate(imageViewerSpace::ImgViewerType imgViewer
QTranslator *translator = new QTranslator(qApp);
if (translator->load(finfo.baseName(), finfo.absolutePath())) {
qApp->installTranslator(translator);
qDebug() << "Installed translator for:" << finfo.baseName();
}
}

Expand All @@ -84,7 +86,7 @@ ImageViewerPrivate::ImageViewerPrivate(imageViewerSpace::ImgViewerType imgViewer

QString translatePath = PLUGINTRANSPATH + translateFilename;
if (QFile::exists(translatePath)) {
qDebug() << "translatePath after feedback:" << translatePath;
qDebug() << "Loading translation file:" << translatePath;
auto translator = new QTranslator(qApp);
translator->load(translatePath);
qApp->installTranslator(translator);
Expand All @@ -104,10 +106,12 @@ ImageViewerPrivate::ImageViewerPrivate(imageViewerSpace::ImgViewerType imgViewer
q->setLayout(layout);
m_panel = new LibViewPanel(customTopToolbar, q);
layout->addWidget(m_panel);
qDebug() << "Image viewer panel initialized";

#ifdef DTKWIDGET_CLASS_DWaterMarkHelper
// 设置看图水印,目前仅在主要展示区域显示
if (PermissionConfig::instance()->hasReadWaterMark()) {
qDebug() << "Setting up watermark for image viewer";
auto data = PermissionConfig::instance()->readWaterMarkData();
DWaterMarkHelper::instance()->setData(data);
DWaterMarkHelper::instance()->registerWidget(m_panel);
Expand All @@ -124,6 +128,7 @@ ImageViewerPrivate::ImageViewerPrivate(imageViewerSpace::ImgViewerType imgViewer
DWaterMarkWidget *mark = m_panel->findChild<DWaterMarkWidget *>();
if (mark) {
mark->setVisible(isTargetImage);
qDebug() << "Watermark visibility changed to:" << isTargetImage;
}
});
}
Expand All @@ -141,11 +146,13 @@ ImageViewer::ImageViewer(imageViewerSpace::ImgViewerType imgViewerType,
: DWidget(parent)
, d_ptr(new ImageViewerPrivate(imgViewerType, savePath, customTopToolbar, this))
{
qDebug() << "Image viewer constructed";
Q_INIT_RESOURCE(icons);
}

ImageViewer::~ImageViewer()
{
qDebug() << "Image viewer being destroyed";
//析构时删除m_panel
Q_D(ImageViewer);
d->m_panel->deleteLater();
Expand All @@ -155,12 +162,15 @@ ImageViewer::~ImageViewer()

bool ImageViewer::startChooseFileDialog()
{
qDebug() << "Starting file choose dialog";
Q_D(ImageViewer);
return d->m_panel->startChooseFileDialog();
}

bool ImageViewer::startdragImage(const QStringList &paths, const QString &firstPath, bool isCustom, const QString &album)
{
qInfo() << "Starting drag image operation with" << paths.size() << "images, first path:" << firstPath
<< "is custom:" << isCustom << "album:" << album;
Q_D(ImageViewer);
d->m_panel->setIsCustomAlbum(isCustom, album);
return d->m_panel->startdragImage(paths, firstPath);
Expand All @@ -169,13 +179,16 @@ bool ImageViewer::startdragImage(const QStringList &paths, const QString &firstP
bool ImageViewer::startdragImageWithUID(
const QStringList &paths, const QString &firstPath, bool isCustom, const QString &album, int UID)
{
qInfo() << "Starting drag image operation with UID:" << UID << "paths:" << paths.size()
<< "first path:" << firstPath << "is custom:" << isCustom << "album:" << album;
Q_D(ImageViewer);
d->m_panel->setIsCustomAlbumWithUID(isCustom, album, UID);
return d->m_panel->startdragImage(paths, firstPath);
}

void ImageViewer::startImgView(const QString &currentPath, const QStringList &paths)
{
qInfo() << "Starting image view with current path:" << currentPath << "total paths:" << paths.size();
Q_D(ImageViewer);

QStringList realPaths = paths;
Expand All @@ -188,6 +201,7 @@ void ImageViewer::startImgView(const QString &currentPath, const QStringList &pa
//启动线程制作缩略图
if (LibCommonService::instance()->getImgViewerType() == imageViewerSpace::ImgViewerTypeLocal ||
LibCommonService::instance()->getImgViewerType() == imageViewerSpace::ImgViewerTypeNull) {
qDebug() << "Generating thumbnails for local image viewer";
//首先生成当前图片的缓存
ImageEngine::instance()->makeImgThumbnail(LibCommonService::instance()->getImgSavePath(), QStringList(realPath), 1);
//看图制作全部缩略图
Expand All @@ -197,12 +211,14 @@ void ImageViewer::startImgView(const QString &currentPath, const QStringList &pa

void ImageViewer::switchFullScreen()
{
qDebug() << "Switching fullscreen mode";
Q_D(ImageViewer);
d->m_panel->toggleFullScreen();
}

void ImageViewer::startSlideShow(const QStringList &paths, const QString &firstPath)
{
qInfo() << "Starting slideshow with" << paths.size() << "images, first path:" << firstPath;
Q_D(ImageViewer);

ViewInfo info;
Expand All @@ -218,6 +234,7 @@ void ImageViewer::startSlideShow(const QStringList &paths, const QString &firstP

void ImageViewer::setTopBarVisible(bool visible)
{
qDebug() << "Setting top bar visibility:" << visible;
Q_D(ImageViewer);
if (d->m_panel) {
d->m_panel->setTopBarVisible(visible);
Expand All @@ -226,6 +243,7 @@ void ImageViewer::setTopBarVisible(bool visible)

void ImageViewer::setBottomtoolbarVisible(bool visible)
{
qDebug() << "Setting bottom toolbar visibility:" << visible;
Q_D(ImageViewer);
if (d->m_panel) {
d->m_panel->setBottomtoolbarVisible(visible);
Expand All @@ -234,6 +252,7 @@ void ImageViewer::setBottomtoolbarVisible(bool visible)

DIconButton *ImageViewer::getBottomtoolbarButton(imageViewerSpace::ButtonType type)
{
qDebug() << "Getting bottom toolbar button of type:" << type;
DIconButton *button = nullptr;
Q_D(ImageViewer);
if (d->m_panel) {
Expand All @@ -248,12 +267,14 @@ QString ImageViewer::getCurrentPath()
QString path;
if (d->m_panel) {
path = d->m_panel->getCurrentPath();
qDebug() << "Getting current path:" << path;
}
return path;
}

void ImageViewer::setViewPanelContextMenuItemVisible(imageViewerSpace::NormalMenuItemId id, bool visible)
{
qDebug() << "Setting context menu item visibility, id:" << id << "visible:" << visible;
Q_D(ImageViewer);
if (d->m_panel) {
d->m_panel->setContextMenuItemVisible(id, visible);
Expand All @@ -262,6 +283,7 @@ void ImageViewer::setViewPanelContextMenuItemVisible(imageViewerSpace::NormalMen

void ImageViewer::setBottomToolBarButtonAlawysNotVisible(imageViewerSpace::ButtonType id, bool notVisible)
{
qDebug() << "Setting bottom toolbar button always not visible, id:" << id << "not visible:" << notVisible;
Q_D(ImageViewer);
if (d->m_panel) {
d->m_panel->setBottomToolBarButtonAlawysNotVisible(id, notVisible);
Expand All @@ -270,6 +292,7 @@ void ImageViewer::setBottomToolBarButtonAlawysNotVisible(imageViewerSpace::Butto

void ImageViewer::setCustomAlbumName(const QMap<QString, bool> map, bool isFav)
{
qDebug() << "Setting custom album names, is favorite:" << isFav;
Q_D(ImageViewer);
if (d->m_panel) {
d->m_panel->updateCustomAlbum(map, isFav);
Expand All @@ -278,6 +301,7 @@ void ImageViewer::setCustomAlbumName(const QMap<QString, bool> map, bool isFav)

void ImageViewer::setCustomAlbumNameAndUID(const QMap<int, std::pair<QString, bool> > &map, bool isFav)
{
qDebug() << "Setting custom album names with UID, is favorite:" << isFav;
Q_D(ImageViewer);
if (d->m_panel) {
d->m_panel->updateCustomAlbumAndUID(map, isFav);
Expand All @@ -286,6 +310,7 @@ void ImageViewer::setCustomAlbumNameAndUID(const QMap<int, std::pair<QString, bo

void ImageViewer::setDropEnabled(bool enable)
{
qDebug() << "Setting drop enabled:" << enable;
Q_D(ImageViewer);
if (d->m_panel) {
d->m_panel->setAcceptDrops(enable);
Expand Down
Loading
Loading