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@150: #include "Preferences.h" Chris@149: Chris@149: #include Chris@156: #include Chris@149: Chris@149: RecentFiles * Chris@149: RecentFiles::m_instance = 0; Chris@149: Chris@149: RecentFiles * Chris@149: RecentFiles::getInstance(int maxFileCount) Chris@149: { Chris@149: if (!m_instance) { Chris@149: m_instance = new RecentFiles(maxFileCount); Chris@149: } Chris@149: return m_instance; Chris@149: } Chris@149: Chris@149: RecentFiles::RecentFiles(int maxFileCount) : Chris@149: m_maxFileCount(maxFileCount) Chris@149: { Chris@149: readFiles(); Chris@149: } Chris@149: Chris@149: RecentFiles::~RecentFiles() Chris@149: { Chris@149: // nothing Chris@149: } Chris@149: Chris@149: void Chris@149: RecentFiles::readFiles() Chris@149: { Chris@149: m_files.clear(); Chris@156: QSettings settings; Chris@156: settings.beginGroup("RecentFiles"); Chris@156: Chris@149: for (unsigned int i = 0; i < 100; ++i) { Chris@149: QString key = QString("recent-file-%1").arg(i); Chris@156: QString filename = settings.value(key, "").toString(); Chris@149: if (filename == "") break; Chris@149: if (i < m_maxFileCount) m_files.push_back(filename); Chris@156: else settings.setValue(key, ""); Chris@149: } Chris@156: Chris@156: settings.endGroup(); Chris@149: } Chris@149: Chris@149: void Chris@149: RecentFiles::writeFiles() Chris@149: { Chris@156: QSettings settings; Chris@156: settings.beginGroup("RecentFiles"); Chris@156: Chris@149: for (unsigned int i = 0; i < m_maxFileCount; ++i) { Chris@149: QString key = QString("recent-file-%1").arg(i); Chris@149: QString filename = ""; Chris@149: if (i < m_files.size()) filename = m_files[i]; Chris@156: settings.setValue(key, filename); Chris@149: } Chris@156: Chris@156: settings.endGroup(); Chris@149: } Chris@149: Chris@149: void Chris@149: RecentFiles::truncateAndWrite() Chris@149: { Chris@149: while (m_files.size() > m_maxFileCount) { Chris@149: m_files.pop_back(); Chris@149: } Chris@149: writeFiles(); Chris@149: } Chris@149: Chris@149: std::vector Chris@149: RecentFiles::getRecentFiles() const Chris@149: { Chris@149: std::vector files; Chris@149: for (unsigned int i = 0; i < m_maxFileCount; ++i) { Chris@149: if (i < m_files.size()) { Chris@149: files.push_back(m_files[i]); Chris@149: } Chris@149: } Chris@149: return files; Chris@149: } Chris@149: Chris@149: void Chris@149: RecentFiles::addFile(QString filename) Chris@149: { Chris@149: filename = QFileInfo(filename).absoluteFilePath(); Chris@149: Chris@149: bool have = false; Chris@149: for (unsigned int i = 0; i < m_files.size(); ++i) { Chris@149: if (m_files[i] == filename) { Chris@149: have = true; Chris@149: break; Chris@149: } Chris@149: } Chris@149: Chris@149: if (!have) { Chris@149: m_files.push_front(filename); Chris@149: } else { Chris@149: std::deque newfiles; Chris@149: newfiles.push_back(filename); Chris@149: for (unsigned int i = 0; i < m_files.size(); ++i) { Chris@149: if (m_files[i] == filename) continue; Chris@149: newfiles.push_back(m_files[i]); Chris@149: } Chris@149: } Chris@149: Chris@149: truncateAndWrite(); Chris@149: emit recentFilesChanged(); Chris@149: } Chris@149: Chris@149: