diff filestates.cpp @ 94:44ed7766d55a

* Clear selections when Esc pressed; some refactoring
author Chris Cannam
date Wed, 24 Nov 2010 14:41:52 +0000
parents 06f4fffd5287
children 1721c580c10e
line wrap: on
line diff
--- a/filestates.cpp	Wed Nov 24 13:50:33 2010 +0000
+++ b/filestates.cpp	Wed Nov 24 14:41:52 2010 +0000
@@ -4,56 +4,85 @@
 
 #include <QMap>
 
-FileStates::FileStates(QString text)
+FileStates::FileStates()
+{
+}
+
+void FileStates::clearBuckets()
+{
+    m_modified.clear();
+    m_added.clear();
+    m_removed.clear();
+    m_missing.clear();
+    m_unknown.clear();
+}
+
+FileStates::State FileStates::charToState(QChar c, bool *ok)
+{
+    if (ok) *ok = true;
+    if (c == 'M') return Modified;
+    if (c == 'A') return Added;
+    if (c == 'R') return Removed;
+    if (c == '!') return Missing;
+    if (c == '?') return Unknown;
+    if (c == 'C') return Clean;
+    if (ok) *ok = false;
+    return Unknown;
+}
+
+QStringList *FileStates::stateToBucket(State s)
+{
+    switch (s) {
+    case Clean: default: return 0; // not implemented yet
+    case Modified: return &m_modified;
+    case Added: return &m_added;
+    case Unknown: return &m_unknown;
+    case Removed: return &m_removed;
+    case Missing: return &m_missing;
+    }
+}
+
+void FileStates::parseStates(QString text)
 {
     text.replace("\r\n", "\n");
 
-    QMap<QChar, QStringList *> buckets;
-    buckets['M'] = &modified;
-    buckets['A'] = &added;
-    buckets['R'] = &removed;
-    buckets['!'] = &missing;
-    buckets['?'] = &unknown;
+    clearBuckets();
 
     QStringList lines = text.split("\n", QString::SkipEmptyParts);
+
     foreach (QString line, lines) {
+
         if (line.length() < 3 || line[1] != ' ') {
             continue;
         }
-        QChar tag = line[0];
+
+        QChar c = line[0];
+        bool ok = false;
+        State s = charToState(c, &ok);
+        if (!ok) continue;
+
         QString file = line.right(line.length() - 2);
-        if (buckets.contains(tag)) {
-            buckets[tag]->push_back(file);
-        }
+        QStringList *bucket = stateToBucket(s);
+        bucket->push_back(file);
+        m_stateMap[file] = s;
     }
 
-    DEBUG << "FileStates: " << modified.size() << " modified, " << added.size()
-            << " added, " << removed.size() << " removed, " << missing.size()
-            << " missing, " << unknown.size() << " unknown" << endl;
+    DEBUG << "FileStates: " << m_modified.size() << " modified, " << m_added.size()
+            << " added, " << m_removed.size() << " removed, " << m_missing.size()
+            << " missing, " << m_unknown.size() << " unknown" << endl;
 }
 
-QStringList FileStates::getFilesInState(State s)
+QStringList FileStates::getFilesInState(State s) const
 {
-    switch (s) {
-
-    case Modified: return modified;
-    case Added: return added;
-    case Unknown: return unknown;
-    case Removed: return removed;
-    case Missing: return missing;
-
-    case UpToDate: // not supported yet
-    default:
-        return QStringList();
-    }
+    QStringList *sl = const_cast<FileStates *>(this)->stateToBucket(s);
+    if (sl) return *sl;
+    else return QStringList();
 }
 
-FileStates::State FileStates::getStateOfFile(QString file)
+FileStates::State FileStates::getStateOfFile(QString file) const
 {
-    // slow, but let's worry about that if it becomes a problem
-    for (int is = int(FirstState); is <= int(LastState); ++is) {
-        QStringList fl = getFilesInState(State(is));
-        foreach (QString f, fl) if (f == file) return State(is);
+    if (m_stateMap.contains(file)) {
+        return m_stateMap[file];
     }
     DEBUG << "FileStates: WARNING: getStateOfFile: file "
             << file << " is unknown to us: returning Unknown state, "