diff --git a/sources/ui/elementselectorwidget.cpp b/sources/ui/elementselectorwidget.cpp index 4451dcab1..f7a5ba952 100644 --- a/sources/ui/elementselectorwidget.cpp +++ b/sources/ui/elementselectorwidget.cpp @@ -61,6 +61,34 @@ void ElementSelectorWidget::showElement(Element *elmt) { showed_element = elmt; } +/** + * @brief ElementSelectorWidget::clear + * Clear the curent list and the widget + */ +void ElementSelectorWidget::clear() { + elements_list.clear(); + string_filter.clear(); + if(showed_element) showed_element->setHighlighted(false); + foreach(QWidget *w, content_list) { + ui->scroll_layout_->removeWidget(w); + delete w; + } + content_list.clear(); + delete sm_; + delete sm_show_; +} + +/** + * @brief ElementSelectorWidget::setList + * Set new list of elements + * @param elmt_list the new elements list + */ +void ElementSelectorWidget::setList(QList elmt_list) { + clear(); + elements_list << elmt_list; + buildInterface(); +} + /** * @brief ElementSelectorWidget::buildInterface * Build interface of this widget (fill all available element) @@ -84,14 +112,23 @@ void ElementSelectorWidget::buildInterface() { .arg(elmt->diagram() -> convertPosition(elmt -> scenePos()).toString()); //add the button himself - QHBoxLayout *hl = new QHBoxLayout(); - QRadioButton *rb = new QRadioButton(button_text , this); - QPushButton *pb = new QPushButton(QET::Icons::ZoomDraw,"", this); + QWidget *widget = new QWidget(this); + QHBoxLayout *hl = new QHBoxLayout(widget); + hl->setContentsMargins(0,0,0,0); + QRadioButton *rb = new QRadioButton(button_text , widget); + QPushButton *pb = new QPushButton(QET::Icons::ZoomDraw,"", widget); pb->setToolTip(tr("Voir l'\351l\351ment")); hl->addWidget(rb); hl->addStretch(); hl->addWidget(pb); - ui->scroll_layout_->addLayout(hl); + ui->scroll_layout_->insertWidget(map_id, widget); + content_list << widget; + //Add the string for filter this widget + QString filter; + foreach(QString str, elmt->elementInformations().keys()){ + filter += elmt->elementInformations()[str].toString(); + } + string_filter << filter; //map the radio button signal connect(rb, SIGNAL(clicked()), sm_, SLOT(map())); @@ -102,7 +139,6 @@ void ElementSelectorWidget::buildInterface() { map_id++; //increase the map_id for next button. } - ui->scroll_layout_->addStretch(); } /** @@ -114,3 +150,23 @@ void ElementSelectorWidget::showElementFromList(const int i) { if (elements_list.size() >= i) showElement(elements_list.at(i)); } + +/** + * @brief ElementSelectorWidget::filter + * Filter the content of the list. + * Give an empty string remove all filter. + * @param str string to filter + */ +void ElementSelectorWidget::filter(const QString &str) { + if(str.isEmpty()) { + foreach (QWidget *w, content_list) w->setHidden(false); + } + else { + for (int i =0; isetHidden(false); + else + content_list.at(i)->setHidden(true); + } + } +} diff --git a/sources/ui/elementselectorwidget.h b/sources/ui/elementselectorwidget.h index 87d2ae076..fb3d46b52 100644 --- a/sources/ui/elementselectorwidget.h +++ b/sources/ui/elementselectorwidget.h @@ -41,6 +41,11 @@ class ElementSelectorWidget : public QWidget ~ElementSelectorWidget(); Element * selectedElement () const{return selected_element;} void showElement(Element *elmt); + void clear(); + void setList(QList elmt_list); + + public slots: + void filter(const QString &str); private: void buildInterface(); @@ -56,6 +61,8 @@ class ElementSelectorWidget : public QWidget QList elements_list; QSignalMapper *sm_, *sm_show_; Element *selected_element, *showed_element; + QList content_list; + QStringList string_filter; }; #endif // ELEMENTSELECTORWIDGET_H diff --git a/sources/ui/elementselectorwidget.ui b/sources/ui/elementselectorwidget.ui index 5a26f585b..037040383 100644 --- a/sources/ui/elementselectorwidget.ui +++ b/sources/ui/elementselectorwidget.ui @@ -19,6 +19,9 @@ true + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + @@ -28,7 +31,21 @@ 280 - + + + + + Qt::Vertical + + + + 20 + 40 + + + + + diff --git a/sources/ui/linksingleelementwidget.cpp b/sources/ui/linksingleelementwidget.cpp index 39dea8a64..345175339 100644 --- a/sources/ui/linksingleelementwidget.cpp +++ b/sources/ui/linksingleelementwidget.cpp @@ -37,7 +37,8 @@ LinkSingleElementWidget::LinkSingleElementWidget(Element *elmt, QWidget *parent) esw_(0), diagram_list(element_->diagram()->project()->diagrams()), unlink_widget(0), - unlink_(false) + unlink_(false), + search_field(0) { ui->setupUi(this); @@ -49,7 +50,7 @@ LinkSingleElementWidget::LinkSingleElementWidget(Element *elmt, QWidget *parent) filter_ = Element::Simple; buildInterface(); - connect(ui->folio_combo_box, SIGNAL(currentIndexChanged(int)), this, SLOT(reBuildList())); + connect(ui->folio_combo_box, SIGNAL(currentIndexChanged(int)), this, SLOT(setNewList())); } /** @@ -87,18 +88,14 @@ void LinkSingleElementWidget::buildInterface() { ui->folio_combo_box->addItem(title); } - //Element is free build list - if(element_->isFree()) { - buildList(); + buildList(); + if (!element_->isFree()) { ui->button_linked->setDisabled(true); - } - //Element isn't free build an empty list and add 'unlink' button - else { buildUnlinkButton(); - QList elmt_list; - esw_ = new ElementSelectorWidget(elmt_list, this); - ui->content_layout->addWidget(esw_); } + + if(filter_ & Element::Master) + buildSearchField(); } /** @@ -108,30 +105,7 @@ void LinkSingleElementWidget::buildInterface() { * required folio (folio selected with the combo box) */ void LinkSingleElementWidget::buildList() { - QList elmt_list; - int i = ui->folio_combo_box->currentIndex(); - - //find in all diagram of this project - if (i == 0) { - ElementProvider ep(element_->diagram()->project()); - if (filter_ & Element::AllReport) - elmt_list = ep.freeElement(filter_); - else - elmt_list = ep.find(filter_); - } - //find in single diagram - else { - ElementProvider ep (diagram_list.at(i-1)); - if (filter_ & Element::AllReport) - elmt_list = ep.freeElement(filter_); - else - elmt_list = ep.find(filter_); - } - - //If element is linked, remove is parent from the list - if(!element_->isFree()) elmt_list.removeAll(element_->linkedElements().first()); - - esw_ = new ElementSelectorWidget(elmt_list, this); + esw_ = new ElementSelectorWidget(availableElements(), this); ui->content_layout->addWidget(esw_); } @@ -153,15 +127,79 @@ void LinkSingleElementWidget::buildUnlinkButton() { } /** - * @brief LinkSingleElementWidget::reBuildList - * Rebuild the list of element + * @brief LinkSingleElementWidget::buildSearchField + * Build a line edit for search element by they information, + * like label or information */ -void LinkSingleElementWidget::reBuildList() { - if (element_->isFree() || unlink_) { - ui->content_layout->removeWidget(esw_); - delete esw_; - buildList(); +void LinkSingleElementWidget::buildSearchField() { + search_field = new QLineEdit(this); + search_field -> setPlaceholderText(tr("Rechercher")); + setUpCompleter(); + connect(search_field, SIGNAL(textChanged(QString)), esw_, SLOT(filter(QString))); + ui->header_layout->addWidget(search_field); +} + +/** + * @brief LinkSingleElementWidget::availableElements + * @return A QList with all available element + * to be linked with the edited element. + * This methode take care of the combo box "find in diagram" + */ +QList LinkSingleElementWidget::availableElements() { + QList elmt_list; + //if element isn't free and unlink isn't pressed, return an empty list + if (!element_->isFree() && !unlink_) return elmt_list; + + int i = ui->folio_combo_box->currentIndex(); + //find in all diagram of this project + if (i == 0) { + ElementProvider ep(element_->diagram()->project()); + if (filter_ & Element::AllReport) + elmt_list = ep.freeElement(filter_); + else + elmt_list = ep.find(filter_); } + //find in single diagram + else { + ElementProvider ep (diagram_list.at(i-1)); + if (filter_ & Element::AllReport) + elmt_list = ep.freeElement(filter_); + else + elmt_list = ep.find(filter_); + } + //If element is linked, remove is parent from the list + if(!element_->isFree()) elmt_list.removeAll(element_->linkedElements().first()); + + return elmt_list; +} + +/** + * @brief LinkSingleElementWidget::setUpCompleter + * Setup the completer for the find_field + */ +void LinkSingleElementWidget::setUpCompleter() { + if (search_field) { + search_field->clear(); + delete search_field->completer(); + + QStringList list; + foreach (Element *elmt, availableElements()) + foreach(QString str, elmt->elementInformations().keys()) + list << elmt->elementInformations()[str].toString(); + + QCompleter *comp = new QCompleter(list, search_field); + comp->setCaseSensitivity(Qt::CaseInsensitive); + search_field->setCompleter(comp); + } +} + +/** + * @brief LinkSingleElementWidget::setNewList + * Set the list according to the selected diagram in the combo_box + */ +void LinkSingleElementWidget::setNewList() { + esw_->setList(availableElements()); + setUpCompleter(); } /** @@ -173,7 +211,7 @@ void LinkSingleElementWidget::unlinkClicked() { delete unlink_widget; unlink_widget = 0; unlink_ = true; - reBuildList(); + setNewList(); } /** diff --git a/sources/ui/linksingleelementwidget.h b/sources/ui/linksingleelementwidget.h index 11fdc9ee5..511802474 100644 --- a/sources/ui/linksingleelementwidget.h +++ b/sources/ui/linksingleelementwidget.h @@ -52,9 +52,12 @@ class LinkSingleElementWidget : public QWidget void buildInterface(); void buildList(); void buildUnlinkButton(); + void buildSearchField(); + QList availableElements(); + void setUpCompleter(); private slots: - void reBuildList(); + void setNewList(); void unlinkClicked(); void on_button_this_clicked(); void on_button_linked_clicked(); @@ -68,6 +71,7 @@ class LinkSingleElementWidget : public QWidget QWidget *unlink_widget; bool unlink_; Element::kind filter_; + QLineEdit *search_field; }; #endif // LINKSINGLEELEMENTWIDGET_H