annotate base/RecentFiles.h @ 1833:21c792334c2e sensible-delimited-data-strings

Rewrite all the DelimitedDataString stuff so as to return vectors of individual cell strings rather than having the classes add the delimiters themselves. Rename accordingly to names based on StringExport. Take advantage of this in the CSV writer code so as to properly quote cells that contain delimiter characters.
author Chris Cannam
date Fri, 03 Apr 2020 17:11:05 +0100
parents 452b48b29c2d
children
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@1581 16 #ifndef SV_RECENT_FILES_H
Chris@1581 17 #define SV_RECENT_FILES_H
Chris@149 18
Chris@149 19 #include <QObject>
Chris@149 20 #include <QString>
Chris@1704 21 #include <QMutex>
Chris@149 22 #include <vector>
Chris@149 23 #include <deque>
Chris@149 24
Chris@166 25 /**
Chris@1704 26 * RecentFiles manages a list of recently-used identifier strings,
Chris@1704 27 * saving and restoring that list via QSettings. The identifiers do
Chris@1704 28 * not actually have to refer to files.
Chris@1704 29 *
Chris@1704 30 * Each entry must have a non-empty identifier, which is typically a
Chris@1704 31 * filename, path, URI, or internal id, and may optionally also have a
Chris@1704 32 * label, which is typically a user-visible convenience.
Chris@1704 33 *
Chris@1704 34 * RecentFiles is thread-safe - all access is serialised.
Chris@166 35 */
Chris@149 36 class RecentFiles : public QObject
Chris@149 37 {
Chris@149 38 Q_OBJECT
Chris@149 39
Chris@149 40 public:
Chris@166 41 /**
Chris@166 42 * Construct a RecentFiles object that saves and restores in the
Chris@166 43 * given QSettings group and truncates when the given count of
Chris@1704 44 * identifiers is reached.
Chris@166 45 */
Chris@1704 46 RecentFiles(QString settingsGroup = "RecentFiles",
Chris@1704 47 int maxCount = 10);
Chris@149 48
Chris@149 49 virtual ~RecentFiles();
Chris@149 50
Chris@1704 51 /**
Chris@1704 52 * Return the settingsGroup as passed to the constructor.
Chris@1704 53 */
Chris@1704 54 QString getSettingsGroup() const {
Chris@1704 55 return m_settingsGroup;
Chris@1704 56 }
Chris@166 57
Chris@166 58 /**
Chris@1704 59 * Return the maxCount as passed to the constructor.
Chris@166 60 */
Chris@1704 61 int getMaxCount() const {
Chris@1704 62 return m_maxCount;
Chris@1704 63 }
Chris@1704 64
Chris@1704 65 /**
Chris@1704 66 * Return the list of recent identifiers, without labels.
Chris@1704 67 */
Chris@1704 68 std::vector<QString> getRecentIdentifiers() const;
Chris@1704 69
Chris@1704 70 /**
Chris@1704 71 * Return the list of recent identifiers, without labels. This is
Chris@1704 72 * an alias for getRecentIdentifiers included for backward
Chris@1704 73 * compatibility.
Chris@1704 74 */
Chris@1704 75 std::vector<QString> getRecent() const {
Chris@1704 76 return getRecentIdentifiers();
Chris@1704 77 }
Chris@1704 78
Chris@1704 79 /**
Chris@1704 80 * Return the list of recent identifiers, with labels. Each
Chris@1704 81 * returned entry is a pair of identifier and label in that order.
Chris@1704 82 */
Chris@1704 83 std::vector<std::pair<QString, QString>> getRecentEntries() const;
Chris@149 84
Chris@166 85 /**
Chris@1704 86 * Add a literal identifier, optionally with a label.
Chris@1704 87 *
Chris@1704 88 * If the identifier already exists in the recent entries list, it
Chris@1704 89 * is moved to the front of the list and its label is replaced
Chris@1704 90 * with the given one.
Chris@166 91 */
Chris@1704 92 void add(QString identifier, QString label = "");
Chris@1704 93
Chris@1704 94 /**
Chris@1704 95 * Add a name that is known to be either a file path or a URL,
Chris@1704 96 * optionally with a label. If it looks like a URL, add it
Chris@1704 97 * literally; otherwise treat it as a file path and canonicalise
Chris@1704 98 * it appropriately. Also take into account the user preference
Chris@1704 99 * for whether to include temporary files in the recent files
Chris@1704 100 * menu: the file will not be added if the preference is set and
Chris@1704 101 * the file appears to be a temporary one.
Chris@1704 102 *
Chris@1704 103 * If the identifier derived from the file path already exists in
Chris@1704 104 * the recent entries list, it is moved to the front of the list
Chris@1704 105 * and its label is replaced with the given one.
Chris@1704 106 */
Chris@1704 107 void addFile(QString filepath, QString label = "");
Chris@149 108
Chris@149 109 signals:
Chris@166 110 void recentChanged();
Chris@149 111
Chris@1704 112 private:
Chris@1704 113 mutable QMutex m_mutex;
Chris@149 114
Chris@1704 115 const QString m_settingsGroup;
Chris@1704 116 const int m_maxCount;
Chris@1704 117
Chris@1704 118 std::deque<std::pair<QString, QString>> m_entries; // identifier, label
Chris@149 119
Chris@166 120 void read();
Chris@166 121 void write();
Chris@149 122 void truncateAndWrite();
Chris@149 123 };
Chris@149 124
Chris@149 125 #endif