File indexing completed on 2024-05-05 08:28:30
0001 // SPDX-FileCopyrightText: 2003 Stephan Binner <binner@kde.org> 0002 // SPDX-FileCopyrightText: 2003-2014 Jesper K. Pedersen <jesper.pedersen@kdab.com> 0003 // SPDX-FileCopyrightText: 2005-2007 Dirk Mueller <mueller@kde.org> 0004 // SPDX-FileCopyrightText: 2006-2010 Tuomas Suutari <tuomas@nepnep.net> 0005 // SPDX-FileCopyrightText: 2007 Laurent Montel <montel@kde.org> 0006 // SPDX-FileCopyrightText: 2007-2009 Jan Kundrát <jkt@flaska.net> 0007 // SPDX-FileCopyrightText: 2008 Henner Zeller <h.zeller@acm.org> 0008 // SPDX-FileCopyrightText: 2010 Wes Hardaker <kpa@capturedonearth.com> 0009 // SPDX-FileCopyrightText: 2010-2012 Miika Turkia <miika.turkia@gmail.com> 0010 // SPDX-FileCopyrightText: 2011 Andreas Neustifter <andreas.neustifter@gmail.com> 0011 // SPDX-FileCopyrightText: 2012-2023 Johannes Zarl-Zierl <johannes@zarl-zierl.at> 0012 // SPDX-FileCopyrightText: 2013 Dominik Broj <broj.dominik@gmail.com> 0013 // SPDX-FileCopyrightText: 2014-2017 Robert Krawitz <rlk@alum.mit.edu> 0014 // SPDX-FileCopyrightText: 2015-2022 Tobias Leupold <tl@stonemx.de> 0015 // 0016 // SPDX-License-Identifier: GPL-2.0-or-later 0017 0018 #ifndef MAINWINDOW_WINDOW_H 0019 #define MAINWINDOW_WINDOW_H 0020 #include <DB/Category.h> 0021 #include <DB/search/ImageSearchInfo.h> 0022 #include <MainWindow/CopyLinkEngine.h> 0023 #include <ThumbnailView/enums.h> 0024 #include <kpabase/FileNameList.h> 0025 #include <kpabase/UIDelegate.h> 0026 #include <kpabase/config-kpa-marble.h> 0027 #include <kpabase/config-kpa-plugins.h> 0028 0029 #include <KXmlGuiWindow> 0030 #include <QList> 0031 #include <QPointer> 0032 #include <QUrl> 0033 0034 class QAction; 0035 class QCloseEvent; 0036 class QContextMenuEvent; 0037 class QFrame; 0038 class QLabel; 0039 class QMoveEvent; 0040 class QResizeEvent; 0041 class QStackedWidget; 0042 class QTimer; 0043 0044 class KActionMenu; 0045 class KTipDialog; 0046 class KToggleAction; 0047 0048 #ifdef HAVE_MARBLE 0049 namespace Map 0050 { 0051 class MapView; 0052 } 0053 #endif 0054 0055 namespace AnnotationDialog 0056 { 0057 class Dialog; 0058 } 0059 namespace Browser 0060 { 0061 class BrowserWidget; 0062 class BreadcrumbList; 0063 } 0064 namespace DateBar 0065 { 0066 class DateBarWidget; 0067 } 0068 namespace DB 0069 { 0070 class ImageInfoList; 0071 } 0072 namespace HTMLGenerator 0073 { 0074 class HTMLDialog; 0075 } 0076 namespace ImageManager 0077 { 0078 class ThumbnailCache; 0079 } 0080 namespace Settings 0081 { 0082 class SettingsDialog; 0083 } 0084 namespace ThumbnailView 0085 { 0086 class ThumbnailFacade; 0087 class FilterWidget; 0088 } 0089 0090 class BreadcrumbViewer; 0091 0092 namespace MainWindow 0093 { 0094 0095 class SearchBar; 0096 class DeleteDialog; 0097 class StatusBar; 0098 class TokenEditor; 0099 class CopyLinkEngine; 0100 0101 class Window : public KXmlGuiWindow, public DB::UIDelegate 0102 { 0103 Q_OBJECT 0104 0105 public: 0106 explicit Window(QWidget *parent); 0107 ~Window() override; 0108 static void configureImages(const DB::ImageInfoList &list, bool oneAtATime); 0109 static Window *theMainWindow(); 0110 0111 ImageManager::ThumbnailCache *thumbnailCache() const; 0112 0113 DB::FileNameList selected(ThumbnailView::SelectionMode mode = ThumbnailView::ExpandCollapsedStacks) const; 0114 DB::ImageSearchInfo currentContext(); 0115 QString currentBrowseCategory() const; 0116 void setStackHead(const DB::FileName &image); 0117 void setHistogramVisibilty(bool visible) const; 0118 bool dbIsDirty() const; 0119 #ifdef HAVE_MARBLE 0120 void showPositionBrowser(); 0121 Map::MapView *positionBrowserWidget(); 0122 #endif 0123 0124 // implement UI delegate interface 0125 // Note(jzarl): we just could create a UIDelegate class that takes a QWidget, 0126 // implementing the same messageParent approach that we took before. 0127 // For now, I don't see anything wrong with directly implementing the interface instead. 0128 // I may change my mind later and I'm ready to convinced of the errors of my way, though... 0129 DB::UserFeedback askWarningContinueCancel(const QString &msg, const QString &title, const QString &dialogId) override; 0130 DB::UserFeedback askQuestionYesNo(const QString &msg, const QString &title, const QString &dialogId) override; 0131 void showInformation(const QString &msg, const QString &title, const QString &dialogId) override; 0132 void showError(const QString &msg, const QString &title, const QString &) override; 0133 bool isDialogDisabled(const QString &dialogId) override; 0134 0135 public Q_SLOTS: 0136 void showThumbNails(const DB::FileNameList &items); 0137 void reloadThumbnails(ThumbnailView::SelectionUpdateMethod method = ThumbnailView::MaintainSelection); 0138 void runDemo(); 0139 void slotImageRotated(const DB::FileName &fileName); 0140 void slotSave(); 0141 0142 protected Q_SLOTS: 0143 void showThumbNails(); 0144 bool slotExit(); 0145 void slotOptions(); 0146 void slotConfigureAllImages(); 0147 void slotConfigureImagesOneAtATime(); 0148 void slotCreateImageStack(); 0149 void slotUnStackImages(); 0150 void slotSetStackHead(); 0151 void slotCopySelectedURLs(); 0152 void slotPasteInformation(); 0153 void slotDeleteSelected(); 0154 void slotReReadExifInfo(); 0155 void slotAutoStackImages(); 0156 void slotSearch(); 0157 // FIXME(jzarl): improve this function signature: 0158 void slotView(bool reuse, bool slideShow = false, bool random = false); 0159 void slotView(); 0160 void slotViewNewWindow(); 0161 void slotSortByDateAndTime(); 0162 void slotSortAllByDateAndTime(); 0163 void slotLimitToSelected(); 0164 void slotExportToHTML(); 0165 void slotAutoSave(); 0166 void showBrowser(); 0167 void slotOptionGroupChanged(); 0168 void slotFilterChanged(); 0169 void showTipOfDay(); 0170 void lockToDefaultScope(); 0171 void setDefaultScopePositive(); 0172 void setDefaultScopeNegative(); 0173 void unlockFromDefaultScope(); 0174 void configureShortcuts(); 0175 void slotSetFileName(const DB::FileName &); 0176 void updateContextMenuFromSelectionSize(int selectionSize); 0177 void slotUpdateViewMenu(DB::Category::ViewType); 0178 void slotShowNotOnDisk(); 0179 void slotBuildThumbnails(); 0180 void slotBuildThumbnailsIfWanted(); 0181 void slotRunSlideShow(); 0182 void slotRunRandomizedSlideShow(); 0183 void slotImport(); 0184 void slotExport(); 0185 void delayedInit(); 0186 void slotReenableMessages(); 0187 void slotImagesChanged(const QList<QUrl> &); 0188 void slotRemoveTokens(); 0189 void slotShowListOfFiles(); 0190 void updateDateBar(const Browser::BreadcrumbList &); 0191 void updateDateBar(); 0192 void slotShowImagesWithInvalidDate(); 0193 void slotShowImagesWithChangedMD5Sum(); 0194 void showDateBarTip(const QString &); 0195 void slotJumpToContext(); 0196 void setDateRange(const DB::ImageDate &); 0197 void clearDateRange(); 0198 void startAutoSaveTimer(); 0199 void slotRecalcCheckSums(); 0200 void slotRescan(); 0201 void slotShowExifInfo(); 0202 void showFeatures(); 0203 void showImage(const DB::FileName &fileName); 0204 void slotOrderIncr(); 0205 void slotOrderDecr(); 0206 void slotRotateSelectedLeft(); 0207 void slotRotateSelectedRight(); 0208 void rotateSelected(int angle); 0209 void showVideos(); 0210 void slotStatistics(); 0211 void slotRecreateExifDB(); 0212 void useNextVideoThumbnail(); 0213 void usePreviousVideoThumbnail(); 0214 void mergeDuplicates(); 0215 void slotThumbnailSizeChanged(); 0216 void slotMarkUntagged(); 0217 void triggerCopyLinkAction(CopyLinkEngine::Action action); 0218 0219 protected: 0220 void configureImages(bool oneAtATime); 0221 QString welcome(); 0222 bool event(QEvent *event) override; 0223 void closeEvent(QCloseEvent *e) override; 0224 void resizeEvent(QResizeEvent *) override; 0225 void moveEvent(QMoveEvent *) override; 0226 void setupMenuBar(); 0227 void createAnnotationDialog(); 0228 bool load(); 0229 void contextMenuEvent(QContextMenuEvent *e) override; 0230 void setLocked(bool b, bool force, bool recount = true); 0231 void configImages(const DB::ImageInfoList &list, bool oneAtATime); 0232 void updateStates(bool thumbNailView); 0233 DB::FileNameList selectedOnDisk(); 0234 void setupPluginMenu(); 0235 void launchViewer(const DB::FileNameList &mediaList, bool reuse, bool slideShow, bool random); 0236 void setupStatusBar(); 0237 void setPluginMenuState(const char *name, const QList<QAction *> &actions); 0238 void createSearchBar(); 0239 void executeStartupActions(); 0240 void checkIfVideoThumbnailerIsInstalled(); 0241 bool anyVideosSelected() const; 0242 0243 private: 0244 static Window *s_instance; 0245 0246 ImageManager::ThumbnailCache *m_thumbnailCache; 0247 ThumbnailView::ThumbnailFacade *m_thumbnailView; 0248 Settings::SettingsDialog *m_settingsDialog; 0249 QPointer<AnnotationDialog::Dialog> m_annotationDialog; 0250 QStackedWidget *m_stack; 0251 QTimer *m_autoSaveTimer; 0252 Browser::BrowserWidget *m_browser; 0253 SearchBar *m_searchBar; 0254 DeleteDialog *m_deleteDialog; 0255 QAction *m_lock; 0256 QAction *m_unlock; 0257 QAction *m_setDefaultPos; 0258 QAction *m_setDefaultNeg; 0259 QAction *m_jumpToContext; 0260 HTMLGenerator::HTMLDialog *m_htmlDialog; 0261 QAction *m_configOneAtATime; 0262 QAction *m_configAllSimultaniously; 0263 QAction *m_createImageStack; 0264 QAction *m_unStackImages; 0265 QAction *m_setStackHead; 0266 QAction *m_view; 0267 QAction *m_rotLeft; 0268 QAction *m_rotRight; 0269 QAction *m_sortByDateAndTime; 0270 QAction *m_sortAllByDateAndTime; 0271 QAction *m_AutoStackImages; 0272 QAction *m_viewInNewWindow; 0273 QAction *m_copyAction; 0274 QAction *m_linkAction; 0275 KActionMenu *m_viewMenu; 0276 KToggleAction *m_smallListView; 0277 KToggleAction *m_largeListView; 0278 KToggleAction *m_largeIconView; 0279 KToggleAction *m_sortViewNaturally; 0280 KActionMenu *m_colorSchemeMenu; 0281 QAction *m_generateHtml; 0282 QAction *m_copy; 0283 QAction *m_paste; 0284 QAction *m_deleteSelected; 0285 QAction *m_limitToMarked; 0286 QAction *m_selectAll; 0287 QAction *m_clearSelection; 0288 QAction *m_runSlideShow; 0289 QAction *m_runRandomSlideShow; 0290 QAction *m_showExifDialog; 0291 QAction *m_recreateThumbnails; 0292 QAction *m_useNextVideoThumbnail; 0293 QAction *m_usePreviousVideoThumbnail; 0294 QAction *m_markUntagged; 0295 TokenEditor *m_tokenEditor; 0296 DateBar::DateBarWidget *m_dateBar; 0297 QFrame *m_dateBarLine; 0298 MainWindow::StatusBar *m_statusBar; 0299 QString m_lastTarget; 0300 #ifdef HAVE_MARBLE 0301 Map::MapView *m_positionBrowser; 0302 #endif 0303 ThumbnailView::FilterWidget *m_filterWidget; 0304 CopyLinkEngine *m_copyLinkEngine; 0305 }; 0306 0307 } 0308 0309 #endif /* MAINWINDOW_WINDOW_H */ 0310 0311 // vi:expandtab:tabstop=4 shiftwidth=4: