00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "RecentFiles.h"
00017
00018 #include "Preferences.h"
00019
00020 #include <QFileInfo>
00021 #include <QSettings>
00022 #include <QRegExp>
00023
00024 RecentFiles::RecentFiles(QString settingsGroup, size_t maxCount) :
00025 m_settingsGroup(settingsGroup),
00026 m_maxCount(maxCount)
00027 {
00028 read();
00029 }
00030
00031 RecentFiles::~RecentFiles()
00032 {
00033
00034 }
00035
00036 void
00037 RecentFiles::read()
00038 {
00039 m_names.clear();
00040 QSettings settings;
00041 settings.beginGroup(m_settingsGroup);
00042
00043 for (size_t i = 0; i < 100; ++i) {
00044 QString key = QString("recent-%1").arg(i);
00045 QString name = settings.value(key, "").toString();
00046 if (name == "") break;
00047 if (i < m_maxCount) m_names.push_back(name);
00048 else settings.setValue(key, "");
00049 }
00050
00051 settings.endGroup();
00052 }
00053
00054 void
00055 RecentFiles::write()
00056 {
00057 QSettings settings;
00058 settings.beginGroup(m_settingsGroup);
00059
00060 for (size_t i = 0; i < m_maxCount; ++i) {
00061 QString key = QString("recent-%1").arg(i);
00062 QString name = "";
00063 if (i < m_names.size()) name = m_names[i];
00064 settings.setValue(key, name);
00065 }
00066
00067 settings.endGroup();
00068 }
00069
00070 void
00071 RecentFiles::truncateAndWrite()
00072 {
00073 while (m_names.size() > m_maxCount) {
00074 m_names.pop_back();
00075 }
00076 write();
00077 }
00078
00079 std::vector<QString>
00080 RecentFiles::getRecent() const
00081 {
00082 std::vector<QString> names;
00083 for (size_t i = 0; i < m_maxCount; ++i) {
00084 if (i < m_names.size()) {
00085 names.push_back(m_names[i]);
00086 }
00087 }
00088 return names;
00089 }
00090
00091 void
00092 RecentFiles::add(QString name)
00093 {
00094 bool have = false;
00095 for (size_t i = 0; i < m_names.size(); ++i) {
00096 if (m_names[i] == name) {
00097 have = true;
00098 break;
00099 }
00100 }
00101
00102 if (!have) {
00103 m_names.push_front(name);
00104 } else {
00105 std::deque<QString> newnames;
00106 newnames.push_back(name);
00107 for (size_t i = 0; i < m_names.size(); ++i) {
00108 if (m_names[i] == name) continue;
00109 newnames.push_back(m_names[i]);
00110 }
00111 m_names = newnames;
00112 }
00113
00114 truncateAndWrite();
00115 emit recentChanged();
00116 }
00117
00118 void
00119 RecentFiles::addFile(QString name)
00120 {
00121 static QRegExp schemeRE("^[a-zA-Z]{2,5}://");
00122 static QRegExp tempRE("[\\/][Tt]e?mp[\\/]");
00123 if (schemeRE.indexIn(name) == 0) {
00124 add(name);
00125 } else {
00126 QString absPath = QFileInfo(name).absoluteFilePath();
00127 if (tempRE.indexIn(absPath) != -1) {
00128 Preferences *prefs = Preferences::getInstance();
00129 if (prefs && !prefs->getOmitTempsFromRecentFiles()) {
00130 add(absPath);
00131 }
00132 } else {
00133 add(absPath);
00134 }
00135 }
00136 }
00137
00138