Tableaux¶
Développement initial en TCL/TK¶
Nouveau développement en QT/C++ (2011)¶
Nouveau nouveau développement QT 5.2¶
Fondé sur l'assistant leterrier-with-statemachine, ce développement va essayer (once more time) de rester au plus près des canons des logiciels du Terrier et des normes de dev Ryxéo.
Les tableaux à double entrée sont créés grâce à une "grande image" représentant le tableau entier rempli avec ses entêtes (voir fichier joint). Les cases du tableau ont une taille de 128 x 128 px (exactement). Les
cases et pièces à afficher sont choisies au hasard. Une classe dédiée au découpage de la grande image (iconesSet) a été créée AbulEduPieceCommonV1, elle retourne des QSharedPointer<QPixmap> pointant vers les icones voulues.
Partis pris de développement.¶
- Les paramètres des exercices sont sauvegardés dans des instances de la classe ExerciseDatas. Les différentes activités sont suffisamment proches pour qu'une seule classe suffise à les décrire.
- La classe ci-dessus fait un appel immodéré aux Q_PROPERTY afin de permettre un truc très pratique, l'export automatique de ces propriétés dans le fichier de configuration voir exportToFile(QSettings) et importFromFile(QSettings)
- Dans l'éditeur, afin de gérer assez simplement les ajouts et suppression d'exercices, la liste des exo est présentée dans un QListWidget, chaque item est lié par un setData(1, pointeur_vers_exerciceDatas), l'exerciceDatas lui-même est lié à l'item grâce à un setProperty("item", pointeur_vers_item)
- Dans le fichier de configuration module.conf, les exercices sont sauvegardés les uns à la suite des autres sans faire de array. Bien que contrevenant aux "normes", j'assume cette décision liée à la ressemblance entre les différentes activités.
Classes "outils"¶
- Afin d'avoir de jolis qdebug, j'ai surclassé l'opérateur operator<< pour les classes AbuEduPieceCommonV1 et ExerciseDatas
DEBUG 2014-02-24T17:48:15.233 abuledueditor.cpp @ 225 ----- ExerciseDatas --------------------- Type : ExercisePlacePiece Titre : "Exercice N°1" Image : "" Nombre de colonnes : 3 Nombre de lignes : 4 Nombre de pièces : 5 -----------------------------------------
- J'ai utilisé une classe Template afin de convertir les void* en QVariant et vice versa afin de pouvoir les utiliser dans setProperty et setData.
/// @brief conversion de pointer void* en Qvariant et vice versa /// @code /// MyClass *p; /// QVariant v = VariantPtr<MyClass>::asQVariant(p); /// /* Retrouver le pointer */ /// MyClass *p1 = VariantPtr<MyClass>::asPtr(v); /// @endcode template <class T> class VariantPtr { public: /* Retrouver le pointeur */ static T* asPtr(QVariant v) { return (T *) v.value<void *>(); } /* Transformer le pointeur en QVariant */ static QVariant asQVariant(T* ptr) { return qVariantFromValue((void *) ptr); } };