2007-12-01 10:47:15 +00:00
/*
2010-01-03 16:25:37 +00:00
Copyright 2006 - 2010 Xavier Guerrin
2007-12-01 10:47:15 +00:00
This file is part of QElectroTech .
QElectroTech is free software : you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation , either version 2 of the License , or
( at your option ) any later version .
QElectroTech is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with QElectroTech . If not , see < http : //www.gnu.org/licenses/>.
*/
2007-01-30 22:32:21 +00:00
# include "elementspanel.h"
2007-09-21 13:22:18 +00:00
# include "qetapp.h"
2009-04-03 19:30:25 +00:00
# include "qetproject.h"
# include "diagram.h"
2007-04-05 01:13:14 +00:00
# include "elementscategory.h"
2007-06-30 17:41:07 +00:00
# include "customelement.h"
2009-04-03 19:30:25 +00:00
# include "fileelementscollection.h"
# include "fileelementdefinition.h"
2009-05-01 14:41:33 +00:00
# include "qeticons.h"
2009-04-03 19:30:25 +00:00
/*
Lorsque le flag ENABLE_PANEL_DND_CHECKS est defini , le panel d ' elements
effectue des verifications lors des drag ' n drop d ' elements et categories .
Par exemple , il verifie qu ' une categorie cible est accessible en ecriture
avant d ' y autoriser le drop d ' un element .
Supprimer ce flag permet de tester le comportement des fonctions de gestion
des items ( copy , move , etc . ) .
*/
# define ENABLE_PANEL_DND_CHECKS
2006-10-27 15:47:22 +00:00
2010-02-28 16:13:45 +00:00
/*
Largeur maximale , en pixels , de la pixmap accrochee au pointeur de la
souris
*/
# define QET_MAX_DND_PIXMAP_WIDTH 500
/*
Hauteur maximale , en pixels , de la pixmap accrochee au pointeur de la
souris
*/
# define QET_MAX_DND_PIXMAP_HEIGHT 375
2006-10-27 15:47:22 +00:00
/**
Constructeur
@ param parent Le QWidget parent du panel d ' appareils
*/
2009-04-03 19:30:25 +00:00
ElementsPanel : : ElementsPanel ( QWidget * parent ) :
QTreeWidget ( parent ) ,
common_collection_item_ ( 0 ) ,
custom_collection_item_ ( 0 )
{
2006-10-27 15:47:22 +00:00
// selection unique
setSelectionMode ( QAbstractItemView : : SingleSelection ) ;
2006-10-28 19:39:43 +00:00
setColumnCount ( 1 ) ;
2010-11-15 00:35:02 +00:00
setExpandsOnDoubleClick ( true ) ;
2006-10-29 17:52:57 +00:00
header ( ) - > hide ( ) ;
2006-10-27 15:47:22 +00:00
// drag'n drop autorise
setDragEnabled ( true ) ;
2009-04-03 19:30:25 +00:00
setAcceptDrops ( true ) ;
setDropIndicatorShown ( true ) ;
2010-11-14 20:11:57 +00:00
setAutoExpandDelay ( 1000 ) ;
2006-10-27 15:47:22 +00:00
2006-10-28 19:39:43 +00:00
// taille des elements
2006-10-27 15:47:22 +00:00
setIconSize ( QSize ( 50 , 50 ) ) ;
2007-02-26 22:42:46 +00:00
// charge les collections
reload ( ) ;
2006-11-11 18:25:42 +00:00
2007-12-29 19:05:50 +00:00
// la premiere fois, etend le premier niveau des collections
2009-04-03 19:30:25 +00:00
if ( common_collection_item_ ) common_collection_item_ - > setExpanded ( true ) ;
if ( custom_collection_item_ ) custom_collection_item_ - > setExpanded ( true ) ;
2007-12-29 19:05:50 +00:00
2006-11-11 18:25:42 +00:00
// force du noir sur une alternance de blanc (comme le schema) et de gris
// clair, avec du blanc sur bleu pas trop fonce pour la selection
2006-10-27 15:47:22 +00:00
QPalette qp = palette ( ) ;
2007-02-01 01:07:26 +00:00
qp . setColor ( QPalette : : Text , Qt : : black ) ;
qp . setColor ( QPalette : : Base , Qt : : white ) ;
qp . setColor ( QPalette : : AlternateBase , QColor ( " #e8e8e8 " ) ) ;
qp . setColor ( QPalette : : Highlight , QColor ( " #678db2 " ) ) ;
2006-11-11 18:25:42 +00:00
qp . setColor ( QPalette : : HighlightedText , Qt : : white ) ;
2006-10-27 15:47:22 +00:00
setPalette ( qp ) ;
2007-06-30 17:41:07 +00:00
// double-cliquer sur un element permet de l'editer
connect ( this , SIGNAL ( itemDoubleClicked ( QTreeWidgetItem * , int ) ) , this , SLOT ( slot_doubleClick ( QTreeWidgetItem * , int ) ) ) ;
2007-10-28 16:03:18 +00:00
// emet un signal au lieu de gerer son menu contextuel
setContextMenuPolicy ( Qt : : CustomContextMenu ) ;
2006-10-27 15:47:22 +00:00
}
2007-04-12 03:13:13 +00:00
/**
Destructeur
*/
ElementsPanel : : ~ ElementsPanel ( ) {
}
2009-04-03 19:30:25 +00:00
/**
@ param qtwi Un QTreeWidgetItem
@ return true si qtwi represente une collection , false sinon
*/
bool ElementsPanel : : itemIsACollection ( QTreeWidgetItem * qtwi ) const {
if ( ElementsCollectionItem * qtwi_item = collectionItemForItem ( qtwi ) ) {
return ( qtwi_item - > isCollection ( ) ) ;
}
return ( false ) ;
}
/**
@ param qtwi Un QTreeWidgetItem
@ return true si qtwi represente une categorie , false sinon
*/
bool ElementsPanel : : itemIsACategory ( QTreeWidgetItem * qtwi ) const {
if ( ElementsCollectionItem * qtwi_item = collectionItemForItem ( qtwi ) ) {
return ( qtwi_item - > isCategory ( ) ) ;
}
return ( false ) ;
}
/**
@ param qtwi Un QTreeWidgetItem
@ return true si qtwi represente un element , false sinon
*/
bool ElementsPanel : : itemIsAnElement ( QTreeWidgetItem * qtwi ) const {
if ( ElementsCollectionItem * qtwi_item = collectionItemForItem ( qtwi ) ) {
return ( qtwi_item - > isElement ( ) ) ;
}
return ( false ) ;
}
/**
@ param qtwi Un QTreeWidgetItem
@ return true si qtwi represente un projet , false sinon
*/
bool ElementsPanel : : itemIsAProject ( QTreeWidgetItem * qtwi ) const {
return ( projects_ . contains ( qtwi ) ) ;
}
/**
@ param qtwi Un QTreeWidgetItem
@ return true si ce que represente qtwi est accessible en ecriture
*/
bool ElementsPanel : : itemIsADiagram ( QTreeWidgetItem * qtwi ) const {
return ( diagrams_ . contains ( qtwi ) ) ;
}
/**
@ param qtwi Un QTreeWidgetItem
@ return true si le qtwi est associe a une ElementsLocation
*/
bool ElementsPanel : : itemHasLocation ( QTreeWidgetItem * qtwi ) const {
return ( locations_ . contains ( qtwi ) ) ;
}
/**
@ param qtwi Un QTreeWidgetItem
@ return true si qtwi represente un element , false sinon
*/
bool ElementsPanel : : itemIsWritable ( QTreeWidgetItem * qtwi ) const {
if ( ElementsCollectionItem * qtwi_item = collectionItemForItem ( qtwi ) ) {
return ( qtwi_item - > isWritable ( ) ) ;
}
return ( false ) ;
2007-08-28 21:17:11 +00:00
}
2009-04-03 19:30:25 +00:00
/**
@ param qtwi Un QTreeWidgetItem
@ return L ' ElementsCollectionItem represente par qtwi , ou 0 si qtwi ne
represente pas un ElementsCollectionItem
*/
ElementsCollectionItem * ElementsPanel : : collectionItemForItem ( QTreeWidgetItem * qtwi ) const {
if ( locations_ . contains ( qtwi ) ) {
return ( QETApp : : collectionItem ( locations_ [ qtwi ] ) ) ;
}
return ( 0 ) ;
}
/**
@ param qtwi Un QTreeWidgetItem
@ return Le projet represente par qtwi , ou 0 si qtwi ne represente pas un
projet
*/
QETProject * ElementsPanel : : projectForItem ( QTreeWidgetItem * qtwi ) const {
if ( projects_ . contains ( qtwi ) ) {
return ( projects_ [ qtwi ] ) ;
}
return ( 0 ) ;
}
/**
@ param qtwi Un QTreeWidgetItem
@ return Le schema represente par qtwi , ou 0 si qtwi ne represente pas un
schema
*/
Diagram * ElementsPanel : : diagramForItem ( QTreeWidgetItem * qtwi ) const {
if ( diagrams_ . contains ( qtwi ) ) {
return ( diagrams_ [ qtwi ] ) ;
}
return ( 0 ) ;
}
/**
@ param qtwi QTreeWidgetItem dont on veut connaitre l ' emplacement
@ return L ' emplacement associe a qtwi , ou un emplacement nul s ' il n ' y a pas
d ' emplacement associe a qtwi
*/
ElementsLocation ElementsPanel : : locationForItem ( QTreeWidgetItem * qtwi ) const {
if ( locations_ . contains ( qtwi ) ) {
return ( locations_ [ qtwi ] ) ;
}
return ( ElementsLocation ( ) ) ;
}
/**
@ return true si une collection est selectionnee , false sinon
*/
bool ElementsPanel : : selectedItemIsACollection ( ) const {
if ( ElementsCollectionItem * selected_item = selectedItem ( ) ) {
return ( selected_item - > isCollection ( ) ) ;
}
return ( false ) ;
}
/**
@ return true si une categorie est selectionnee , false sinon
*/
2007-08-28 21:17:11 +00:00
bool ElementsPanel : : selectedItemIsACategory ( ) const {
2009-04-03 19:30:25 +00:00
if ( ElementsCollectionItem * selected_item = selectedItem ( ) ) {
return ( selected_item - > isCategory ( ) ) ;
}
return ( false ) ;
}
/**
@ return true si un element est selectionne , false sinon
*/
bool ElementsPanel : : selectedItemIsAnElement ( ) const {
if ( ElementsCollectionItem * selected_item = selectedItem ( ) ) {
return ( selected_item - > isElement ( ) ) ;
}
return ( false ) ;
}
/**
@ return true si un projet est selectionne , false sinon
*/
bool ElementsPanel : : selectedItemIsAProject ( ) const {
return ( projects_ . contains ( currentItem ( ) ) ) ;
}
/**
@ return true si un schema est selectionne , false sinon
*/
bool ElementsPanel : : selectedItemIsADiagram ( ) const {
return ( diagrams_ . contains ( currentItem ( ) ) ) ;
}
/**
@ return true si l ' element selectionne est associe a une ElementsLocation
*/
bool ElementsPanel : : selectedItemHasLocation ( ) const {
return ( locations_ . contains ( currentItem ( ) ) ) ;
}
/**
@ return true si l ' item selectionne est accessible en ecriture , false sinon
*/
bool ElementsPanel : : selectedItemIsWritable ( ) const {
if ( ElementsCollectionItem * selected_item = selectedItem ( ) ) {
return ( selected_item - > isWritable ( ) ) ;
}
return ( false ) ;
}
/**
@ return la collection , la categorie ou l ' element selectionne ( e )
*/
ElementsCollectionItem * ElementsPanel : : selectedItem ( ) const {
ElementsLocation selected_location ( selectedLocation ( ) ) ;
if ( ! selected_location . isNull ( ) ) {
return ( QETApp : : collectionItem ( selected_location ) ) ;
}
return ( 0 ) ;
}
/**
@ return Le projet selectionne , ou 0 s ' il n ' y en a pas
*/
QETProject * ElementsPanel : : selectedProject ( ) const {
return ( projectForItem ( currentItem ( ) ) ) ;
}
/**
@ return Le schema selectionne , ou 0 s ' il n ' y en a pas
*/
Diagram * ElementsPanel : : selectedDiagram ( ) const {
return ( diagramForItem ( currentItem ( ) ) ) ;
}
/**
@ return L ' emplacement selectionne , ou un emplacement nul s ' il n ' y en a pas
*/
ElementsLocation ElementsPanel : : selectedLocation ( ) const {
return ( locationForItem ( currentItem ( ) ) ) ;
}
/**
Gere l ' entree d ' un drag ' n drop . L ' evenement est accepte si les donnees
fournies contiennent un type MIME representant une categorie ou un element
QET .
@ param e QDragEnterEvent decrivant l ' entree du drag ' n drop
*/
void ElementsPanel : : dragEnterEvent ( QDragEnterEvent * e ) {
if ( e - > mimeData ( ) - > hasFormat ( " application/x-qet-category-uri " ) ) {
e - > acceptProposedAction ( ) ;
} else if ( e - > mimeData ( ) - > hasFormat ( " application/x-qet-element-uri " ) ) {
e - > acceptProposedAction ( ) ;
}
2007-08-28 21:17:11 +00:00
}
2006-10-27 15:47:22 +00:00
/**
Gere le mouvement lors d ' un drag ' n drop
*/
2009-04-03 19:30:25 +00:00
void ElementsPanel : : dragMoveEvent ( QDragMoveEvent * e ) {
// scrolle lorsque le curseur est pres des bords
int limit = 40 ;
QScrollBar * scroll_bar = verticalScrollBar ( ) ;
if ( e - > pos ( ) . y ( ) < limit ) {
scroll_bar - > setValue ( scroll_bar - > value ( ) - 1 ) ;
} else if ( e - > pos ( ) . y ( ) > height ( ) - limit ) {
scroll_bar - > setValue ( scroll_bar - > value ( ) + 1 ) ;
}
2010-11-14 20:11:57 +00:00
QTreeWidget : : dragMoveEvent ( e ) ;
2009-04-03 19:30:25 +00:00
// recupere la categorie cible pour le deplacement / la copie
ElementsCategory * target_category = categoryForPos ( e - > pos ( ) ) ;
if ( ! target_category ) {
e - > ignore ( ) ;
return ;
}
// recupere la source (categorie ou element) pour le deplacement / la copie
ElementsLocation dropped_location = ElementsLocation : : locationFromString ( e - > mimeData ( ) - > text ( ) ) ;
ElementsCollectionItem * source_item = QETApp : : collectionItem ( dropped_location , false ) ;
if ( ! source_item ) {
e - > ignore ( ) ;
return ;
}
# ifdef ENABLE_PANEL_DND_CHECKS
// ne prend pas en consideration le drop d'un item sur lui-meme ou une categorie imbriquee
if (
source_item - > location ( ) = = target_category - > location ( ) | | \
target_category - > isChildOf ( source_item )
) {
e - > ignore ( ) ;
return ;
}
// s'assure que la categorie cible est accessible en ecriture
if ( ! target_category - > isWritable ( ) ) {
e - > ignore ( ) ;
return ;
}
# endif
e - > accept ( ) ;
/// @todo mettre en valeur le lieu de depot
2006-10-27 15:47:22 +00:00
}
/**
Gere le depot lors d ' un drag ' n drop
2009-04-03 19:30:25 +00:00
@ param e QDropEvent decrivant le depot
2006-10-27 15:47:22 +00:00
*/
2009-04-03 19:30:25 +00:00
void ElementsPanel : : dropEvent ( QDropEvent * e ) {
// recupere la categorie cible pour le deplacement / la copie
ElementsCategory * target_category = categoryForPos ( e - > pos ( ) ) ;
if ( ! target_category ) {
e - > ignore ( ) ;
return ;
}
// recupere la source (categorie ou element) pour le deplacement / la copie
ElementsLocation dropped_location = ElementsLocation : : locationFromString ( e - > mimeData ( ) - > text ( ) ) ;
ElementsCollectionItem * source_item = QETApp : : collectionItem ( dropped_location , false ) ;
if ( ! source_item ) {
e - > ignore ( ) ;
return ;
}
# ifdef ENABLE_PANEL_DND_CHECKS
// ne prend pas en consideration le drop d'un item sur lui-meme ou une categorie imbriquee
if (
source_item - > location ( ) = = target_category - > location ( ) | | \
target_category - > isChildOf ( source_item )
) {
e - > ignore ( ) ;
return ;
}
// s'assure que la categorie cible est accessible en ecriture
if ( ! target_category - > isWritable ( ) ) {
e - > ignore ( ) ;
return ;
}
# endif
e - > accept ( ) ;
emit ( requestForMoveElements ( source_item , target_category , e - > pos ( ) ) ) ;
2006-10-27 15:47:22 +00:00
}
/**
Gere le debut des drag ' n drop
@ param supportedActions Les actions supportees
2009-04-03 19:30:25 +00:00
*/
2009-11-22 16:12:22 +00:00
void ElementsPanel : : startDrag ( Qt : : DropActions supportedActions ) {
Q_UNUSED ( supportedActions ) ;
2009-04-03 19:30:25 +00:00
// recupere l'emplacement selectionne
ElementsLocation location = selectedLocation ( ) ;
if ( location . isNull ( ) ) return ;
// recupere la selection
ElementsCollectionItem * selected_item = QETApp : : collectionItem ( location ) ;
if ( ! selected_item ) return ;
2006-10-28 19:39:43 +00:00
2006-10-27 15:47:22 +00:00
// objet QDrag pour realiser le drag'n drop
QDrag * drag = new QDrag ( this ) ;
// donnees qui seront transmises par le drag'n drop
2009-04-03 19:30:25 +00:00
QString location_string ( location . toString ( ) ) ;
2006-10-27 15:47:22 +00:00
QMimeData * mimeData = new QMimeData ( ) ;
2009-04-03 19:30:25 +00:00
mimeData - > setText ( location_string ) ;
if ( selected_item - > isCategory ( ) | | selected_item - > isCollection ( ) ) {
mimeData - > setData ( " application/x-qet-category-uri " , location_string . toAscii ( ) ) ;
2009-05-01 14:41:33 +00:00
drag - > setPixmap ( QET : : Icons : : Folder . pixmap ( 22 , 22 ) ) ;
2009-04-03 19:30:25 +00:00
} else if ( selected_item - > isElement ( ) ) {
mimeData - > setData ( " application/x-qet-element-uri " , location_string . toAscii ( ) ) ;
// element temporaire pour fournir un apercu
int elmt_creation_state ;
Element * temp_elmt = new CustomElement ( location , 0 , 0 , & elmt_creation_state ) ;
if ( elmt_creation_state ) {
delete temp_elmt ;
return ;
}
// accrochage d'une pixmap representant l'appareil au pointeur
2010-02-28 16:13:45 +00:00
QPixmap elmt_pixmap ( temp_elmt - > pixmap ( ) ) ;
QPoint elmt_hotspot ( temp_elmt - > hotspot ( ) ) ;
// ajuste la pixmap si celle-ci est trop grande
QPoint elmt_pixmap_size ( elmt_pixmap . width ( ) , elmt_pixmap . height ( ) ) ;
if ( elmt_pixmap . width ( ) > QET_MAX_DND_PIXMAP_WIDTH | | elmt_pixmap . height ( ) > QET_MAX_DND_PIXMAP_HEIGHT ) {
elmt_pixmap = elmt_pixmap . scaled ( QET_MAX_DND_PIXMAP_WIDTH , QET_MAX_DND_PIXMAP_HEIGHT , Qt : : KeepAspectRatio ) ;
elmt_hotspot = QPoint (
elmt_hotspot . x ( ) * elmt_pixmap . width ( ) / elmt_pixmap_size . x ( ) ,
elmt_hotspot . y ( ) * elmt_pixmap . height ( ) / elmt_pixmap_size . y ( )
) ;
}
drag - > setPixmap ( elmt_pixmap ) ;
drag - > setHotSpot ( elmt_hotspot ) ;
2009-04-03 19:30:25 +00:00
// suppression de l'appareil temporaire
delete temp_elmt ;
2006-10-27 15:47:22 +00:00
}
2009-04-03 19:30:25 +00:00
// realisation du drag'n drop
2006-10-27 15:47:22 +00:00
drag - > setMimeData ( mimeData ) ;
2009-04-03 19:30:25 +00:00
drag - > start ( Qt : : MoveAction | Qt : : CopyAction ) ;
}
/**
Methode permettant d ' ajouter un projet au panel d ' elements .
@ param qtwi_parent QTreeWidgetItem parent sous lequel sera insere le projet
@ param project Projet a inserer dans le panel d ' elements
@ return Le QTreeWidgetItem insere le plus haut
*/
QTreeWidgetItem * ElementsPanel : : addProject ( QTreeWidgetItem * qtwi_parent , QETProject * project ) {
// le projet sera insere juste avant la collection commune
QTreeWidgetItem * last_project = 0 ;
if ( int common_collection_item_idx = indexOfTopLevelItem ( common_collection_item_ ) ) {
last_project = topLevelItem ( common_collection_item_idx - 1 ) ;
}
2006-10-27 15:47:22 +00:00
2009-04-03 19:30:25 +00:00
// creation du QTreeWidgetItem representant le projet
QTreeWidgetItem * qtwi_project = new QTreeWidgetItem ( qtwi_parent , last_project ) ;
qtwi_project - > setExpanded ( true ) ;
projects_ . insert ( qtwi_project , project ) ;
updateProjectItemInformations ( project ) ;
connect (
project , SIGNAL ( projectInformationsChanged ( QETProject * ) ) ,
this , SLOT ( projectInformationsChanged ( QETProject * ) )
) ;
// ajoute les schemas du projet
foreach ( Diagram * diagram , project - > diagrams ( ) ) {
addDiagram ( qtwi_project , diagram ) ;
}
2006-10-27 15:47:22 +00:00
2009-04-03 19:30:25 +00:00
// ajoute la collection du projet
addCollection ( qtwi_project , project - > embeddedCollection ( ) , tr ( " Collection projet " ) ) ;
2006-10-27 15:47:22 +00:00
2009-04-03 19:30:25 +00:00
return ( qtwi_project ) ;
2006-10-27 15:47:22 +00:00
}
2006-10-28 19:39:43 +00:00
2006-11-11 18:25:42 +00:00
/**
2009-04-03 19:30:25 +00:00
Methode permettant d ' ajouter un schema au panel d ' elements .
@ param qtwi_parent QTreeWidgetItem parent sous lequel sera insere le schema
@ param diagram Schema a inserer dans le panel d ' elements
@ return Le QTreeWidgetItem insere le plus haut
2006-11-11 18:25:42 +00:00
*/
2009-04-03 19:30:25 +00:00
QTreeWidgetItem * ElementsPanel : : addDiagram ( QTreeWidgetItem * qtwi_parent , Diagram * diagram ) {
// determine le nom du schema
QString final_name = diagramTitleToDisplay ( diagram ) ;
// repere le dernier element correspondant a un schema, s'il existe
QTreeWidgetItem * last_diagram = 0 ;
bool collection_item_exists = false ;
if ( QETProject * project = diagram - > project ( ) ) {
if ( ElementsCollection * project_collection = project - > embeddedCollection ( ) ) {
if ( QTreeWidgetItem * collection_item = locations_ . key ( project_collection - > location ( ) ) ) {
collection_item_exists = true ;
// repere le dernier schema
int common_collection_item_idx = qtwi_parent - > indexOfChild ( collection_item ) ;
if ( common_collection_item_idx ! = - 1 ) {
last_diagram = qtwi_parent - > child ( common_collection_item_idx - 1 ) ;
}
}
}
}
// creation du QTreeWidgetItem representant le schema
QTreeWidgetItem * qtwi_diagram ;
if ( collection_item_exists ) {
qtwi_diagram = new QTreeWidgetItem ( qtwi_parent , last_diagram ) ;
} else {
qtwi_diagram = new QTreeWidgetItem ( qtwi_parent ) ;
}
qtwi_diagram - > setText ( 0 , final_name ) ;
2009-05-01 14:41:33 +00:00
qtwi_diagram - > setIcon ( 0 , QET : : Icons : : Diagram ) ;
2009-04-03 19:30:25 +00:00
diagrams_ . insert ( qtwi_diagram , diagram ) ;
return ( qtwi_diagram ) ;
}
/**
Methode privee permettant d ' ajouter une collection d ' elements au panel d ' elements
@ param qtwi_parent QTreeWidgetItem parent sous lequel sera insere la collection d ' elements
@ param collection Collection a inserer dans le panel d ' elements - si
collection vaut 0 , cette methode retourne 0.
@ param coll_name Nom a utiliser pour la collection
@ param icon Icone a utiliser pour l ' affichage de la collection
@ return Le QTreeWidgetItem insere le plus haut
*/
QTreeWidgetItem * ElementsPanel : : addCollection ( QTreeWidgetItem * qtwi_parent , ElementsCollection * collection , const QString & coll_name , const QIcon & icon ) {
if ( ! collection ) return ( 0 ) ;
QTreeWidgetItem * qtwi_coll = addCategory ( qtwi_parent , collection - > rootCategory ( ) , coll_name , icon ) ;
return ( qtwi_coll ) ;
}
/**
Methode privee permettant d ' ajouter une categorie au panel d ' elements
@ param qtwi_parent QTreeWidgetItem parent sous lequel sera insere la categorie
@ param category Categorie d ' elements a inserer - si category vaut 0 , cette
methode retourne 0.
2009-11-22 16:12:22 +00:00
@ param cat_name Parametre facultatif permettant de forcer le nom affiche
2009-04-03 19:30:25 +00:00
S ' il n ' est pas precise , la methode utilise le nom declare par la categorie .
@ param icon Icone a utiliser pour l ' affichage de la categorie
Si elle n ' est pas precisee , une icone par defaut est utilisee
@ return Le QTreeWidgetItem insere le plus haut
*/
QTreeWidgetItem * ElementsPanel : : addCategory ( QTreeWidgetItem * qtwi_parent , ElementsCategory * category , const QString & cat_name , const QIcon & icon ) {
if ( ! category ) return ( 0 ) ;
2006-11-11 18:25:42 +00:00
// recupere le nom de la categorie
2009-04-03 19:30:25 +00:00
QString final_name ( cat_name . isEmpty ( ) ? category - > name ( ) : cat_name ) ;
2009-05-01 14:41:33 +00:00
QIcon final_icon ( icon . isNull ( ) ? QET : : Icons : : Folder : icon ) ;
2006-11-11 18:25:42 +00:00
// creation du QTreeWidgetItem representant le dossier
2009-04-03 19:30:25 +00:00
QTreeWidgetItem * qtwi_category = new QTreeWidgetItem ( qtwi_parent , QStringList ( final_name ) ) ;
qtwi_category - > setToolTip ( 0 , category - > location ( ) . toString ( ) ) ;
qtwi_category - > setIcon ( 0 , final_icon ) ;
2006-11-11 18:25:42 +00:00
QLinearGradient t ( 0 , 0 , 200 , 0 ) ;
t . setColorAt ( 0 , QColor ( " #e8e8e8 " ) ) ;
t . setColorAt ( 1 , QColor ( " #ffffff " ) ) ;
2009-04-03 19:30:25 +00:00
qtwi_category - > setBackground ( 0 , QBrush ( t ) ) ;
locations_ . insert ( qtwi_category , category - > location ( ) ) ;
2006-11-11 18:25:42 +00:00
2007-10-16 12:04:08 +00:00
// reduit le dossier si besoin
2009-04-03 19:30:25 +00:00
qtwi_category - > setExpanded ( expanded_directories . contains ( category - > location ( ) . toString ( ) ) ) ;
2007-10-16 12:04:08 +00:00
2009-04-03 19:30:25 +00:00
// ajout des sous-categories
foreach ( ElementsCategory * sub_cat , category - > categories ( ) ) addCategory ( qtwi_category , sub_cat ) ;
2006-11-11 18:25:42 +00:00
2009-04-03 19:30:25 +00:00
// ajout des elements
foreach ( ElementDefinition * elmt , category - > elements ( ) ) addElement ( qtwi_category , elmt ) ;
return ( qtwi_category ) ;
2006-11-11 18:25:42 +00:00
}
2006-10-28 19:39:43 +00:00
/**
2009-04-03 19:30:25 +00:00
Methode privee permettant d ' ajouter un element au panel d ' elements
2006-10-28 19:39:43 +00:00
@ param qtwi_parent QTreeWidgetItem parent sous lequel sera insere l ' element
2009-04-03 19:30:25 +00:00
@ param element Element a inserer
2009-11-22 16:12:22 +00:00
@ param elmt_name Parametre facultatif permettant de forcer le nom affiche
S ' il n ' est pas precise , la methode utilise le nom declare par l ' element .
2009-04-03 19:30:25 +00:00
Une icone sera generee a partir de l ' element .
@ return Le QTreeWidgetItem insere
2006-10-28 19:39:43 +00:00
*/
2009-04-03 19:30:25 +00:00
QTreeWidgetItem * ElementsPanel : : addElement ( QTreeWidgetItem * qtwi_parent , ElementDefinition * element , const QString & elmt_name ) {
if ( ! element ) return ( 0 ) ;
2006-10-28 19:39:43 +00:00
QString whats_this = tr ( " Ceci est un \351 l \351 ment que vous pouvez ins \351 rer dans votre sch \351 ma par cliquer-d \351 placer " ) ;
QString tool_tip = tr ( " Cliquer-d \351 posez cet \351 l \351 ment sur le sch \351 ma pour ins \351 rer un \351 l \351 ment " ) ;
2009-04-13 01:35:01 +00:00
int state ;
CustomElement custom_elmt ( element - > location ( ) , 0 , 0 , & state ) ;
if ( state ) {
qDebug ( ) < < " ElementsCategoriesList::addElement() : Le chargement du composant " < < qPrintable ( element - > location ( ) . toString ( ) ) < < " a echoue avec le code d'erreur " < < state ;
2009-04-03 19:30:25 +00:00
return ( 0 ) ;
2006-10-28 19:39:43 +00:00
}
2009-04-03 19:30:25 +00:00
QString final_name ( elmt_name . isEmpty ( ) ? custom_elmt . name ( ) : elmt_name ) ;
QTreeWidgetItem * qtwi = new QTreeWidgetItem ( qtwi_parent , QStringList ( final_name ) ) ;
qtwi - > setStatusTip ( 0 , tool_tip + " \253 " + custom_elmt . name ( ) + " \273 " ) ;
qtwi - > setToolTip ( 0 , element - > location ( ) . toString ( ) ) ;
2006-10-28 19:39:43 +00:00
qtwi - > setWhatsThis ( 0 , whats_this ) ;
qtwi - > setFlags ( Qt : : ItemIsSelectable | Qt : : ItemIsDragEnabled | Qt : : ItemIsEnabled ) ;
2009-04-03 19:30:25 +00:00
qtwi - > setIcon ( 0 , QIcon ( custom_elmt . pixmap ( ) ) ) ;
// actions speciales pour les elements appartenant a un projet
if ( QETProject * element_project = element - > location ( ) . project ( ) ) {
// affiche en rouge les elements inutilises dans un projet
if ( ! element_project - > usesElement ( element - > location ( ) ) ) {
QLinearGradient t ( 0 , 0 , 200 , 0 ) ;
t . setColorAt ( 0 , QColor ( " #ffc0c0 " ) ) ;
t . setColorAt ( 1 , QColor ( " #ffffff " ) ) ;
qtwi - > setBackground ( 0 , QBrush ( t ) ) ;
qtwi - > setToolTip ( 0 , QString ( tr ( " %1 [non utilis \351 dans le projet] " ) ) . arg ( qtwi - > toolTip ( 0 ) ) ) ;
}
}
locations_ . insert ( qtwi , element - > location ( ) ) ;
return ( qtwi ) ;
2006-10-28 19:39:43 +00:00
}
2006-11-19 22:04:15 +00:00
2007-02-26 22:42:46 +00:00
/**
Recharge l ' arbre des elements
2009-04-03 19:30:25 +00:00
@ param reload_collections true pour relire les collections depuis leurs sources ( fichiers , projets . . . )
2007-02-26 22:42:46 +00:00
*/
2009-04-03 19:30:25 +00:00
void ElementsPanel : : reload ( bool reload_collections ) {
2007-10-16 12:04:08 +00:00
// sauvegarde la liste des repertoires reduits
2007-12-23 01:53:18 +00:00
saveExpandedCategories ( ) ;
2007-10-16 12:04:08 +00:00
2009-04-03 19:30:25 +00:00
if ( reload_collections ) {
foreach ( ElementsCollection * collection , QETApp : : availableCollections ( ) ) {
collection - > reload ( ) ;
}
}
// vide l'arbre et le hash
2007-10-16 12:49:04 +00:00
clear ( ) ;
2009-04-03 19:30:25 +00:00
locations_ . clear ( ) ;
projects_ . clear ( ) ;
diagrams_ . clear ( ) ;
common_collection_item_ = 0 ;
custom_collection_item_ = 0 ;
2007-02-26 22:42:46 +00:00
// chargement des elements de la collection QET
2009-05-01 15:46:17 +00:00
common_collection_item_ = addCollection ( invisibleRootItem ( ) , QETApp : : commonElementsCollection ( ) , tr ( " Collection QET " ) , QIcon ( " :/ico/16x16/qet.png " ) ) ;
2007-02-26 22:42:46 +00:00
// chargement des elements de la collection utilisateur
2009-05-01 15:46:17 +00:00
custom_collection_item_ = addCollection ( invisibleRootItem ( ) , QETApp : : customElementsCollection ( ) , tr ( " Collection utilisateur " ) , QIcon ( " :/ico/16x16/go-home.png " ) ) ;
2007-10-16 12:49:04 +00:00
2009-04-03 19:30:25 +00:00
// chargement des projets
foreach ( QETProject * project , projects_to_display_ . values ( ) ) {
addProject ( invisibleRootItem ( ) , project ) ;
2007-12-20 19:18:31 +00:00
}
2007-10-16 12:49:04 +00:00
// reselectionne le dernier element selectionne
if ( ! last_selected_item . isNull ( ) ) {
2009-05-19 19:00:37 +00:00
QTreeWidgetItem * qtwi = findLocation ( last_selected_item ) ;
2007-10-16 12:49:04 +00:00
if ( qtwi ) setCurrentItem ( qtwi ) ;
}
2007-02-26 22:42:46 +00:00
}
2007-06-30 17:41:07 +00:00
2007-10-10 17:50:26 +00:00
/**
2009-04-03 19:30:25 +00:00
Gere le double - clic sur un element .
Si un double - clic sur un projet est effectue , le signal requestForProject
est emis .
Si un double - clic sur un schema est effectue , le signal requestForDiagram
est emis .
Si un double - clic sur une collection , une categorie ou un element est
effectue , le signal requestForCollectionItem est emis .
@ param qtwi
2007-10-10 17:50:26 +00:00
*/
2009-04-03 19:30:25 +00:00
void ElementsPanel : : slot_doubleClick ( QTreeWidgetItem * qtwi , int ) {
if ( QETProject * project = projectForItem ( qtwi ) ) {
emit ( requestForProject ( project ) ) ;
} else if ( Diagram * diagram = diagramForItem ( qtwi ) ) {
emit ( requestForDiagram ( diagram ) ) ;
} else if ( ElementsCollectionItem * item = collectionItemForItem ( qtwi ) ) {
emit ( requestForCollectionItem ( item ) ) ;
}
}
/**
Enregistre la liste des categories repliees ainsi que le dernier element
selectionne
*/
void ElementsPanel : : saveExpandedCategories ( ) {
expanded_directories . clear ( ) ;
QList < QTreeWidgetItem * > items = findItems ( " * " , Qt : : MatchRecursive | Qt : : MatchWildcard ) ;
foreach ( QTreeWidgetItem * item , items ) {
QString file = locations_ [ item ] . toString ( ) ;
if ( ! file . endsWith ( " .elmt " ) & & item - > isExpanded ( ) ) {
expanded_directories < < file ;
}
}
// sauvegarde egalement le dernier element selectionne
QTreeWidgetItem * current_item = currentItem ( ) ;
if ( current_item ) last_selected_item = locations_ [ current_item ] . toString ( ) ;
2007-08-28 21:17:11 +00:00
}
2007-10-10 17:50:26 +00:00
/**
2009-05-19 19:00:37 +00:00
@ param location emplacement a retrouver dans l ' arborescence
@ return le QTreeWidgetItem correspondant a l ' emplacaement location ou 0 si celui - ci n ' est pas trouve
2007-10-10 17:50:26 +00:00
*/
2009-05-19 19:00:37 +00:00
QTreeWidgetItem * ElementsPanel : : findLocation ( const ElementsLocation & location ) const {
if ( location . isNull ( ) ) return ( 0 ) ;
return ( locations_ . key ( location , 0 ) ) ;
}
/**
@ param location emplacement a retrouver dans l ' arborescence
@ return le QTreeWidgetItem correspondant a l ' emplacaement location ou 0 si celui - ci n ' est pas trouve
*/
QTreeWidgetItem * ElementsPanel : : findLocation ( const QString & location ) const {
return ( findLocation ( ElementsLocation ( location ) ) ) ;
2007-08-28 21:17:11 +00:00
}
2007-10-10 17:50:26 +00:00
/**
2009-04-03 19:30:25 +00:00
Enleve et supprime un item du panel en nettoyant les structures le referencant .
Note : Ce nettoyage est recursif
@ param removed_item Item a enlever et supprimer
2007-10-10 17:50:26 +00:00
*/
2009-04-03 19:30:25 +00:00
void ElementsPanel : : deleteItem ( QTreeWidgetItem * removed_item ) {
if ( ! removed_item ) return ;
2007-08-28 21:17:11 +00:00
2009-04-03 19:30:25 +00:00
// supprime les eventuels enfants de l'item
foreach ( QTreeWidgetItem * child_item , removed_item - > takeChildren ( ) ) {
deleteItem ( child_item ) ;
}
2007-08-28 21:17:11 +00:00
2009-04-03 19:30:25 +00:00
if ( locations_ . contains ( removed_item ) ) {
locations_ . remove ( removed_item ) ;
} else if ( diagrams_ . contains ( removed_item ) ) {
diagrams_ . remove ( removed_item ) ;
} else if ( projects_ . contains ( removed_item ) ) {
projects_ . remove ( removed_item ) ;
}
delete removed_item ;
2007-08-28 21:17:11 +00:00
}
/**
2009-04-03 19:30:25 +00:00
@ param pos Position dans l ' arborescence
@ return La categorie situee sous la position pos , ou 0 s ' il n ' y a aucune
categorie correspondante .
@ see categoryForItem
2007-08-28 21:17:11 +00:00
*/
2009-04-03 19:30:25 +00:00
ElementsCategory * ElementsPanel : : categoryForPos ( const QPoint & pos ) {
// Accede a l'item sous la position
QTreeWidgetItem * pos_qtwi = itemAt ( pos ) ;
if ( ! pos_qtwi ) {
return ( 0 ) ;
}
2007-08-28 21:17:11 +00:00
2009-04-03 19:30:25 +00:00
return ( categoryForItem ( pos_qtwi ) ) ;
2007-08-28 21:17:11 +00:00
}
2007-10-10 17:50:26 +00:00
/**
2009-04-03 19:30:25 +00:00
Cette methode permet d ' acceder a la categorie correspondant a un item donne .
Si cet item represente une collection , c ' est sa categorie racine qui est renvoyee .
Si cet item represente une categorie , c ' est cette categorie qui est renvoyee .
Si cet item represente un element , c ' est sa categorie parente qui est renvoyee .
@ param qtwi un QTreeWidgetItem
@ return la categorie correspondant au QTreeWidgetItem qtwi , ou 0 s ' il n ' y a
aucune categorie correspondante .
2007-10-10 17:50:26 +00:00
*/
2009-04-03 19:30:25 +00:00
ElementsCategory * ElementsPanel : : categoryForItem ( QTreeWidgetItem * qtwi ) {
if ( ! qtwi ) return ( 0 ) ;
2007-06-30 17:41:07 +00:00
2009-04-03 19:30:25 +00:00
// Recupere le CollectionItem associe a cet item
ElementsCollectionItem * collection_item = collectionItemForItem ( qtwi ) ;
if ( ! collection_item ) return ( 0 ) ;
// recupere la categorie cible pour le deplacement
return ( collection_item - > toCategory ( ) ) ;
}
/**
N ' affiche que les elements contenant une chaine donnee
@ param m Chaine a filtrer
*/
void ElementsPanel : : filter ( const QString & m ) {
QList < QTreeWidgetItem * > items = findItems ( " * " , Qt : : MatchRecursive | Qt : : MatchWildcard ) ;
if ( m . isEmpty ( ) ) {
// la chaine est vide : affiche tout
foreach ( QTreeWidgetItem * item , items ) item - > setHidden ( false ) ;
} else {
// repere les items correspondant au filtre
QList < QTreeWidgetItem * > matching_items ;
foreach ( QTreeWidgetItem * item , items ) {
bool item_matches = item - > text ( 0 ) . contains ( m , Qt : : CaseInsensitive ) ;
if ( item_matches ) matching_items < < item ;
item - > setHidden ( ! item_matches ) ;
}
2009-05-19 19:00:37 +00:00
ensureHierarchyIsVisible ( matching_items ) ;
2007-06-30 17:41:07 +00:00
}
}
2007-08-28 21:17:11 +00:00
2009-04-03 19:30:25 +00:00
/**
Rajoute un projet au panel d ' elements
@ param project Projet ouvert a rajouter au panel
*/
void ElementsPanel : : projectWasOpened ( QETProject * project ) {
projects_to_display_ < < project ;
addProject ( invisibleRootItem ( ) , project ) ;
2007-08-28 21:17:11 +00:00
}
2007-10-10 17:50:26 +00:00
/**
2009-04-03 19:30:25 +00:00
Enleve un projet du panel d ' elements
@ param project Projet a enlever du panel
2007-10-10 17:50:26 +00:00
*/
2009-04-03 19:30:25 +00:00
void ElementsPanel : : projectWasClosed ( QETProject * project ) {
if ( QTreeWidgetItem * item_to_remove = projects_ . key ( project , 0 ) ) {
deleteItem ( item_to_remove ) ;
projects_to_display_ . remove ( project ) ;
}
2007-08-28 21:17:11 +00:00
}
2007-10-10 17:50:26 +00:00
/**
2009-04-03 19:30:25 +00:00
Gere le fait que les proprietes d ' un projet change ( exemple : fichier ,
titre , . . . ) .
@ param project Projet modifie
2007-10-10 17:50:26 +00:00
*/
2009-04-03 19:30:25 +00:00
void ElementsPanel : : projectInformationsChanged ( QETProject * project ) {
updateProjectItemInformations ( project ) ;
2007-08-28 21:17:11 +00:00
}
2007-10-16 12:04:08 +00:00
/**
2009-04-03 19:30:25 +00:00
Gere l ' ajout d ' un schema dans un projet
@ param project Projet auquel a ete ajouter le schema
@ param diagram Schema ajoute
2007-10-16 12:04:08 +00:00
*/
2009-04-03 19:30:25 +00:00
void ElementsPanel : : diagramWasAdded ( QETProject * project , Diagram * diagram ) {
// repere le QTWI du projet
if ( QTreeWidgetItem * qtwi_project = projects_ . key ( project ) ) {
addDiagram ( qtwi_project , diagram ) ;
2007-10-16 12:04:08 +00:00
}
2007-10-16 12:49:04 +00:00
}
/**
2009-04-03 19:30:25 +00:00
Gere la suppression d ' un schema dans un projet
@ param project Projet duquel a ete supprime le schema
@ param diagram Schema supprime
2007-10-16 12:49:04 +00:00
*/
2009-04-03 19:30:25 +00:00
void ElementsPanel : : diagramWasRemoved ( QETProject * project , Diagram * diagram ) {
// on verifie que le projet apparait dans le panel
if ( projects_ . key ( project , 0 ) ) {
// on verifie que le schema apparait dans le panel
if ( QTreeWidgetItem * item_to_remove = diagrams_ . key ( diagram , 0 ) ) {
deleteItem ( item_to_remove ) ;
}
2007-10-16 12:49:04 +00:00
}
2007-10-16 12:04:08 +00:00
}
2007-12-29 15:00:30 +00:00
/**
2009-04-03 19:30:25 +00:00
@ param project Projet auquel appartient le schema concerne
@ param diagram schema dont le titre a change
2007-12-29 15:00:30 +00:00
*/
2009-04-03 19:30:25 +00:00
void ElementsPanel : : diagramTitleChanged ( QETProject * project , Diagram * diagram ) {
// on verifie que le projet apparait dans le panel
if ( projects_ . key ( project , 0 ) ) {
// on verifie que le schema apparait dans le panel
if ( QTreeWidgetItem * qtwi_diagram = diagrams_ . key ( diagram ) ) {
qtwi_diagram - > setText ( 0 , diagramTitleToDisplay ( diagram ) ) ;
2007-12-29 15:00:30 +00:00
}
}
}
2009-04-03 19:30:25 +00:00
/**
@ param project Projet auquel appartiennent les schemas concernes
@ param from Index de l ' onglet avant le deplacement
@ param to Index de l ' onglet apres le deplacement
*/
void ElementsPanel : : diagramOrderChanged ( QETProject * project , int from , int to ) {
// repere le QTWI correspondant au projet
QTreeWidgetItem * qtwi_project = projects_ . key ( project ) ;
if ( ! qtwi_project ) return ;
// repere le QTWI representant le schema deplace
QTreeWidgetItem * moved_qtwi_diagram = qtwi_project - > child ( from ) ;
if ( ! moved_qtwi_diagram ) return ;
// enleve le QTWI et le reinsere au bon endroit
2010-02-28 16:13:45 +00:00
bool was_selected = moved_qtwi_diagram - > isSelected ( ) ;
2009-04-03 19:30:25 +00:00
qtwi_project - > removeChild ( moved_qtwi_diagram ) ;
qtwi_project - > insertChild ( to , moved_qtwi_diagram ) ;
2010-02-28 16:13:45 +00:00
if ( was_selected ) {
setCurrentItem ( moved_qtwi_diagram ) ;
}
2009-04-03 19:30:25 +00:00
}
2009-05-19 19:00:37 +00:00
/**
Affiche un element etant donne son emplacement
@ param location Emplacement de l ' element a afficher
*/
bool ElementsPanel : : scrollToElement ( const ElementsLocation & location ) {
// recherche l'element dans le panel
QTreeWidgetItem * item = findLocation ( location ) ;
if ( ! item ) return ( false ) ;
// s'assure que l'item ne soit pas filtre
item - > setHidden ( false ) ;
setCurrentItem ( item ) ;
ensureHierarchyIsVisible ( QList < QTreeWidgetItem * > ( ) < < item ) ;
scrollToItem ( item ) ;
return ( true ) ;
}
2009-04-03 19:30:25 +00:00
/**
Met a jour le nom , l ' info - bulle et l ' icone de l ' item representant un projet .
@ param project le projet dont il faut mettre a jour l ' affichage
*/
void ElementsPanel : : updateProjectItemInformations ( QETProject * project ) {
// determine le QTWI correspondant au projet
QTreeWidgetItem * qtwi_project = projects_ . key ( project ) ;
if ( ! qtwi_project ) return ;
// determine le nom et l'icone du projet
QString final_name ( project - > pathNameTitle ( ) ) ;
QString final_tooltip = project - > filePath ( ) ;
if ( final_tooltip . isEmpty ( ) ) {
final_tooltip = tr (
" Pas de fichier " ,
" tooltip for a file-less project in the element panel "
) ;
}
qtwi_project - > setText ( 0 , final_name ) ;
qtwi_project - > setToolTip ( 0 , final_tooltip ) ;
2009-05-01 14:41:33 +00:00
qtwi_project - > setIcon ( 0 , QET : : Icons : : Project ) ;
2009-04-03 19:30:25 +00:00
}
/**
@ param diagram Schema dont on souhaite affiche le titre
@ return Un titre affichable , tenant compte du fait que le titre du schema
peut etre vide .
*/
QString ElementsPanel : : diagramTitleToDisplay ( Diagram * diagram ) const {
return ( diagram - > title ( ) . isEmpty ( ) ? tr ( " Sch \351 ma sans titre " ) : diagram - > title ( ) ) ;
}
2009-05-19 19:00:37 +00:00
/**
2009-11-22 16:12:22 +00:00
@ param items une liste de QTreeWidgetItem pour lesquels il faut s ' assurer
que eux et leurs parents sont visibles
2009-05-19 19:00:37 +00:00
*/
void ElementsPanel : : ensureHierarchyIsVisible ( QList < QTreeWidgetItem * > items ) {
// remonte l'arborescence pour lister les categories contenant les elements filtres
QSet < QTreeWidgetItem * > parent_items ;
foreach ( QTreeWidgetItem * item , items ) {
for ( QTreeWidgetItem * parent_qtwi = item - > parent ( ) ; parent_qtwi ; parent_qtwi = parent_qtwi - > parent ( ) ) {
parent_items < < parent_qtwi ;
}
}
// etend les parents
foreach ( QTreeWidgetItem * parent_qtwi , parent_items ) {
if ( ! parent_qtwi - > isExpanded ( ) ) parent_qtwi - > setExpanded ( true ) ;
}
// affiche les parents
foreach ( QTreeWidgetItem * parent_qtwi , parent_items ) {
if ( parent_qtwi - > isHidden ( ) ) parent_qtwi - > setHidden ( false ) ;
}
}