recoll/src/qtgui/scbase.h

119 lines
4.5 KiB
C++

/* Copyright (C) 2021 J.F.Dockes
*
* License: GPL 2.1
*
* 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.1 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the
* Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef _SCBASE_H_INCLUDED_
#define _SCBASE_H_INCLUDED_
#include <QString>
#include <QKeySequence>
#include <QStringList>
#include <QObject>
/** Shortcuts storage classe. Singleton.
*
* Manage settings storage for key sequences shortcuts.
* Each shortcut is defined by 4 strings:
* - Context (e.g. "Main Window").
* - Description (e.g. "Move focus to search entry").
* - Current value, possibly changed by user, e.g. "Ctrl+l".
* - Default value.
*
* The customised values are read from the stored settings by the SCBase
* constructor.
* The entries with default values are created from the init() method
* of each class responsible for a context (e.g. RclMain, SnippetsW),
* or from a static method for classes which are not instantiated when
* the program starts up.
*
* Macros are provided for actually creating the shortcuts in the
* init() routines, or for just creating the default entries (for use
* in the preferences screen).
*/
class SCBase : public QObject {
Q_OBJECT;
public:
~SCBase();
/* Return a reference to the instantiated singleton */
static SCBase& scBase();
/** Get the current keysequence for the shortcut. If the entry was not
* created from the settings, create it with the default
* sequence. This is called from the context classes and returns
* either the default or the customised sequence. */
QKeySequence get(const QString& id, const QString& context,
const QString& description, const QString& defkeyseq);
/** Set a customised value for the designated shortcut. Called
* from the preference code. */
void set(const QString& id, const QString& context,
const QString& description, const QString& keyseq);
/** Return a list of all shortcuts. This is used to create the
* preferences table. Each entry in the list is a string
* tuple: id, context, description, value, default */
QStringList getAll();
/** Return a list of all shortcuts, with only default values (no settings).
* Used for resetting the defaults, especially if a lang changed
* has messed up the keys */
QStringList getAllDefaults();
/** Store the customised values to the settings storage. Called
* from the preferences accept() method. */
void store();
class Internal;
signals:
/** Preference change has been accepted and client classes should
* update their shortcuts */
void shortcutsChanged();
private:
Internal *m{nullptr};
SCBase();
};
/** This can be used in the client class init method, to actually
* create and connect the shortcuts. */
#define SETSHORTCUT(OBJ, ID, CTXT, DESCR, SEQ, FLD, SLTFUNC) \
do { \
QKeySequence ks = SCBase::scBase().get(ID, CTXT, DESCR, SEQ); \
if (!ks.isEmpty()) { \
delete FLD; \
FLD = new QShortcut(ks, OBJ, SLOT(SLTFUNC())); \
} \
} while (false);
/** This can be used from a static method, to be called by the program
* initialisation, for classes which are not instantiated at startup,
* and so that the shortcuts are available for the preferences
* customisation screen. Same param list as SETSHORTCUT to make it
* easy to duplicate a list of ones into the other, even if some
* parameters are not used here. */
#define LISTSHORTCUT(OBJ, ID, CTXT, DESCR, SEQ, FLD, SLTFUNC) \
do { \
SCBase::scBase().get(ID, CTXT, DESCR, SEQ); \
} while (false);
#endif /* _SCBASE_H_INCLUDED_ */