diff --git a/CMakeLists.txt b/CMakeLists.txt
index 23340ae1..a0c54a3b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,560 +1,537 @@
cmake_minimum_required(VERSION 3.2.0)
project(kphotoalbum LANGUAGES CXX VERSION 5.6.1)
if(POLICY CMP0063)
cmake_policy(SET CMP0063 NEW)
endif()
# provide drop-down menu for build-type in cmake-gui:
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS ";Debug;Release;RelWithDebInfo;MinSizeRel")
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules)
find_package(ECM REQUIRED NO_MODULE)
list(APPEND CMAKE_MODULE_PATH ${ECM_MODULE_PATH} )
include(KDEInstallDirs)
include(KDECompilerSettings)
include(KDECMakeSettings)
include(FeatureSummary)
# enable exceptions:
kde_enable_exceptions()
add_definitions(
-DQT_NO_CAST_FROM_ASCII
-DQT_NO_CAST_TO_ASCII
-DQT_NO_URL_CAST_FROM_STRING
-DQT_NO_CAST_FROM_BYTEARRAY
-DQT_DEPRECATED_WARNINGS
-DQT_STRICT_ITERATORS
-DQT_DISABLE_DEPRECATED_BEFORE=0x050900
-DQT_DISABLE_Q_FOREACH
)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_REQUIRED TRUE)
########### dependencies ###############
find_package(Qt5 5.9 REQUIRED COMPONENTS Sql Xml Widgets)
find_package(Phonon4Qt5 REQUIRED)
find_package(KF5 5.44 REQUIRED COMPONENTS Archive Completion Config CoreAddons DocTools I18n IconThemes JobWidgets KIO TextWidgets XmlGui WidgetsAddons)
find_package(JPEG REQUIRED)
if(JPEG_FOUND)
include_directories(${JPEG_INCLUDE_DIR})
endif()
### 2018-12-30 jzarl
# When Exiv2 0.26 can be deprecated, FindExiv2.cmake should be removed
# and only find_package(exiv2) should be used
find_package(exiv2 CONFIG QUIET)
if(exiv2_FOUND)
# search againg with REQUIRED, so that the feature summary correctly shows exiv as required dependency
find_package(exiv2 CONFIG REQUIRED)
set(EXIV2_LIBRARIES exiv2lib)
else()
find_package(Exiv2 REQUIRED)
endif()
-find_package(KF5Kipi 5.1.0)
-set_package_properties(KF5Kipi
- PROPERTIES
- TYPE RECOMMENDED
- PURPOSE "Enables integration of KDE image plugin interface (shared functionality between KPhotoAlbum and other apps like gwenview or digikam)"
- )
-set(HASKIPI ${KF5Kipi_FOUND})
-
find_package(KF5Purpose)
set_package_properties(KF5Purpose
PROPERTIES
TYPE RECOMMENDED
PURPOSE "Enables integration with KDE Purpose plugins, which provide image sharing and similar functionality."
)
find_package(KF5KDcraw)
set_package_properties(KF5KDcraw
PROPERTIES
TYPE OPTIONAL
PURPOSE "Enables RAW image support"
)
set(HAVE_KDCRAW ${KF5KDcraw_FOUND} )
find_package(Marble)
set_package_properties(Marble
PROPERTIES
TYPE OPTIONAL
PURPOSE "Enables support for geographic map location using embedded GPS information."
)
set(HAVE_MARBLE ${Marble_FOUND})
if(Marble_FOUND)
include(MarbleChecks)
endif()
add_custom_target(
UpdateVersion ALL
COMMAND ${CMAKE_COMMAND}
-DBASE_DIR=${CMAKE_CURRENT_SOURCE_DIR} -DPROJECT_NAME=KPA -DPROJECT_VERSION="${PROJECT_VERSION}"
-DCMAKE_BUILD_TYPE="${CMAKE_BUILD_TYPE}" -P "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules/UpdateVersion.cmake"
COMMENT "Updating version header."
BYPRODUCTS "${CMAKE_CURRENT_SOURCE_DIR}/version.h"
)
# For config-kpa-*.h
include_directories(${CMAKE_CURRENT_BINARY_DIR})
set(libdatebar_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/DateBar/documentation.h
${CMAKE_CURRENT_SOURCE_DIR}/DateBar/DateBarWidget.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DateBar/ViewHandler.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DateBar/MouseHandler.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DateBar/MouseHandler.cpp
)
set(libSettings_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/Settings/documentation.h
${CMAKE_CURRENT_SOURCE_DIR}/Settings/SettingsData.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Settings/SettingsDialog.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Settings/ViewerSizeConfig.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Settings/CategoryItem.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Settings/CategoryPage.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Settings/TagGroupsPage.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Settings/GeneralPage.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Settings/FileVersionDetectionPage.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Settings/ThumbnailsPage.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Settings/ViewerPage.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Settings/DatabaseBackendPage.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Settings/UntaggedGroupBox.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Settings/CategoriesGroupsWidget.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Settings/BirthdayPage.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Settings/DateTableWidgetItem.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Settings/Logging.cpp
)
set(libxmldb_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/XMLDB/documentation.h
${CMAKE_CURRENT_SOURCE_DIR}/XMLDB/Database.cpp
${CMAKE_CURRENT_SOURCE_DIR}/XMLDB/XMLCategoryCollection.cpp
${CMAKE_CURRENT_SOURCE_DIR}/XMLDB/XMLCategory.cpp
${CMAKE_CURRENT_SOURCE_DIR}/XMLDB/XMLImageDateCollection.cpp
${CMAKE_CURRENT_SOURCE_DIR}/XMLDB/NumberedBackup.cpp
${CMAKE_CURRENT_SOURCE_DIR}/XMLDB/FileReader.cpp
${CMAKE_CURRENT_SOURCE_DIR}/XMLDB/FileWriter.cpp
${CMAKE_CURRENT_SOURCE_DIR}/XMLDB/ElementWriter.cpp
${CMAKE_CURRENT_SOURCE_DIR}/XMLDB/XmlReader.cpp
${CMAKE_CURRENT_SOURCE_DIR}/XMLDB/CompressFileInfo.cpp
${CMAKE_CURRENT_SOURCE_DIR}/XMLDB/Logging.cpp
)
set(libThumbnailView_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/ThumbnailView/documentation.h
${CMAKE_CURRENT_SOURCE_DIR}/ThumbnailView/FilterWidget.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ThumbnailView/ThumbnailRequest.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ThumbnailView/ThumbnailToolTip.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ThumbnailView/ThumbnailWidget.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ThumbnailView/GridResizeInteraction.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ThumbnailView/GridResizeSlider.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ThumbnailView/SelectionInteraction.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ThumbnailView/MouseTrackingInteraction.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ThumbnailView/CellGeometry.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ThumbnailView/ThumbnailModel.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ThumbnailView/ThumbnailFacade.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ThumbnailView/ThumbnailComponent.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ThumbnailView/KeyboardEventHandler.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ThumbnailView/ThumbnailDND.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ThumbnailView/Delegate.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ThumbnailView/SelectionMaintainer.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ThumbnailView/VideoThumbnailCycler.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ThumbnailView/Logging.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ThumbnailView/MouseInteraction.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ThumbnailView/ThumbnailFactory.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ThumbnailView/enums.cpp
)
set(libPlugins_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/Plugins/documentation.h
${CMAKE_CURRENT_SOURCE_DIR}/Plugins/Logging.cpp
)
-if(KF5Kipi_FOUND)
- set(libPlugins_SRCS ${libPlugins_SRCS}
- ${CMAKE_CURRENT_SOURCE_DIR}/Plugins/Interface.cpp
- ${CMAKE_CURRENT_SOURCE_DIR}/Plugins/ImageCollection.cpp
- ${CMAKE_CURRENT_SOURCE_DIR}/Plugins/ImageInfo.cpp
- ${CMAKE_CURRENT_SOURCE_DIR}/Plugins/CategoryImageCollection.cpp
- ${CMAKE_CURRENT_SOURCE_DIR}/Plugins/ImageCollectionSelector.cpp
- ${CMAKE_CURRENT_SOURCE_DIR}/Settings/PluginsPage.cpp
- ${CMAKE_CURRENT_SOURCE_DIR}/Plugins/UploadWidget.cpp
- ${CMAKE_CURRENT_SOURCE_DIR}/Plugins/UploadImageCollection.cpp
- )
-endif()
if(KF5Purpose_FOUND)
set(libPlugins_SRCS ${libPlugins_SRCS}
${CMAKE_CURRENT_SOURCE_DIR}/Plugins/PurposeMenu.cpp
)
endif()
set(libViewer_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/Viewer/documentation.h
${CMAKE_CURRENT_SOURCE_DIR}/Viewer/ViewerWidget.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Viewer/ImageDisplay.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Viewer/ViewHandler.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Viewer/SpeedDisplay.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Viewer/InfoBox.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Viewer/CategoryImageConfig.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Viewer/AbstractDisplay.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Viewer/VideoDisplay.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Viewer/TextDisplay.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Viewer/InfoBoxResizer.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Viewer/VisibleOptionsMenu.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Viewer/VideoShooter.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Viewer/TaggedArea.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Viewer/Logging.cpp
)
set(libCategoryListView_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/CategoryListView/documentation.h
${CMAKE_CURRENT_SOURCE_DIR}/CategoryListView/DragableTreeWidget.cpp
${CMAKE_CURRENT_SOURCE_DIR}/CategoryListView/CheckDropItem.cpp
${CMAKE_CURRENT_SOURCE_DIR}/CategoryListView/DragItemInfo.cpp
${CMAKE_CURRENT_SOURCE_DIR}/CategoryListView/Logging.cpp
)
set(libHTMLGenerator_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/HTMLGenerator/documentation.h
${CMAKE_CURRENT_SOURCE_DIR}/HTMLGenerator/HTMLDialog.cpp
${CMAKE_CURRENT_SOURCE_DIR}/HTMLGenerator/Generator.cpp
${CMAKE_CURRENT_SOURCE_DIR}/HTMLGenerator/Setup.cpp
${CMAKE_CURRENT_SOURCE_DIR}/HTMLGenerator/ImageSizeCheckBox.h
${CMAKE_CURRENT_SOURCE_DIR}/HTMLGenerator/Logging.cpp
${CMAKE_CURRENT_SOURCE_DIR}/HTMLGenerator/ImageSizeCheckBox.cpp
)
set(libUtilities_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/Utilities/documentation.h
${CMAKE_CURRENT_SOURCE_DIR}/Utilities/AlgorithmHelper.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Utilities/ShowBusyCursor.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Utilities/List.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Utilities/UniqFilenameMapper.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Utilities/FileUtil.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Utilities/BooleanGuard.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Utilities/Process.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Utilities/DeleteFiles.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Utilities/ToolTip.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Utilities/Logging.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Utilities/JpeglibWithFix.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Utilities/StringSet.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Utilities/FastJpeg.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Utilities/DemoUtil.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Utilities/DescriptionUtil.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Utilities/FileNameUtil.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Utilities/VideoUtil.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Utilities/ImageUtil.cpp
)
set(libMainWindow_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/MainWindow/documentation.h
${CMAKE_CURRENT_SOURCE_DIR}/MainWindow/DeleteDialog.cpp
${CMAKE_CURRENT_SOURCE_DIR}/MainWindow/RunDialog.cpp
${CMAKE_CURRENT_SOURCE_DIR}/MainWindow/FeatureDialog.cpp
${CMAKE_CURRENT_SOURCE_DIR}/MainWindow/InvalidDateFinder.cpp
${CMAKE_CURRENT_SOURCE_DIR}/MainWindow/AutoStackImages.cpp
${CMAKE_CURRENT_SOURCE_DIR}/MainWindow/TokenEditor.cpp
${CMAKE_CURRENT_SOURCE_DIR}/MainWindow/WelcomeDialog.cpp
${CMAKE_CURRENT_SOURCE_DIR}/MainWindow/Window.cpp
${CMAKE_CURRENT_SOURCE_DIR}/MainWindow/SplashScreen.cpp
${CMAKE_CURRENT_SOURCE_DIR}/MainWindow/ExternalPopup.cpp
${CMAKE_CURRENT_SOURCE_DIR}/MainWindow/CategoryImagePopup.cpp
${CMAKE_CURRENT_SOURCE_DIR}/MainWindow/SearchBar.cpp
${CMAKE_CURRENT_SOURCE_DIR}/MainWindow/ImageCounter.cpp
${CMAKE_CURRENT_SOURCE_DIR}/MainWindow/DirtyIndicator.cpp
${CMAKE_CURRENT_SOURCE_DIR}/MainWindow/StatisticsDialog.cpp
${CMAKE_CURRENT_SOURCE_DIR}/MainWindow/BreadcrumbViewer.cpp
${CMAKE_CURRENT_SOURCE_DIR}/MainWindow/StatusBar.cpp
${CMAKE_CURRENT_SOURCE_DIR}/MainWindow/UpdateVideoThumbnail.cpp
${CMAKE_CURRENT_SOURCE_DIR}/MainWindow/DuplicateMerger/DuplicateMerger.cpp
${CMAKE_CURRENT_SOURCE_DIR}/MainWindow/DuplicateMerger/DuplicateMatch.cpp
${CMAKE_CURRENT_SOURCE_DIR}/MainWindow/DuplicateMerger/MergeToolTip.cpp
${CMAKE_CURRENT_SOURCE_DIR}/MainWindow/CopyPopup.cpp
${CMAKE_CURRENT_SOURCE_DIR}/MainWindow/Options.cpp
${CMAKE_CURRENT_SOURCE_DIR}/MainWindow/Logging.cpp
)
set(libImageManager_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/ImageManager/documentation.h
${CMAKE_CURRENT_SOURCE_DIR}/ImageManager/ImageLoaderThread.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ImageManager/AsyncLoader.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ImageManager/ImageRequest.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ImageManager/ImageClientInterface.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ImageManager/ImageDecoder.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ImageManager/RawImageDecoder.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ImageManager/RequestQueue.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ImageManager/ThumbnailCache.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ImageManager/ImageEvent.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ImageManager/ThumbnailBuilder.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ImageManager/PreloadRequest.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ImageManager/CancelEvent.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ImageManager/VideoImageRescaleRequest.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ImageManager/VideoThumbnails.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ImageManager/VideoLengthExtractor.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ImageManager/ExtractOneVideoFrame.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ImageManager/Logging.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ImageManager/CacheFileInfo.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ImageManager/enums.cpp
)
set(libDB_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/DB/documentation.h
${CMAKE_CURRENT_SOURCE_DIR}/DB/ImageInfo.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DB/Category.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DB/CategoryCollection.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DB/ExactCategoryMatcher.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DB/ImageDate.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DB/MD5Map.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DB/MemberMap.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DB/ImageInfoList.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DB/ImageDB.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DB/FileInfo.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DB/NegationCategoryMatcher.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DB/NewImageFinder.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DB/ImageScout.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DB/NoTagCategoryMatcher.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DB/GroupCounter.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DB/CategoryMatcher.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DB/ImageSearchInfo.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DB/CategoryItem.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DB/ContainerCategoryMatcher.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DB/ValueCategoryMatcher.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DB/OrCategoryMatcher.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DB/AndCategoryMatcher.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DB/FastDir.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DB/OptimizedFileList.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DB/FileName.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DB/FileNameList.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DB/Logging.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DB/CategoryPtr.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DB/ExifMode.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DB/ImageDateCollection.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DB/ImageInfoPtr.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DB/MD5.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DB/MediaCount.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DB/RawId.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DB/SimpleCategoryMatcher.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DB/UIDelegate.cpp
)
set(libImportExport_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/ImportExport/documentation.h
${CMAKE_CURRENT_SOURCE_DIR}/ImportExport/Export.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ImportExport/Import.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ImportExport/ImportMatcher.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ImportExport/XMLHandler.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ImportExport/MiniViewer.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ImportExport/ImportHandler.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ImportExport/ImageRow.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ImportExport/ImportDialog.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ImportExport/ImportSettings.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ImportExport/KimFileReader.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ImportExport/MD5CheckPage.cpp
${CMAKE_CURRENT_SOURCE_DIR}/ImportExport/Logging.cpp
)
set(libAnnotationDialog_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/AnnotationDialog/documentation.h
${CMAKE_CURRENT_SOURCE_DIR}/AnnotationDialog/Dialog.cpp
${CMAKE_CURRENT_SOURCE_DIR}/AnnotationDialog/ListSelect.cpp
${CMAKE_CURRENT_SOURCE_DIR}/AnnotationDialog/ImagePreview.cpp
${CMAKE_CURRENT_SOURCE_DIR}/AnnotationDialog/ImagePreviewWidget.cpp
${CMAKE_CURRENT_SOURCE_DIR}/AnnotationDialog/DateEdit.cpp
${CMAKE_CURRENT_SOURCE_DIR}/AnnotationDialog/CompletableLineEdit.cpp
${CMAKE_CURRENT_SOURCE_DIR}/AnnotationDialog/ListViewItemHider.cpp
${CMAKE_CURRENT_SOURCE_DIR}/AnnotationDialog/ShowSelectionOnlyManager.cpp
${CMAKE_CURRENT_SOURCE_DIR}/AnnotationDialog/ShortCutManager.cpp
${CMAKE_CURRENT_SOURCE_DIR}/AnnotationDialog/ResizableFrame.cpp
${CMAKE_CURRENT_SOURCE_DIR}/AnnotationDialog/DescriptionEdit.cpp
${CMAKE_CURRENT_SOURCE_DIR}/AnnotationDialog/AreaTagSelectDialog.cpp
${CMAKE_CURRENT_SOURCE_DIR}/AnnotationDialog/Logging.cpp
${CMAKE_CURRENT_SOURCE_DIR}/AnnotationDialog/enums.cpp
)
set(libBrowser_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/Browser/documentation.h
${CMAKE_CURRENT_SOURCE_DIR}/Browser/BrowserWidget.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Browser/BrowserPage.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Browser/OverviewPage.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Browser/CategoryPage.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Browser/ImageViewPage.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Browser/TreeFilter.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Browser/Breadcrumb.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Browser/BreadcrumbList.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Browser/AbstractCategoryModel.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Browser/FlatCategoryModel.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Browser/TreeCategoryModel.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Browser/CenteringIconView.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Browser/Logging.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Browser/enums.cpp
)
set(libExif_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/Exif/documentation.h
${CMAKE_CURRENT_SOURCE_DIR}/Exif/Database.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Exif/InfoDialog.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Exif/SearchDialog.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Exif/SearchInfo.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Exif/TreeView.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Exif/Info.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Exif/RangeWidget.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Exif/DatabaseElement.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Exif/ReReadDialog.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Exif/Grid.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Exif/Logging.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Exif/SearchDialogSettings.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Settings/ExifPage.cpp
)
set(libBackgroundTaskManager_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/BackgroundTaskManager/JobInterface.cpp
${CMAKE_CURRENT_SOURCE_DIR}/BackgroundTaskManager/JobManager.cpp
${CMAKE_CURRENT_SOURCE_DIR}/BackgroundTaskManager/StatusIndicator.cpp
${CMAKE_CURRENT_SOURCE_DIR}/BackgroundTaskManager/JobViewer.cpp
${CMAKE_CURRENT_SOURCE_DIR}/BackgroundTaskManager/JobModel.cpp
${CMAKE_CURRENT_SOURCE_DIR}/BackgroundTaskManager/JobInfo.cpp
${CMAKE_CURRENT_SOURCE_DIR}/BackgroundTaskManager/CompletedJobInfo.cpp
${CMAKE_CURRENT_SOURCE_DIR}/BackgroundTaskManager/Priority.cpp
${CMAKE_CURRENT_SOURCE_DIR}/BackgroundTaskManager/PriorityQueue.cpp
${CMAKE_CURRENT_SOURCE_DIR}/BackgroundTaskManager/Logging.cpp
)
set(libBackgroundJobs_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/BackgroundJobs/SearchForVideosWithoutLengthInfo.cpp
${CMAKE_CURRENT_SOURCE_DIR}/BackgroundJobs/ReadVideoLengthJob.cpp
${CMAKE_CURRENT_SOURCE_DIR}/BackgroundJobs/SearchForVideosWithoutVideoThumbnailsJob.cpp
${CMAKE_CURRENT_SOURCE_DIR}/BackgroundJobs/HandleVideoThumbnailRequestJob.cpp
${CMAKE_CURRENT_SOURCE_DIR}/BackgroundJobs/ExtractOneThumbnailJob.cpp
)
option(KPA_ENABLE_REMOTECONTROL "Build with support for companion Android/QML app." OFF)
set(libRemoteControl_SRCS)
set(libRemoteControl_LIBS)
if(KPA_ENABLE_REMOTECONTROL)
find_package(Qt5 5.9 REQUIRED COMPONENTS Network)
# requires cmake 3.12
add_compile_definitions(KPA_ENABLE_REMOTECONTROL)
set(libRemoteControl_LIBS Qt5::Network)
set(libRemoteControl_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/RemoteControl/RemoteCommand.cpp
${CMAKE_CURRENT_SOURCE_DIR}/RemoteControl/RemoteConnection.cpp
${CMAKE_CURRENT_SOURCE_DIR}/RemoteControl/Server.cpp
${CMAKE_CURRENT_SOURCE_DIR}/RemoteControl/RemoteInterface.cpp
${CMAKE_CURRENT_SOURCE_DIR}/RemoteControl/SearchInfo.cpp
${CMAKE_CURRENT_SOURCE_DIR}/RemoteControl/RemoteImageRequest.cpp
${CMAKE_CURRENT_SOURCE_DIR}/RemoteControl/ImageNameStore.cpp
${CMAKE_CURRENT_SOURCE_DIR}/RemoteControl/ConnectionIndicator.cpp
${CMAKE_CURRENT_SOURCE_DIR}/RemoteControl/Logging.cpp
)
endif()
set(libMap_SRCS)
if(Marble_FOUND)
set(libMap_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/Browser/GeoPositionPage.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Map/GeoCluster.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Map/MapView.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Map/Logging.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Map/GeoCoordinates.cpp
)
endif()
add_subdirectory(images)
add_subdirectory(icons)
add_subdirectory(demo)
add_subdirectory(themes)
add_subdirectory(scripts)
add_subdirectory(doc)
########### next target ###############
set(kphotoalbum_SRCS
main.cpp
${libdatebar_SRCS}
${libSettings_SRCS}
${libsurvey_SRCS}
${libxmldb_SRCS}
${libThumbnailView_SRCS}
${libPlugins_SRCS}
${libViewer_SRCS}
${libCategoryListView_SRCS}
${libHTMLGenerator_SRCS}
${libMainWindow_SRCS}
${libImageManager_SRCS}
${libDB_SRCS}
${libImportExport_SRCS}
${libAnnotationDialog_SRCS}
${libExif_SRCS}
${libBrowser_SRCS}
${libBackgroundTaskManager_SRCS}
${libBackgroundJobs_SRCS}
${libRemoteControl_SRCS}
${libMap_SRCS}
${libUtilities_SRCS}
)
add_executable(kphotoalbum ${kphotoalbum_SRCS})
add_dependencies(kphotoalbum UpdateVersion)
# External components
target_link_libraries(kphotoalbum
${JPEG_LIBRARY}
${EXIV2_LIBRARIES}
KF5::Archive
KF5::Completion
KF5::ConfigCore
KF5::ConfigGui
KF5::CoreAddons
KF5::I18n
KF5::IconThemes
KF5::JobWidgets
KF5::KIOCore
KF5::KIOWidgets
KF5::TextWidgets
KF5::XmlGui
KF5::WidgetsAddons
Phonon::phonon4qt5
${libRemoteControl_LIBS}
Qt5::Sql
)
-if(KF5Kipi_FOUND)
- target_link_libraries(kphotoalbum KF5::Kipi)
-endif()
if(KF5Purpose_FOUND)
target_link_libraries(kphotoalbum KF5::Purpose KF5::PurposeWidgets)
endif()
if(KF5KDcraw_FOUND)
target_link_libraries(kphotoalbum KF5::KDcraw)
endif()
if(Marble_FOUND)
target_link_libraries(kphotoalbum Marble)
endif()
install(TARGETS kphotoalbum ${KDE_INSTALL_TARGETS_DEFAULT_ARGS})
########### install files ###############
install(PROGRAMS org.kde.kphotoalbum.desktop org.kde.kphotoalbum-import.desktop DESTINATION ${KDE_INSTALL_APPDIR})
install(FILES kphotoalbumrc DESTINATION ${KDE_INSTALL_CONFDIR})
install(FILES tips default-setup DESTINATION ${KDE_INSTALL_DATADIR}/kphotoalbum)
install(FILES kphotoalbumui.rc DESTINATION ${KDE_INSTALL_KXMLGUI5DIR}/kphotoalbum)
install(FILES org.kde.kphotoalbum.appdata.xml DESTINATION ${KDE_INSTALL_METAINFODIR})
configure_file(config-kpa-kdcraw.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-kpa-kdcraw.h)
configure_file(config-kpa-plugins.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-kpa-plugins.h)
configure_file(config-kpa-marble.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-kpa-marble.h)
feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES)
# vi:expandtab:tabstop=4 shiftwidth=4:
diff --git a/MainWindow/Window.cpp b/MainWindow/Window.cpp
index eb56306c..4025fd21 100644
--- a/MainWindow/Window.cpp
+++ b/MainWindow/Window.cpp
@@ -1,1933 +1,1827 @@
/* Copyright (C) 2003-2020 The KPhotoAlbum Development Team
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; see the file COPYING. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#include "Window.h"
#include
#include
#ifdef HAVE_STDLIB_H
#include
#endif
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include // for #if KIO_VERSION...
#include
-#ifdef HASKIPI
-#include
-#include
-#endif
-
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
-#ifdef HASKIPI
-#include
-#endif
#ifdef KF5Purpose_FOUND
#include
#endif
#include "AutoStackImages.h"
#include "BreadcrumbViewer.h"
#include "CopyPopup.h"
#include "DeleteDialog.h"
#include "DirtyIndicator.h"
#include "DuplicateMerger/DuplicateMerger.h"
#include "ExternalPopup.h"
#include "FeatureDialog.h"
#include "ImageCounter.h"
#include "InvalidDateFinder.h"
#include "Logging.h"
#include "Options.h"
#include "SearchBar.h"
#include "SplashScreen.h"
#include "StatisticsDialog.h"
#include "StatusBar.h"
#include "TokenEditor.h"
#include "UpdateVideoThumbnail.h"
#include "WelcomeDialog.h"
#ifdef HAVE_MARBLE
#include
"),
i18n("Feature has not been configured"));
}
}
void MainWindow::Window::setupStatusBar()
{
m_statusBar = new MainWindow::StatusBar;
setStatusBar(m_statusBar);
setLocked(Settings::SettingsData::instance()->locked(), true, false);
connect(m_statusBar, &StatusBar::thumbnailSettingsRequested, [this]() { this->slotOptions(); m_settingsDialog->activatePage(Settings::SettingsPage::ThumbnailsPage); });
}
void MainWindow::Window::slotRecreateExifDB()
{
Exif::Database::instance()->recreate();
}
void MainWindow::Window::useNextVideoThumbnail()
{
UpdateVideoThumbnail::useNext(selected());
}
void MainWindow::Window::usePreviousVideoThumbnail()
{
UpdateVideoThumbnail::usePrevious(selected());
}
void MainWindow::Window::mergeDuplicates()
{
DuplicateMerger *merger = new DuplicateMerger;
merger->show();
}
void MainWindow::Window::slotThumbnailSizeChanged()
{
QString thumbnailSizeMsg = i18nc("@info:status",
//xgettext:no-c-format
"Thumbnail width: %1px (storage size: %2px)",
Settings::SettingsData::instance()->actualThumbnailSize(),
Settings::SettingsData::instance()->thumbnailSize());
m_statusBar->showMessage(thumbnailSizeMsg, 4000);
}
void MainWindow::Window::createSearchBar()
{
// Set up the search tool bar
SearchBar *searchBar = new SearchBar(this);
searchBar->setLineEditEnabled(false);
searchBar->setObjectName(QString::fromUtf8("searchBar"));
connect(searchBar, &SearchBar::textChanged, m_browser, &Browser::BrowserWidget::slotLimitToMatch);
connect(searchBar, &SearchBar::returnPressed, m_browser, &Browser::BrowserWidget::slotInvokeSeleted);
connect(searchBar, &SearchBar::keyPressed, m_browser, &Browser::BrowserWidget::scrollKeyPressed);
connect(m_browser, &Browser::BrowserWidget::viewChanged, searchBar, &SearchBar::reset);
connect(m_browser, &Browser::BrowserWidget::isSearchable, searchBar, &SearchBar::setLineEditEnabled);
m_filterWidget = m_thumbnailView->createFilterWidget(this);
addToolBar(m_filterWidget);
m_filterWidget->setObjectName(QString::fromUtf8("filterBar"));
connect(m_browser, &Browser::BrowserWidget::viewChanged, ThumbnailView::ThumbnailFacade::instance(), &ThumbnailView::ThumbnailFacade::clearFilter);
connect(m_browser, &Browser::BrowserWidget::isFilterable, m_filterWidget, &ThumbnailView::FilterWidget::setEnabled);
}
void MainWindow::Window::executeStartupActions()
{
new ImageManager::ThumbnailBuilder(m_statusBar, this);
if (!Settings::SettingsData::instance()->incrementalThumbnails())
ImageManager::ThumbnailBuilder::instance()->buildMissing();
connect(Settings::SettingsData::instance(), &Settings::SettingsData::thumbnailSizeChanged,
this, &Window::slotBuildThumbnailsIfWanted);
if (!FeatureDialog::hasVideoThumbnailer()) {
BackgroundTaskManager::JobManager::instance()->addJob(
new BackgroundJobs::SearchForVideosWithoutLengthInfo);
BackgroundTaskManager::JobManager::instance()->addJob(
new BackgroundJobs::SearchForVideosWithoutVideoThumbnailsJob);
}
}
void MainWindow::Window::checkIfVideoThumbnailerIsInstalled()
{
if (Options::the()->demoMode())
return;
if (!FeatureDialog::hasVideoThumbnailer()) {
KMessageBox::information(this,
i18n("Unable to find ffmpeg on the system.
"
"Without it, KPhotoAlbum will not be able to display video thumbnails and video lengths. "
"Please install the ffmpeg package
"),
i18n("Video thumbnails are not available"), QString::fromLatin1("VideoThumbnailerNotInstalled"));
}
}
bool MainWindow::Window::anyVideosSelected() const
{
const auto selectedFiles = selected();
for (const DB::FileName &fileName : selectedFiles) {
if (Utilities::isVideo(fileName))
return true;
}
return false;
}
void MainWindow::Window::setHistogramVisibilty(bool visible) const
{
if (visible) {
m_dateBar->show();
m_dateBarLine->show();
} else {
m_dateBar->hide();
m_dateBarLine->hide();
}
}
void MainWindow::Window::slotImageRotated(const DB::FileName &fileName)
{
// An image has been rotated by the annotation dialog or the viewer.
// We have to reload the respective thumbnail to get it in the right angle
ImageManager::ThumbnailCache::instance()->removeThumbnail(fileName);
}
bool MainWindow::Window::dbIsDirty() const
{
return m_statusBar->mp_dirtyIndicator->isSaveDirty();
}
#ifdef HAVE_MARBLE
void MainWindow::Window::showPositionBrowser()
{
auto positionBrowser = positionBrowserWidget();
m_stack->setCurrentWidget(positionBrowser);
updateStates(false);
}
Map::MapView *MainWindow::Window::positionBrowserWidget()
{
if (!m_positionBrowser) {
m_positionBrowser = new Map::MapView(m_stack, Map::UsageType::InlineMapView);
m_stack->addWidget(m_positionBrowser);
}
return m_positionBrowser;
}
#endif
UserFeedback MainWindow::Window::askWarningContinueCancel(const QString &msg, const QString &title, const QString &dialogId)
{
auto answer = KMessageBox::warningContinueCancel(this, msg, title, KStandardGuiItem::cont(), KStandardGuiItem::cancel(), dialogId);
return (answer == KMessageBox::Continue) ? UserFeedback::Confirm : UserFeedback::Deny;
}
UserFeedback MainWindow::Window::askQuestionYesNo(const QString &msg, const QString &title, const QString &dialogId)
{
auto answer = KMessageBox::questionYesNo(this, msg, title, KStandardGuiItem::yes(), KStandardGuiItem::no(), dialogId);
return (answer == KMessageBox::Yes) ? UserFeedback::Confirm : UserFeedback::Deny;
}
void MainWindow::Window::showInformation(const QString &msg, const QString &title, const QString &dialogId)
{
KMessageBox::information(this, msg, title, dialogId);
}
void MainWindow::Window::showSorry(const QString &msg, const QString &title, const QString &)
{
KMessageBox::sorry(this, msg, title);
}
void MainWindow::Window::showError(const QString &msg, const QString &title, const QString &)
{
KMessageBox::error(this, msg, title);
}
bool MainWindow::Window::isDialogDisabled(const QString &dialogId)
{
// Note(jzarl): there are different methods for different kinds of dialogs.
// However, all these methods share exactly the same code in KMessageBox.
// If that ever changes, we can still update our implementation - until then I won't just copy a stupid API...
return !KMessageBox::shouldBeShownContinue(dialogId);
}
// vi:expandtab:tabstop=4 shiftwidth=4:
diff --git a/MainWindow/Window.h b/MainWindow/Window.h
index 5c46f349..f8f861e2 100644
--- a/MainWindow/Window.h
+++ b/MainWindow/Window.h
@@ -1,312 +1,299 @@
/* Copyright (C) 2003-2020 The KPhotoAlbum Development Team
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; see the file COPYING. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#ifndef MAINWINDOW_WINDOW_H
#define MAINWINDOW_WINDOW_H
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
-#include
+#include
class QAction;
class QCloseEvent;
class QContextMenuEvent;
class QFrame;
class QLabel;
class QMoveEvent;
class QResizeEvent;
class QStackedWidget;
class QTimer;
class KActionMenu;
class KTipDialog;
class KToggleAction;
-#ifdef HASKIPI
-namespace KIPI
-{
-class PluginLoader;
-}
-#endif
#ifdef HAVE_MARBLE
namespace Map
{
class MapView;
}
#endif
namespace AnnotationDialog
{
class Dialog;
}
namespace Browser
{
class BrowserWidget;
class BreadcrumbList;
}
namespace DateBar
{
class DateBarWidget;
}
namespace DB
{
class ImageInfoList;
}
namespace HTMLGenerator
{
class HTMLDialog;
}
namespace Plugins
{
class Interface;
}
namespace Settings
{
class SettingsDialog;
}
namespace ThumbnailView
{
class ThumbnailFacade;
class FilterWidget;
}
class BreadcrumbViewer;
namespace MainWindow
{
class DeleteDialog;
class StatusBar;
class TokenEditor;
class Window : public KXmlGuiWindow, public DB::UIDelegate
{
Q_OBJECT
public:
explicit Window(QWidget *parent);
~Window() override;
static void configureImages(const DB::ImageInfoList &list, bool oneAtATime);
static Window *theMainWindow();
DB::FileNameList selected(ThumbnailView::SelectionMode mode = ThumbnailView::ExpandCollapsedStacks) const;
DB::ImageSearchInfo currentContext();
QString currentBrowseCategory() const;
void setStackHead(const DB::FileName &image);
void setHistogramVisibilty(bool visible) const;
bool dbIsDirty() const;
#ifdef HAVE_MARBLE
void showPositionBrowser();
Map::MapView *positionBrowserWidget();
#endif
// implement UI delegate interface
// Note(jzarl): we just could create a UIDelegate class that takes a QWidget,
// implementing the same messageParent approach that we took before.
// For now, I don't see anything wrong with directly implementing the interface instead.
// I may change my mind later and I'm ready to convinced of the errors of my way, though...
DB::UserFeedback askWarningContinueCancel(const QString &msg, const QString &title, const QString &dialogId) override;
DB::UserFeedback askQuestionYesNo(const QString &msg, const QString &title, const QString &dialogId) override;
void showInformation(const QString &msg, const QString &title, const QString &dialogId) override;
void showSorry(const QString &msg, const QString &title, const QString &) override;
void showError(const QString &msg, const QString &title, const QString &) override;
bool isDialogDisabled(const QString &dialogId) override;
public slots:
void showThumbNails(const DB::FileNameList &items);
- void loadKipiPlugins();
void reloadThumbnails(ThumbnailView::SelectionUpdateMethod method = ThumbnailView::MaintainSelection);
void runDemo();
void slotImageRotated(const DB::FileName &fileName);
void slotSave();
protected slots:
void showThumbNails();
bool slotExit();
void slotOptions();
void slotConfigureAllImages();
void slotConfigureImagesOneAtATime();
void slotCreateImageStack();
void slotUnStackImages();
void slotSetStackHead();
void slotCopySelectedURLs();
void slotPasteInformation();
void slotDeleteSelected();
void slotReReadExifInfo();
void slotAutoStackImages();
void slotSearch();
// FIXME(jzarl): improve this function signature:
void slotView(bool reuse, bool slideShow = false, bool random = false);
void slotView();
void slotViewNewWindow();
void slotSortByDateAndTime();
void slotSortAllByDateAndTime();
void slotLimitToSelected();
void slotExportToHTML();
void slotAutoSave();
void showBrowser();
void slotOptionGroupChanged();
void showTipOfDay();
void lockToDefaultScope();
void setDefaultScopePositive();
void setDefaultScopeNegative();
void unlockFromDefaultScope();
void configureShortcuts();
void slotSetFileName(const DB::FileName &);
void updateContextMenuFromSelectionSize(int selectionSize);
void slotUpdateViewMenu(DB::Category::ViewType);
void slotShowNotOnDisk();
void slotBuildThumbnails();
void slotBuildThumbnailsIfWanted();
void slotRunSlideShow();
void slotRunRandomizedSlideShow();
void slotImport();
void slotExport();
void delayedInit();
void slotReenableMessages();
void slotImagesChanged(const QList &);
- void slotSelectionChanged(int count);
- void plug();
void slotRemoveTokens();
void slotShowListOfFiles();
void updateDateBar(const Browser::BreadcrumbList &);
void updateDateBar();
void slotShowImagesWithInvalidDate();
void slotShowImagesWithChangedMD5Sum();
void showDateBarTip(const QString &);
void slotJumpToContext();
void setDateRange(const DB::ImageDate &);
void clearDateRange();
void startAutoSaveTimer();
void slotRecalcCheckSums();
void slotShowExifInfo();
void showFeatures();
void showImage(const DB::FileName &fileName);
void slotOrderIncr();
void slotOrderDecr();
void slotRotateSelectedLeft();
void slotRotateSelectedRight();
void rotateSelected(int angle);
void showVideos();
void slotStatistics();
void slotRecreateExifDB();
void useNextVideoThumbnail();
void usePreviousVideoThumbnail();
void mergeDuplicates();
void slotThumbnailSizeChanged();
void slotMarkUntagged();
protected:
void configureImages(bool oneAtATime);
QString welcome();
bool event(QEvent *event) override;
void closeEvent(QCloseEvent *e) override;
void resizeEvent(QResizeEvent *) override;
void moveEvent(QMoveEvent *) override;
void setupMenuBar();
void createAnnotationDialog();
bool load();
void contextMenuEvent(QContextMenuEvent *e) override;
void setLocked(bool b, bool force, bool recount = true);
void configImages(const DB::ImageInfoList &list, bool oneAtATime);
void updateStates(bool thumbNailView);
DB::FileNameList selectedOnDisk();
void setupPluginMenu();
void launchViewer(const DB::FileNameList &mediaList, bool reuse, bool slideShow, bool random);
void setupStatusBar();
void setPluginMenuState(const char *name, const QList &actions);
void createSearchBar();
void executeStartupActions();
void checkIfVideoThumbnailerIsInstalled();
bool anyVideosSelected() const;
private:
static Window *s_instance;
ThumbnailView::ThumbnailFacade *m_thumbnailView;
Settings::SettingsDialog *m_settingsDialog;
QPointer m_annotationDialog;
QStackedWidget *m_stack;
QTimer *m_autoSaveTimer;
Browser::BrowserWidget *m_browser;
DeleteDialog *m_deleteDialog;
QAction *m_lock;
QAction *m_unlock;
QAction *m_setDefaultPos;
QAction *m_setDefaultNeg;
QAction *m_jumpToContext;
HTMLGenerator::HTMLDialog *m_htmlDialog;
QAction *m_configOneAtATime;
QAction *m_configAllSimultaniously;
QAction *m_createImageStack;
QAction *m_unStackImages;
QAction *m_setStackHead;
QAction *m_view;
QAction *m_rotLeft;
QAction *m_rotRight;
QAction *m_sortByDateAndTime;
QAction *m_sortAllByDateAndTime;
QAction *m_AutoStackImages;
QAction *m_viewInNewWindow;
KActionMenu *m_viewMenu;
KToggleAction *m_smallListView;
KToggleAction *m_largeListView;
KToggleAction *m_largeIconView;
KActionMenu *m_colorSchemeMenu;
QAction *m_generateHtml;
QAction *m_copy;
QAction *m_paste;
QAction *m_deleteSelected;
QAction *m_limitToMarked;
QAction *m_selectAll;
QAction *m_clearSelection;
QAction *m_runSlideShow;
QAction *m_runRandomSlideShow;
Plugins::Interface *m_pluginInterface;
QAction *m_showExifDialog;
-#ifdef HASKIPI
- KIPI::PluginLoader *m_pluginLoader;
-#endif
QAction *m_recreateThumbnails;
QAction *m_useNextVideoThumbnail;
QAction *m_usePreviousVideoThumbnail;
QAction *m_markUntagged;
TokenEditor *m_tokenEditor;
DateBar::DateBarWidget *m_dateBar;
QFrame *m_dateBarLine;
- bool m_hasLoadedKipiPlugins;
QMap> m_viewerInputMacros;
MainWindow::StatusBar *m_statusBar;
QString m_lastTarget;
#ifdef HAVE_MARBLE
Map::MapView *m_positionBrowser;
#endif
ThumbnailView::FilterWidget *m_filterWidget;
};
}
#endif /* MAINWINDOW_WINDOW_H */
// vi:expandtab:tabstop=4 shiftwidth=4:
diff --git a/Plugins/CategoryImageCollection.cpp b/Plugins/CategoryImageCollection.cpp
deleted file mode 100644
index 4f172fa2..00000000
--- a/Plugins/CategoryImageCollection.cpp
+++ /dev/null
@@ -1,48 +0,0 @@
-/* Copyright (C) 2003-2010 Jesper K. Pedersen
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; see the file COPYING. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-
-#include "CategoryImageCollection.h"
-
-#include
-
-#include
-Plugins::CategoryImageCollection::CategoryImageCollection(const DB::ImageSearchInfo &context, const QString &category,
- const QString &value)
- : Plugins::ImageCollection(CategoryImageCollection::SubClass)
- , m_context(context)
- , m_category(category)
- , m_value(value)
-{
-}
-
-QString Plugins::CategoryImageCollection::name()
-{
- if (m_value == QString::fromLatin1("**NONE**"))
- return i18nc("The 'name' of an unnamed image collection.", "None");
- else
- return m_value;
-}
-
-QList Plugins::CategoryImageCollection::images()
-{
- DB::ImageSearchInfo context(m_context);
- context.addAnd(m_category, m_value);
- QStringList list = DB::ImageDB::instance()->search(context, true).toStringList(DB::AbsolutePath);
- return stringListToUrlList(list);
-}
-// vi:expandtab:tabstop=4 shiftwidth=4:
diff --git a/Plugins/CategoryImageCollection.h b/Plugins/CategoryImageCollection.h
deleted file mode 100644
index 9d5fb995..00000000
--- a/Plugins/CategoryImageCollection.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/* Copyright (C) 2003-2010 Jesper K. Pedersen
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; see the file COPYING. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-
-#ifndef CATEGORYIMAGECOLLECTION_H
-#define CATEGORYIMAGECOLLECTION_H
-
-#include "ImageCollection.h"
-
-#include
-
-#include
-namespace Plugins
-{
-
-class CategoryImageCollection : public Plugins::ImageCollection
-{
-
-public:
- CategoryImageCollection(const DB::ImageSearchInfo &context, const QString &category, const QString &value);
-
- QString name() override;
- QList images() override;
-
-private:
- DB::ImageSearchInfo m_context;
- const QString m_category;
- const QString m_value;
-};
-}
-
-#endif /* CATEGORYIMAGECOLLECTION_H */
-
-// vi:expandtab:tabstop=4 shiftwidth=4:
diff --git a/Plugins/ImageCollection.cpp b/Plugins/ImageCollection.cpp
deleted file mode 100644
index 5998dac3..00000000
--- a/Plugins/ImageCollection.cpp
+++ /dev/null
@@ -1,154 +0,0 @@
-/* Copyright (C) 2003-2010 Jesper K. Pedersen
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; see the file COPYING. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-
-#include "ImageCollection.h"
-
-#include "Logging.h"
-
-#include
-#include
-#include
-#include
-#include
-
-#include
-#include
-
-Plugins::ImageCollection::ImageCollection(Type tp)
- : m_type(tp)
-{
-}
-
-QString Plugins::ImageCollection::name()
-{
- QString res;
- switch (m_type) {
- case CurrentAlbum:
- res = MainWindow::Window::theMainWindow()->currentContext().toString();
- break;
- case CurrentSelection:
- res = MainWindow::Window::theMainWindow()->currentContext().toString();
- if (res.isEmpty()) {
- res = i18nc("As in 'an unknown set of images, created from the selection'.", "Unknown (Selection)");
- } else {
- res += i18nc("As in 'A selection of [a generated context description]'", " (Selection)");
- }
- break;
- case SubClass:
- qCWarning(PluginsLog, "Subclass of ImageCollection should overwrite ImageCollection::name()");
- res = i18nc("A set of images with no description.", "Unknown");
- break;
- }
- if (res.isEmpty()) {
- // at least html export plugin needs a non-empty name:
- res = i18nc("The 'name' of an unnamed image collection.", "None");
- }
- return res;
-}
-
-QList Plugins::ImageCollection::images()
-{
- switch (m_type) {
- case CurrentAlbum:
- return stringListToUrlList(DB::ImageDB::instance()->currentScope(false).toStringList(DB::AbsolutePath));
-
- case CurrentSelection:
- return stringListToUrlList(MainWindow::Window::theMainWindow()->selected(ThumbnailView::NoExpandCollapsedStacks).toStringList(DB::AbsolutePath));
-
- case SubClass:
- qFatal("The subclass should implement images()");
- return QList();
- }
- return QList();
-}
-
-QList Plugins::ImageCollection::imageListToUrlList(const DB::ImageInfoList &imageList)
-{
- QList urlList;
- for (DB::ImageInfoListConstIterator it = imageList.constBegin(); it != imageList.constEnd(); ++it) {
- QUrl url;
- url.setPath((*it)->fileName().absolute());
- urlList.append(url);
- }
- return urlList;
-}
-
-QList Plugins::ImageCollection::stringListToUrlList(const QStringList &list)
-{
- QList urlList;
- for (QStringList::ConstIterator it = list.begin(); it != list.end(); ++it) {
- QUrl url;
- url.setPath(*it);
- urlList.append(url);
- }
- return urlList;
-}
-
-QUrl Plugins::ImageCollection::url()
-{
- return commonRoot();
-}
-
-QUrl Plugins::ImageCollection::commonRoot()
-{
- QString imgRoot = Settings::SettingsData::instance()->imageDirectory();
- const QList imgs = images();
- if (imgs.count() == 0)
- return QUrl::fromLocalFile(imgRoot);
-
- QStringList res = QFileInfo(imgs[0].path()).absolutePath().split(QLatin1String("/"));
-
- for (QList::ConstIterator it = imgs.begin(); it != imgs.end(); ++it) {
- QStringList newRes;
-
- QStringList path = QFileInfo((*it).path()).absolutePath().split(QLatin1String("/"));
- int i = 0;
- for (; i < qMin(path.size(), res.size()); ++i) {
- if (path[i] == res[i])
- newRes.append(res[i]);
- else
- break;
- }
- res = newRes;
- }
-
- QString result = res.join(QString::fromLatin1("/"));
- if (result.left(imgRoot.length()) != imgRoot) {
- result = imgRoot;
- }
-
- return QUrl::fromLocalFile(result);
-}
-
-QUrl Plugins::ImageCollection::uploadUrl()
-{
- return commonRoot();
-}
-
-QUrl Plugins::ImageCollection::uploadRootUrl()
-{
- QUrl url = QUrl::fromLocalFile(Settings::SettingsData::instance()->imageDirectory());
- return url;
-}
-
-QString Plugins::ImageCollection::uploadRootName()
-{
- return i18nc("'Name' of the image directory", "Image/Video root directory");
-}
-
-// vi:expandtab:tabstop=4 shiftwidth=4:
diff --git a/Plugins/ImageCollection.h b/Plugins/ImageCollection.h
deleted file mode 100644
index e140d39f..00000000
--- a/Plugins/ImageCollection.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/* Copyright (C) 2003-2010 Jesper K. Pedersen
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; see the file COPYING. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-
-#ifndef MYIMAGECOLLECTION_H
-#define MYIMAGECOLLECTION_H
-
-#include
-
-#include
-#include
-
-namespace Plugins
-{
-
-class ImageCollection : public KIPI::ImageCollectionShared
-{
-public:
- enum Type { CurrentAlbum,
- CurrentSelection,
- SubClass };
-
- explicit ImageCollection(Type tp);
-
- QString name() override;
- QList images() override;
-
- // FIXME: url() should not called unless isDirectory() is true
- // therefore, we should also to implement isDirectory
- QUrl url() override;
- QUrl uploadUrl() override;
- QUrl uploadRootUrl() override;
- QString uploadRootName() override;
- // isDirectory
-
-protected:
- QList imageListToUrlList(const DB::ImageInfoList &list);
- QList stringListToUrlList(const QStringList &list);
- QUrl commonRoot();
-
-private:
- Type m_type;
-};
-
-}
-
-#endif /* MYIMAGECOLLECTION_H */
-
-// vi:expandtab:tabstop=4 shiftwidth=4:
diff --git a/Plugins/ImageCollectionSelector.cpp b/Plugins/ImageCollectionSelector.cpp
deleted file mode 100644
index 011a9e07..00000000
--- a/Plugins/ImageCollectionSelector.cpp
+++ /dev/null
@@ -1,55 +0,0 @@
-/* Copyright (C) 2003-2010 Jesper K. Pedersen
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; see the file COPYING. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-#include "ImageCollectionSelector.h"
-
-Plugins::ImageCollectionSelector::ImageCollectionSelector(QWidget *parent, Interface *interface)
- : KIPI::ImageCollectionSelector(parent)
-{
- m_interface = interface;
- m_firstTimeVisible = true;
-}
-
-QList Plugins::ImageCollectionSelector::selectedImageCollections() const
-{
- if (m_interface) {
- KIPI::ImageCollection collection = m_interface->currentSelection();
- if (!collection.isValid()) {
- collection = m_interface->currentAlbum();
- }
- if (collection.isValid()) {
- QList res;
- res.append(collection);
- return res;
- }
- // probably never happens:
- return m_interface->allAlbums();
- }
- return QList();
-}
-
-void Plugins::ImageCollectionSelector::showEvent(QShowEvent *event)
-{
- KIPI::ImageCollectionSelector::showEvent(event);
- if (m_firstTimeVisible) {
- // fake one selection change to make HTML Export Plugin believe there really is a selection:
- emit selectionChanged();
- m_firstTimeVisible = false;
- }
-}
-
-// vi:expandtab:tabstop=4 shiftwidth=4:
diff --git a/Plugins/ImageCollectionSelector.h b/Plugins/ImageCollectionSelector.h
deleted file mode 100644
index d843959c..00000000
--- a/Plugins/ImageCollectionSelector.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Copyright (C) 2003-2010 Jesper K. Pedersen
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; see the file COPYING. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-#ifndef MYIMAGECOLLECTIONSELECTOR_H
-#define MYIMAGECOLLECTIONSELECTOR_H
-
-#include "ImageCollection.h"
-#include "Interface.h"
-
-#include
-
-namespace Plugins
-{
-/** This class should provide a widget for selecting one ore more image collection for plugins that want the user to
- * select images.
- *
- * Since selecting images is all kphotoalbum is about ;-), this implementation just passes the images that are (or
- * would be) currently visible in thumbnail view - if some of them are selected, only selected ones, otherwise all.
- *
- * The widget shown is currently empty.
- *
- * Possible improvements:
- * * show some description of the currently selected images instead of just nothing
- * * give the user the possibility to group the selected images into image collections by some category: this would be
- * useful as i.e. html export plugin uses the names of image collections as headlines and groups the images visually by
- * image collection.
- */
-class ImageCollectionSelector : public KIPI::ImageCollectionSelector
-{
-public:
- ImageCollectionSelector(QWidget *parent, Interface *interface);
- QList selectedImageCollections() const override;
-
-protected:
- // just fake a selectionChanged event when first shown to make export plugin happy:
- void showEvent(QShowEvent *event) override;
-
-private:
- Interface *m_interface;
- bool m_firstTimeVisible;
-};
-
-}
-
-#endif /* MYIMAGECOLLECTIONSELECTOR_H */
-// vi:expandtab:tabstop=4 shiftwidth=4:
diff --git a/Plugins/ImageInfo.cpp b/Plugins/ImageInfo.cpp
deleted file mode 100644
index ba32adfa..00000000
--- a/Plugins/ImageInfo.cpp
+++ /dev/null
@@ -1,369 +0,0 @@
-/* Copyright (C) 2003-2020 Jesper K. Pedersen
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; see the file COPYING. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-
-#include "ImageInfo.h"
-
-#include "Logging.h"
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include