Mercurial > hg > easyhg
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..." |