annotate src/fswatcher.h @ 558:d932ce55c364 find

Remove the single find widget from top, add one to each tab at the bottom instead. (Turns out you don't usually want to search for the same text in both types of widget.) Also provide sensible no-results text.
author Chris Cannam
date Mon, 27 Feb 2012 17:08:26 +0000
parents 7829da6abe97
children 533519ebc0cb
rev   line source
Chris@538 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@538 2
Chris@538 3 /*
Chris@538 4 EasyMercurial
Chris@538 5
Chris@538 6 Based on HgExplorer by Jari Korhonen
Chris@538 7 Copyright (c) 2010 Jari Korhonen
Chris@538 8 Copyright (c) 2011 Chris Cannam
Chris@538 9 Copyright (c) 2011 Queen Mary, University of London
Chris@538 10
Chris@538 11 This program is free software; you can redistribute it and/or
Chris@538 12 modify it under the terms of the GNU General Public License as
Chris@538 13 published by the Free Software Foundation; either version 2 of the
Chris@538 14 License, or (at your option) any later version. See the file
Chris@538 15 COPYING included with this distribution for more information.
Chris@538 16 */
Chris@538 17
Chris@538 18 #ifndef FSWATCHER_H
Chris@538 19 #define FSWATCHER_H
Chris@538 20
Chris@538 21 #include <QObject>
Chris@538 22 #include <QMutex>
Chris@538 23 #include <QString>
Chris@538 24 #include <QSet>
Chris@538 25 #include <QHash>
Chris@538 26 #include <QMap>
Chris@538 27 #include <QStringList>
Chris@538 28 #include <QFileSystemWatcher>
Chris@538 29
Chris@538 30 class FsWatcher : public QObject
Chris@538 31 {
Chris@538 32 Q_OBJECT
Chris@538 33
Chris@538 34 public:
Chris@538 35 FsWatcher();
Chris@538 36 virtual ~FsWatcher();
Chris@538 37
Chris@538 38 /**
Chris@539 39 * Set the root path of the work directory to be monitored. This
Chris@539 40 * directory and all its subdirectories (recursively) will be
Chris@539 41 * monitored for changes.
Chris@539 42 *
Chris@541 43 * If this path differs from the currently set work dir path, then
Chris@541 44 * the tracked file paths will also be cleared. Call
Chris@539 45 * setTrackedFilePaths afterwards to ensure non-directory files
Chris@539 46 * are monitored.
Chris@538 47 */
Chris@538 48 void setWorkDirPath(QString path);
Chris@538 49
Chris@538 50 /**
Chris@539 51 * Provide a set of paths for files which should be tracked. These
Chris@542 52 * will be the only non-directory files monitored for changes. The
Chris@542 53 * paths should be relative to the work directory.
Chris@539 54 */
Chris@539 55 void setTrackedFilePaths(QStringList paths);
Chris@539 56
Chris@539 57 /**
Chris@538 58 * Provide a set of prefixes to ignore. Files whose names start
Chris@538 59 * with a prefix in this set will be ignored when they change.
Chris@538 60 */
Chris@538 61 void setIgnoredFilePrefixes(QStringList prefixes);
Chris@538 62
Chris@538 63 /**
Chris@538 64 * Provide a set of suffixes to ignore. Files whose names end
Chris@538 65 * with a suffix in this set will be ignored when they change.
Chris@538 66 */
Chris@538 67 void setIgnoredFileSuffixes(QStringList suffixes);
Chris@538 68
Chris@538 69 /**
Chris@538 70 * Return a token to identify the current caller in subsequent
Chris@538 71 * calls to getChangedPaths(). Only changes that occur after this
Chris@538 72 * has been called can be detected by the caller.
Chris@538 73 */
Chris@538 74 int getNewToken();
Chris@538 75
Chris@538 76 /**
Chris@538 77 * Return a list of all non-ignored file paths that have been
Chris@538 78 * observed to have changed since the last call to getChangedPaths
Chris@538 79 * with the same token.
Chris@538 80 */
Chris@538 81 QSet<QString> getChangedPaths(int token);
Chris@538 82
Chris@538 83 signals:
Chris@538 84 /**
Chris@538 85 * Emitted when something has changed. Use the asynchronous
Chris@538 86 * interface to find out what.
Chris@538 87 */
Chris@538 88 void changed();
Chris@538 89
Chris@538 90 private slots:
Chris@538 91 void fsDirectoryChanged(QString);
Chris@538 92 void fsFileChanged(QString);
Chris@538 93
Chris@538 94 private:
Chris@538 95 // call with lock already held
Chris@538 96 void addWorkDirectory(QString path);
Chris@538 97
Chris@538 98 // call with lock already held
Chris@538 99 bool shouldIgnore(QString path);
Chris@538 100
Chris@540 101 // call with lock already held. Returns set of non-ignored files in dir
Chris@540 102 QSet<QString> scanDirectory(QString path);
Chris@540 103
Chris@540 104 // call with lock already held
Chris@540 105 void debugPrint();
Chris@540 106
Chris@538 107 private:
Chris@538 108 /**
Chris@538 109 * A change associates a filename with a counter (the
Chris@538 110 * size_t). Each time a file is changed, its counter is assigned
Chris@538 111 * from m_lastCounter and m_lastCounter is incremented.
Chris@538 112 *
Chris@538 113 * This is not especially efficient -- we often want to find "all
Chris@538 114 * files whose counter is greater than X" which involves a
Chris@538 115 * traversal. Maybe something better later.
Chris@538 116 */
Chris@538 117 QHash<QString, size_t> m_changes;
Chris@538 118
Chris@538 119 /**
Chris@538 120 * Associates a token (the client identifier) with a counter. The
Chris@538 121 * counter represents the value of m_lastCounter at the moment
Chris@538 122 * getChangedPaths last completed for that token. Any files in
Chris@538 123 * m_changes whose counters are larger must have been modified.
Chris@538 124 */
Chris@538 125 QMap<int, size_t> m_tokenMap;
Chris@538 126
Chris@540 127 /**
Chris@540 128 * Associates a directory path with a list of all the files in it
Chris@540 129 * that do not match our ignore patterns. When a directory is
Chris@540 130 * signalled as having changed, then we need to rescan it and
Chris@540 131 * compare against this list before we can determine whether to
Chris@540 132 * notify about the change or not.
Chris@540 133 */
Chris@540 134 QHash<QString, QSet<QString> > m_dirContents;
Chris@540 135
Chris@538 136 QStringList m_ignoredPrefixes;
Chris@538 137 QStringList m_ignoredSuffixes;
Chris@538 138
Chris@538 139 /// Everything in this class is synchronised.
Chris@538 140 QMutex m_mutex;
Chris@538 141
Chris@538 142 QString m_workDirPath;
Chris@538 143 int m_lastToken;
Chris@538 144 size_t m_lastCounter;
Chris@538 145 QFileSystemWatcher m_watcher;
Chris@538 146 };
Chris@538 147
Chris@538 148 #endif