Interface graphique C++, ou comment perdre son temps

Comme mentionné précédemment, je travaille sur un générateur de terrain utilisant la SFML (plus de détails à ce sujet prochainement). Mais maintenant que le coeur de l'application est fonctionnel, j'aimerais ajouter une GUI pour modifier les paramètres.

Si j'avais su.

Donc. Je sais que nous devons travailler avec Qt cette année, donc j'ai voulu utiliser Qt. Mais à vue d’œil, la compilation sous VC2010 s'annonçait particulièrement agaçante, donc j'ai regardé ailleurs.

wxWidgets s'annonçait sympathique. Mais dommage, pas de version VC2010. Mais attendez, il y a une version compilée, wxPack, compatible VC2010 ! Eh, pas tant que ça. wxPack ne s'intègre pas à VC 2010 donc c'est une horreur pour linker, il faut spécifier chaque librairie à la main, sans information sur lesquelles sont nécessaires (et le "trial and error" commence à être vraiment fatiguant passé 20 librairies). L'intégration fonctionne sous la version 2008 de Visual. Qui en plus d'être moins jolie - sisi c'est un argument important - refuse de me colorer les parenthèses correspondantes en lecture. La syntaxe de wxWidgets est de plus vraiment affreuse, utilisant des macros absolument partout. Et je n'apprécie que moyennement de recevoir 400 warnings en provenance des libs au linking.

Retour à Qt alors, en utilisant QtCreator ? J'imagine. Ou pas. L'installeur a apparement cafouillé et refusé d'installer les projets d'exemple. Et le package manager refuse de se lancer à cause de metadonnées d'un composant non trouvées. Donc hop, téléchargeons la version offline de l'installeur.

Pendant ce temps - c'est que c'est long à télécharger, 1.4Go - je recherche à nouveau une alternative. J'avais entendu parler de GTK+, mais n'avais pas creusé la question. Tiens, un wrapper C++ appelé gtkmm. Télécharger. Installer. Ajouter les feuilles de propriétés pour VC2010, sympathiquement inclues dans l'installation. Code d'exemple. Compiler. Exécuter. Un petit warning de rien du tout. Exécution impeccable. Sans parler du petit détail tout bête mais agréable : une section "Effets de bord de l'installeur" mentionnant les variables d'environnement modifiées à l'installation. Ce qui est bien trop rare !

Le téléchargement de Qt n'était même pas fini.

Donc je suppose que je vais rester à gtkmm. Pas de macros moches, installation simple, multi-plateformes. Que demander de plus ? (Edit / Spoiler : la création simple d'un contexte OpenGL par exemple ? On ne peut pas tout avoir... Je verrai bien à quoi j'arrive.)

Permettre l’utilisation de la SFML sous Visual C++ 2010

Eh oui, car la SFML n'est (au jour où j'écris) disponible "que" pour les versions 2005 et 2008, en plus de MinGW. Vous me direz "y'a qu'à utiliser des logiciels libres !". Vu que mon but à court / moyen terme est de me familiariser avec Visual Studio, ce serait un brin dommage. Donc, SFML sous Visual.

Tout d'abord, pour éviter le moindre souci d'incompatibilité, il faut recompiler la SFML (ou télécharger mes propres binaires si vous n'avez pas le courage :D). Pour cela :

  • Télécharger le SDK complet à cette adresse : http://www.sfml-dev.org/download.php.
  • Extraire dans un répertoire qui sera celui de référence pour cette librairie.
  • Ouvrir SFML.sln, qui se trouve dans build/vc2008.
  • Visual Studio propose de convertir le projet, cliquer sur suivant jusqu'à ce que ça soit fait. S'il y a quelques erreurs, c'est normal : il s'agit des projets d'exemple, qui ne nous intéressent pas ici.
  • Supprimer de la solution tous les projets autres que les 6 en "sfml-" quelque chose.
  • Ensuite, recompiler les quatre cibles : Debug DLL, Debug static, Release DLL, Release static (choix dans le menu déroulant en haut à gauche).
  • Normalement tout devrait bien se passer : fermer la solution.
  • La compilation a créé des fichiers .lib dans lib/vc2008 : personnellement j'ai remplacé ceux présent dans lib avec ceux-là.

Pour lier la SFML à un projet, il faudra réaliser deux actions. La première consiste à indiquer l'emplacement de la librairie à Visual. Pour cela, aller dans les propriétés du projet, Configuration Properties, VC++ Directories. En haut à gauche, dans le menu déroulant, choisir All targets. Puis :

  • Dans Include Directories, ajouter le répertoire include du dossier où se trouve la SFML.
  • Dans Library Directories, ajouter le répertoire lib du dossier où se trouve la SFML.

La seconde action indique à l'éditeur de liens les librairies à utiliser. Pour cela, aller dans Configuration Properties, Linker, Input. Puis :

  • En configuration Debug : indiquer les librairies utilisées, de la forme sfml-...-d.lib
  • En configuration Release : indiquer les librairies utilisées, de la forme sfml-....lib
  • Si vous souhaitez effectuer une liaison statique (inclusion dans l'exécutable) plutôt que dynamique (par une DLL), il faut alors utiliser les formes sfml-...-s-d.lib et sfml-...-s.lib

En cas de liaison dynamique, il faut bien évidemment placer les DLL nécessaires dans le dossier du projet (pas de la solution), en version debug et release.

Et si je n'ai rien oublié, le projet devrait compiler et s'exécuter tranquillement... Visual râlera contre des fichiers PDB manquants en mode debug, mais ce n'est rien de dramatique. Au départ j'avais oublié de remplacer les fichiers de lib par leurs nouvelles versions de lib/vc2008, et le programme fonctionnait en Release mais pas en Debug ("Application failed to start correctly, error 0xc0150002" ou quelque chose du genre).

Avec tout ça en place, et en utilisant les tutoriels situés ici (section "Window package"), j'ai rapidement obtenu une fenêtre avec un cube qui tourne et enchaîné sur un générateur de terrain. Mais les détails seront pour plus tard ;)

Mise en place...

Eh bien ce fut amusant ... Voyons donc à quel point ces deux derniers jours ont été instructifs, et listons ce qui m'est arrivé au cas où cela puisse aider quelqu'un (ou le faire rire, c'est selon).

  • Trouver un moyen d'accéder à mon hébergement OVH via SSH : non ce n'est pas aussi simple que c'est écrit dans le guide. Celu-ci affirme qu'on peut utiliser indifféremment pro.ovh.net ou son nom de domaine pour se connecter. Personnellement, je n'ai jamais réussi à me connecter sur pro.ovh.net. Allez comprendre.
  • Mettre en place wordpress : un vrai bonheur, simple et rapide. OVH interdit l'accès internet depuis les hébergements mutualisés, donc il faut télécharger chez soi puis uploader (via Filezilla par exemple). Mais ensuite, de la création de la base de données à l'exécution du script d'installation, aucun souci.
  • Installer SVN : là-dessus le guide OVH est fiable. Vous pouvez donc le suivre sans souci : guides.ovh.com/SVNMutu. Une chose à savoir : si vous êtes aussi barbare que moi et utilisez l'exécutable de Putty au lieu d'utiliser l'installeur, "charger la clef dans Pageant" ne se résume pas à un double clic. Il faut d'abord indiquer à Windows avec quoi ouvrir le fichier de clé publique généré par PuttyGen. Ah et au moins sous Windows 7, la fameuse "icône en bas à droite" apparaît en fait dans les miniatures de la zone de notification.
  • Installer WebSVN : jusque là pas de souci. Une fois de plus, télécharger, uploader, dézipper. Il suffit ensuite d'indiquer le répertoire du dépôt SVN dans le fichier de configuration (qui n'existe pas au départ ! il faut copier include/distconfig.php en include/config.php).
  • Ajouter un login à WebSVN (histoire de ne pas laisser les dépôts en lecture libre) : CA c'était amusant, trois heures de galère. Les informations que j'ai trouvées étaient toutes complexes et impliquaient la configuration poussée d'Apache, à laquelle je n'avais apparemment pas accès. J'ai renoncé à l'idée de faire quelque chose de propre et choisi de faire un .htaccess simple (AuthName, AuthType, AuthUserFile, Require valid-user) lisant un .htpasswd (situé hors des répertoires web public, bien sûr ;)). L'inconvénient est qu'il n'est pas possible de filtrer les accès par dépôt avec cette méthode, mais c'est mieux que de laisser mes dépôts SVN en lecture libre.
  • Le tout pour remarquer que WebSVN avait changé la version de PHP et cassé Wordpress. Heureusement la réparation fut simple, un simple SetEnv PHP_5 ajouté en tête du .htaccess de Wordpress.

Prochaine étape : intégrer un bug tracker (a priori Mantis) ! On verra bien, ce n'est pas urgent.