view base/RecentFiles.h @ 1879:652c5360e682

Ensure transforms are populated before instantiateDefaultPluginFor runs - otherwise if we have prior knowledge of a transform id, we can find ourselves trying to instantiate it before the plugin factory has heard of it and e.g. knows which server to use
author Chris Cannam
date Thu, 25 Jun 2020 12:20:06 +0100
parents 452b48b29c2d
children
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.
*/

#ifndef SV_RECENT_FILES_H
#define SV_RECENT_FILES_H

#include <QObject>
#include <QString>
#include <QMutex>
#include <vector>
#include <deque>

/**
 * RecentFiles manages a list of recently-used identifier strings,
 * saving and restoring that list via QSettings.  The identifiers do
 * not actually have to refer to files.
 *
 * Each entry must have a non-empty identifier, which is typically a
 * filename, path, URI, or internal id, and may optionally also have a
 * label, which is typically a user-visible convenience.
 *
 * RecentFiles is thread-safe - all access is serialised.
 */
class RecentFiles : public QObject
{
    Q_OBJECT

public:
    /**
     * Construct a RecentFiles object that saves and restores in the
     * given QSettings group and truncates when the given count of
     * identifiers is reached.
     */
    RecentFiles(QString settingsGroup = "RecentFiles",
                int maxCount = 10);

    virtual ~RecentFiles();

    /**
     * Return the settingsGroup as passed to the constructor.
     */
    QString getSettingsGroup() const {
        return m_settingsGroup;
    }

    /**
     * Return the maxCount as passed to the constructor.
     */
    int getMaxCount() const {
        return m_maxCount;
    }

    /**
     * Return the list of recent identifiers, without labels.
     */
    std::vector<QString> getRecentIdentifiers() const;

    /**
     * Return the list of recent identifiers, without labels. This is
     * an alias for getRecentIdentifiers included for backward
     * compatibility.
     */
    std::vector<QString> getRecent() const {
        return getRecentIdentifiers();
    }

    /**
     * Return the list of recent identifiers, with labels. Each
     * returned entry is a pair of identifier and label in that order.
     */
    std::vector<std::pair<QString, QString>> getRecentEntries() const;
    
    /**
     * Add a literal identifier, optionally with a label.
     *
     * If the identifier already exists in the recent entries list, it
     * is moved to the front of the list and its label is replaced
     * with the given one.
     */
    void add(QString identifier, QString label = "");
    
    /**
     * Add a name that is known to be either a file path or a URL,
     * optionally with a label.  If it looks like a URL, add it
     * literally; otherwise treat it as a file path and canonicalise
     * it appropriately.  Also take into account the user preference
     * for whether to include temporary files in the recent files
     * menu: the file will not be added if the preference is set and
     * the file appears to be a temporary one.
     *
     * If the identifier derived from the file path already exists in
     * the recent entries list, it is moved to the front of the list
     * and its label is replaced with the given one.
     */
    void addFile(QString filepath, QString label = "");

signals:
    void recentChanged();

private:
    mutable QMutex m_mutex;

    const QString m_settingsGroup;
    const int m_maxCount;

    std::deque<std::pair<QString, QString>> m_entries; // identifier, label

    void read();
    void write();
    void truncateAndWrite();
};

#endif