Table des matières

Documentation diverse et en vrac

Hiérarchie des classes de l'API des ElementsCollectionItem

Pour information, cette hiérarchie de classe permet d'accéder et de manipuler de manière abstraite des collections, catégories et éléments, que ceux-ci soient stockés sur un système de fichiers (classes d'implémentation File*) ou dans un projet (classes d'implémentation Xml*)

Contrôles effectués lors des déplacements / copies dans l'API des ElementsCollectionItem

Contrôle ElementsCollection ElementsCategory ElementDefinition
copy move copy move copy move
Handler provided ? [ok] [ok] [ok] [ok] [ok] [ok]
Dst != src ? [ok] [no] [ok] [ok] [no] [no]
Src is writable ? [no] [no] [no] [ok] [no] [ok]
Dst is readable ? [ok] [no] [ok] [ok] [ok] [ok]
Dst is writeable ? [ok] [no] [ok] [ok] [ok] [ok]
Dst already exists ? [ok] [no] [ok] [ok] [ok] [ok]
Already existing dst is writable ? [ok] [no] [ok] [ok] [ok] [ok]
Creation/deletion error ? [ok] [no] [ok] [ok] [ok] [ok]

Légende

[ok] Vérification effectuée
[no] Vérification non effectuée car non pertinente

Exemple : on n'a pas besoin de pouvoir modifier l'item source lors d'une copie.

À noter que certains de ces contrôles sont redondés dans l'interface utilisateur, plus exactement dans le panel d'éléments. Celui-ci n'autorise que les drag'n drop à priori possibles au regard des permissions sur les items et de leur type. Ces contrôles peuvent être désactivés via les variables ENABLE_PANEL_WIDGET_DND_CHECKS (elementspanelwidget.cpp:37) et ENABLE_PANEL_DND_CHECKS (elementspanel.cpp:35).

Embarquement des éléments dans les projets

Lorsqu'un élément (ou une catégorie) est ajouté à la collection embarquée d'un projet, il ne peut être référencé que par rapport à un projet donné, en tant qu'élément embarqué ; on a alors le couple de données suivant :

Ces données sont ce que retient un objet ElementsLocation pour désigner un élément sans ambiguïté. Les projets ouverts dans l'application étant numérotés et accessibles par leur numéro (on parle de “project id”), un élément peut également être désigné par une simple chaîne de caractères de la forme project<id>+embed://category1/category2/category3/element.elmt

Passage de projectx+embed:// à embed:// :

Passages de embed:// à projectx+embed:// :

QString type_id = e.attribute("type");
ElementsLocation element_location = ElementsLocation(type_id);
if (type_id.startsWith("embed://")) element_location.setProject(project_);

Lorsque le schéma est lu, si un élément se déclare de type embed://, alors l'ElementsLocation construit pour localiser l'élément en question se voit lié au projet auquel appartient ce schéma.

/**
	@return Une chaine de caracteres representant l'emplacement
*/
QString ElementsLocation::toString() const {
	QString result;
	if (project_) {
		int project_id = QETApp::projectId(project_);
		if (project_id != -1) {
			result += "project" + QString().setNum(project_id) + "+";
		}
	}
	result += path_;
	return(result);
}

Codes d'erreur lors du chargement d'un élément

Le chargement de l'élément … a échoué avec le code d'erreur….

Pourquoi -fno-ipa-sra ?

L'option -fno-ip-sra a été ajoutée dans le qelectrotech.pro suite à la découverte de l'erreur de compilation suivante avec g++ 4.6.2 sur plateforme x86_64:

Pour rappel, la compilation en mode “Release” utilise -O2 tandis que celle en mode “Debug” n'incorpore pas d'optimisations spécifiques.

L'erreur elle-même se traduit ainsi : au moment de générer le binaire final, l'éditeur de liens ld constate que elementspanel.o référence une fonction / un symbole qu'il n'a pas pu retrouvé ailleurs, à savoir T GenericPanel::valueForItem<T>(QTreeWidgetItem *). Une rapide analyse des objets générés confirme cette version des faits :

Une rapide recherche sur les optimisations activées avec ''-O2'' mais pas ''-O1'' nous conduit à l'option -fipa-sra (d'où -fno-ipa-sra) :

-fipa-sra
    Perform interprocedural scalar replacement of aggregates, removal of unused parameters and replacement of parameters passed by reference by parameters passed by value.

    Enabled at levels -O2, -O3 and -Os. 

Sans doute le compilateur a-t-il décidé que QTreeWidgetItem * (pointeur standard, 64 bits) pouvait être directement remplacé par un QTreeWidgetItem, mais ça ne semble pas avoir fait beaucoup de biens à la liste des symboles générés… Toute explication plus détaillée sera la bienvenue

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41750

note

problème de compilation seulement sur backport wheezy arch amd64 4:4.7.2, build ok en sid 4:4.8.1 avec dans le debian/rules

CFLAGS+=-O2
CXXFLAGS=-O3''
recentfiles.o release/moc_titleblockpropertieswidget.o release/moc_titleblocktemplate.o release/moc_titleblocktemplaterenderer.o release/moc_xmlelementdefinition.o release/moc_xmlelementscategory.o release/moc_xmlelementscollection.o release/moc_diagramselection.o release/moc_dialogautonum.o release/moc_dialogwaiting.o release/moc_numparteditorw.o release/moc_selectautonumw.o release/moc_arceditor.o release/moc_elementitemeditor.o release/moc_elementprimitivedecorator.o release/moc_elementscene.o release/moc_elementview.o release/moc_ellipseeditor.o release/moc_lineeditor.o release/moc_parttext.o release/moc_parttextfield.o release/moc_polygoneditor.o release/moc_qetelementeditor.o release/moc_rectangleeditor.o release/moc_styleeditor.o release/moc_terminaleditor.o release/moc_texteditor.o release/moc_textfieldeditor.o release/moc_dimensionwidget.o release/moc_helpercell.o release/moc_integrationmovetemplateshandler.o release/moc_movetemplateshandler.o release/moc_qettemplateeditor.o release/moc_
splittedhelpercell.o release/moc_templatecellwidget.o release/moc_templatedeleter.o release/moc_templatelocationchooser.o release/moc_templatelocationsaver.o release/moc_templatelogomanager.o release/moc_templatescollection.o release/moc_templateview.o release/moc_richtexteditor_p.o release/qrc_qelectrotech.o    -L/usr/lib/x86_64-linux-gnu -lQtSvg -lQtSql -lQtXml -lQtGui -lQtNetwork -lQtCore 
release/elementspanel.o: In function `ElementsPanel::slot_doubleClick(QTreeWidgetItem*, int)':
elementspanel.cpp:(.text+0x201c): undefined reference to `TitleBlockTemplateLocation GenericPanel::valueForItem<TitleBlockTemplateLocation>(QTreeWidgetItem*) const'
collect2: error: ld returned 1 exit status
make[2]: *** [qelectrotech] Error 1