Mercurial > hg > easyhg
comparison recentfiles.cpp @ 63:2340b00561d2
* Add (but don't yet use) RecentFiles class to replace inline MRU logic
author | Chris Cannam |
---|---|
date | Wed, 17 Nov 2010 14:26:27 +0000 |
parents | |
children | 8fd71f570884 |
comparison
equal
deleted
inserted
replaced
62:68aebc316898 | 63:2340b00561d2 |
---|---|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ | |
2 | |
3 /* | |
4 EasyMercurial | |
5 | |
6 Based on HgExplorer by Jari Korhonen | |
7 Copyright (c) 2010 Jari Korhonen | |
8 Copyright (c) 2010 Chris Cannam | |
9 Copyright (c) 2010 Queen Mary, University of London | |
10 | |
11 This program is free software; you can redistribute it and/or | |
12 modify it under the terms of the GNU General Public License as | |
13 published by the Free Software Foundation; either version 2 of the | |
14 License, or (at your option) any later version. See the file | |
15 COPYING included with this distribution for more information. | |
16 */ | |
17 | |
18 #include "recentfiles.h" | |
19 | |
20 #include <QFileInfo> | |
21 #include <QSettings> | |
22 #include <QRegExp> | |
23 | |
24 RecentFiles::RecentFiles(QString settingsGroup, size_t maxCount, | |
25 bool ignoreTemporaries) : | |
26 m_settingsGroup(settingsGroup), | |
27 m_maxCount(maxCount), | |
28 m_ignoreTemporaries(ignoreTemporaries) | |
29 { | |
30 read(); | |
31 } | |
32 | |
33 RecentFiles::~RecentFiles() | |
34 { | |
35 // nothing | |
36 } | |
37 | |
38 void | |
39 RecentFiles::read() | |
40 { | |
41 m_names.clear(); | |
42 QSettings settings; | |
43 settings.beginGroup(m_settingsGroup); | |
44 | |
45 for (size_t i = 0; i < 100; ++i) { | |
46 QString key = QString("recent-%1").arg(i); | |
47 QString name = settings.value(key, "").toString(); | |
48 if (name == "") break; | |
49 if (i < m_maxCount) m_names.push_back(name); | |
50 else settings.setValue(key, ""); | |
51 } | |
52 | |
53 settings.endGroup(); | |
54 } | |
55 | |
56 void | |
57 RecentFiles::write() | |
58 { | |
59 QSettings settings; | |
60 settings.beginGroup(m_settingsGroup); | |
61 | |
62 for (size_t i = 0; i < m_maxCount; ++i) { | |
63 QString key = QString("recent-%1").arg(i); | |
64 QString name = ""; | |
65 if (i < m_names.size()) name = m_names[i]; | |
66 settings.setValue(key, name); | |
67 } | |
68 | |
69 settings.endGroup(); | |
70 } | |
71 | |
72 void | |
73 RecentFiles::truncateAndWrite() | |
74 { | |
75 while (m_names.size() > m_maxCount) { | |
76 m_names.pop_back(); | |
77 } | |
78 write(); | |
79 } | |
80 | |
81 QStringList | |
82 RecentFiles::getRecent() const | |
83 { | |
84 QStringList names; | |
85 for (size_t i = 0; i < m_maxCount; ++i) { | |
86 if (i < m_names.size()) { | |
87 names.push_back(m_names[i]); | |
88 } | |
89 } | |
90 return names; | |
91 } | |
92 | |
93 void | |
94 RecentFiles::add(QString name) | |
95 { | |
96 bool have = false; | |
97 for (size_t i = 0; i < m_names.size(); ++i) { | |
98 if (m_names[i] == name) { | |
99 have = true; | |
100 break; | |
101 } | |
102 } | |
103 | |
104 if (!have) { | |
105 m_names.push_front(name); | |
106 } else { | |
107 std::deque<QString> newnames; | |
108 newnames.push_back(name); | |
109 for (size_t i = 0; i < m_names.size(); ++i) { | |
110 if (m_names[i] == name) continue; | |
111 newnames.push_back(m_names[i]); | |
112 } | |
113 m_names = newnames; | |
114 } | |
115 | |
116 truncateAndWrite(); | |
117 emit recentChanged(); | |
118 } | |
119 | |
120 void | |
121 RecentFiles::addFile(QString name) | |
122 { | |
123 static QRegExp schemeRE("^[a-zA-Z]{2,5}://"); | |
124 static QRegExp tempRE("[\\/][Tt]e?mp[\\/]"); | |
125 if (schemeRE.indexIn(name) == 0) { | |
126 add(name); | |
127 } else { | |
128 QString absPath = QFileInfo(name).absoluteFilePath(); | |
129 if (tempRE.indexIn(absPath) != -1) { | |
130 if (!m_ignoreTemporaries) { | |
131 add(absPath); | |
132 } | |
133 } else { | |
134 add(absPath); | |
135 } | |
136 } | |
137 } | |
138 | |
139 |