{"id":202,"date":"2020-08-17T20:11:47","date_gmt":"2020-08-17T20:11:47","guid":{"rendered":"http:\/\/renaudguezennec.eu\/?p=202"},"modified":"2025-08-17T20:18:44","modified_gmt":"2025-08-17T20:18:44","slug":"gerer-les-preferences-utilisateurs-en-c","status":"publish","type":"post","link":"http:\/\/renaudguezennec.eu\/index.php\/2020\/08\/17\/gerer-les-preferences-utilisateurs-en-c\/","title":{"rendered":"G\u00e9rer les pr\u00e9f\u00e9rences utilisateurs en C++"},"content":{"rendered":"<p>Aujourd\u2019hui, nous allons voir comment sont g\u00e9r\u00e9es les pr\u00e9f\u00e9rences dans Rolisteam (et plus g\u00e9n\u00e9ralement dans mes d\u00e9veloppements).<\/p>\n<h2>Quels contenus sont g\u00e9r\u00e9s dans les Pr\u00e9f\u00e9rences ?<\/h2>\n<p>Les pr\u00e9f\u00e9rences conservent l\u2019ensemble des \u00e9l\u00e9ments qu&#8217;un utilisateur peut d\u00e9finir pour changer le comportement de l\u2019application.<\/p>\n<p>Dans Rolisteam, il est possible de d\u00e9finir le th\u00e8me de l\u2019application, la couleur du brouillard de guerre pour les cartes, la valeur de son opacit\u00e9, Activer\/d\u00e9sactiver la recherche de mise \u00e0 jour, le lancement en plein \u00e9cran, des alias de d\u00e9s etc.<\/p>\n<h2>La probl\u00e9matique<\/h2>\n<p>La principale difficult\u00e9 est de rendre accessible en lecture et en \u00e9criture les pr\u00e9f\u00e9rences pour l&#8217;ensemble de l&#8217;application.<br \/>\nEn parall\u00e8le, la fen\u00eatre de pr\u00e9f\u00e9rences doit permettre d&#8217;afficher et de modifier toutes les valeurs.<br \/>\nIl est important de ne conserver qu&#8217;une version de donn\u00e9es afin d&#8217;\u00e9viter des incoh\u00e9rences. L&#8217;autre objecti est de r\u00e9ussir \u00e0 notifier les utilisateurs d&#8217;une donn\u00e9e apr\u00e8s son changement.<\/p>\n<h2>La solution<\/h2>\n<p>Pour r\u00e9pondre \u00e0 ces probl\u00e9matiques, j\u2019ai \u00e9crit la classe PreferencesManager. Elle est fond\u00e9e sur le patron de conception: Singleton.<br \/>\nLe but de ce patron est de s\u2019assurer de l\u2019unicit\u00e9 d\u2019une instance de classe. Cela permet de garantir que les valeurs sera bien la m\u00eame pour tout le monde: les composants de l\u2019application et le panneau de pr\u00e9f\u00e9rences.<\/p>\n<p>Pour r\u00e9aliser un singleton, il est n\u00e9cessaire de mettre les \u00e9l\u00e9ments suivants:<\/p>\n<p>[pastacode lang=&#8221;cpp&#8221; manual=&#8221;class%20PreferencesManager%0A%7B%0Apublic%3A%0A%20%20%20%20%2F**%0A%20%20%20%20*%20%40brief%20Must%20be%20called%20instead%20of%20the%20constructor.%0A%20%20%20%20*%0A%20%20%20%20*%20%40return%20instance%20of%20PreferencesManager%0A%20%20%20%20*%2F%0A%20%20%20%20static%20PreferencesManager*%20getInstance()%3B%0A%20%20%20%20%2F**%0A%20%20%20%20*%20%40brief%20%20desturctor%0A%20%20%20%20*%2F%0A%20%20%20%20~PreferencesManager()%3B%0Aprivate%3A%0A%20%20%20%20%2F**%0A%20%20%20%20*%20%40brief%20Private%20constructor%20to%20make%20sure%20there%20is%20only%20one%20instance%20of%20this.%0A%20%20%20%20*%2F%0A%20%20%20%20PreferencesManager()%3B%0Aprivate%3A%0A%20%20%20%20%2F**%0A%20%20%20%20*%20Static%20reference%2C%20part%20of%20the%20singleton%20pattern%0A%20%20%20%20*%2F%0A%20%20%20%20static%20PreferencesManager*%20m_singleton%3B%0A%7D%3B&#8221; message=&#8221;Code d&#8217;un Singleton&#8221; highlight=&#8221;&#8221; provider=&#8221;manual&#8221;\/]<\/p>\n<p>C\u00f4t\u00e9 impl\u00e9mentation, cela donne ceci:<\/p>\n<p>[pastacode lang=&#8221;cpp&#8221; manual=&#8221;PreferencesManager*%20PreferencesManager%3A%3Am_singleton%20%3D%20NULL%3B%0A%0A%0APreferencesManager*%20PreferencesManager%3A%3AgetInstance()%0A%7B%0A%20%20%20%20if(m_singleton%20%3D%3D%20NULL)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20m_singleton%20%3D%20new%20PreferencesManager%3B%0A%20%20%20%20%7D%0A%20%20%20%20%0A%20%20%20%20return%20m_singleton%3B%0A%7D&#8221; message=&#8221;Impl\u00e9mentation Singleton&#8221; highlight=&#8221;&#8221; provider=&#8221;manual&#8221;\/]<\/p>\n<p>La classe PreferencesManager conserve l&#8217;ensemble des donn\u00e9es dans une map.<\/p>\n<p>[pastacode lang=&#8221;cpp&#8221; manual=&#8221;QMap%3CQString%2CQVariant%3E*%20m_optionDictionary%3B&#8221; message=&#8221;structure de donn\u00e9es&#8221; highlight=&#8221;&#8221; provider=&#8221;manual&#8221;\/]<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Aujourd\u2019hui, nous allons voir comment sont g\u00e9r\u00e9es les pr\u00e9f\u00e9rences dans Rolisteam (et plus g\u00e9n\u00e9ralement dans mes d\u00e9veloppements). Quels contenus sont g\u00e9r\u00e9s dans les Pr\u00e9f\u00e9rences ? Les pr\u00e9f\u00e9rences conservent l\u2019ensemble des \u00e9l\u00e9ments qu&#8217;un utilisateur peut d\u00e9finir pour changer le comportement de l\u2019application. Dans Rolisteam, il est possible de d\u00e9finir le th\u00e8me de l\u2019application, la couleur du [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":""},"categories":[31,80],"tags":[],"class_list":["post-202","post","type-post","status-publish","format-standard","hentry","category-tips","category-fr"],"_links":{"self":[{"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/posts\/202","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/comments?post=202"}],"version-history":[{"count":2,"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/posts\/202\/revisions"}],"predecessor-version":[{"id":209,"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/posts\/202\/revisions\/209"}],"wp:attachment":[{"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/media?parent=202"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/categories?post=202"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/renaudguezennec.eu\/index.php\/wp-json\/wp\/v2\/tags?post=202"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}