Skip to content

Commit

Permalink
chore: [Merge] Merge the latest code of the image viewer into the album
Browse files Browse the repository at this point in the history
   Merge the latest code of the image viewer into the album

Log: Merge the latest code of the image viewer into the album
  • Loading branch information
starhcq committed Aug 29, 2024
1 parent 79e9082 commit a4206dc
Show file tree
Hide file tree
Showing 154 changed files with 31,749 additions and 21,847 deletions.
1 change: 1 addition & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ set_target_properties(${BIN_NAME} PROPERTIES INSTALL_RPATH ${DTK_QML_APP_PLUGIN_
set(PREFIX ${CMAKE_INSTALL_PREFIX})
set(AppIconDir ${PREFIX}/share/icons/hicolor/scalable/apps)
set(APPSHAREDIR ${CMAKE_INSTALL_PREFIX}/share/${CMAKE_PROJECT_NAME})
install(FILES com.deepin.album.service DESTINATION ${CMAKE_INSTALL_PREFIX}/share/dbus-1/services/)

# Add install rule
install(TARGETS ${BIN_NAME} DESTINATION ${APP_BIN_INSTALL_DIR})
Expand Down
3 changes: 3 additions & 0 deletions src/com.deepin.album.service
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[D-BUS Service]
Name=com.deepin.album
Exec=/usr/bin/deepin-album
52 changes: 31 additions & 21 deletions src/deepin-album.qrc
Original file line number Diff line number Diff line change
Expand Up @@ -12,32 +12,44 @@
<file>qml/ThumbnailImageView/RecentlyDeletedView/RecentlyDeletedView.qml</file>
<file>qml/ThumbnailImageView/ThumbnailImage.qml</file>
<file>qml/ThumbnailImageView/NoPictureView.qml</file>
<file>qml/PreviewImageViewer/AlertToolTip.qml</file>
<file>qml/PreviewImageViewer/FloatingNotice.qml</file>
<file>qml/PreviewImageViewer/FullThumbnail.qml</file>
<file>qml/PreviewImageViewer/ImageViewer.qml</file>
<file>qml/PreviewImageViewer/InfomationDialog.qml</file>
<file>qml/PreviewImageViewer/ListViewDelegate.qml</file>
<file>qml/PreviewImageViewer/MainStack.qml</file>
<file>qml/PreviewImageViewer/NavigationWidget.qml</file>
<file>qml/PreviewImageViewer/OpenImageWidget.qml</file>
<file>qml/PreviewImageViewer/PropertyActionItemDelegate.qml</file>
<file>qml/PreviewImageViewer/PropertyItem.qml</file>
<file>qml/PreviewImageViewer/PropertyItemDelegate.qml</file>
<file>qml/PreviewImageViewer/ImageViewer.qml</file>
<file>qml/PreviewImageViewer/ThumbnailListView.qml</file>
<file>qml/PreviewImageViewer/FullImageView.qml</file>
<file>qml/PreviewImageViewer/ReName.qml</file>
<file>qml/PreviewImageViewer/RightMenuItem.qml</file>
<file>qml/PreviewImageViewer/SFadeInOut.qml</file>
<file>qml/PreviewImageViewer/NavigationWidget.qml</file>
<file>qml/PreviewImageViewer/SliderShow.qml</file>
<file>qml/PreviewImageViewer/ThumbnailButton.qml</file>
<file>qml/PreviewImageViewer/ToolBarThumbnailListView.qml</file>
<file>qml/PreviewImageViewer/SFadeInOut.qml</file>
<file>qml/PreviewImageViewer/ViewRightMenu.qml</file>
<file>qml/PreviewImageViewer/ViewTopTitle.qml</file>
<file>qml/PreviewImageViewer/InformationDialog/InformationDialog.qml</file>
<file>qml/PreviewImageViewer/InformationDialog/PropertyActionItemDelegate.qml</file>
<file>qml/PreviewImageViewer/InformationDialog/PropertyItem.qml</file>
<file>qml/PreviewImageViewer/InformationDialog/PropertyItemDelegate.qml</file>
<file>qml/PreviewImageViewer/ImageDelegate/BaseImageDelegate.qml</file>
<file>qml/PreviewImageViewer/ImageDelegate/NormalImageDelegate.qml</file>
<file>qml/PreviewImageViewer/ImageDelegate/SvgImageDelegate.qml</file>
<file>qml/PreviewImageViewer/ImageDelegate/DynamicImageDelegate.qml</file>
<file>qml/PreviewImageViewer/ImageDelegate/NonexistImageDelegate.qml</file>
<file>qml/PreviewImageViewer/ImageDelegate/NoPermissionImageDelegate.qml</file>
<file>qml/PreviewImageViewer/ImageDelegate/DamagedImageDelegate.qml</file>
<file>qml/PreviewImageViewer/ImageDelegate/MultiImageDelegate.qml</file>
<file>qml/PreviewImageViewer/ThumbnailDelegate/BaseThumbnailDelegate.qml</file>
<file>qml/PreviewImageViewer/ThumbnailDelegate/NormalThumbnailDelegate.qml</file>
<file>qml/PreviewImageViewer/ThumbnailDelegate/MultiThumnailDelegate.qml</file>
<file>qml/PreviewImageViewer/ThumbnailDelegate/ThumbnailImage.qml</file>
<file>qml/PreviewImageViewer/Utils/FloatingNotice.qml</file>
<file>qml/PreviewImageViewer/Utils/ImageInputHandler.qml</file>
<file>qml/PreviewImageViewer/Utils/RightMenuItem.qml</file>
<file>qml/PreviewImageViewer/Dialog/RemoveDialog.qml</file>
<file>qml/PreviewImageViewer/ImageAnimation.qml</file>
<file>qml/PreviewImageViewer/ImageDelegate/ViewDelegateLoader.qml</file>
<file>qml/PreviewImageViewer/InformationDialog/ElideLabel.qml</file>
<file>qml/PreviewImageViewer/WindowButtonGroupEx.qml</file>
<file>qml/Control/NewAlbumDialog.qml</file>
<file>qml/Control/RubberBand.qml</file>
<file>qml/Control/ListView/ThumbnailListView.qml</file>
<file>qml/Control/ListView/ThumbnailListDelegate.qml</file>
<file>qml/ThumbnailImageView/HaveImportedView/ImportedlListView.qml</file>
<file>qml/Control/ListView/RightMenuItem.qml</file>
<file>qml/StatusBar.qml</file>
<file>qml/Control/FilterComboBox.qml</file>
<file>qml/Control/ListView/VideoLabel.qml</file>
Expand All @@ -49,7 +61,6 @@
<file>qml/ThumbnailImageView/CollecttionView/AllCollection.qml</file>
<file>qml/Control/VideoInfoDialog.qml</file>
<file>qml/ThumbnailImageView/DeviceAlbum/DeviceAlbum.qml</file>
<file>qml/PreviewImageViewer/WindowButtonGroupEx.qml</file>
<file>qml/Control/DeleteDialog.qml</file>
<file>qml/Control/RemoveAlbumDialog.qml</file>
<file>qml/Control/DeviceLoadDialog.qml</file>
Expand All @@ -58,10 +69,9 @@
<file>qml/SideBar/SideBarItem.qml</file>
<file>qml/SideBar/SideBarItemDelegate.qml</file>
<file>qml/MenuItemStates.qml</file>
<file>qml/PreviewImageViewer/MultiImageListView.qml</file>
<file>qml/PopProgress/StandardProgressDialog.qml</file>
<file>qml/Control/ListView/ThumbnailListView2.qml</file>
<file>qml/Control/ListView/ThumbnailListDelegate2.qml</file>
<file>qml/Control/ListView/ThumbnailListViewAlbum.qml</file>
<file>qml/Control/ListView/ThumbnailListDelegate.qml</file>
<file>qml/Control/ListView/ThumbnailListViewTools.js</file>
<file>qml/Control/BaseView.qml</file>
<file>qml/Control/BorderImageEx.qml</file>
Expand Down
Binary file modified src/dsg/icons/import_photo.dci
Binary file not shown.
193 changes: 121 additions & 72 deletions src/main.cpp
Original file line number Diff line number Diff line change
@@ -1,74 +1,76 @@
// Copyright (C) 2020 ~ 2020 Deepin Technology Co., Ltd.
// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd.
// SPDX-FileCopyrightText: 2020 ~ 2024 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: GPL-3.0-or-later

#include "src/filecontrol.h"
#include "src/thumbnailload.h"
#include "src/cursortool.h"
#include "src/albumControl.h"
#include "src/dbus/applicationadpator.h"
#include "src/declarative/mousetrackitem.h"
#include "src/declarative/pathviewrangehandler.h"
#include "src/globalcontrol.h"
#include "src/globalstatus.h"
#include "src/types.h"
#include "src/imagedata/imageinfo.h"
#include "src/imagedata/imagesourcemodel.h"
#include "src/imagedata/imageprovider.h"
#include "src/utils/filetrashhelper.h"
#include "config.h"

#include "src/albumControl.h"
#include "src/imageengine/imagedataservice.h"
#include "thumbnailview/itemviewadapter.h"
#include "thumbnailview/positioner.h"
#include "thumbnailview/rubberband.h"
#include "thumbnailview/mouseeventlistener.h"
#include "thumbnailview/eventgenerator.h"

#include "thumbnailview/roles.h"
#include "thumbnailview/imagedatamodel.h"
#include "thumbnailview/thumbnailmodel.h"
#include "types.h"
#include "thumbnailview/qimageitem.h"

#include "globalstatus.h"

#include <dapplicationhelper.h>
#include <DApplication>

#include "config.h"

#include <DLog>

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QScopedPointer>
#include <QQmlContext>
#include <QIcon>

DWIDGET_USE_NAMESPACE
DCORE_USE_NAMESPACE

// 此文件是QML应用的启动文件,一般无需修改
// 请在LauncherPlugin::main()中实现所需功能
int main(int argc, char *argv[])
{
// TODO: 无 XDG_CURRENT_DESKTOP 变量时,将不会加载 deepin platformtheme 插件,会导致
// 查找图标的接口无法调用 qt5integration 提供的插件,后续应当把图标查找相关的功能移到 dtkgui
//qputenv("QML_DISABLE_DISK_CACHE", "1");
qputenv("D_POPUP_MODE", "embed");
if (qEnvironmentVariableIsEmpty("XDG_CURRENT_DESKTOP")) {
qputenv("XDG_CURRENT_DESKTOP", "Deepin");
}

//qputenv("QML_DISABLE_DISK_CACHE", "1");
qputenv("D_POPUP_MODE", "embed");
// 注意:请不要管理 QGuiApplication 对象的生命周期!
DApplication *app = new DApplication(argc, argv);
app->loadTranslator();
app->setApplicationLicense("GPLV3");
app->setApplicationVersion(DApplication::buildVersion(VERSION));
app->setAttribute(Qt::AA_UseHighDpiPixmaps);
app->setOrganizationName("deepin");
app->setApplicationName("deepin-album");
app->setApplicationDisplayName(QObject::tr("Album"));
app->setProductIcon(QIcon::fromTheme("deepin-album"));
//app->setApplicationDescription(QObject::tr("Main", "Album is a fashion manager for viewing and organizing photos and videos."));
app->setWindowIcon(QIcon::fromTheme("deepin-album"));
DApplication app(argc, argv);
app.loadTranslator();
app.setApplicationLicense("GPLV3");
app.setApplicationVersion(DApplication::buildVersion(VERSION));
app.setAttribute(Qt::AA_UseHighDpiPixmaps);
// TODO: ? 设置后在 DTK6 下菜单显示空白
app.setOrganizationName("deepin");
app.setApplicationName("deepin-album");
app.setApplicationDisplayName(QObject::tr("Album"));
app.setProductIcon(QIcon::fromTheme("deepin-album"));
app.setApplicationDescription(
QObject::tr("Main", "Album is a fashion manager for viewing and organizing photos and videos."));
app.setWindowIcon(QIcon::fromTheme("deepin-album"));

DLogManager::registerConsoleAppender();
DLogManager::registerFileAppender();

QQmlApplicationEngine engine;

if (!DGuiApplicationHelper::instance()->setSingleInstance(app->applicationName(), DGuiApplicationHelper::UserScope)) {
if (!DGuiApplicationHelper::instance()->setSingleInstance(app.applicationName(), DGuiApplicationHelper::UserScope)) {
exit(0);
}

Expand All @@ -77,76 +79,123 @@ int main(int argc, char *argv[])

// 请在此处注册需要导入到QML中的C++类型
// 例如: engine.rootContext()->setContextProperty("Utils", new Utils);
//后端缩略图加载
LoadImage *load = new LoadImage();
engine.rootContext()->setContextProperty("CodeImage", load);
engine.addImageProvider(QLatin1String("ThumbnailImage"), load->m_pThumbnail);
engine.addImageProvider(QLatin1String("viewImage"), load->m_viewLoad);
// 后端多页图加载
engine.addImageProvider(QLatin1String("multiimage"), load->m_multiLoad);
// @uri org.deepin.album
const QString uri("org.deepin.image.viewer");
qmlRegisterType<ImageInfo>(uri.toUtf8().data(), 1, 0, "ImageInfo");
qmlRegisterUncreatableType<ImageSourceModel>(uri.toUtf8().data(), 1, 0, "ImageSourceModel", "Use for global data");
qmlRegisterUncreatableType<PathViewProxyModel>(uri.toUtf8().data(), 1, 0, "PathViewProxyModel", "Use for view data");
qmlRegisterType<MouseTrackItem>(uri.toUtf8().data(), 1, 0, "MouseTrackItem");
qmlRegisterType<PathViewRangeHandler>(uri.toUtf8().data(), 1, 0, "PathViewRangeHandler");
// 文件回收站处理
qmlRegisterType<FileTrashHelper>(uri.toUtf8().data(), 1, 0, "FileTrashHelper");

// QML全局单例
GlobalControl control;
engine.rootContext()->setContextProperty("GControl", &control);
GlobalStatus status;
engine.rootContext()->setContextProperty("GStatus", &status);
FileControl fileControl;
engine.rootContext()->setContextProperty("FileControl", &fileControl);
status.setFileControl(&fileControl);
// 光标位置查询工具
CursorTool cursorTool;
engine.rootContext()->setContextProperty("CursorTool", &cursorTool);

engine.addImageProvider(QLatin1String("publisher"), load->m_publisher);
engine.addImageProvider(QLatin1String("collectionPublisher"), load->m_collectionPublisher);
engine.addImageProvider(QLatin1String("asynImageProvider"), load->m_asynImageProvider);
// 解析命令行参数
QString cliParam = /*fileControl.parseCommandlineGetPath()*/"";

engine.rootContext()->setContextProperty("asynImageProvider", load->m_asynImageProvider);
engine.rootContext()->setContextProperty("publisher", load->m_publisher);
// 看图后端缩略图加载,由 QMLEngine 管理生命周期
// 部分平台支持线程数较低时,使用同步加载
ProviderCache *providerCache = nullptr;
if (!GlobalControl::enableMultiThread()) {
ImageProvider *imageProvider = new ImageProvider;
engine.addImageProvider(QLatin1String("ImageLoad"), imageProvider);

engine.rootContext()->setContextProperty("imageDataService", ImageDataService::instance());
providerCache = static_cast<ProviderCache *>(imageProvider);
} else {
AsyncImageProvider *asyncImageProvider = new AsyncImageProvider;
engine.addImageProvider(QLatin1String("ImageLoad"), asyncImageProvider);

QImageItem::initDamage();
providerCache = static_cast<ProviderCache *>(asyncImageProvider);

GlobalStatus status;
engine.rootContext()->setContextProperty("GStatus", &status);
if (!cliParam.isEmpty()) {
asyncImageProvider->preloadImage(cliParam);
}
}

ThumbnailProvider *multiImageLoad = new ThumbnailProvider;
engine.addImageProvider(QLatin1String("ThumbnailLoad"), multiImageLoad);

FileControl *fileControl = new FileControl();
engine.rootContext()->setContextProperty("fileControl", fileControl);
// 关联文件处理(需要保证优先处理,onImageFileChanged已做多线程安全)
QObject::connect(fileControl, &FileControl::requestImageFileChanged,
load, [&](const QString & filePath, bool isMultiImage, bool isExist) {
// 更新缓存信息
load->onImageFileChanged(filePath, isMultiImage, isExist);
// 处理完成后加载图片
emit fileControl->imageFileChanged(filePath, isMultiImage, isExist);
// 关联各组件
// 图片旋转时更新图像缓存
QObject::connect(&control, &GlobalControl::requestRotateCacheImage, [&]() {
providerCache->rotateImageCached(control.currentRotation(), control.currentSource().toLocalFile());
});

status.setFileControl(fileControl);
status.setEnableNavigation(fileControl.isEnableNavigation());
QObject::connect(
&status, &GlobalStatus::enableNavigationChanged, [&]() { fileControl.setEnableNavigation(status.enableNavigation()); });
QObject::connect(&fileControl, &FileControl::imageRenamed, &control, &GlobalControl::renameImage);
// 文件变更时清理缓存
QObject::connect(&fileControl, &FileControl::imageFileChanged, [&](const QString &fileName) {
providerCache->removeImageCache(fileName);
});

// 光标位置查询工具
CursorTool *cursorTool = new CursorTool();
engine.rootContext()->setContextProperty("cursorTool", cursorTool);
// 判断命令行数据,在 QML 前优先加载
if (!cliParam.isEmpty()) {
QStringList filePaths = fileControl.getDirImagePath(cliParam);
if (!filePaths.isEmpty()) {
control.setImageFiles(filePaths, cliParam);
fileControl.resetImageFiles(filePaths);

status.setStackPage(Types::ImageViewPage);
}
}

QImageItem::initDamage();
//设置为相册模式
fileControl->setViewerType(imageViewerSpace::ImgViewerTypeAlbum);
fileControl.setViewerType(imageViewerSpace::ImgViewerTypeAlbum);

//禁止多开
if (!fileControl->isCheckOnly()) {
if (!fileControl.isCheckOnly()) {
return 0;
}

//新增相册控制模块
engine.rootContext()->setContextProperty("albumControl", AlbumControl::instance());

char uri[] = "org.deepin.album";
//相册后端缩略图加载
LoadImage *load = new LoadImage();
engine.addImageProvider(QLatin1String("collectionPublisher"), load->m_collectionPublisher);
engine.addImageProvider(QLatin1String("asynImageProviderAlbum"), load->m_asynImageProvider);
engine.rootContext()->setContextProperty("asynImageProviderAlbum", load->m_asynImageProvider);
engine.rootContext()->setContextProperty("imageDataService", ImageDataService::instance());

char uriAlbum[] = "org.deepin.album";
#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0)
qmlRegisterType<QAbstractItemModel>();
#else
qmlRegisterAnonymousType<QAbstractItemModel>(uri, 0);
qmlRegisterAnonymousType<QAbstractItemModel>(uriAlbum, 0);
#endif
qmlRegisterType<ImageDataModel>(uri, 1, 0, "ImageDataModel");
qmlRegisterType<ThumbnailModel>(uri, 1, 0, "ThumbnailModel");
qmlRegisterType<ItemViewAdapter>(uri, 1, 0, "ItemViewAdapter");
qmlRegisterType<Positioner>(uri, 1, 0, "Positioner");
qmlRegisterType<RubberBand>(uri, 1, 0, "RubberBand");
qmlRegisterType<MouseEventListener>(uri, 1, 0, "MouseEventListener");
qmlRegisterType<EventGenerator>(uri, 1, 0, "EventGenerator");
qmlRegisterUncreatableType<Types>(uri, 1, 0, "Types", "Cannot instantiate the Types class");
qmlRegisterUncreatableType<Roles>(uri, 1, 0, "Roles", "Cannot instantiate the Roles class");
qmlRegisterType<QImageItem>(uri, 1, 0, "QImageItem");
qmlRegisterType<ImageDataModel>(uriAlbum, 1, 0, "ImageDataModel");
qmlRegisterType<ThumbnailModel>(uriAlbum, 1, 0, "ThumbnailModel");
qmlRegisterType<ItemViewAdapter>(uriAlbum, 1, 0, "ItemViewAdapter");
qmlRegisterType<Positioner>(uriAlbum, 1, 0, "Positioner");
qmlRegisterType<RubberBand>(uriAlbum, 1, 0, "RubberBand");
qmlRegisterType<MouseEventListener>(uriAlbum, 1, 0, "MouseEventListener");
qmlRegisterType<EventGenerator>(uriAlbum, 1, 0, "EventGenerator");
qmlRegisterUncreatableType<Types>(uriAlbum, 1, 0, "Types", "Cannot instantiate the Types class");
qmlRegisterUncreatableType<Roles>(uriAlbum, 1, 0, "Roles", "Cannot instantiate the Roles class");
qmlRegisterType<QImageItem>(uriAlbum, 1, 0, "QImageItem");

engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;

return app->exec();
// 设置DBus接口
ApplicationAdaptor adaptor(&fileControl);
QDBusConnection::sessionBus().registerService("com.deepin.album");
QDBusConnection::sessionBus().registerObject("/", &fileControl);

return app.exec();
}
Loading

0 comments on commit a4206dc

Please sign in to comment.