Membres inscrits :611
Membres en ligne : 0
Invités en ligne : 8


|
| Conversation : AuiToolbarItem liés à des entrées de menu |
freem (Nouveau membre)
Inscrit le : 09-04-2010
Messages: 8
Snippets: 0
Tutoriels: 0
Hors ligne |
Je voulais savoir si il existe une classe, ou un système, pour lier (je devrai plutôt dire regrouper dans un même objet) une entrée de menu et un bouton de toolbar (auiToolbar dans le cas qui m'intéresse le plus).
Pour prendre un exemple simple: Dans word (ancien style, sans le bandeau) il y avais un menu "Fichier" contenant l'entrée "Sauvegarder" ainsi qu'un bouton de raccourcis dans l'application qui faisait la même chose (sisi celui avec la disquette... bon je blague je sais que j'ai pas besoin de préciser ).
La seule solution que je connais actuellement avec wxWidgets est de définir séparément chacune de ces deux entités, et pour chacune d'elle lier leur évènement d'activation à la fonction de sauvegarde.
Pour une applis ou ce type de doublon est occasionnel, pourquoi pas... Ca fait du code lourd à maintenir, imposant et peu puissant, mais pourquoi pas... Le problème, c'est que je veux (et j'ai déjà commencé d'ailleurs) refaire AutoRealm from scratch, en C++ (histoire de le rendre utilisable nativement sous Linux, d'une part, et de corriger certains problèmes de performance et de rendu, d'autre part.) et ce logiciel possède de très nombreux doublons de ce genre.
Un système qui me permettrait de n'avoir qu'un seul objet qui gère ces deux entrées me permettrait plusieurs choses bien sympathiques: _ créer un système de personnalisation des boîtes à outils qui gère les boutons un par un (je crois que word avait ça... mais je ne l'ai que peu utilisé donc j'ai un doute) _ optimiser certaines données (chaînes de caractère - bulles d'aide par exemple - non dupliquées, ID pour une fonctionnalité et pas pour une entrée) et faciliter la traduction _ augmenter la maintenabilité du code _ créer dynamiquement au bon vouloir de l'utilisateur les barres d'outils et y mettre les raccourcis voulus sans distinction de groupe
Et peut-être d'autres que je ne perçois pas encore.
J'ai bien pensé à créer une classe qui hérite de wxMenuItem et qui contient les données nécessaires à wxAuiToolbar->AddItem, mais je me dis que ça existe peut-être déjà... sans compter que wxAuiToolbar ne semble pas posséder de méthode AddItem prenant en paramètre un objet, je devrai donc filer l'adresse de la wxAuiToolbar en question à mon objet perso pour lui permettre de s'enregistrer dedans. Du coup pour l'en retirer, il faut que cet objet conserve une liste de pointeur sur les wxAuiToolbar qui le "contiennent" afin de pouvoir s'en enlever... (bon, vous me direz, un std::list<wxAuiToolbar*> c'est pas compliqué à gérer, mais quand même)
Voila, donc si quelqu'un à une idée, je suis preneur.
(Je ne met pas le lien vers mon projet parce qu'il n'est pas assez avancé pour être utilisable (pour le moment je soigne plus la conception que la fonctionnalité déjà implémentée, histoire de pouvoir réutiliser au max le code)... Sauf si quelqu'un tiens à l'avoir)
[edit] Je me suis planté de section je pense...Et pas moyen de déplacer moi-même donc mea culpa si mauvais endroit
Dernière modification par freem (25-01-2012 12:21:07)
| |
|
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1154
Snippets: 23
Tutoriels: 6
Site web
Hors ligne |
Salut.
C'est vrai que le fait d'avoir à répéter la majorité des chaînes de caractères n'est "pas top".
En ce qui concerne le fait d'utiliser un ID pour une fonctionnalité et non pour une entrée, c'est faisable sans rien toucher au code : une entrée de menu et un bouton de barre d'outils peuvent très bien avoir le même identifiant. Je ne sais pas ce qu'il en est avec une wxAuiToolbar, mais avec une wxToolBar classique, il n'est même pas nécessaire d'avoir les deux entrées dans la table d'événements (ou d'appeler deux fois la méthode "Connect").
Ensuite, pour ce qui est le la table des événements, rien ne t'empêche de placer toutes les entrées (correspondant à tous les identifiants dont tu te sers) même si certains ne sont pas utilisés dans la barre d'outils (ça évite d'avoir à Connecter / Déconnecter certains événements lors de la personnalisation).
En ce qui concerne les chaînes de caractères, tu peux utiliser une (ou plusieurs) wxHashMap avec en index, l'identifiant (ce qui implique d'utiliser des valeurs constantes prédéfinies) et en valeur la chaîne concernée.
Tu pourrais par exemple avoir une map pour les "titres" des menus et qui pourraient éventuellement être affichés avec la barre d'outils, une autre pour la description de chaque fonctionnalité (affichée dans la barre d'état lorsque la souris survole une entrée de menu et affichée sous forme de tooltip lorsque la souris survole un bouton de la barre d'outils).
Enfin, pour "enregistrer" la personnalisation (toujours sur le principe d'une table prédéfinie d'identifiants), il te suffirait de stocker les identifiants correspondants aux éléments à afficher (avec éventuellement une liste prédéfinie d'éléments à afficher par défaut si aucune personnalisation n'est faite par l'utilisateur).
Enfin, c'est juste une solution qui m'est venue à l'esprit en lisant ton post.
@+ Xav'
|
Le nouveau portail wxWidgets francophone : www.wxdev.fr Ben en fait, vous y êtes déjà...
|
freem (Nouveau membre)
Inscrit le : 09-04-2010
Messages: 8
Snippets: 0
Tutoriels: 0
Hors ligne |
Désolé pour le délai de réponse...
Pour le coup, je pense que je vais dériver une classe de wxMenuEntry qui possède les informations (redondantes pour certaines) nécessaires à créer le toolbarItem lié.
J'ai commencé à réfléchir à ce point, mais je dois reconnaître que je vais devoir jouer la carte de l'expérimentation plus que de la réflexion, je ne parviens pas trop a visualiser le fonctionnement des toolbar... (aui ou pas) Peut-être que je vais utiliser un outil pour générer le diagramme des classes du code source...
Enfin, je pense que je re posterai ici quand j'aurai un truc qui semble correct.
[edit] En fait, je n'arrive pas à trouver de doc tout court au sujet de wxAuiToolbarItem. Je dois regarder dans les source pour essayer d'en comprendre les possibilités, ou il existe une doc sur cette classe quelque part? Il semble qu'elle hérite de wxControl, qui hérite de wxControlBase, qui elle-même hérite de wxWindow... Pas même de référence à une classe wxAuiXXX dans la chaîne d'héritage, je ne comprend pas trop le modèle qui l'inclut pour le coup... Je vais tenter de trouver de la doc sur ces mécanismes Aui, qui sont quand même très intéressants par rapport à la souplesse qu'ils trouvent, sinon je me laisse une semaine pour trouver le moyen de faire une classe qui fasse ce dont j'ai besoin, avant d'utiliser une méthode plus barbare, parce que ce n'est pas en bloquant sur un détail aussi '''insignifiant''' que l'UI qu'autorealm pourra renaître (le pire c'est que pour ce qui est lié au graphisme, j'ai une modélisation qui tiens super bien la route... jamais aimé les UI... toujours compliqué pour pas grand chose, mais un outil de dessin en ligne de commande serait... ahem...bref) ---------- Pour résoudre mon problème de code dupliqué & co plus tard (je pense ne pas tout avoir saisi au sujet de ta solution, d'où mon manque d'entrain à l'appliquer...) je vais créer mon architecture logicielle pour pouvoir supporter des plugin. Du coup, le problème est déplacé en attendant plus propre, vu que mes codes dupliqués ne seront plus situés dans le projet lui-même, mais dans des plug-in. Au moins le coeur sera propre, et quand ça commencera a tourner et a avoir quelques outils, je pense que j'aurai une idée pour résoudre définitivement le problème, au prix potentiel de la réécriture de plusieurs de ces entrées.
Je ne sais pas trop si je dois mettre résolu ou pas pour le coup, mais je tenait a préciser que je ne considère plus ce problème comme bloquant. (Mon objectif n°1 étant d'avoir un coeur propre et stable, décaler le problème me conviens pour le moment.)
Dernière modification par freem (01-02-2012 00:09:36)
| |
|
|