Chris@149: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@149: Chris@149: /* Chris@149: Sonic Visualiser Chris@149: An audio file viewer and annotation editor. Chris@149: Centre for Digital Music, Queen Mary, University of London. Chris@149: This file copyright 2006 Chris Cannam. Chris@149: Chris@149: This program is free software; you can redistribute it and/or Chris@149: modify it under the terms of the GNU General Public License as Chris@149: published by the Free Software Foundation; either version 2 of the Chris@149: License, or (at your option) any later version. See the file Chris@149: COPYING included with this distribution for more information. Chris@149: */ Chris@149: Chris@149: #include "RecentFiles.h" Chris@149: Chris@277: #include "Preferences.h" Chris@277: Chris@149: #include Chris@156: #include Chris@209: #include Chris@1704: #include Chris@149: Chris@928: RecentFiles::RecentFiles(QString settingsGroup, int maxCount) : Chris@166: m_settingsGroup(settingsGroup), Chris@166: m_maxCount(maxCount) Chris@149: { Chris@166: read(); Chris@149: } Chris@149: Chris@149: RecentFiles::~RecentFiles() Chris@149: { Chris@149: // nothing Chris@149: } Chris@149: Chris@149: void Chris@166: RecentFiles::read() Chris@149: { Chris@1704: // Private method - called only from constructor - no mutex lock required Chris@1704: Chris@1704: m_entries.clear(); Chris@156: QSettings settings; Chris@166: settings.beginGroup(m_settingsGroup); Chris@156: Chris@928: for (int i = 0; i < 100; ++i) { Chris@1704: Chris@1704: QString idKey = QString("recent-%1").arg(i); Chris@1704: QString identifier = settings.value(idKey, "").toString(); Chris@1704: if (identifier == "") break; Chris@1704: Chris@1704: QString labelKey = QString("recent-%1-label").arg(i); Chris@1704: QString label = settings.value(labelKey, "").toString(); Chris@1704: Chris@1704: if (i < m_maxCount) m_entries.push_back({ identifier, label }); Chris@1704: else { Chris@1704: settings.setValue(idKey, ""); Chris@1704: settings.setValue(labelKey, ""); Chris@1704: } Chris@149: } Chris@156: Chris@156: settings.endGroup(); Chris@149: } Chris@149: Chris@149: void Chris@166: RecentFiles::write() Chris@149: { Chris@1704: // Private method - must be serialised at call site Chris@1704: Chris@156: QSettings settings; Chris@166: settings.beginGroup(m_settingsGroup); Chris@156: Chris@928: for (int i = 0; i < m_maxCount; ++i) { Chris@1704: QString idKey = QString("recent-%1").arg(i); Chris@1704: QString labelKey = QString("recent-%1-label").arg(i); Chris@1704: QString identifier; Chris@1704: QString label; Chris@1704: if (in_range_for(m_entries, i)) { Chris@1704: identifier = m_entries[i].first; Chris@1704: label = m_entries[i].second; Chris@1704: } Chris@1704: settings.setValue(idKey, identifier); Chris@1704: settings.setValue(labelKey, label); Chris@149: } Chris@156: Chris@156: settings.endGroup(); Chris@149: } Chris@149: Chris@149: void Chris@149: RecentFiles::truncateAndWrite() Chris@149: { Chris@1704: // Private method - must be serialised at call site Chris@1704: Chris@1704: while (int(m_entries.size()) > m_maxCount) { Chris@1704: m_entries.pop_back(); Chris@149: } Chris@166: write(); Chris@149: } Chris@149: Chris@149: std::vector Chris@1704: RecentFiles::getRecentIdentifiers() const Chris@149: { Chris@1704: QMutexLocker locker(&m_mutex); Chris@1704: Chris@1704: std::vector identifiers; Chris@928: for (int i = 0; i < m_maxCount; ++i) { Chris@1704: if (i < (int)m_entries.size()) { Chris@1704: identifiers.push_back(m_entries[i].first); Chris@149: } Chris@149: } Chris@1704: Chris@1704: return identifiers; Chris@1704: } Chris@1704: Chris@1704: std::vector> Chris@1704: RecentFiles::getRecentEntries() const Chris@1704: { Chris@1704: QMutexLocker locker(&m_mutex); Chris@1704: Chris@1704: std::vector> entries; Chris@1704: for (int i = 0; i < m_maxCount; ++i) { Chris@1704: if (i < (int)m_entries.size()) { Chris@1704: entries.push_back(m_entries[i]); Chris@1704: } Chris@1704: } Chris@1704: Chris@1704: return entries; Chris@149: } Chris@149: Chris@149: void Chris@1704: RecentFiles::add(QString identifier, QString label) Chris@149: { Chris@1704: { Chris@1704: QMutexLocker locker(&m_mutex); Chris@1704: Chris@1704: bool have = false; Chris@1704: for (int i = 0; i < int(m_entries.size()); ++i) { Chris@1704: if (m_entries[i].first == identifier) { Chris@1704: have = true; Chris@1704: break; Chris@1704: } Chris@149: } Chris@1704: Chris@1704: if (!have) { Chris@1704: m_entries.push_front({ identifier, label }); Chris@1704: } else { Chris@1704: std::deque> newEntries; Chris@1704: newEntries.push_back({ identifier, label }); Chris@1704: for (int i = 0; in_range_for(m_entries, i); ++i) { Chris@1704: if (m_entries[i].first == identifier) continue; Chris@1704: newEntries.push_back(m_entries[i]); Chris@1704: } Chris@1704: m_entries = newEntries; Chris@1704: } Chris@1704: Chris@1704: truncateAndWrite(); Chris@149: } Chris@149: Chris@166: emit recentChanged(); Chris@149: } Chris@149: Chris@166: void Chris@1704: RecentFiles::addFile(QString filepath, QString label) Chris@166: { Chris@209: static QRegExp schemeRE("^[a-zA-Z]{2,5}://"); Chris@277: static QRegExp tempRE("[\\/][Tt]e?mp[\\/]"); Chris@1704: if (schemeRE.indexIn(filepath) == 0) { Chris@1704: add(filepath, label); Chris@209: } else { Chris@1704: QString absPath = QFileInfo(filepath).absoluteFilePath(); Chris@277: if (tempRE.indexIn(absPath) != -1) { Chris@277: Preferences *prefs = Preferences::getInstance(); Chris@277: if (prefs && !prefs->getOmitTempsFromRecentFiles()) { Chris@1704: add(absPath, label); Chris@277: } Chris@277: } else { Chris@1704: add(absPath, label); Chris@277: } Chris@209: } Chris@166: } Chris@149: Chris@166: