Ajout d'une action "Retrouver dans le panel" dans les proprietes des elements.

git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@654 bfdf4180-ca20-0410-9c96-a3a8aa849046
This commit is contained in:
xavier
2009-05-19 19:00:37 +00:00
parent 9f46d81f5c
commit 87c5007e45
13 changed files with 391 additions and 196 deletions

View File

@@ -622,11 +622,24 @@ void DiagramView::editElement(Element *element) {
description_string += QString(tr("Emplacement\240: %1\n")).arg(custom_element -> location().toString());
}
QMessageBox::information(
this,
tr("Propri\351t\351s de l'\351l\351ment s\351lectionn\351"),
description_string
);
// titre et boutons du dialogue
QString description_title = tr("Propri\351t\351s de l'\351l\351ment s\351lectionn\351");
QPushButton *find_in_panel = new QPushButton(tr("Retrouver dans le panel"));
// dialogue en lui-meme
QMessageBox edit_element_dialog;
edit_element_dialog.setIcon(QMessageBox::Information);
edit_element_dialog.setWindowTitle(description_title);
edit_element_dialog.setText(description_title);
edit_element_dialog.setInformativeText(description_string);
edit_element_dialog.addButton(find_in_panel, QMessageBox::ApplyRole);
edit_element_dialog.addButton(QMessageBox::Ok);
edit_element_dialog.setDefaultButton(QMessageBox::Ok);
edit_element_dialog.exec();
if (edit_element_dialog.clickedButton() == find_in_panel) {
emit(findElementRequired(custom_element -> location()));
}
}
/**

View File

@@ -43,6 +43,7 @@ class DiagramView : public QGraphicsView {
Diagram *scene;
QMenu *context_menu;
QAction *paste_here;
QAction *find_element_;
QPoint paste_here_pos;
bool is_adding_text;
ElementsLocation next_location_;
@@ -90,6 +91,8 @@ class DiagramView : public QGraphicsView {
void titleChanged(DiagramView *, const QString &);
/// Signal emis avant l'integration d'un element
void aboutToAddElement();
/// Signal emis lorsque l'utilisateur souhaite retrouver un element du schema dans les collections
void findElementRequired(const ElementsLocation &);
public slots:
void selectNothing();

View File

@@ -661,7 +661,7 @@ void ElementsPanel::reload(bool reload_collections) {
// reselectionne le dernier element selectionne
if (!last_selected_item.isNull()) {
QTreeWidgetItem *qtwi = findPath(last_selected_item);
QTreeWidgetItem *qtwi = findLocation(last_selected_item);
if (qtwi) setCurrentItem(qtwi);
}
}
@@ -706,15 +706,20 @@ void ElementsPanel::saveExpandedCategories() {
}
/**
@param path chemin virtuel a retrouver dans l'arborescence
@return le QTreeWidgetItem correspondant au chemin path ou 0 si celui-ci n'est pas trouve
@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::findPath(const QString &path) const {
QList<QTreeWidgetItem *> items = findItems("*", Qt::MatchRecursive|Qt::MatchWildcard);
foreach(QTreeWidgetItem *item, items) {
if (locations_[item].toString() == path) return(item);
}
return(0);
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)));
}
/**
@@ -794,23 +799,7 @@ void ElementsPanel::filter(const QString &m) {
item -> setHidden(!item_matches);
}
// remonte l'arborescence pour lister les categories contenant les elements filtres
QSet<QTreeWidgetItem *> parent_items;
foreach(QTreeWidgetItem *item, matching_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);
}
ensureHierarchyIsVisible(matching_items);
}
}
@@ -903,6 +892,23 @@ void ElementsPanel::diagramOrderChanged(QETProject *project, int from, int to) {
qtwi_project -> insertChild(to, moved_qtwi_diagram);
}
/**
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);
}
/**
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
@@ -935,3 +941,27 @@ void ElementsPanel::updateProjectItemInformations(QETProject *project) {
QString ElementsPanel::diagramTitleToDisplay(Diagram *diagram) const {
return(diagram -> title().isEmpty() ? tr("Sch\351ma sans titre") : diagram -> title());
}
/**
@param une liste de QTreeWidgetItem pour lesquels il faut s'assurer que eux
et leurs parents sont visibles
*/
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);
}
}

View File

@@ -92,6 +92,7 @@ class ElementsPanel : public QTreeWidget {
void diagramWasRemoved(QETProject *, Diagram *);
void diagramTitleChanged(QETProject *, Diagram *);
void diagramOrderChanged(QETProject *, int, int);
bool scrollToElement(const ElementsLocation &);
protected:
void dragEnterEvent(QDragEnterEvent *);
@@ -106,10 +107,12 @@ class ElementsPanel : public QTreeWidget {
QTreeWidgetItem *addCategory (QTreeWidgetItem *, ElementsCategory *, const QString & = QString(), const QIcon & = QIcon());
QTreeWidgetItem *addElement (QTreeWidgetItem *, ElementDefinition *, const QString & = QString());
void saveExpandedCategories();
QTreeWidgetItem *findPath(const QString &) const;
QTreeWidgetItem *findLocation(const ElementsLocation &) const;
QTreeWidgetItem *findLocation(const QString &) const;
void deleteItem(QTreeWidgetItem *);
void updateProjectItemInformations(QETProject *);
QString diagramTitleToDisplay(Diagram *) const;
void ensureHierarchyIsVisible(QList<QTreeWidgetItem *>);
// attributs
private:

View File

@@ -299,6 +299,7 @@ void ProjectView::addDiagram(DiagramView *diagram) {
diagrams_ << diagram;
rebuildDiagramsMap();
connect(diagram, SIGNAL(titleChanged(DiagramView *, const QString &)), this, SLOT(updateTabTitle(DiagramView *, const QString &)));
connect(diagram, SIGNAL(findElementRequired(const ElementsLocation &)), this, SIGNAL(findElementRequired(const ElementsLocation &)));
// signale l'ajout du schema
emit(diagramAdded(diagram));

View File

@@ -21,6 +21,7 @@
class QETProject;
class DiagramView;
class Diagram;
class ElementsLocation;
class QETTabWidget;
/**
Cette classe affiche les schemas d'un projet dans des onglets.
@@ -70,6 +71,7 @@ class ProjectView : public QWidget {
void diagramActivated(DiagramView *);
void diagramOrderChanged(ProjectView *, int, int);
void projectClosed(ProjectView *);
void findElementRequired(const ElementsLocation &);
private:
void loadDiagrams();

View File

@@ -1252,6 +1252,9 @@ void QETDiagramEditor::addProjectView(ProjectView *project_view) {
// gere les changements de l'ordre des schemas dans le projet
connect(project_view, SIGNAL(diagramOrderChanged(ProjectView *, int, int)), this, SLOT(diagramOrderChanged(ProjectView *, int, int)));
// gere les demandes consistant a retrouver un element dans le panel
connect(project_view, SIGNAL(findElementRequired(const ElementsLocation &)), this, SLOT(findElementInPanel(const ElementsLocation &)));
// affiche la fenetre
if (maximise) project_view -> showMaximized();
else project_view -> show();
@@ -1675,6 +1678,46 @@ void QETDiagramEditor::diagramTitleChanged(DiagramView *dv) {
}
}
/**
@param location Emplacement de l'element a retrouver dans le panel
d'elements.
*/
void QETDiagramEditor::findElementInPanel(const ElementsLocation &location) {
bool element_found = pa -> elementsPanel().scrollToElement(location);
if (!element_found) {
// l'element n'a pas ete trouve
ElementsCollectionItem *element = QETApp::collectionItem(location);
if (element) {
// mais il semble exister tout de meme
// peut-etre vient-il d'un projet ouvert dans un autre editeur ?
if (location.project() && !findProject(location.project())) {
statusBar() -> showMessage(
tr("Impossible de retrouver cet \351l\351ment dans le panel car il semble \351dit\351 dans une autre fen\352tre"),
10000
);
} else {
// il devrait etre affiche : on tente de recharger le panel
statusBar() -> showMessage(
tr("Impossible de retrouver cet \351l\351ment dans le panel... rechargement du panel..."),
10000
);
pa -> reloadAndFilter();
statusBar() -> clearMessage();
element_found = pa -> elementsPanel().scrollToElement(location);
}
}
}
if (!element_found) {
statusBar() -> showMessage(
tr("Impossible de retrouver cet \351l\351ment dans le panel"),
10000
);
}
}
/**
Permet a l'utilisateur de configurer QET en lancant un dialogue approprie.
@see ConfigDialog

View File

@@ -26,6 +26,7 @@ class ProjectView;
class Diagram;
class DiagramView;
class ElementsPanelWidget;
class ElementsLocation;
class RecentFiles;
/**
Cette classe represente la fenetre principale de QElectroTech et,
@@ -144,6 +145,7 @@ class QETDiagramEditor : public QMainWindow {
void diagramIsAboutToBeRemoved(DiagramView *);
void diagramWasRemoved(DiagramView *);
void diagramTitleChanged(DiagramView *);
void findElementInPanel(const ElementsLocation &);
// attributs
public: