1 # -*- coding: utf-8 -*- |
1 # -*- coding: utf-8 -*- |
2 |
2 |
3 # Copyright (c) 2016 Detlev Offenbach <detlev@die-offenbachs.de> |
3 # Copyright (c) 2016 Detlev Offenbach <detlev@die-offenbachs.de> |
4 # |
4 # |
5 |
5 |
|
6 """ |
|
7 Module implementing a file system watcher with a delay. |
|
8 """ |
|
9 |
6 from __future__ import unicode_literals |
10 from __future__ import unicode_literals |
7 |
11 |
8 ##class DelayedFileWatcher : public QFileSystemWatcher |
12 from PyQt5.QtCore import pyqtSignal, pyqtSlot, QFileSystemWatcher, QTimer |
9 ##{ |
13 |
10 ## Q_OBJECT |
14 |
11 ## |
15 class DelayedFileWatcher(QFileSystemWatcher): |
12 ##public: |
16 """ |
13 ## explicit DelayedFileWatcher(QObject* parent = 0); |
17 Class implementing a file system watcher with a delay. |
14 ## explicit DelayedFileWatcher(const QStringList &paths, QObject* parent = 0); |
18 |
15 ## |
19 @signal delayedDirectoryChanged(path) emitted to indicate a changed |
16 ##signals: |
20 directory |
17 ## void delayedDirectoryChanged(const QString &path); |
21 @signal delayedFileChanged(path) emitted to indicate a changed file |
18 ## void delayedFileChanged(const QString &path); |
22 """ |
19 ## |
23 delayedDirectoryChanged = pyqtSignal(str) |
20 ##private slots: |
24 delayedFileChanged = pyqtSignal(str) |
21 ## void slotDirectoryChanged(const QString &path); |
25 |
22 ## void slotFileChanged(const QString &path); |
26 def __init__(self, paths=None, parent=None): |
23 ## |
27 """ |
24 ## void dequeueDirectory(); |
28 Constructor |
25 ## void dequeueFile(); |
29 |
26 ## |
30 @param paths list of paths to be watched |
27 ##private: |
31 @type list of str |
28 ## void init(); |
32 @param parent reference to the parent object |
29 ## |
33 @type QObject |
30 ## QQueue<QString> m_dirQueue; |
34 """ |
31 ## QQueue<QString> m_fileQueue; |
35 if paths: |
32 ##}; |
36 super(DelayedFileWatcher, self).__init__(paths, parent) |
33 ## |
37 else: |
34 ## |
38 super(DelayedFileWatcher, self).__init__(parent) |
35 ##DelayedFileWatcher::DelayedFileWatcher(QObject* parent) |
39 |
36 ## : QFileSystemWatcher(parent) |
40 self.__dirQueue = [] |
37 ##{ |
41 self.__fileQueue = [] |
38 ## init(); |
42 |
39 ##} |
43 self.directoryChanged.connect(self.__directoryChanged) |
40 ## |
44 self.fileChanged.connect(self.__fileChanged) |
41 ##DelayedFileWatcher::DelayedFileWatcher(const QStringList &paths, QObject* parent) |
45 |
42 ## : QFileSystemWatcher(paths, parent) |
46 @pyqtSlot(str) |
43 ##{ |
47 def __directoryChanged(self, path): |
44 ## init(); |
48 """ |
45 ##} |
49 Private slot handling a changed directory. |
46 ## |
50 |
47 ##void DelayedFileWatcher::init() |
51 @param path name of the changed directory |
48 ##{ |
52 @type str |
49 ## connect(this, SIGNAL(directoryChanged(QString)), this, SLOT(slotDirectoryChanged(QString))); |
53 """ |
50 ## connect(this, SIGNAL(fileChanged(QString)), this, SLOT(slotFileChanged(QString))); |
54 self.__dirQueue.append(path) |
51 ##} |
55 QTimer.singleShot(500, self.__dequeueDirectory) |
52 ## |
56 |
53 ##void DelayedFileWatcher::slotDirectoryChanged(const QString &path) |
57 @pyqtSlot(str) |
54 ##{ |
58 def __fileChanged(self, path): |
55 ## m_dirQueue.enqueue(path); |
59 """ |
56 ## QTimer::singleShot(500, this, SLOT(dequeueDirectory())); |
60 Private slot handling a changed file. |
57 ##} |
61 |
58 ## |
62 @param path name of the changed file |
59 ##void DelayedFileWatcher::slotFileChanged(const QString &path) |
63 @type str |
60 ##{ |
64 """ |
61 ## m_fileQueue.enqueue(path); |
65 self.__fileQueue.append(path) |
62 ## QTimer::singleShot(500, this, SLOT(dequeueFile())); |
66 QTimer.singleShot(500, self.__dequeueFile) |
63 ##} |
67 |
64 ## |
68 @pyqtSlot() |
65 ##void DelayedFileWatcher::dequeueDirectory() |
69 def __dequeueDirectory(self): |
66 ##{ |
70 """ |
67 ## emit delayedDirectoryChanged(m_dirQueue.dequeue()); |
71 Private slot to signal a directory change. |
68 ##} |
72 """ |
69 ## |
73 self.delayedDirectoryChanged.emit(self.__dirQueue.pop(0)) |
70 ##void DelayedFileWatcher::dequeueFile() |
74 |
71 ##{ |
75 @pyqtSlot() |
72 ## emit delayedFileChanged(m_fileQueue.dequeue()); |
76 def __dequeueFile(self): |
73 ##} |
77 """ |
|
78 Private slot to signal a file change. |
|
79 """ |
|
80 self.delayedFileChanged.emit(self.__fileQueue.pop(0)) |