view libgui/src/gui-preferences.h @ 31695:5749674b826e

store constant shortcut data in global QHash object This change is a step toward removing the shortcut_manager class * gui-preferences-sc.cc, gui-preferences.cc: New files. * libgui/src/module.mk: Update. * gui-preferences-sc.h, gui-preferences-sc.cc: Declare shortcut objects extern instead of const and initialize them in source file instead of header. (all_shortcut_preferences): New singleton class for global shortcut data. * gui-preferences.h, gui-preferences.cc (sc_pref): Define as class with private data members. Disallow modifying data members by only providing accessor functions instead of making data members constant. Change all uses. (sc_pref::m_description, sc_pref::description): New data member and accessor function. (sc_pref::sc_pref): Include description in constructor argument list. Change all uses. Store shortcut info in global all_shortcut_preferences hash when creating sc_pref objects. Use settings_keys instead of keys to avoid confusion between the index key use for QSettings and keyboard keys.
author John W. Eaton <jwe@octave.org>
date Sun, 25 Dec 2022 20:37:53 -0500
parents e518e1f7e944
children 8fed04d0607c
line wrap: on
line source

////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2017-2022 The Octave Project Developers
//
// See the file COPYRIGHT.md in the top-level directory of this
// distribution or <https://octave.org/copyright/>.
//
// This file is part of Octave.
//
// Octave 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 3 of the License, or
// (at your option) any later version.
//
// Octave 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Octave; see the file COPYING.  If not, see
// <https://www.gnu.org/licenses/>.
//
////////////////////////////////////////////////////////////////////////

#if ! defined (octave_gui_preferences_h)
#define octave_gui_preferences_h 1

#include <QStringList>
#include <QStyle>
#include <QTabWidget>
#include <QTextCodec>
#include <QVariant>

// Structure for the definition of pairs: key and default value

struct gui_pref
{
  gui_pref (const QString& key_arg, const QVariant& def_arg,
            const bool ignore_arg = false)
    : key (key_arg), def (def_arg), ignore (ignore_arg)
  { }

  // No copying!

  gui_pref (const gui_pref&) = delete;

  gui_pref& operator = (const gui_pref&) = delete;

  ~gui_pref (void) = default;

  const QString key;   // the key name
  const QVariant def;  // the default value
  const bool ignore;   // when true, ignore, i.e. always take default
};

// The version for shortcuts, where the default value is stored as a
// combination of Qt:Keys (resutling in an unsigend int, when added)
// or as one of the predefined standard key sequences.

const QString sc_group ("shortcuts/");  // group name is handled separately

class sc_pref
{
public:

  // Default constructed sc_pref objects are invalid, but we need this
  // to create QHash objects that contain sc_pref objects.  No invalid
  // sc_pref objects should acutally be used.

  sc_pref (void) = default;

  sc_pref (const QString& description, const QString& settings_key,
           Qt::Key def);

  sc_pref (const QString& description_arg, const QString& settings_key,
           unsigned int def);

  sc_pref (const QString& description_arg, const QString& settings_key,
           QKeySequence::StandardKey def_std);

  sc_pref (const sc_pref&) = default;

  sc_pref& operator = (const sc_pref&) = default;

  ~sc_pref (void) = default;

  QString description (void) const { return m_description; }

  QString settings_key (void) const { return m_settings_key; }

  unsigned int def (void) const { return m_def; }

  QKeySequence::StandardKey def_std (void) const { return m_def_std; }

private:

  // Description of the shortcut.
  QString m_description;

  // The settings key name.
  QString m_settings_key;

  // The default as key.
  unsigned int m_def;

  // The default as standard key.
  QKeySequence::StandardKey m_def_std;
};

// FIXME: Is there a better/more modern way to manage this data than to
// have this style of singleton class?

class all_shortcut_preferences
{
public:

  all_shortcut_preferences (void) = default;

  // No copying!

  all_shortcut_preferences (const all_shortcut_preferences&) = delete;

  all_shortcut_preferences&
  operator = (const all_shortcut_preferences&) = delete;

  ~all_shortcut_preferences (void) = default;

  static void insert (const QString& settings_key, const sc_pref& scpref);

private:

  // Map from shortcut identifier (settings key) to sc_pref object.
  QHash <QString, sc_pref> m_hash;

  void do_insert (const QString& settings_key, const sc_pref& scpref);

  static void ensure_instance (void);

  // Map from shortcut identifier (settings key) to sc_pref object.
  static all_shortcut_preferences *s_instance;
};

#endif