Voir aussi : Développement du site web
Tâches non effectuées lors du développement de la 0.2 (cf Notes pour la version 0.2) :
TODO :
Faire le point sur tout ce qui est améliorable pour la 0.21 ⇒ voir Changelog ci-dessous
Tenir à jour le ChangeLog de la version 0.21
Finir le guide de démarrage rapide ? Non, ce ne sera pas prêt pour la 0.21
Améliorer l'installeur Windows :
Intégrer le guide de démarrage rapide au niveau des raccourcis générés ⇒ non disponible
Test de l'application avec Qt 4.4.x, 4.5.x et 4.6.x :
Virer “titre du document” dans le cartouche ?
Faire le point sur les bugs de rendu connus :
Se décider à faire une release ⇒ samedi 06 et dimanche 07 Février 2010
Prévenir les packageurs du tag à venir (trem, scorpio, Remi) ⇒ trem n'est pas dispo le week-end de la release, mais bon, il faut bien faire la release un jour
Préparer la dépêche pour linuxfr.org : Useless, il s'agit seulement d'une version mineure
Préparer la news pour qelectrotech.org ⇒ huxley:/home/xavier/news.qet.0.21.txt
Vérifier l'état des traductions : il serait souhaitable que les traductions espagnoles soient confirmées par Youssef ou Alfredo, mais à part ça, le statut des traductions est plus que satisfaisant ; les .ts pour Qt ont également été mis à jour
Modifier le displayedVersion et le splash screen
Tagger la version dans le dépôt Subversion : SVN_ROOT="svn+ssh://xavier@svn.tuxfamily.org/svnroot/qet/qet" svn cp ${SVN_ROOT}/trunk ${SVN_ROOT}/tags/0.21 -m "Tag de la version 0.21"
Générer le paquet src et l'uploader : SVN_ROOT="svn+ssh://xavier@svn.tuxfamily.org/svnroot/qet/qet" SSH_ACCESS="xavier@ssh.tuxfamily.org" SSH_TAGS_PATH="/home/qet/qet-repository/tags" SSH_DEBIANWATCH_PATH="/home/qet/qet-repository/debianwatch" QET_VERSION="0.21" archive_name="qelectrotech-${QET_VERSION}-src" now_date="$(date "+%Y%m%d")" ssh_tags_dir="${SSH_TAGS_PATH}/${now_date}" cd /tmp umask 0022 svn export $SVN_ROOT/tags/${QET_VERSION} ${archive_name} tar czvf ${archive_name}.tar.gz ${archive_name}/ chmod 664 ${archive_name}.tar.gz ssh ${SSH_ACCESS} "mkdir -p ${ssh_tags_dir} && chmod g+w ${ssh_tags_dir}" scp ${archive_name}.tar.gz ${SSH_ACCESS}:${ssh_tags_dir}/ rm -rf ${archive_name} ${archive_name}.tar.gz ssh ${SSH_ACCESS} "cd ${SSH_DEBIANWATCH_PATH} && ln -s ../tags/${now_date}/${archive_name}.tar.gz ${archive_name}.tar.gz"
Ajouter un lien symbolique dans http://download.tuxfamily.org/qet/debianwatch/ (cf script ci-dessus) et mdifier releases.txt
Windows : paquet ready to use (ne pas oublier les .dll dans bin\)
Windows : installeur (ne pas oublier les .dll dans bin\)
Slackware,
Fedora ⇒ Remi,
Mises à jour :
Prévenir les packageurs du tag à venir (trem, scorpio, Remi) ⇒ failed
Préparer la dépêche pour linuxfr.org : Useless, il s'agit seulement d'une version mineure
Rédiger le Changelog 0.21 -> 0.22
Préparer la news pour qelectrotech.org ⇒ huxley:/home/xavier/news.qet.0.22.txt
Vérifier l'état des traductions : All right
Modifier le displayedVersion et le splash screen
Tagger la version dans le dépôt Subversion : SVN_ROOT="svn+ssh://xavier@svn.tuxfamily.org/svnroot/qet/qet" svn cp ${SVN_ROOT}/trunk ${SVN_ROOT}/tags/0.22 -m "Tag de la version 0.22"
Générer le paquet src et l'uploader : SVN_ROOT="svn+ssh://xavier@svn.tuxfamily.org/svnroot/qet/qet" SSH_ACCESS="xavier@ssh.tuxfamily.org" SSH_TAGS_PATH="/home/qet/qet-repository/tags" SSH_DEBIANWATCH_PATH="/home/qet/qet-repository/debianwatch" QET_VERSION="0.22" archive_name="qelectrotech-${QET_VERSION}-src" now_date="$(date "+%Y%m%d")" ssh_tags_dir="${SSH_TAGS_PATH}/${now_date}" cd /tmp umask 0022 svn export $SVN_ROOT/tags/${QET_VERSION} ${archive_name} rm -rf ${archive_name}/ico/scalable ${archive_name}/ico/oxygen-icons/scalable/ tar czvf ${archive_name}.tar.gz ${archive_name}/ chmod 664 ${archive_name}.tar.gz ssh ${SSH_ACCESS} "mkdir -p ${ssh_tags_dir} && chmod g+w ${ssh_tags_dir}" scp ${archive_name}.tar.gz ${SSH_ACCESS}:${ssh_tags_dir}/ rm -rf ${archive_name} ${archive_name}.tar.gz ssh ${SSH_ACCESS} "cd ${SSH_DEBIANWATCH_PATH} && ln -s ../tags/${now_date}/${archive_name}.tar.gz ${archive_name}.tar.gz"
Ajouter un lien symbolique dans http://download.tuxfamily.org/qet/debianwatch/ (cf script ci-dessus) et modifier releases.txt
Paquets pour :
Windows : paquet ready to use (ne pas oublier les .dll dans bin\)
Windows : installeur (ne pas oublier les .dll dans bin\)
Slackware,
Debian ⇒ Laurent,
Fedora ⇒ Remi,SVNROOT="svn+ssh://xavier@svn.tuxfamily.org/svnroot/qet/qet" BRANCHE="0.3" svn cp "${SVNROOT}/trunk" "${SVNROOT}/branches/${BRANCHE}" -m "Creation de la branche ${BRANCHE}"
Effectué — Xavier G. 16/08/2009 18:52
Dans l'éditeur d'éléments, les textes statiques et les champs de texte sont positionnés de la même manière : dans ElementScene::mouseReleaseEvent, si l'on est en mode Text ou TextField, la position du curseur est affectée aux champs de texte via PartText::setPos et PartTextField::setPos. Ces deux méthodes ont le même code :
void PartText::setPos(qreal x, qreal y) { QGraphicsTextItem::setPos(QPointF(x, y) - margin()); }
Un décalage est donc appliqué à la position réellement cliquée ; cette marge est fournie par les méthodes margin(), identiques entre les deux classes :
QPointF PartTextField::margin() const { QFont used_font = font(); QFontMetrics qfm(used_font); QPointF margin( (boundingRect().width () - qfm.width(toPlainText())) / 2.0, ((boundingRect().height() - used_font.pointSizeF()) / 3.0) + used_font.pointSizeF() ); return(margin); }
En abscisse :
En ordonnée :
Lors du rendu des textes statiques sur le schéma, la méthode CustomElement::parseText passe directement les coordonnées lues dans la description XML à la méthode QPainter::drawText :
qp.drawText(QPointF(pos_x, pos_y), e.attribute("text"));
Voici la documentation de cette méthode :
void QPainter::drawText ( const QPointF & position, const QString & text )
Draws the given text with the currently defined text direction, beginning at the given position.
This function does not handle the newline character (\n), as it cannot break text into multiple lines, and it cannot display the newline character. Use the QPainter::drawText() overload that takes a rectangle instead if you want to draw multiple lines of text with the newline character, or if you want the text to be wrapped.
By default, QPainter draws text anti-aliased.
Note: The y-position is used as the baseline of the font.
Constats :
Lors du positionnement des champs de texte sur le schéma, la position indiquée dans la description XML est passée à ElementTextItem::setPos, qui lui applique le traitement suivant :
actual_pos -= QPointF(0.0, boundingRect().height() / 2.0);
⇒ utilisation du milieu vertical du boundingRect du champ de texte.
Attention : le boundingRect a été agrandie de 1.1px vers le haut (classe ElementTextItem) ⇒ à répercuter dans la classe PartTextField ?
Le but initial était de travailler avec :
En clair, le but était d'enregistrer des coordonnées indiquant où commence la représentation graphique du texte afin que le chargement d'un texte statique (donc dessiné) n'ait pas à le calculer, et que le calcul inverse puisse être effectué pour les champs de texte.
Au final, dans l'éditeur de schéma, un décalage est tout de suite visible :
Pour les champs de texte statiques, on pourrait :
affiner les calculs actuels de l'ordonnée, qui représenterait la baseline ⇒ solutionné : prendre en compte le documentMargin de la classe QTextDocument ainsi que l'ascent de la police utilisée
problème : il resterait à gérer les champs de texte à plusieurs lignes ⇒ solutionné en effectuant le rendu via la classe QTextDocument
se baser sur le “top of the font” (voir http://qt.nokia.com/doc/4.5/qpainter.html#drawText-10 - définition à éclaircir)
problème : les éléments existants (collection officielle ou non) ont été créés en “visant” la baseline
solution : ajouter un attribut genre positionning=“top” pour distinguer s'il faut appliquer l'ancien ou le nouveau comportementPour les champs de texte dynamiques, on pourrait :
affiner les calculs et les implémenter des deux côtés ⇒ choix du champ de texte positionné par le milieu de son côté gauche
stocker simplement la position du champ de texteDocumentation complémentaire :
Voici les nouvelles fonctionnalités demandées par rapport aux textes :
pouvoir pivoter des textes statiques dans l'éditeur d'éléments ; ceci implique :
de modifier l'éditeur de façon à pouvoir pivoter les textes statiques (cohérence du positionnement et du pivotement, annulations, etc.)
de modifier le format .elmt de façon à pouvoir mémoriser l'orientation d'un texte statique
pouvoir pivoter les textes dynamiques sur les schémas ; ceci est valable pour :
les textes indépendants ⇒ modification de la classe DiagramTextItem ⇒ attribut XML “rotation” ajoutés aux éléments XML diagram/inputs/input + annulations ok, rotation par rapport au point (0, 0), c-à-d le coin supérieur gauche du champ
les textes des conducteurs ⇒ modification de la classe DiagramTextItem ⇒ attribut XML “rotation” ajoutés aux éléments XML diagram/conductors/conductor + annulations ok, rotation par rapport au point (0, 0), c-à-d le coin supérieur gauche du champ
les textes dynamiques des éléments ; cela implique de pouvoir définir dans l'éditeur d'éléments, et ce pour chaque texte dynamique, une orientation par défaut. La rotation s'effectue par rapport au milieu du côté gauche du champ de texte
Modification des deux éditeurs pour que le positionnement se fasse correctement par rapport au milieu du côté gauche du champ de texte
Modification des deux éditeurs pour que l'ajout ou le retrait de lignes dans un champ de texte ne modifie pas sa position
Modification de l'éditeur d'élément pour que le changement de taille de police d'un champ de texte ne modifie pas sa position
Modification de la classe DiagramTextItem pour pouvoir pivoter via une méthode virtuelle qui fait réellement le travail de rotation
Redéfinition de cette méthode dans ElementTextItem pour effectuer la rotation par rapport au point
Adaptation de l'éditeur d'élément
Donner à l'utilisateur la possibilité de spécifier l'angle exact de l'orientation des champs de texte :
dialogue à finir (QTextOrientationWidget + QSpinBox = en faire un nouveau widget composite réutilisable, genre QTextOrientationSpinBoxWidget [quelle originalité, Xavier…] ?)
classe dérivée de QUndoCommand à réaliser : attributs : QHash<DiagramTextItem *, qreal> previous_state_ pour undo, qreal applied_orientation_ pour redo
Régler le bug/conflit entre la fonction followParentRotation (FPR) et la rotation elle-même : plan :
Dans un premier temps, désactiver la contre-rotation qui est actuellement appliquée aux champs de texte sans FPR lors du pivotement de leur élément parent
Implémenter le repositionnement des textes (cf ci-dessous)
Modifier la classe qui effectue et annule les pivotements d'éléments de façon à ce qu'elle inclut, pour chaque texte sans FPR de l'élément, une rotation et un déplacement ; le non-FPR est alors un `hint' pour dire « pivoter l'élément parent revient à pivoter l'élément parent, puis à pivoter et repositionner ce texte comme si l'utilisateur l'avait fait lui-même. »
Lors du chargement des schémas :
si le schéma chargé est en version >= 0.3, prendre en compte l'orientation et la position définies par l'utilisateur
si le schéma chargé est en version < 0.3, positionner le texte avec l'ancien comportement (=considérer la position ainsi calculée comme définie par l'utilisateur)
pouvoir repositionner les textes dynamiques comme on le souhaite :
la position des textes indépendants est déjà modifiable
textes dynamiques des éléments ⇒ flag à activer + gestion des déplacements + gestion des annulations + export XML à modifier
textes des conducteurs :
flag pour détecter le déplacement par l'utilisateur
algo pour limiter ce déplacement aux alentours du conducteur
algo pour ramener le texte dans les alentours du conducteur si celui-ci est modifié
annulation des repositionnements dûs à la modification d'un conducteur
annulation des repositionnements à la souris
annulation du flag moved_by_user
annulation des repositionnements dûs aux déplacement d'éléments
lors de l'update des conductorsToUpdate()
mémoriser les positions de leurs ConductorTextItem
Enregistrer les positions dans les fichiers et les relire
Questions :
le positionnement d'un champ de texte ayant un parent doit-il être absolu (le parent bouge, le texte ne le suit pas) ou relatif (le parent bouge, la position du texte en est modifiée) ? ⇒ à priori relatif ; pour du positionnement absolu, il y a les champs de texte indépendants
quels attributs XML pour spécifier la position modifiée d'un champ de texte ? ⇒ “userposition”, pour être cohérent avec l'attribut “userrotation”, utilisé pour redéfinir l'orientation d'un champ de texte dynamique d'élément sur le schéma
par rapport à quel point est effectué le pivotement ? ⇒ le même que pour le positionnement, c-à-d :
concernant l'édition des champs de texte, faut-il :
opter pour la même politique que les champs de texte indépendants actuels (à savoir : clic pour sélectionner [et donc déplacer/pivoter] et double-clic pour éditer)
OU opter pour une édition via un simple clic, un déplacement en maintenant une touche enfoncée (éventuel conflit avec l'édition de texte ?) et un pivotement avec un raccourci clavier ?Remarques :
Si les textes et leurs parents (éléments, conducteurs) peuvent être largement séparés/éloignés, il serait de bon ton de mettre en valeur le conducteur / l'élement parent d'un texte sélectionné et vice-versa.Rien à voir : réflexions sur le futur des cartouches
Transformer le dialogue de sélection de manière à mettre en avant certaines couleurs :
Prévoir un système de templates pour l'apparence des conducteurs : on lit deux dossiers (un fourni par QET, l'autre dans la conf user), on y trouve un fichier XML par template ; chaque fichier XML contient les traductions du nom du template et ses caractéristiques (couleur1, couleur2, pointillés/style de trait). Le nom du template ET ses caractéristiques sont embarquées dans le conducteur ; dans les propriétés du conducteur, si le nom du template est reconnu, on le sélectionne dans la liste, sinon on considère qu'il s'agit d'une couleur personnalisée.