annotate base/RecentFiles.cpp @ 537:3cc4b7cd2aa5

* Merge from one-fftdataserver-per-fftmodel branch. This bit of reworking (which is not described very accurately by the title of the branch) turns the MatrixFile object into something that either reads or writes, but not both, and separates the FFT file cache reader and writer implementations separately. This allows the FFT data server to have a single thread owning writers and one reader per "customer" thread, and for all locking to be vastly simplified and concentrated in the data server alone (because none of the classes it makes use of is used in more than one thread at a time). The result is faster and more trustworthy code.
author Chris Cannam
date Tue, 27 Jan 2009 13:25:10 +0000
parents 3b8008d09541
children 6a94bb528e9d
rev   line source
Chris@149 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@149 2
Chris@149 3 /*
Chris@149 4 Sonic Visualiser
Chris@149 5 An audio file viewer and annotation editor.
Chris@149 6 Centre for Digital Music, Queen Mary, University of London.
Chris@149 7 This file copyright 2006 Chris Cannam.
Chris@149 8
Chris@149 9 This program is free software; you can redistribute it and/or
Chris@149 10 modify it under the terms of the GNU General Public License as
Chris@149 11 published by the Free Software Foundation; either version 2 of the
Chris@149 12 License, or (at your option) any later version. See the file
Chris@149 13 COPYING included with this distribution for more information.
Chris@149 14 */
Chris@149 15
Chris@149 16 #include "RecentFiles.h"
Chris@149 17
Chris@277 18 #include "Preferences.h"
Chris@277 19
Chris@149 20 #include <QFileInfo>
Chris@156 21 #include <QSettings>
Chris@209 22 #include <QRegExp>
Chris@149 23
Chris@166 24 RecentFiles::RecentFiles(QString settingsGroup, size_t maxCount) :
Chris@166 25 m_settingsGroup(settingsGroup),
Chris@166 26 m_maxCount(maxCount)
Chris@149 27 {
Chris@166 28 read();
Chris@149 29 }
Chris@149 30
Chris@149 31 RecentFiles::~RecentFiles()
Chris@149 32 {
Chris@149 33 // nothing
Chris@149 34 }
Chris@149 35
Chris@149 36 void
Chris@166 37 RecentFiles::read()
Chris@149 38 {
Chris@166 39 m_names.clear();
Chris@156 40 QSettings settings;
Chris@166 41 settings.beginGroup(m_settingsGroup);
Chris@156 42
Chris@166 43 for (size_t i = 0; i < 100; ++i) {
Chris@166 44 QString key = QString("recent-%1").arg(i);
Chris@166 45 QString name = settings.value(key, "").toString();
Chris@166 46 if (name == "") break;
Chris@166 47 if (i < m_maxCount) m_names.push_back(name);
Chris@156 48 else settings.setValue(key, "");
Chris@149 49 }
Chris@156 50
Chris@156 51 settings.endGroup();
Chris@149 52 }
Chris@149 53
Chris@149 54 void
Chris@166 55 RecentFiles::write()
Chris@149 56 {
Chris@156 57 QSettings settings;
Chris@166 58 settings.beginGroup(m_settingsGroup);
Chris@156 59
Chris@166 60 for (size_t i = 0; i < m_maxCount; ++i) {
Chris@166 61 QString key = QString("recent-%1").arg(i);
Chris@166 62 QString name = "";
Chris@166 63 if (i < m_names.size()) name = m_names[i];
Chris@166 64 settings.setValue(key, name);
Chris@149 65 }
Chris@156 66
Chris@156 67 settings.endGroup();
Chris@149 68 }
Chris@149 69
Chris@149 70 void
Chris@149 71 RecentFiles::truncateAndWrite()
Chris@149 72 {
Chris@166 73 while (m_names.size() > m_maxCount) {
Chris@166 74 m_names.pop_back();
Chris@149 75 }
Chris@166 76 write();
Chris@149 77 }
Chris@149 78
Chris@149 79 std::vector<QString>
Chris@166 80 RecentFiles::getRecent() const
Chris@149 81 {
Chris@166 82 std::vector<QString> names;
Chris@166 83 for (size_t i = 0; i < m_maxCount; ++i) {
Chris@166 84 if (i < m_names.size()) {
Chris@166 85 names.push_back(m_names[i]);
Chris@149 86 }
Chris@149 87 }
Chris@166 88 return names;
Chris@149 89 }
Chris@149 90
Chris@149 91 void
Chris@166 92 RecentFiles::add(QString name)
Chris@149 93 {
Chris@149 94 bool have = false;
Chris@166 95 for (size_t i = 0; i < m_names.size(); ++i) {
Chris@166 96 if (m_names[i] == name) {
Chris@149 97 have = true;
Chris@149 98 break;
Chris@149 99 }
Chris@149 100 }
Chris@149 101
Chris@149 102 if (!have) {
Chris@166 103 m_names.push_front(name);
Chris@149 104 } else {
Chris@166 105 std::deque<QString> newnames;
Chris@166 106 newnames.push_back(name);
Chris@166 107 for (size_t i = 0; i < m_names.size(); ++i) {
Chris@166 108 if (m_names[i] == name) continue;
Chris@166 109 newnames.push_back(m_names[i]);
Chris@149 110 }
Chris@185 111 m_names = newnames;
Chris@149 112 }
Chris@149 113
Chris@149 114 truncateAndWrite();
Chris@166 115 emit recentChanged();
Chris@149 116 }
Chris@149 117
Chris@166 118 void
Chris@166 119 RecentFiles::addFile(QString name)
Chris@166 120 {
Chris@209 121 static QRegExp schemeRE("^[a-zA-Z]{2,5}://");
Chris@277 122 static QRegExp tempRE("[\\/][Tt]e?mp[\\/]");
Chris@209 123 if (schemeRE.indexIn(name) == 0) {
Chris@209 124 add(name);
Chris@209 125 } else {
Chris@277 126 QString absPath = QFileInfo(name).absoluteFilePath();
Chris@277 127 if (tempRE.indexIn(absPath) != -1) {
Chris@277 128 Preferences *prefs = Preferences::getInstance();
Chris@277 129 if (prefs && !prefs->getOmitTempsFromRecentFiles()) {
Chris@277 130 add(absPath);
Chris@277 131 }
Chris@277 132 } else {
Chris@277 133 add(absPath);
Chris@277 134 }
Chris@209 135 }
Chris@166 136 }
Chris@149 137
Chris@166 138