Mercurial > hg > svcore
view base/RecentFiles.cpp @ 758:babed5be1ae7
Better general approach
author | Chris Cannam |
---|---|
date | Fri, 08 Mar 2013 20:05:49 +0000 |
parents | 3b8008d09541 |
children | 6a94bb528e9d |
line wrap: on
line source
/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. This file copyright 2006 Chris Cannam. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "RecentFiles.h" #include "Preferences.h" #include <QFileInfo> #include <QSettings> #include <QRegExp> RecentFiles::RecentFiles(QString settingsGroup, size_t maxCount) : m_settingsGroup(settingsGroup), m_maxCount(maxCount) { read(); } RecentFiles::~RecentFiles() { // nothing } void RecentFiles::read() { m_names.clear(); QSettings settings; settings.beginGroup(m_settingsGroup); for (size_t i = 0; i < 100; ++i) { QString key = QString("recent-%1").arg(i); QString name = settings.value(key, "").toString(); if (name == "") break; if (i < m_maxCount) m_names.push_back(name); else settings.setValue(key, ""); } settings.endGroup(); } void RecentFiles::write() { QSettings settings; settings.beginGroup(m_settingsGroup); for (size_t i = 0; i < m_maxCount; ++i) { QString key = QString("recent-%1").arg(i); QString name = ""; if (i < m_names.size()) name = m_names[i]; settings.setValue(key, name); } settings.endGroup(); } void RecentFiles::truncateAndWrite() { while (m_names.size() > m_maxCount) { m_names.pop_back(); } write(); } std::vector<QString> RecentFiles::getRecent() const { std::vector<QString> names; for (size_t i = 0; i < m_maxCount; ++i) { if (i < m_names.size()) { names.push_back(m_names[i]); } } return names; } void RecentFiles::add(QString name) { bool have = false; for (size_t i = 0; i < m_names.size(); ++i) { if (m_names[i] == name) { have = true; break; } } if (!have) { m_names.push_front(name); } else { std::deque<QString> newnames; newnames.push_back(name); for (size_t i = 0; i < m_names.size(); ++i) { if (m_names[i] == name) continue; newnames.push_back(m_names[i]); } m_names = newnames; } truncateAndWrite(); emit recentChanged(); } void RecentFiles::addFile(QString name) { static QRegExp schemeRE("^[a-zA-Z]{2,5}://"); static QRegExp tempRE("[\\/][Tt]e?mp[\\/]"); if (schemeRE.indexIn(name) == 0) { add(name); } else { QString absPath = QFileInfo(name).absoluteFilePath(); if (tempRE.indexIn(absPath) != -1) { Preferences *prefs = Preferences::getInstance(); if (prefs && !prefs->getOmitTempsFromRecentFiles()) { add(absPath); } } else { add(absPath); } } }