comparison 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
comparison
equal deleted inserted replaced
93:dfb7a274b90f 94:44ed7766d55a
2 2
3 #include "debug.h" 3 #include "debug.h"
4 4
5 #include <QMap> 5 #include <QMap>
6 6
7 FileStates::FileStates(QString text) 7 FileStates::FileStates()
8 {
9 }
10
11 void FileStates::clearBuckets()
12 {
13 m_modified.clear();
14 m_added.clear();
15 m_removed.clear();
16 m_missing.clear();
17 m_unknown.clear();
18 }
19
20 FileStates::State FileStates::charToState(QChar c, bool *ok)
21 {
22 if (ok) *ok = true;
23 if (c == 'M') return Modified;
24 if (c == 'A') return Added;
25 if (c == 'R') return Removed;
26 if (c == '!') return Missing;
27 if (c == '?') return Unknown;
28 if (c == 'C') return Clean;
29 if (ok) *ok = false;
30 return Unknown;
31 }
32
33 QStringList *FileStates::stateToBucket(State s)
34 {
35 switch (s) {
36 case Clean: default: return 0; // not implemented yet
37 case Modified: return &m_modified;
38 case Added: return &m_added;
39 case Unknown: return &m_unknown;
40 case Removed: return &m_removed;
41 case Missing: return &m_missing;
42 }
43 }
44
45 void FileStates::parseStates(QString text)
8 { 46 {
9 text.replace("\r\n", "\n"); 47 text.replace("\r\n", "\n");
10 48
11 QMap<QChar, QStringList *> buckets; 49 clearBuckets();
12 buckets['M'] = &modified;
13 buckets['A'] = &added;
14 buckets['R'] = &removed;
15 buckets['!'] = &missing;
16 buckets['?'] = &unknown;
17 50
18 QStringList lines = text.split("\n", QString::SkipEmptyParts); 51 QStringList lines = text.split("\n", QString::SkipEmptyParts);
52
19 foreach (QString line, lines) { 53 foreach (QString line, lines) {
54
20 if (line.length() < 3 || line[1] != ' ') { 55 if (line.length() < 3 || line[1] != ' ') {
21 continue; 56 continue;
22 } 57 }
23 QChar tag = line[0]; 58
59 QChar c = line[0];
60 bool ok = false;
61 State s = charToState(c, &ok);
62 if (!ok) continue;
63
24 QString file = line.right(line.length() - 2); 64 QString file = line.right(line.length() - 2);
25 if (buckets.contains(tag)) { 65 QStringList *bucket = stateToBucket(s);
26 buckets[tag]->push_back(file); 66 bucket->push_back(file);
27 } 67 m_stateMap[file] = s;
28 } 68 }
29 69
30 DEBUG << "FileStates: " << modified.size() << " modified, " << added.size() 70 DEBUG << "FileStates: " << m_modified.size() << " modified, " << m_added.size()
31 << " added, " << removed.size() << " removed, " << missing.size() 71 << " added, " << m_removed.size() << " removed, " << m_missing.size()
32 << " missing, " << unknown.size() << " unknown" << endl; 72 << " missing, " << m_unknown.size() << " unknown" << endl;
33 } 73 }
34 74
35 QStringList FileStates::getFilesInState(State s) 75 QStringList FileStates::getFilesInState(State s) const
36 { 76 {
37 switch (s) { 77 QStringList *sl = const_cast<FileStates *>(this)->stateToBucket(s);
38 78 if (sl) return *sl;
39 case Modified: return modified; 79 else return QStringList();
40 case Added: return added;
41 case Unknown: return unknown;
42 case Removed: return removed;
43 case Missing: return missing;
44
45 case UpToDate: // not supported yet
46 default:
47 return QStringList();
48 }
49 } 80 }
50 81
51 FileStates::State FileStates::getStateOfFile(QString file) 82 FileStates::State FileStates::getStateOfFile(QString file) const
52 { 83 {
53 // slow, but let's worry about that if it becomes a problem 84 if (m_stateMap.contains(file)) {
54 for (int is = int(FirstState); is <= int(LastState); ++is) { 85 return m_stateMap[file];
55 QStringList fl = getFilesInState(State(is));
56 foreach (QString f, fl) if (f == file) return State(is);
57 } 86 }
58 DEBUG << "FileStates: WARNING: getStateOfFile: file " 87 DEBUG << "FileStates: WARNING: getStateOfFile: file "
59 << file << " is unknown to us: returning Unknown state, " 88 << file << " is unknown to us: returning Unknown state, "
60 << "but unknown to us is not supposed to be the same " 89 << "but unknown to us is not supposed to be the same "
61 << "thing as unknown state..." 90 << "thing as unknown state..."