From 8fa096f23b42389c63f598211edc2fc2ffe50d82 Mon Sep 17 00:00:00 2001 From: wmayer Date: Thu, 17 Sep 2020 11:35:41 +0200 Subject: [PATCH] PD: fixes for pipe task panel + fix Qt4 build failure + fix handling of adding items to spine/auxiliary spine/sections to allow to remove them again + QListWidget::takeItem() returns a pointer to the removed item. So a previous call of QListWidget::item() is superfluous --- src/Mod/PartDesign/Gui/TaskPipeParameters.cpp | 46 ++++++++++++------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/src/Mod/PartDesign/Gui/TaskPipeParameters.cpp b/src/Mod/PartDesign/Gui/TaskPipeParameters.cpp index 39346b47d6..f5e9a46304 100644 --- a/src/Mod/PartDesign/Gui/TaskPipeParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskPipeParameters.cpp @@ -189,8 +189,12 @@ void TaskPipeParameters::onSelectionChanged(const Gui::SelectionChanges& msg) } else if (selectionMode == refAdd) { QString sub = QString::fromStdString(msg.pSubName); - if (!sub.isEmpty()) - ui->listWidgetReferences->addItem(QString::fromStdString(msg.pSubName)); + if (!sub.isEmpty()) { + QListWidgetItem* item = new QListWidgetItem(); + item->setText(sub); + item->setData(Qt::UserRole, QByteArray(msg.pSubName)); + ui->listWidgetReferences->addItem(item); + } App::Document* document = App::GetApplication().getDocument(msg.pDocName); App::DocumentObject* object = document ? document->getObject(msg.pObjectName) : nullptr; @@ -309,17 +313,18 @@ void TaskPipeParameters::onDeleteEdge() { // Delete the selected path edge int row = ui->listWidgetReferences->currentRow(); - QListWidgetItem* item = ui->listWidgetReferences->item(row); + QListWidgetItem* item = ui->listWidgetReferences->takeItem(row); if (item) { QByteArray data = item->data(Qt::UserRole).toByteArray(); - ui->listWidgetReferences->takeItem(row); delete item; + // search inside the list of spines PartDesign::Pipe* pipe = static_cast(vp->getObject()); std::vector refs = pipe->Spine.getSubValues(); - std::string obj = data.toStdString(); + std::string obj = data.constData(); std::vector::iterator f = std::find(refs.begin(), refs.end(), obj); - // if something was found, delte it and update the spine list + + // if something was found, delete it and update the spine list if (f != refs.end()) { refs.erase(f); pipe->Spine.setValue(pipe->Spine.getValue(), refs); @@ -582,8 +587,12 @@ void TaskPipeOrientation::onSelectionChanged(const SelectionChanges& msg) { if (referenceSelected(msg)) { if (selectionMode == refAdd) { QString sub = QString::fromStdString(msg.pSubName); - if (!sub.isEmpty()) - ui->listWidgetReferences->addItem(QString::fromStdString(msg.pSubName)); + if (!sub.isEmpty()) { + QListWidgetItem* item = new QListWidgetItem(); + item->setText(sub); + item->setData(Qt::UserRole, QByteArray(msg.pSubName)); + ui->listWidgetReferences->addItem(item); + } App::Document* document = App::GetApplication().getDocument(msg.pDocName); App::DocumentObject* object = document ? document->getObject(msg.pObjectName) : nullptr; @@ -676,17 +685,18 @@ void TaskPipeOrientation::onDeleteItem() { // Delete the selected spine int row = ui->listWidgetReferences->currentRow(); - QListWidgetItem* item = ui->listWidgetReferences->item(row); + QListWidgetItem* item = ui->listWidgetReferences->takeItem(row); if (item) { QByteArray data = item->data(Qt::UserRole).toByteArray(); - ui->listWidgetReferences->takeItem(row); delete item; + // search inside the list of spines PartDesign::Pipe* pipe = static_cast(vp->getObject()); std::vector refs = pipe->AuxillerySpine.getSubValues(); - std::string obj = data.toStdString(); + std::string obj = data.constData(); std::vector::iterator f = std::find(refs.begin(), refs.end(), obj); - // if something was found, delte it and update the spine list + + // if something was found, delete it and update the spine list if (f != refs.end()) { refs.erase(f); pipe->AuxillerySpine.setValue(pipe->AuxillerySpine.getValue(), refs); @@ -811,7 +821,10 @@ void TaskPipeScaling::onSelectionChanged(const SelectionChanges& msg) { if (object) { QString label = QString::fromUtf8(object->Label.getValue()); if (selectionMode == refAdd) { - ui->listWidgetReferences->addItem(label); + QListWidgetItem* item = new QListWidgetItem(); + item->setText(label); + item->setData(Qt::UserRole, QByteArray(msg.pObjectName)); + ui->listWidgetReferences->addItem(item); } else if (selectionMode == refRemove) { removeFromListWidget(ui->listWidgetReferences, label); @@ -883,17 +896,18 @@ void TaskPipeScaling::onDeleteSection() { // Delete the selected profile int row = ui->listWidgetReferences->currentRow(); - QListWidgetItem* item = ui->listWidgetReferences->item(row); + QListWidgetItem* item = ui->listWidgetReferences->takeItem(row); if (item) { QByteArray data = item->data(Qt::UserRole).toByteArray(); - ui->listWidgetReferences->takeItem(row); delete item; + // search inside the list of sections PartDesign::Pipe* pipe = static_cast(vp->getObject()); std::vector refs = pipe->Sections.getValues(); App::DocumentObject* obj = pipe->getDocument()->getObject(data.constData()); std::vector::iterator f = std::find(refs.begin(), refs.end(), obj); - // if something was found, delte it and update the section list + + // if something was found, delete it and update the section list if (f != refs.end()) { refs.erase(f); pipe->Sections.setValues(refs);