From 710558812a257db67179e0efd856ebb9d2f5120f Mon Sep 17 00:00:00 2001 From: Roman Telezhynskyi Date: Fri, 14 Oct 2016 17:11:15 +0300 Subject: [PATCH 1/4] Improved performans commands Select all/Select none in the list of details in layout. --HG-- branch : develop --- src/app/valentina/dialogs/vwidgetdetails.cpp | 4 ++-- .../undocommands/toggledetailinlayout.cpp | 19 +------------------ .../undocommands/toggledetailinlayout.h | 12 +++++++----- 3 files changed, 10 insertions(+), 25 deletions(-) diff --git a/src/app/valentina/dialogs/vwidgetdetails.cpp b/src/app/valentina/dialogs/vwidgetdetails.cpp index 80672e979..90d98b239 100644 --- a/src/app/valentina/dialogs/vwidgetdetails.cpp +++ b/src/app/valentina/dialogs/vwidgetdetails.cpp @@ -81,7 +81,7 @@ void VWidgetDetails::InLayoutStateChanged(int row, int column) const bool inLayout = not allDetails->value(id).IsInLayout(); ToggleDetailInLayout *togglePrint = new ToggleDetailInLayout(id, inLayout, m_data, m_doc); - connect(togglePrint, &ToggleDetailInLayout::NeedLiteParsing, m_doc, &VAbstractPattern::LiteParseTree); + connect(togglePrint, &ToggleDetailInLayout::UpdateList, this, &VWidgetDetails::UpdateList); qApp->getUndoStack()->push(togglePrint); } @@ -194,7 +194,7 @@ void VWidgetDetails::ShowContextMenu(const QPoint &pos) if (not select == m_data->DataDetails()->value(id).IsInLayout()) { ToggleDetailInLayout *togglePrint = new ToggleDetailInLayout(id, select, m_data, m_doc); - connect(togglePrint, &ToggleDetailInLayout::NeedLiteParsing, m_doc, &VAbstractPattern::LiteParseTree); + connect(togglePrint, &ToggleDetailInLayout::UpdateList, this, &VWidgetDetails::UpdateList); qApp->getUndoStack()->push(togglePrint); } } diff --git a/src/libs/vtools/undocommands/toggledetailinlayout.cpp b/src/libs/vtools/undocommands/toggledetailinlayout.cpp index 8c71997c7..88aa7daf2 100644 --- a/src/libs/vtools/undocommands/toggledetailinlayout.cpp +++ b/src/libs/vtools/undocommands/toggledetailinlayout.cpp @@ -82,22 +82,6 @@ void ToggleDetailInLayout::redo() } } -//--------------------------------------------------------------------------------------------------------------------- -bool ToggleDetailInLayout::mergeWith(const QUndoCommand *command) -{ - const ToggleDetailInLayout *stateCommand = static_cast(command); - SCASSERT(stateCommand != nullptr); - const quint32 id = stateCommand->getDetId(); - - if (id != m_id) - { - return false; - } - - m_newState = stateCommand->getNewState(); - return true; -} - //--------------------------------------------------------------------------------------------------------------------- int ToggleDetailInLayout::id() const { @@ -134,8 +118,7 @@ void ToggleDetailInLayout::Do(bool state) VDetail det = m_data->DataDetails()->value(m_id); det.SetInLayout(state); m_data->UpdateDetail(m_id, det); - - emit NeedLiteParsing(Document::LiteParse); + emit UpdateList(); } else { diff --git a/src/libs/vtools/undocommands/toggledetailinlayout.h b/src/libs/vtools/undocommands/toggledetailinlayout.h index eca12d4e4..9ba65da8c 100644 --- a/src/libs/vtools/undocommands/toggledetailinlayout.h +++ b/src/libs/vtools/undocommands/toggledetailinlayout.h @@ -50,16 +50,18 @@ public: virtual ~ToggleDetailInLayout(); virtual void undo() Q_DECL_OVERRIDE; virtual void redo() Q_DECL_OVERRIDE; - virtual bool mergeWith(const QUndoCommand *command) Q_DECL_OVERRIDE; virtual int id() const Q_DECL_OVERRIDE; quint32 getDetId() const; bool getNewState() const; + +signals: + void UpdateList(); private: Q_DISABLE_COPY(ToggleDetailInLayout) - quint32 m_id; - VContainer *m_data; - bool m_oldState; - bool m_newState; + quint32 m_id; + VContainer *m_data; + bool m_oldState; + bool m_newState; void Do(bool state); }; From d38e81cecb4d93d7d6b74a2aa1c309a403de85b1 Mon Sep 17 00:00:00 2001 From: Roman Telezhynskyi Date: Fri, 14 Oct 2016 20:41:37 +0300 Subject: [PATCH 2/4] Added new option "In layout" to context menu tool Detail. --HG-- branch : develop --- src/app/valentina/mainwindow.cpp | 1 + src/libs/ifc/xml/vabstractpattern.cpp | 6 ++++++ src/libs/ifc/xml/vabstractpattern.h | 2 ++ src/libs/vpatterndb/vcontainer.cpp | 18 +++++++++--------- src/libs/vpatterndb/vcontainer.h | 15 ++++++++++----- src/libs/vtools/tools/vtooldetail.cpp | 24 ++++++++++++++++-------- 6 files changed, 44 insertions(+), 22 deletions(-) diff --git a/src/app/valentina/mainwindow.cpp b/src/app/valentina/mainwindow.cpp index f302efc57..684814517 100644 --- a/src/app/valentina/mainwindow.cpp +++ b/src/app/valentina/mainwindow.cpp @@ -3510,6 +3510,7 @@ void MainWindow::InitDocksContain() detailsWidget = new VWidgetDetails(pattern, doc, this); connect(doc, &VPattern::FullUpdateFromFile, detailsWidget, &VWidgetDetails::UpdateList); + connect(doc, &VPattern::UpdateInLayoutList, detailsWidget, &VWidgetDetails::UpdateList); connect(detailsWidget, &VWidgetDetails::Highlight, sceneDetails, &VMainGraphicsScene::HighlightItem); detailsWidget->setVisible(false); } diff --git a/src/libs/ifc/xml/vabstractpattern.cpp b/src/libs/ifc/xml/vabstractpattern.cpp index 77a6dae99..535f8fc3d 100644 --- a/src/libs/ifc/xml/vabstractpattern.cpp +++ b/src/libs/ifc/xml/vabstractpattern.cpp @@ -1202,6 +1202,12 @@ void VAbstractPattern::ClearScene() emit ClearMainWindow(); } +//--------------------------------------------------------------------------------------------------------------------- +void VAbstractPattern::CheckInLayoutList() +{ + emit UpdateInLayoutList(); +} + //--------------------------------------------------------------------------------------------------------------------- void VAbstractPattern::ToolExists(const quint32 &id) const { diff --git a/src/libs/ifc/xml/vabstractpattern.h b/src/libs/ifc/xml/vabstractpattern.h index d13d8f718..e68299e53 100644 --- a/src/libs/ifc/xml/vabstractpattern.h +++ b/src/libs/ifc/xml/vabstractpattern.h @@ -291,6 +291,7 @@ signals: void UndoCommand(); void SetEnabledGUI(bool enabled); void CheckLayout(); + void UpdateInLayoutList(); void SetCurrentPP(const QString &patterPiece); public slots: @@ -298,6 +299,7 @@ public slots: void haveLiteChange(); void NeedFullParsing(); void ClearScene(); + void CheckInLayoutList(); protected: /** @brief nameActivDraw name current pattern peace. */ diff --git a/src/libs/vpatterndb/vcontainer.cpp b/src/libs/vpatterndb/vcontainer.cpp index ea350a8a9..5661de0c3 100644 --- a/src/libs/vpatterndb/vcontainer.cpp +++ b/src/libs/vpatterndb/vcontainer.cpp @@ -156,9 +156,9 @@ const val VContainer::GetObject(const QHash &obj, key id) const */ const VDetail VContainer::GetDetail(quint32 id) const { - if (d->details.contains(id)) + if (d->details->contains(id)) { - return d->details.value(id); + return d->details->value(id); } else { @@ -188,8 +188,8 @@ quint32 VContainer::AddGObject(VGObject *obj) */ quint32 VContainer::AddDetail(const VDetail &detail) { - quint32 id = getNextId(); - d->details[id] = detail; + const quint32 id = getNextId(); + d->details->insert(id, detail); return id; } @@ -260,7 +260,7 @@ void VContainer::Clear() qCDebug(vCon, "Clearing container data."); _id = NULL_ID; - d->details.clear(); + d->details->clear(); ClearVariables(); ClearGObjects(); ClearUniqueNames(); @@ -272,7 +272,7 @@ void VContainer::ClearForFullParse() qCDebug(vCon, "Clearing container data for full parse."); _id = NULL_ID; - d->details.clear(); + d->details->clear(); ClearVariables(VarType::Increment); ClearVariables(VarType::LineAngle); ClearVariables(VarType::LineLength); @@ -496,7 +496,7 @@ void VContainer::UpdateGObject(quint32 id, VGObject* obj) void VContainer::UpdateDetail(quint32 id, const VDetail &detail) { Q_ASSERT_X(id != NULL_ID, Q_FUNC_INFO, "id == 0"); //-V654 //-V712 - d->details[id] = detail; + d->details->insert(id, detail); UpdateId(id); } @@ -653,7 +653,7 @@ const QMap > VContainer::DataVar(const VarType &type) // cppcheck-suppress unusedFunction void VContainer::ClearDetails() { - d->details.clear(); + d->details->clear(); } //--------------------------------------------------------------------------------------------------------------------- @@ -731,7 +731,7 @@ const QHash > *VContainer::DataGObjects() cons */ const QHash *VContainer::DataDetails() const { - return &d->details; + return d->details.data(); } //--------------------------------------------------------------------------------------------------------------------- diff --git a/src/libs/vpatterndb/vcontainer.h b/src/libs/vpatterndb/vcontainer.h index 6a581f94c..028d763ce 100644 --- a/src/libs/vpatterndb/vcontainer.h +++ b/src/libs/vpatterndb/vcontainer.h @@ -78,14 +78,19 @@ class VContainerData : public QSharedData //-V690 public: VContainerData(const VTranslateVars *trVars, const Unit *patternUnit) - :gObjects(QHash >()), - variables(QHash > ()), details(QHash()), + : gObjects(QHash >()), + variables(QHash > ()), + details(QSharedPointer>(new QHash())), trVars(trVars), patternUnit(patternUnit) {} VContainerData(const VContainerData &data) - :QSharedData(data), gObjects(data.gObjects), - variables(data.variables), details(data.details), trVars(data.trVars), patternUnit(data.patternUnit) + : QSharedData(data), + gObjects(data.gObjects), + variables(data.variables), + details(data.details), + trVars(data.trVars), + patternUnit(data.patternUnit) {} virtual ~VContainerData(); @@ -102,7 +107,7 @@ public: /** * @brief details container of details */ - QHash details; + QSharedPointer> details; const VTranslateVars *trVars; const Unit *patternUnit; diff --git a/src/libs/vtools/tools/vtooldetail.cpp b/src/libs/vtools/tools/vtooldetail.cpp index cf0d90d33..1cfcb324b 100644 --- a/src/libs/vtools/tools/vtooldetail.cpp +++ b/src/libs/vtools/tools/vtooldetail.cpp @@ -76,6 +76,7 @@ #include "../undocommands/deletedetail.h" #include "../undocommands/movedetail.h" #include "../undocommands/savedetailoptions.h" +#include "../undocommands/toggledetailinlayout.h" #include "../vgeometry/varc.h" #include "../vgeometry/vcubicbezier.h" #include "../vgeometry/vcubicbezierpath.h" @@ -731,15 +732,15 @@ void VToolDetail::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) { QMenu menu; QAction *actionOption = menu.addAction(QIcon::fromTheme("preferences-other"), tr("Options")); + + QAction *inLayoutOption = menu.addAction(tr("In layout")); + inLayoutOption->setCheckable(true); + const VDetail detail = VAbstractTool::data.GetDetail(id); + inLayoutOption->setChecked(detail.IsInLayout()); + QAction *actionRemove = menu.addAction(QIcon::fromTheme("edit-delete"), tr("Delete")); - if (_referens > 1) - { - actionRemove->setEnabled(false); - } - else - { - actionRemove->setEnabled(true); - } + _referens > 1 ? actionRemove->setEnabled(false) : actionRemove->setEnabled(true); + QAction *selectedAction = menu.exec(event->screenPos()); if (selectedAction == actionOption) { @@ -751,6 +752,13 @@ void VToolDetail::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) setDialog(); dialog->show(); } + else if (selectedAction == inLayoutOption) + { + ToggleDetailInLayout *togglePrint = new ToggleDetailInLayout(id, selectedAction->isChecked(), + &(VAbstractTool::data), doc); + connect(togglePrint, &ToggleDetailInLayout::UpdateList, doc, &VAbstractPattern::CheckInLayoutList); + qApp->getUndoStack()->push(togglePrint); + } else if (selectedAction == actionRemove) { try From 972c70e6087eb92468a1c70cd34bb1aef3d53997 Mon Sep 17 00:00:00 2001 From: Roman Telezhynskyi Date: Fri, 14 Oct 2016 21:33:12 +0300 Subject: [PATCH 3/4] Selected detail is also selected in the list. --HG-- branch : develop --- src/app/valentina/dialogs/vwidgetdetails.cpp | 16 ++++++++++++++++ src/app/valentina/dialogs/vwidgetdetails.h | 1 + src/app/valentina/mainwindow.cpp | 1 + src/libs/ifc/xml/vabstractpattern.cpp | 6 ++++++ src/libs/ifc/xml/vabstractpattern.h | 2 ++ src/libs/vtools/tools/vtooldetail.cpp | 1 + 6 files changed, 27 insertions(+) diff --git a/src/app/valentina/dialogs/vwidgetdetails.cpp b/src/app/valentina/dialogs/vwidgetdetails.cpp index 90d98b239..23d8d68e1 100644 --- a/src/app/valentina/dialogs/vwidgetdetails.cpp +++ b/src/app/valentina/dialogs/vwidgetdetails.cpp @@ -65,6 +65,22 @@ void VWidgetDetails::UpdateList() FillTable(m_data->DataDetails()); } +//--------------------------------------------------------------------------------------------------------------------- +void VWidgetDetails::SelectDetail(quint32 id) +{ + const int rowCount = ui->tableWidget->rowCount(); + for (int row = 0; row < rowCount; ++row) + { + QTableWidgetItem *item = ui->tableWidget->item(row, 0); + + if (item->data(Qt::UserRole).toUInt() == id) + { + ui->tableWidget->setCurrentItem(item); + return; + } + } +} + //--------------------------------------------------------------------------------------------------------------------- void VWidgetDetails::InLayoutStateChanged(int row, int column) { diff --git a/src/app/valentina/dialogs/vwidgetdetails.h b/src/app/valentina/dialogs/vwidgetdetails.h index 0d2658a65..4f08445ea 100644 --- a/src/app/valentina/dialogs/vwidgetdetails.h +++ b/src/app/valentina/dialogs/vwidgetdetails.h @@ -53,6 +53,7 @@ signals: public slots: void UpdateList(); + void SelectDetail(quint32 id); private slots: void InLayoutStateChanged(int row, int column); diff --git a/src/app/valentina/mainwindow.cpp b/src/app/valentina/mainwindow.cpp index 684814517..2f678b024 100644 --- a/src/app/valentina/mainwindow.cpp +++ b/src/app/valentina/mainwindow.cpp @@ -3511,6 +3511,7 @@ void MainWindow::InitDocksContain() detailsWidget = new VWidgetDetails(pattern, doc, this); connect(doc, &VPattern::FullUpdateFromFile, detailsWidget, &VWidgetDetails::UpdateList); connect(doc, &VPattern::UpdateInLayoutList, detailsWidget, &VWidgetDetails::UpdateList); + connect(doc, &VPattern::ShowDetail, detailsWidget, &VWidgetDetails::SelectDetail); connect(detailsWidget, &VWidgetDetails::Highlight, sceneDetails, &VMainGraphicsScene::HighlightItem); detailsWidget->setVisible(false); } diff --git a/src/libs/ifc/xml/vabstractpattern.cpp b/src/libs/ifc/xml/vabstractpattern.cpp index 535f8fc3d..2975f223b 100644 --- a/src/libs/ifc/xml/vabstractpattern.cpp +++ b/src/libs/ifc/xml/vabstractpattern.cpp @@ -1208,6 +1208,12 @@ void VAbstractPattern::CheckInLayoutList() emit UpdateInLayoutList(); } +//--------------------------------------------------------------------------------------------------------------------- +void VAbstractPattern::SelectedDetail(quint32 id) +{ + emit ShowDetail(id); +} + //--------------------------------------------------------------------------------------------------------------------- void VAbstractPattern::ToolExists(const quint32 &id) const { diff --git a/src/libs/ifc/xml/vabstractpattern.h b/src/libs/ifc/xml/vabstractpattern.h index e68299e53..ca4b8faef 100644 --- a/src/libs/ifc/xml/vabstractpattern.h +++ b/src/libs/ifc/xml/vabstractpattern.h @@ -292,6 +292,7 @@ signals: void SetEnabledGUI(bool enabled); void CheckLayout(); void UpdateInLayoutList(); + void ShowDetail(quint32 id); void SetCurrentPP(const QString &patterPiece); public slots: @@ -300,6 +301,7 @@ public slots: void NeedFullParsing(); void ClearScene(); void CheckInLayoutList(); + void SelectedDetail(quint32 id); protected: /** @brief nameActivDraw name current pattern peace. */ diff --git a/src/libs/vtools/tools/vtooldetail.cpp b/src/libs/vtools/tools/vtooldetail.cpp index 1cfcb324b..ccfbf855f 100644 --- a/src/libs/vtools/tools/vtooldetail.cpp +++ b/src/libs/vtools/tools/vtooldetail.cpp @@ -671,6 +671,7 @@ void VToolDetail::mousePressEvent(QGraphicsSceneMouseEvent *event) if (event->button() == Qt::LeftButton && event->type() != QEvent::GraphicsSceneMouseDoubleClick) { + doc->SelectedDetail(id); emit ChoosedTool(id, SceneObject::Detail); } From 29664e118a0dd43f0b25c30939e0cd5643e59f69 Mon Sep 17 00:00:00 2001 From: Roman Telezhynskyi Date: Fri, 14 Oct 2016 23:25:10 +0300 Subject: [PATCH 4/4] Added new option "Invert selection" to context menu tool Detail. --HG-- branch : develop --- src/app/valentina/dialogs/vwidgetdetails.cpp | 134 ++++++++++++------- src/app/valentina/dialogs/vwidgetdetails.h | 1 + 2 files changed, 86 insertions(+), 49 deletions(-) diff --git a/src/app/valentina/dialogs/vwidgetdetails.cpp b/src/app/valentina/dialogs/vwidgetdetails.cpp index 23d8d68e1..afeed4185 100644 --- a/src/app/valentina/dialogs/vwidgetdetails.cpp +++ b/src/app/valentina/dialogs/vwidgetdetails.cpp @@ -156,68 +156,104 @@ void VWidgetDetails::FillTable(const QHash *details) } //--------------------------------------------------------------------------------------------------------------------- -void VWidgetDetails::ShowContextMenu(const QPoint &pos) +void VWidgetDetails::ToggleSectionDetails(bool select) { - QMenu *menu = new QMenu; - QAction *actionSelectAll = menu->addAction(tr("Select all")); - QAction *actionSelectNone = menu->addAction(tr("Select none")); - const QHash *allDetails = m_data->DataDetails(); - if (not allDetails->count() == 0) + if (allDetails->count() == 0) { - int selectedDetails = 0; + return; + } - QHash::const_iterator iter = allDetails->constBegin(); - while (iter != allDetails->constEnd()) + for (int i = 0; itableWidget->rowCount(); ++i) + { + QTableWidgetItem *item = ui->tableWidget->item(i, 0); + const quint32 id = item->data(Qt::UserRole).toUInt(); + if (allDetails->contains(id)) { - if(iter.value().IsInLayout()) - { - selectedDetails++; - } - ++iter; - } - if (selectedDetails == 0) - { - actionSelectNone->setDisabled(true); - } - else if (selectedDetails == allDetails->size()) - { - actionSelectAll->setDisabled(true); - } - - QAction *selectedAction = menu->exec(ui->tableWidget->viewport()->mapToGlobal(pos)); - - bool select; - if (selectedAction == actionSelectAll) - { - select = true; - qApp->getUndoStack()->beginMacro(tr("select all details")); - } - else if (selectedAction == actionSelectNone) - { - select = false; - qApp->getUndoStack()->beginMacro(tr("select none details")); - } - else - { - return; - } - - for (int i = 0; itableWidget->rowCount(); ++i) - { - QTableWidgetItem *item = ui->tableWidget->item(i, 0); - const quint32 id = item->data(Qt::UserRole).toUInt(); - if (not select == m_data->DataDetails()->value(id).IsInLayout()) + if (not select == allDetails->value(id).IsInLayout()) { ToggleDetailInLayout *togglePrint = new ToggleDetailInLayout(id, select, m_data, m_doc); connect(togglePrint, &ToggleDetailInLayout::UpdateList, this, &VWidgetDetails::UpdateList); qApp->getUndoStack()->push(togglePrint); } } - qApp->getUndoStack()->endMacro(); } - else +} + +//--------------------------------------------------------------------------------------------------------------------- +void VWidgetDetails::ShowContextMenu(const QPoint &pos) +{ + QMenu *menu = new QMenu(this); + QAction *actionSelectAll = menu->addAction(tr("Select all")); + QAction *actionSelectNone = menu->addAction(tr("Select none")); + + QAction *actionSeparator = new QAction(this); + actionSeparator->setSeparator(true); + menu->addAction(actionSeparator); + + QAction *actionInvertSelection = menu->addAction(tr("Invert selection")); + + const QHash *allDetails = m_data->DataDetails(); + if (allDetails->count() == 0) { return; } + + int selectedDetails = 0; + + QHash::const_iterator iter = allDetails->constBegin(); + while (iter != allDetails->constEnd()) + { + if(iter.value().IsInLayout()) + { + selectedDetails++; + } + ++iter; + } + + if (selectedDetails == 0) + { + actionSelectNone->setDisabled(true); + } + else if (selectedDetails == allDetails->size()) + { + actionSelectAll->setDisabled(true); + } + + + QAction *selectedAction = menu->exec(ui->tableWidget->viewport()->mapToGlobal(pos)); + + bool select; + if (selectedAction == actionSelectAll) + { + select = true; + qApp->getUndoStack()->beginMacro(tr("select all details")); + ToggleSectionDetails(select); + } + else if (selectedAction == actionSelectNone) + { + select = false; + qApp->getUndoStack()->beginMacro(tr("select none details")); + ToggleSectionDetails(select); + } + else if (selectedAction == actionInvertSelection) + { + qApp->getUndoStack()->beginMacro(tr("invert selection")); + + for (int i = 0; itableWidget->rowCount(); ++i) + { + QTableWidgetItem *item = ui->tableWidget->item(i, 0); + const quint32 id = item->data(Qt::UserRole).toUInt(); + if (allDetails->contains(id)) + { + select = not allDetails->value(id).IsInLayout(); + + ToggleDetailInLayout *togglePrint = new ToggleDetailInLayout(id, select, m_data, m_doc); + connect(togglePrint, &ToggleDetailInLayout::UpdateList, this, &VWidgetDetails::UpdateList); + qApp->getUndoStack()->push(togglePrint); + } + } + } + + qApp->getUndoStack()->endMacro(); } diff --git a/src/app/valentina/dialogs/vwidgetdetails.h b/src/app/valentina/dialogs/vwidgetdetails.h index 4f08445ea..987bb74d1 100644 --- a/src/app/valentina/dialogs/vwidgetdetails.h +++ b/src/app/valentina/dialogs/vwidgetdetails.h @@ -66,6 +66,7 @@ private: VContainer *m_data; void FillTable(const QHash *details); + void ToggleSectionDetails(bool select); }; #endif // VWIDGETDETAILS_H