IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Impl�menter un syst�me de raccourcis clavier pour mon application


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre du Club Avatar de lilivve
    Homme Profil pro
    Creative coding
    Inscrit en
    Mars 2018
    Messages
    7
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : Creative coding
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mars 2018
    Messages : 7
    Par d�faut Impl�menter un syst�me de raccourcis clavier pour mon application
    Bonjour,

    Je suis en train de r�fl�chir � comment ajouter des raccourcis claviers configurables � mon programme. N'�tant pas le premier � vouloir faire ceci j'ai cherch� sur le net des tutos, frameworks, biblioth�ques mais sans r�sultat. Peut-�tre aurais-je ici des pistes pour ne pas r�inventer la roue!

    Ce que je sais d�j� faire:
    - Ecouter les touches press�es
    - Associer une touche � par exemple une std::function<void()> et appeler cette fonction quand la touche est press�e.

    Ma question est au niveau de la conception de mon syst�me de gestion des raccourcis. J'explique le syst�me que j'imagine:

    Il y a des classes avec des m�thodes publiques, et des objets instances de ces classes.
    On peut associer certaines m�thodes de certains de ces objets � des raccourcis clavier, et modifier ces raccourcis pendant l'ex�cution (et du coup que l'utilisateur puisse le faire).

    Il y a plusieurs "jeux" de raccourcis claviers. Selon l'�tat de l'application tel ou tel jeu de raccourcis est actif. Une m�me touche peut donc, selon les jeux actifs, d�clencher l'appel de diff�rentes m�thodes.
    Il y a au moins un jeu de base, actif tout le temps, qui contient les raccourcis g�n�raux de pilotage global de l'application (la fermer, basculer entre ses �tats principaux, afficher ou cacher certaines fen�tres, etc).
    Et il y a des jeux de raccourcis suppl�mentaires, sp�cifiques � l'�tat de l'application. Par exemple quand l'application est en train de lire des vid�os la touche espace fait le play/pause, mais plus tard quand l'application est en mode enregistrement du son du microphone la touche espace d�clenche ou stoppe cet enregistrement.
    Plusieurs jeux de raccourcis suppl�mentaires peuvent �tre actifs en m�me temps.
    Donc, quand une touche est enfonc�e, le programme d�clenche la fonction associ�e dans le jeu de raccourcis globaux. S'il n'y a pas de fonction associ�e dans ce jeu elle cherche s'il y a une fonction associ�e dans un des autres jeux, et l'ex�cute.

    Les objets r�pondant aux touches peuvent �tre cr��s et d�truits pendant l'ex�cution du programme. La m�thode d'un objet associ�e � une touche doit donc �tre appel�e uniquement si l'objet existe, bien s�r.

    Les objets peuvent recevoir le focus. Dans un m�me jeu de raccourcis, plusieurs objets peuvent associer une m�thode � une m�me touche. Quand la touche est press�e c'est l'objet qui a le focus qui aura sa m�thode associ�e ex�cut�e.

    Il doit �tre possible de sauvegarder et charger les jeux de raccourcis sur le disque, de pr�f�rence sous forme texte (qui soit donc �ditable � la main).

    Donc voil�, je suis en train de me demander comment articuler tout cela, avec donc la sensation d'�tre en train de coder quelques chose qui l'a d�j� �t� par d'autres. Est-ce que quelqu'un aurait une piste d'impl�mentation, un pattern � proposer ? En m�me temps j'ai l'impression que ma question est complexe...
    Merci

  2. #2
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    Salut,

    cote structure, un truc sympa pourrait etre une std::map<Bind, Callback> avec Bind quelque chose comme par exemple struct Bind { std::vector<Button> }; qui contient les boutons qui doivent etre presses pour activer le raccourci et Callback pourrait etre using Callback = std::function<void(void)>;.
    La partie la plus difficile c'est de creer ce Bind dynqmiauement pendant l'execution si tu as des combinaisons plus complexes que modifier+1 bouton puisque les timings sont jamais parfaits.
    Ensuite si tu comptes avoir differents niveaux et priorites, faut placer et tester ces elements aux endroits correspondants, en partant du focus puis traversant les parents iterativement jusqu'a ce qu'un d'eux interceptent et activent une action.
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  3. #3
    Membre du Club Avatar de lilivve
    Homme Profil pro
    Creative coding
    Inscrit en
    Mars 2018
    Messages
    7
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : Creative coding
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mars 2018
    Messages : 7
    Par d�faut
    Merci pour ta r�ponse Bousk,

    Apr�s plusieurs jours j'en suis arriv� � quelque chose qui semble satisfaisant pour mon usage. Le principe est que j'ai d'une part une table des raccourcis existants de l'application:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    std::unordered_multimap< keyboard::Stroke, CallbackID > shortcuts ;
    o� pour le moment CallbackID est une string et o� keyboard::Stroke est ceci:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Stroke
    {
    	public:
    		int keyCode = 0 ;
    		bool ctrlModifier = false ;
    		bool majModifier = false ;
    		bool altModifier = false ;
    		std::string text ;                // Une représentation de la touche en texte, par exemple "Ctrl+A"
    }
    Et que d'autre part j'ai une table des callbacks existants qui associe chaque raccourci clavier � la fonction qu'il doit appeler:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    std::unordered_map< CallbackID, Callback > bindings ;
    Un Callback �tant:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class Callback
    {
    	public:
    		CallbackID id ;
    		typedef std::function< void ( ) > function ;          // La fonction a exécuter 
    		typedef std::function< bool ( ) > precondition ;    // Une fonction qui doit renvoyer true pour que la fonction soit exécutée
    }
    (je ne montre pas tout le code, juste ce qu'il faut pour expliquer le principe)

    Quand une touche est press�e je regarde dans la premi�re table shortcuts si des CallbackID lui sont associ�s. Je regarde ensuite dans la table bindings si les Callback qui ont ces ID existent. Pour ceux-ci, je commence par regarder parmi ceux qui ont une precondition d�finie, et j'ex�cute la function du premier Callback dont la precondition renvoie true. Si je n'en trouve pas j'ex�cute alors la function du premier Callback qui n'a pas de precondition.

    Le d�couplage en deux tables, shortcuts et bindings complique mais � deux avantages:
    - Je peux sauvegarder sur le disque la table shortcuts, ensemble des raccourcis de l'application, sous une forme texte que je peux �ventuellement �diter � la main, et charger au lancement du programme.
    - Je peux instancier des objets � n'importe quel moment de la vie de l'application, et ces objets peuvent d�clarer leurs callbacks dans la table bindings, et les rendre accessibles. Quand un objet cens� r�pondre � un raccourci clavier n'existe pas il ne se passe rien.

    Un inconv�nient est que je dois m'assurer de l'unicit� de chaque CallbackID. En m�me temps si je veux pouvoir sauvegarder les raccourcis sous forme texte, il me semble que je dois forc�ment en passer par l�.

    J'ai introduis la gestion du focus gr�ce � l'histoire de la precondition, qui pourra d'ailleurs servir � un autre usage. Je choisis alors de cr�er le Callback avec une precondition de ce genre:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    [ this ](){ return isFocused ; }
    C'est une gestion rudimentaire du focus, un objet a le focus ou ne l'a pas, et je n'ai pas de relation parent/enfant entre les diff�rents objets qui ont des Callbacks, mais cela semble suffire � mes besoins.

    D'autre part j'ai en r�alit� plusieurs jeux de raccourcis, chacun avec sa table shortcuts, que je peux activer ou d�sactiver selon l'�tat de l'application. Ceci me permet d'avoir une m�me touche qui � un moment va d�clencher une action, et plus tard une autre. Par exemple la touche espace pour du play/pause.

    S'il y a des remarques sur ce que j'ai commis, je suis preneur

  4. #4
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 505
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 505
    Par d�faut
    J'ai l'impression que l'essence m�me du "raccourci" n'est pas dans ce machin.
    Un raccourci, c'est pour r�duire le nombre d'actions � faire dans une IHM pour acc�l�rer le travail.
    Sous Windows (du moins si l'on respecte les guidelines), ces raccourcis sont affich�s explicitement dans les menus de fen�tre et les menus contextuels.
    Ici, je ne vois aucunement cette int�gration graphique.
    Un framework comme les MFC int�gre directement la gestion des raccourcis dans les utilitaires de cr�ation des interfaces graphiques.
    Rendre ces raccourcis "customisables", c'est juste rendre des composants graphiques (menuItems) "customisables".
    Il n'y a pas une tambouille en sous-marin pour les 0.001% des utilisateurs qui ont retenus les 18 modes de base des 25 jeux de raccourcis, avant qu'un plugin simplifie ce capharna�m.

  5. #5
    Membre du Club Avatar de lilivve
    Homme Profil pro
    Creative coding
    Inscrit en
    Mars 2018
    Messages
    7
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : Creative coding
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mars 2018
    Messages : 7
    Par d�faut
    Merci pour tes remarques Bacelar,
    Les 0.001% des utilisateurs �a ne va pas faire beaucoup, vu qu'on est 2 � utiliser cette application !
    (c'est une application de r�gie son/vid�o/animations pour un spectacle).
    L'interface graphique est faite avec ImGui, et j'ai bien ajout� ce qu'il faut pour faire apparaitre les raccourcis � c�t� des divers boutons , et les modifier.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Cr�er raccourci (ShortCut) pour mon application
    Par cp-08jhu dans le forum Android
    R�ponses: 2
    Dernier message: 12/10/2012, 11h53
  2. cr�er raccourci clavier pour une application console
    Par aurelien3030 dans le forum C#
    R�ponses: 6
    Dernier message: 08/03/2011, 18h03
  3. R�ponses: 8
    Dernier message: 04/01/2008, 16h46
  4. [eclipse 3.0.1]Raccourci clavier pour changer de fichier
    Par partyboy dans le forum Eclipse Java
    R�ponses: 1
    Dernier message: 04/11/2004, 15h06
  5. [] Raccourci clavier pour bouton d'une barre d'outil
    Par S�bastien dans le forum VB 6 et ant�rieur
    R�ponses: 12
    Dernier message: 24/03/2003, 17h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo