Gérer les préférences utilisateurs en C++

Aujourd’hui, nous allons voir comment sont gérées les préférences dans Rolisteam (et plus généralement dans mes développements).

Quels contenus sont gérés dans les Préférences ?

Les préférences conservent l’ensemble des éléments qu’un utilisateur peut définir pour changer le comportement de l’application.

Dans Rolisteam, il est possible de définir le thème de l’application, la couleur du brouillard de guerre pour les cartes, la valeur de son opacité, Activer/désactiver la recherche de mise à jour, le lancement en plein écran, des alias de dés etc.

La problématique

La principale difficulté est de rendre accessible en lecture et en écriture les préférences pour l’ensemble de l’application.
En parallèle, la fenêtre de préférences doit permettre d’afficher et de modifier toutes les valeurs.
Il est important de ne conserver qu’une version de données afin d’éviter des incohérences. L’autre objecti est de réussir à notifier les utilisateurs d’une donnée après son changement.

La solution

Pour répondre à ces problématiques, j’ai écrit la classe PreferencesManager. Elle est fondée sur le patron de conception: Singleton.
Le but de ce patron est de s’assurer de l’unicité d’une instance de classe. Cela permet de garantir que les valeurs sera bien la même pour tout le monde: les composants de l’application et le panneau de préférences.

Pour réaliser un singleton, il est nécessaire de mettre les éléments suivants:

class PreferencesManager
{
public:
    /**
    * @brief Must be called instead of the constructor.
    *
    * @return instance of PreferencesManager
    */
    static PreferencesManager* getInstance();
    /**
    * @brief  desturctor
    */
    ~PreferencesManager();
private:
    /**
    * @brief Private constructor to make sure there is only one instance of this.
    */
    PreferencesManager();
private:
    /**
    * Static reference, part of the singleton pattern
    */
    static PreferencesManager* m_singleton;
};
Code d'un Singleton

Côté implémentation, cela donne ceci:

PreferencesManager* PreferencesManager::m_singleton = NULL;


PreferencesManager* PreferencesManager::getInstance()
{
    if(m_singleton == NULL)
    {
        m_singleton = new PreferencesManager;
    }
    
    return m_singleton;
}
Implémentation Singleton

La classe PreferencesManager conserve l’ensemble des données dans une map.

QMap<QString,QVariant>* m_optionDictionary;
structure de données

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *