File indexing completed on 2024-04-21 15:12:48

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: