123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- /*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
- #ifndef CRYINCLUDE_EDITOR_UTIL_FILECHANGEMONITOR_H
- #define CRYINCLUDE_EDITOR_UTIL_FILECHANGEMONITOR_H
- #pragma once
- #if !defined(Q_MOC_RUN)
- #include <AzCore/std/containers/set.h>
- #include <QFileInfoList>
- #include <QFileSystemWatcher>
- #include <QObject>
- #include <QQueue>
- #include <QScopedPointer>
- #endif
- class CFileChangeMonitorListener;
- struct SFileChangeInfo
- {
- enum EChangeType
- {
- //! error or unknown change type
- eChangeType_Unknown,
- //! the file was created
- eChangeType_Created,
- //! the file was deleted
- eChangeType_Deleted,
- //! the file was modified (size changed,write)
- eChangeType_Modified,
- //! this is the old name of a renamed file
- eChangeType_RenamedOldName,
- //! this is the new name of a renamed file
- eChangeType_RenamedNewName
- };
- SFileChangeInfo()
- : changeType(eChangeType_Unknown)
- {
- }
- bool operator==(const SFileChangeInfo& rhs) const
- {
- return changeType == rhs.changeType && filename == rhs.filename;
- }
- QString filename;
- EChangeType changeType;
- };
- // Monitors directory for any changed files
- class CFileChangeMonitor : public QObject
- {
- public:
- friend class CEditorFileMonitor;
- typedef AZStd::set<CFileChangeMonitorListener*> TListeners;
- protected:
- explicit CFileChangeMonitor(QObject* parent = nullptr);
- ~CFileChangeMonitor();
- void Initialize();
- static void DeleteInstance();
- static CFileChangeMonitor* s_pFileMonitorInstance;
- public:
- static CFileChangeMonitor* Instance();
- bool MonitorItem(const QString& sItem);
- void StopMonitor();
- void SetEnabled(bool bEnable);
- bool IsEnabled();
- //! get next modified file, this file will be delete from list after calling this function,
- //! call it until HaveModifiedFiles return true or this function returns false
- void Subscribe(CFileChangeMonitorListener* pListener);
- void Unsubscribe(CFileChangeMonitorListener* pListener);
- bool IsDirectory(const char* pFilename);
- bool IsFile(const char* pFilename);
- bool IsLoggingChanges() const
- {
- return ed_logFileChanges != 0;
- }
- void AddIgnoreFileMask(const char* pMask);
- void RemoveIgnoreFileMask(const char* pMask, int aAfterDelayMsec = 1000);
- private:
- void OnDirectoryChange(const QString &path);
- void OnFileChange(const QString &path);
- void NotifyListeners(const QString &path, SFileChangeInfo::EChangeType changeType);
- int ed_logFileChanges;
- QScopedPointer<QFileSystemWatcher> m_watcher;
- TListeners m_listeners;
- QQueue<SFileChangeInfo> m_changes;
- QStringList m_ignoreMasks;
- QHash<QString, QFileInfoList> m_entries;
- };
- // Used as base class (aka interface) to subscribe for file change events
- class CFileChangeMonitorListener
- {
- public:
- CFileChangeMonitorListener()
- : m_pMonitor(nullptr)
- {
- }
- virtual ~CFileChangeMonitorListener()
- {
- if (m_pMonitor)
- {
- m_pMonitor->Unsubscribe(this);
- }
- }
- virtual void OnFileMonitorChange(const SFileChangeInfo& rChange) = 0;
- void SetMonitor(CFileChangeMonitor* pMonitor)
- {
- m_pMonitor = pMonitor;
- }
- private:
- CFileChangeMonitor* m_pMonitor;
- };
- #endif // CRYINCLUDE_EDITOR_UTIL_FILECHANGEMONITOR_H
|