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