File indexing completed on 2024-04-21 16:30:27

0001 // SPDX-FileCopyrightText: 2020 Simon Persson <simon.persson@mykolab.com>
0002 //
0003 // SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0004 
0005 #ifndef BACKUPPLANWIDGET_H
0006 #define BACKUPPLANWIDGET_H
0007 
0008 #include <QDialog>
0009 #include <QSet>
0010 #include <QWidget>
0011 
0012 class BackupPlan;
0013 class DirSelector;
0014 class DriveSelection;
0015 class FolderSelectionModel;
0016 
0017 class KLineEdit;
0018 class KMessageWidget;
0019 class KPageWidget;
0020 class KPageWidgetItem;
0021 class QAction;
0022 class QFileInfo;
0023 class QPushButton;
0024 class QRadioButton;
0025 class QThread;
0026 class QTimer;
0027 class QTreeView;
0028 
0029 class FileScanner : public QObject {
0030     Q_OBJECT
0031 public:
0032     FileScanner();
0033     bool event(QEvent *pEvent) override;
0034 
0035 public slots:
0036     void includePath(const QString &pPath);
0037     void excludePath(const QString &pPath);
0038 
0039 signals:
0040     void unreadablesChanged(QPair<QSet<QString>, QSet<QString>>);
0041     void symlinkProblemsChanged(QHash<QString,QString>);
0042 
0043 protected slots:
0044     void sendPendingUnreadables();
0045     void sendPendingSymlinks();
0046 
0047 protected:
0048     bool isPathIncluded(const QString &pPath);
0049     void checkPathForProblems(const QFileInfo &pFileInfo);
0050     bool isSymlinkProblematic(const QString &pTarget);
0051     void scanFolder(const QString &pPath);
0052 
0053     QSet<QString> mIncludedFolders;
0054     QSet<QString> mExcludedFolders;
0055 
0056     QSet<QString> mUnreadableFolders;
0057     QSet<QString> mUnreadableFiles;
0058     QTimer *mUnreadablesTimer;
0059 
0060     QHash<QString,QString> mSymlinksNotOk;
0061     QHash<QString,QString> mSymlinksOk;
0062     QTimer *mSymlinkTimer;
0063 };
0064 
0065 class FolderSelectionWidget : public QWidget {
0066     Q_OBJECT
0067 public:
0068     explicit FolderSelectionWidget(FolderSelectionModel *pModel, QWidget *pParent = nullptr);
0069     virtual ~FolderSelectionWidget();
0070 
0071 public slots:
0072     void setHiddenFoldersVisible(bool pVisible);
0073     void expandToShowSelections();
0074     void setUnreadables(const QPair<QSet<QString>, QSet<QString>> &pUnreadables);
0075     void setSymlinks(QHash<QString,QString> pSymlinks);
0076     void updateMessage();
0077     void executeExcludeAction();
0078     void executeIncludeAction();
0079 
0080 protected:
0081     QTreeView *mTreeView;
0082     FolderSelectionModel *mModel;
0083     KMessageWidget *mMessageWidget;
0084     QThread *mWorkerThread;
0085     QStringList mUnreadableFolders;
0086     QStringList mUnreadableFiles;
0087     QString mExcludeActionPath;
0088     QAction *mExcludeAction;
0089     QHash<QString,QString> mSymlinkProblems;
0090     QString mIncludeActionPath;
0091     QAction *mIncludeAction;
0092 };
0093 
0094 class ConfigIncludeDummy : public QWidget {
0095     Q_OBJECT
0096 signals:
0097     void includeListChanged();
0098 public:
0099     Q_PROPERTY(QStringList includeList READ includeList WRITE setIncludeList NOTIFY includeListChanged USER true)
0100     ConfigIncludeDummy(FolderSelectionModel *pModel, FolderSelectionWidget *pParent);
0101     QStringList includeList();
0102     void setIncludeList(QStringList pIncludeList);
0103     FolderSelectionModel *mModel;
0104     FolderSelectionWidget *mTreeView;
0105 };
0106 
0107 class ConfigExcludeDummy : public QWidget {
0108     Q_OBJECT
0109 signals:
0110     void excludeListChanged();
0111 public:
0112     Q_PROPERTY(QStringList excludeList READ excludeList WRITE setExcludeList NOTIFY excludeListChanged USER true)
0113     ConfigExcludeDummy(FolderSelectionModel *pModel, FolderSelectionWidget *pParent);
0114     QStringList excludeList();
0115     void setExcludeList(QStringList pExcludeList);
0116     FolderSelectionModel *mModel;
0117     FolderSelectionWidget *mTreeView;
0118 };
0119 
0120 class DirDialog: public QDialog
0121 {
0122     Q_OBJECT
0123 public:
0124     explicit DirDialog(const QUrl &pRootDir, const QString &pStartSubDir, QWidget *pParent = nullptr);
0125     QUrl url() const;
0126 private:
0127     DirSelector *mDirSelector;
0128 };
0129 
0130 class BackupPlanWidget : public QWidget
0131 {
0132     Q_OBJECT
0133 public:
0134     BackupPlanWidget(BackupPlan *pBackupPlan, const QString &pBupVersion,
0135                      const QString &pRsyncVersion, bool pPar2Available);
0136 
0137     void saveExtraData();
0138     void showSourcePage();
0139     KLineEdit *mDescriptionEdit;
0140 
0141 protected:
0142     KPageWidgetItem *createTypePage(const QString &pBupVersion, const QString &pRsyncVersion);
0143     KPageWidgetItem *createSourcePage();
0144     KPageWidgetItem *createDestinationPage();
0145     KPageWidgetItem *createSchedulePage();
0146     KPageWidgetItem *createAdvancedPage(bool pPar2Available);
0147 
0148 
0149     QPushButton *mConfigureButton;
0150     KPageWidget *mConfigPages;
0151     BackupPlan *mBackupPlan;
0152     DriveSelection *mDriveSelection{};
0153     KLineEdit *mDriveDestEdit{};
0154     QRadioButton *mVersionedRadio{};
0155     QRadioButton *mSyncedRadio{};
0156     FolderSelectionWidget *mSourceSelectionWidget{};
0157     KPageWidgetItem *mSourcePage;
0158     KMessageWidget *mLocalMessage;
0159     KMessageWidget *mExistMessage;
0160 
0161 protected slots:
0162     void openDriveDestDialog();
0163     void checkFilesystemDestination(const QString &pDestination);
0164 
0165 signals:
0166     void requestOverviewReturn();
0167 };
0168 
0169 #endif // BACKUPPLANWIDGET_H