From 1608599795de14fa9e7b67f5355d60235f6af0c0 Mon Sep 17 00:00:00 2001 From: Roman Telezhynskyi Date: Sun, 26 Jun 2016 14:36:12 +0300 Subject: [PATCH] Added list "Details in layout". --HG-- branch : feature --- src/app/valentina/dialogs/dialogs.pri | 9 +- src/app/valentina/dialogs/vwidgetdetails.cpp | 125 +++++++++++++++++ src/app/valentina/dialogs/vwidgetdetails.h | 66 +++++++++ src/app/valentina/dialogs/vwidgetdetails.ui | 58 ++++++++ src/app/valentina/dialogs/vwidgetgroups.ui | 10 +- src/app/valentina/mainwindow.cpp | 106 ++++++++------ src/app/valentina/mainwindow.h | 5 +- src/app/valentina/mainwindow.ui | 5 +- src/app/valentina/xml/vpattern.cpp | 1 + src/libs/ifc/ifcdef.cpp | 1 + src/libs/ifc/ifcdef.h | 1 + src/libs/vmisc/share/resources/icon.qrc | 4 + .../resources/icon/16x16/allow_detail.png | Bin 0 -> 3315 bytes .../resources/icon/16x16/allow_detail@2x.png | Bin 0 -> 4137 bytes .../resources/icon/16x16/forbid_detail.png | Bin 0 -> 3519 bytes .../resources/icon/16x16/forbid_detail@2x.png | Bin 0 -> 5175 bytes src/libs/vpatterndb/vdetail.cpp | 12 ++ src/libs/vpatterndb/vdetail.h | 3 + src/libs/vpatterndb/vdetail_p.h | 8 +- .../undocommands/toggledetailinlayout.cpp | 132 ++++++++++++++++++ .../undocommands/toggledetailinlayout.h | 57 ++++++++ src/libs/vtools/undocommands/undocommands.pri | 6 +- src/libs/vtools/undocommands/vundocommand.h | 3 +- 23 files changed, 552 insertions(+), 60 deletions(-) create mode 100644 src/app/valentina/dialogs/vwidgetdetails.cpp create mode 100644 src/app/valentina/dialogs/vwidgetdetails.h create mode 100644 src/app/valentina/dialogs/vwidgetdetails.ui create mode 100644 src/libs/vmisc/share/resources/icon/16x16/allow_detail.png create mode 100644 src/libs/vmisc/share/resources/icon/16x16/allow_detail@2x.png create mode 100644 src/libs/vmisc/share/resources/icon/16x16/forbid_detail.png create mode 100644 src/libs/vmisc/share/resources/icon/16x16/forbid_detail@2x.png create mode 100644 src/libs/vtools/undocommands/toggledetailinlayout.cpp create mode 100644 src/libs/vtools/undocommands/toggledetailinlayout.h diff --git a/src/app/valentina/dialogs/dialogs.pri b/src/app/valentina/dialogs/dialogs.pri index c5910f074..edc6d002c 100644 --- a/src/app/valentina/dialogs/dialogs.pri +++ b/src/app/valentina/dialogs/dialogs.pri @@ -18,7 +18,8 @@ HEADERS += \ $$PWD/dialoglayoutsettings.h \ $$PWD/dialoglayoutprogress.h \ $$PWD/dialogsavelayout.h \ - $$PWD/vwidgetgroups.h + $$PWD/vwidgetgroups.h \ + $$PWD/vwidgetdetails.h SOURCES += \ $$PWD/dialogincrements.cpp \ @@ -35,7 +36,8 @@ SOURCES += \ $$PWD/dialoglayoutsettings.cpp \ $$PWD/dialoglayoutprogress.cpp \ $$PWD/dialogsavelayout.cpp \ - $$PWD/vwidgetgroups.cpp + $$PWD/vwidgetgroups.cpp \ + $$PWD/vwidgetdetails.cpp FORMS += \ $$PWD/dialogincrements.ui \ @@ -47,4 +49,5 @@ FORMS += \ $$PWD/dialoglayoutsettings.ui \ $$PWD/dialoglayoutprogress.ui \ $$PWD/dialogsavelayout.ui \ - $$PWD/vwidgetgroups.ui + $$PWD/vwidgetgroups.ui \ + $$PWD/vwidgetdetails.ui diff --git a/src/app/valentina/dialogs/vwidgetdetails.cpp b/src/app/valentina/dialogs/vwidgetdetails.cpp new file mode 100644 index 000000000..c8b636727 --- /dev/null +++ b/src/app/valentina/dialogs/vwidgetdetails.cpp @@ -0,0 +1,125 @@ +/************************************************************************ + ** + ** @file vwidgetdetails.cpp + ** @author Roman Telezhynskyi + ** @date 25 6, 2016 + ** + ** @brief + ** @copyright + ** This source code is part of the Valentine project, a pattern making + ** program, whose allow create and modeling patterns of clothing. + ** Copyright (C) 2016 Valentina project + ** All Rights Reserved. + ** + ** Valentina 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 3 of the License, or + ** (at your option) any later version. + ** + ** Valentina 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 Valentina. If not, see . + ** + *************************************************************************/ + +#include "vwidgetdetails.h" +#include "ui_vwidgetdetails.h" +#include "../ifc/xml/vabstractpattern.h" +#include "../vpatterndb/vcontainer.h" +#include "../vmisc/vabstractapplication.h" +#include "../vtools/undocommands/toggledetailinlayout.h" + +#include + +//--------------------------------------------------------------------------------------------------------------------- +VWidgetDetails::VWidgetDetails(VContainer *data, VAbstractPattern *doc, QWidget *parent) + : QWidget(parent), + ui(new Ui::VWidgetDetails), + m_doc(doc), + m_data(data) +{ + ui->setupUi(this); + + FillTable(m_data->DataDetails()); + + connect(ui->tableWidget, &QTableWidget::cellClicked, this, &VWidgetDetails::InLayoutStateChanged); +} + +//--------------------------------------------------------------------------------------------------------------------- +VWidgetDetails::~VWidgetDetails() +{ + delete ui; +} + +//--------------------------------------------------------------------------------------------------------------------- +void VWidgetDetails::UpdateList() +{ + FillTable(m_data->DataDetails()); +} + +//--------------------------------------------------------------------------------------------------------------------- +void VWidgetDetails::InLayoutStateChanged(int row, int column) +{ + if (column != 0) + { + return; + } + + QTableWidgetItem *item = ui->tableWidget->item(row, column); + const quint32 id = item->data(Qt::UserRole).toUInt(); + const QHash *allDetails = m_data->DataDetails(); + 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); + qApp->getUndoStack()->push(togglePrint); +} + +//--------------------------------------------------------------------------------------------------------------------- +void VWidgetDetails::FillTable(const QHash *details) +{ + const int selectedRow = ui->tableWidget->currentRow(); + ui->tableWidget->clear(); + + ui->tableWidget->setColumnCount(2); + ui->tableWidget->setRowCount(details->size()); + qint32 currentRow = -1; + auto i = details->constBegin(); + while (i != details->constEnd()) + { + ++currentRow; + const VDetail det = i.value(); + + QTableWidgetItem *item = new QTableWidgetItem(); + item->setTextAlignment(Qt::AlignHCenter); + if (det.IsInLayout()) + { + item->setIcon(QIcon("://icon/16x16/allow_detail.png")); + } + else + { + item->setIcon(QIcon("://icon/16x16/forbid_detail.png")); + } + item->setData(Qt::UserRole, i.key()); + ui->tableWidget->setItem(currentRow, 0, item); + + QString name = det.getName(); + if (name.isEmpty()) + { + name = tr("Unnamed"); + } + + item = new QTableWidgetItem(name); + item->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter); + ui->tableWidget->setItem(currentRow, 1, item); + ++i; + } + ui->tableWidget->resizeColumnsToContents(); + ui->tableWidget->resizeRowsToContents(); + + ui->tableWidget->setCurrentCell(selectedRow, 0); +} diff --git a/src/app/valentina/dialogs/vwidgetdetails.h b/src/app/valentina/dialogs/vwidgetdetails.h new file mode 100644 index 000000000..c59147007 --- /dev/null +++ b/src/app/valentina/dialogs/vwidgetdetails.h @@ -0,0 +1,66 @@ +/************************************************************************ + ** + ** @file vwidgetdetails.h + ** @author Roman Telezhynskyi + ** @date 25 6, 2016 + ** + ** @brief + ** @copyright + ** This source code is part of the Valentine project, a pattern making + ** program, whose allow create and modeling patterns of clothing. + ** Copyright (C) 2016 Valentina project + ** All Rights Reserved. + ** + ** Valentina 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 3 of the License, or + ** (at your option) any later version. + ** + ** Valentina 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 Valentina. If not, see . + ** + *************************************************************************/ + +#ifndef VWIDGETDETAILS_H +#define VWIDGETDETAILS_H + +#include + +class VAbstractPattern; +class VContainer; +class VDetail; + +namespace Ui +{ + class VWidgetDetails; +} + +class VWidgetDetails : public QWidget +{ + Q_OBJECT + +public: + explicit VWidgetDetails(VContainer *data, VAbstractPattern *doc, QWidget *parent = nullptr); + virtual ~VWidgetDetails(); + +public slots: + void UpdateList(); + +private slots: + void InLayoutStateChanged(int row, int column); + +private: + Q_DISABLE_COPY(VWidgetDetails) + Ui::VWidgetDetails *ui; + VAbstractPattern *m_doc; + VContainer *m_data; + + void FillTable(const QHash *details); +}; + +#endif // VWIDGETDETAILS_H diff --git a/src/app/valentina/dialogs/vwidgetdetails.ui b/src/app/valentina/dialogs/vwidgetdetails.ui new file mode 100644 index 000000000..fb6fc341a --- /dev/null +++ b/src/app/valentina/dialogs/vwidgetdetails.ui @@ -0,0 +1,58 @@ + + + VWidgetDetails + + + + 0 + 0 + 400 + 300 + + + + Form + + + + + + true + + + QAbstractItemView::SingleSelection + + + QAbstractItemView::SelectRows + + + false + + + false + + + 16 + + + false + + + true + + + false + + + false + + + 10 + + + + + + + + diff --git a/src/app/valentina/dialogs/vwidgetgroups.ui b/src/app/valentina/dialogs/vwidgetgroups.ui index 3bd6c417e..006e30e6c 100644 --- a/src/app/valentina/dialogs/vwidgetgroups.ui +++ b/src/app/valentina/dialogs/vwidgetgroups.ui @@ -11,7 +11,11 @@ - Form + + + + + :/icon/64x64/icon64x64.png:/icon/64x64/icon64x64.png @@ -53,6 +57,8 @@ - + + + diff --git a/src/app/valentina/mainwindow.cpp b/src/app/valentina/mainwindow.cpp index fdacde006..cc5b835b6 100644 --- a/src/app/valentina/mainwindow.cpp +++ b/src/app/valentina/mainwindow.cpp @@ -56,6 +56,7 @@ #include "dialogs/dialogs.h" #include "dialogs/vwidgetgroups.h" #include "../vtools/undocommands/addgroup.h" +#include "dialogs/vwidgetdetails.h" #include #include @@ -122,6 +123,7 @@ MainWindow::MainWindow(QWidget *parent) gradationHeights(nullptr), gradationSizes(nullptr), gradationHeightsLabel(nullptr), gradationSizesLabel(nullptr), toolOptions(nullptr), groupsWidget(nullptr), + detailsWidget(nullptr), lock(nullptr) { for (int i = 0; i < MaxRecentFiles; ++i) @@ -137,7 +139,12 @@ MainWindow::MainWindow(QWidget *parent) connect(doc, &VPattern::patternChanged, this, &MainWindow::PatternWasModified); connect(doc, &VPattern::UndoCommand, this, &MainWindow::FullParseFile); connect(doc, &VPattern::SetEnabledGUI, this, &MainWindow::SetEnabledGUI); - connect(doc, &VPattern::CheckLayout, this, &MainWindow::Layout); + connect(doc, &VPattern::CheckLayout, [this](){ + if (pattern->DataDetails()->count() == 0) + { + ActionDraw(true); + } + }); connect(doc, &VPattern::SetCurrentPP, this, &MainWindow::GlobalChangePP); qApp->setCurrentDocument(doc); @@ -1320,7 +1327,8 @@ void MainWindow::CleanLayout() shadows.clear(); papers.clear(); ui->listWidget->clear(); - SetLayoutModeActions(false); + listDetails.clear(); + SetLayoutModeActions(); } //--------------------------------------------------------------------------------------------------------------------- @@ -1335,7 +1343,7 @@ void MainWindow::PrepareSceneList() if (not scenes.isEmpty()) { ui->listWidget->setCurrentRow(0); - SetLayoutModeActions(true); + SetLayoutModeActions(); } } @@ -2109,7 +2117,10 @@ void MainWindow::ActionDraw(bool checked) ui->dockWidgetLayoutPages->setVisible(false); ui->dockWidgetToolOptions->setVisible(isDockToolOptionsVisible); + + ui->dockWidgetGroups->setWidget(groupsWidget); ui->dockWidgetGroups->setVisible(isDockGroupsVisible); + ui->dockWidgetGroups->setToolTip(tr("Contains all visibility groups")); } else { @@ -2149,11 +2160,13 @@ void MainWindow::ActionDetails(bool checked) QMessageBox::information(this, tr("Detail mode"), tr("You can't use now the Detail mode. " "Please, create at least one workpiece."), QMessageBox::Ok, QMessageBox::Ok); - Layout(); + ActionDraw(true); return; } } + detailsWidget->UpdateList(); + qCDebug(vMainWindow, "Show details scene"); SaveCurrentScene(); @@ -2179,7 +2192,10 @@ void MainWindow::ActionDetails(bool checked) ui->dockWidgetLayoutPages->setVisible(false); ui->dockWidgetToolOptions->setVisible(isDockToolOptionsVisible); + + ui->dockWidgetGroups->setWidget(detailsWidget); ui->dockWidgetGroups->setVisible(isDockGroupsVisible); + ui->dockWidgetGroups->setToolTip(tr("Show which details will go in layout")); helpLabel->setText(""); } @@ -2214,17 +2230,39 @@ void MainWindow::ActionLayout(bool checked) ui->actionDetails->setChecked(false); ui->actionLayout->setChecked(true); - const QHash *details = pattern->DataDetails(); + QHash details; if(not qApp->getOpeningPattern()) { - if (details->count() == 0) + const QHash *allDetails = pattern->DataDetails(); + if (allDetails->count() == 0) { QMessageBox::information(this, tr("Layout mode"), tr("You can't use now the Layout mode. " "Please, create at least one workpiece."), QMessageBox::Ok, QMessageBox::Ok); - Layout(); + ActionDraw(true); return; } + else + { + QHash::const_iterator i = allDetails->constBegin(); + while (i != allDetails->constEnd()) + { + if (i.value().IsInLayout()) + { + details.insert(i.key(), i.value()); + } + ++i; + } + + if (details.count() == 0) + { + QMessageBox::information(this, tr("Layout mode"), tr("You can't use now the Layout mode. Please, " + "include at least one detail in layout."), + QMessageBox::Ok, QMessageBox::Ok); + mode == Draw::Calculation ? ActionDraw(true) : ActionDetails(true); + return; + } + } } comboBoxDraws->setCurrentIndex(-1);// Hide pattern pieces @@ -2233,7 +2271,7 @@ void MainWindow::ActionLayout(bool checked) SaveCurrentScene(); - PrepareDetailsForLayout(details); + PrepareDetailsForLayout(&details); currentScene = tempSceneLayout; ui->view->itemClicked(nullptr); @@ -2514,7 +2552,7 @@ void MainWindow::Clear() #ifndef QT_NO_CURSOR QApplication::restoreOverrideCursor(); #endif - Layout(); + CleanLayout(); #ifdef Q_OS_WIN32 qt_ntfs_permission_lookup--; // turn it off again @@ -2781,29 +2819,6 @@ void MainWindow::ClickEndVisualization() EndVisualization(true); } -//--------------------------------------------------------------------------------------------------------------------- -void MainWindow::Layout() -{ - if (pattern->DataDetails()->size() > 0) - { - SetLayoutModeActions(true); - } - else - { - listDetails.clear(); - if (not ui->actionDraw->isChecked()) - { - ActionDraw(true); - } - else - { - ui->actionDetails->setChecked(false); - ui->actionLayout->setChecked(false); - } - SetLayoutModeActions(false); - } -} - //--------------------------------------------------------------------------------------------------------------------- void MainWindow::UpdateGradation() { @@ -3154,19 +3169,16 @@ void MainWindow::SetEnableTool(bool enable) } //--------------------------------------------------------------------------------------------------------------------- -void MainWindow::SetLayoutModeActions(bool enable) +void MainWindow::SetLayoutModeActions() { - bool value = enable; - if (scenes.isEmpty()) - { - value = false; - } - ui->actionExportAs->setEnabled(value); - ui->actionPrintPreview->setEnabled(value); - ui->actionPrintPreviewTiled->setEnabled(value); - ui->actionSaveAsTiledPDF->setEnabled(value); - ui->actionPrint->setEnabled(value); - ui->actionPrintTiled->setEnabled(value); + const bool enabled = not scenes.isEmpty(); + + ui->actionExportAs->setEnabled(enabled); + ui->actionPrintPreview->setEnabled(enabled); + ui->actionPrintPreviewTiled->setEnabled(enabled); + ui->actionSaveAsTiledPDF->setEnabled(enabled); + ui->actionPrint->setEnabled(enabled); + ui->actionPrintTiled->setEnabled(enabled); } //--------------------------------------------------------------------------------------------------------------------- @@ -3625,6 +3637,10 @@ void MainWindow::InitDocksContain() qCDebug(vMainWindow, "Initialization groups dock."); groupsWidget = new VWidgetGroups(doc, this); ui->dockWidgetGroups->setWidget(groupsWidget); + + detailsWidget = new VWidgetDetails(pattern, doc, this); + connect(doc, &VPattern::FullUpdateFromFile, detailsWidget, &VWidgetDetails::UpdateList); + detailsWidget->setVisible(false); } //--------------------------------------------------------------------------------------------------------------------- @@ -3983,12 +3999,10 @@ void MainWindow::ShowPaper(int index) if (index < 0 || index >= scenes.size()) { ui->view->setScene(tempSceneLayout); - SetLayoutModeActions(false); } else { ui->view->setScene(scenes.at(index)); - SetLayoutModeActions(true); } ui->view->fitInView(ui->view->scene()->sceneRect(), Qt::KeepAspectRatio); diff --git a/src/app/valentina/mainwindow.h b/src/app/valentina/mainwindow.h index 828766427..1f8b5cd91 100644 --- a/src/app/valentina/mainwindow.h +++ b/src/app/valentina/mainwindow.h @@ -49,6 +49,7 @@ class DialogIncrements; class DialogTool; class DialogHistory; class VWidgetGroups; +class VWidgetDetails; /** * @brief The MainWindow class main windows. @@ -152,7 +153,6 @@ public slots: void SetEnabledGUI(bool enabled); void ClickEndVisualization(); - void Layout(); void UpdateGradation(); void GlobalChangePP(const QString &patternPiece); void WindowsLocale(); @@ -277,6 +277,7 @@ private: QPointer gradationSizesLabel; VToolOptionsPropertyBrowser *toolOptions; VWidgetGroups *groupsWidget; + VWidgetDetails *detailsWidget; std::shared_ptr> lock; void SetDefaultHeight(); @@ -291,7 +292,7 @@ private: void SetEnableWidgets(bool enable); void SetEnableTool(bool enable); - void SetLayoutModeActions(bool enable); + void SetLayoutModeActions(); void SaveCurrentScene(); void RestoreCurrentScene(); diff --git a/src/app/valentina/mainwindow.ui b/src/app/valentina/mainwindow.ui index f0904c225..d1e500848 100644 --- a/src/app/valentina/mainwindow.ui +++ b/src/app/valentina/mainwindow.ui @@ -1518,8 +1518,11 @@ true + + + - Groups + Group 2 diff --git a/src/app/valentina/xml/vpattern.cpp b/src/app/valentina/xml/vpattern.cpp index 339d2f53c..abaac899c 100644 --- a/src/app/valentina/xml/vpattern.cpp +++ b/src/app/valentina/xml/vpattern.cpp @@ -590,6 +590,7 @@ void VPattern::ParseDetailElement(const QDomElement &domElement, const Document detail.setSeamAllowance(GetParametrUInt(domElement, VToolDetail::AttrSupplement, "1")); detail.setWidth(GetParametrDouble(domElement, VToolDetail::AttrWidth, "10.0")); detail.setClosed(GetParametrUInt(domElement, VToolDetail::AttrClosed, "1")); + detail.SetInLayout(GetParametrBool(domElement, AttrInLayout, trueStr)); QStringList types = QStringList() << VToolDetail::NodePoint << VToolDetail::NodeArc << VToolDetail::NodeSpline << VToolDetail::NodeSplinePath; diff --git a/src/libs/ifc/ifcdef.cpp b/src/libs/ifc/ifcdef.cpp index 53b3e1587..1228e41e4 100644 --- a/src/libs/ifc/ifcdef.cpp +++ b/src/libs/ifc/ifcdef.cpp @@ -130,6 +130,7 @@ const QString AttrCRadius = QStringLiteral("cRadius"); const QString AttrArc = QStringLiteral("arc"); const QString AttrSuffix = QStringLiteral("suffix"); const QString AttrIdObject = QStringLiteral("idObject"); +const QString AttrInLayout = QStringLiteral("inLayout"); const QString TypeLineNone = QStringLiteral("none"); const QString TypeLineLine = QStringLiteral("hair"); diff --git a/src/libs/ifc/ifcdef.h b/src/libs/ifc/ifcdef.h index 93399b39d..0ce6dddd9 100644 --- a/src/libs/ifc/ifcdef.h +++ b/src/libs/ifc/ifcdef.h @@ -132,6 +132,7 @@ extern const QString AttrCRadius; extern const QString AttrArc; extern const QString AttrSuffix; extern const QString AttrIdObject; +extern const QString AttrInLayout; extern const QString TypeLineNone; extern const QString TypeLineLine; diff --git a/src/libs/vmisc/share/resources/icon.qrc b/src/libs/vmisc/share/resources/icon.qrc index 8abf44308..74cb170cd 100644 --- a/src/libs/vmisc/share/resources/icon.qrc +++ b/src/libs/vmisc/share/resources/icon.qrc @@ -61,5 +61,9 @@ icon/16x16/closed_eye@2x.png icon/16x16/open_eye.png icon/16x16/open_eye@2x.png + icon/16x16/allow_detail.png + icon/16x16/allow_detail@2x.png + icon/16x16/forbid_detail.png + icon/16x16/forbid_detail@2x.png diff --git a/src/libs/vmisc/share/resources/icon/16x16/allow_detail.png b/src/libs/vmisc/share/resources/icon/16x16/allow_detail.png new file mode 100644 index 0000000000000000000000000000000000000000..6bd8724f669783e2f49cf51b6a9c59277a9c2603 GIT binary patch literal 3315 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 literal 0 HcmV?d00001 diff --git a/src/libs/vmisc/share/resources/icon/16x16/forbid_detail@2x.png b/src/libs/vmisc/share/resources/icon/16x16/forbid_detail@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ee46abafba9772f146e66216cbc8577b8afb963b GIT binary patch literal 5175 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 literal 0 HcmV?d00001 diff --git a/src/libs/vpatterndb/vdetail.cpp b/src/libs/vpatterndb/vdetail.cpp index d7a2e8db2..2d9d87e2f 100644 --- a/src/libs/vpatterndb/vdetail.cpp +++ b/src/libs/vpatterndb/vdetail.cpp @@ -175,6 +175,18 @@ void VDetail::setId(const quint32 &id) d->_id = id; } +//--------------------------------------------------------------------------------------------------------------------- +bool VDetail::IsInLayout() const +{ + return d->inLayout; +} + +//--------------------------------------------------------------------------------------------------------------------- +void VDetail::SetInLayout(bool inLayout) +{ + d->inLayout = inLayout; +} + //--------------------------------------------------------------------------------------------------------------------- /** * @brief OnEdge checks if two poins located on the edge. Edge is line between two points. If between two points diff --git a/src/libs/vpatterndb/vdetail.h b/src/libs/vpatterndb/vdetail.h index fb57ab56e..5ef7f34c1 100644 --- a/src/libs/vpatterndb/vdetail.h +++ b/src/libs/vpatterndb/vdetail.h @@ -67,6 +67,9 @@ public: quint32 id() const; void setId(const quint32 &id); + bool IsInLayout() const; + void SetInLayout(bool inLayout); + QVector getNodes() const; void setNodes(const QVector &value); diff --git a/src/libs/vpatterndb/vdetail_p.h b/src/libs/vpatterndb/vdetail_p.h index 72aff357a..b22d094da 100644 --- a/src/libs/vpatterndb/vdetail_p.h +++ b/src/libs/vpatterndb/vdetail_p.h @@ -42,15 +42,15 @@ class VDetailData : public QSharedData { public: VDetailData() - :_id(NULL_ID), nodes(QVector()), mx(0), my(0) + :_id(NULL_ID), nodes(QVector()), mx(0), my(0), inLayout(true) {} explicit VDetailData(const QVector &nodes) - :_id(NULL_ID), nodes(nodes), mx(0), my(0) + :_id(NULL_ID), nodes(nodes), mx(0), my(0), inLayout(true) {} VDetailData(const VDetailData &detail) - :QSharedData(detail), _id(NULL_ID), nodes(detail.nodes), mx(detail.mx), my(detail.my) + :QSharedData(detail), _id(NULL_ID), nodes(detail.nodes), mx(detail.mx), my(detail.my), inLayout(detail.inLayout) {} ~VDetailData() {} @@ -67,6 +67,8 @@ public: /** @brief my bias y axis. */ qreal my; + bool inLayout; + private: VDetailData &operator=(const VDetailData &) Q_DECL_EQ_DELETE; }; diff --git a/src/libs/vtools/undocommands/toggledetailinlayout.cpp b/src/libs/vtools/undocommands/toggledetailinlayout.cpp new file mode 100644 index 000000000..4b13fd15f --- /dev/null +++ b/src/libs/vtools/undocommands/toggledetailinlayout.cpp @@ -0,0 +1,132 @@ +/************************************************************************ + ** + ** @file toggledetailinlayout.cpp + ** @author Roman Telezhynskyi + ** @date 25 6, 2016 + ** + ** @brief + ** @copyright + ** This source code is part of the Valentine project, a pattern making + ** program, whose allow create and modeling patterns of clothing. + ** Copyright (C) 2016 Valentina project + ** All Rights Reserved. + ** + ** Valentina 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 3 of the License, or + ** (at your option) any later version. + ** + ** Valentina 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 Valentina. If not, see . + ** + *************************************************************************/ + +#include "toggledetailinlayout.h" +#include "../vpatterndb/vdetail.h" +#include "../vpatterndb/vcontainer.h" + +//--------------------------------------------------------------------------------------------------------------------- +ToggleDetailInLayout::ToggleDetailInLayout(quint32 id, bool state, VContainer *data, VAbstractPattern *doc, + QUndoCommand *parent) + : VUndoCommand(QDomElement(), doc, parent), + m_id(id), + m_data(data), + m_oldState(m_data->DataDetails()->value(m_id).IsInLayout()), + m_newState(state) +{ + setText(tr("detail in layout list")); +} + +//--------------------------------------------------------------------------------------------------------------------- +ToggleDetailInLayout::~ToggleDetailInLayout() +{ +} + +//--------------------------------------------------------------------------------------------------------------------- +void ToggleDetailInLayout::undo() +{ + qCDebug(vUndo, "ToggleDetailInLayout::undo()."); + + if (m_newState != m_oldState) + { + Do(m_oldState); + } +} + +//--------------------------------------------------------------------------------------------------------------------- +void ToggleDetailInLayout::redo() +{ + qCDebug(vUndo, "ToggleDetailInLayout::redo()."); + + if (m_newState != m_oldState) + { + Do(m_newState); + } +} + +//--------------------------------------------------------------------------------------------------------------------- +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 +{ + return static_cast(UndoCommand::ToggleDetailInLayout); +} + +//--------------------------------------------------------------------------------------------------------------------- +quint32 ToggleDetailInLayout::getDetId() const +{ + return m_id; +} + +//--------------------------------------------------------------------------------------------------------------------- +bool ToggleDetailInLayout::getNewState() const +{ + return m_newState; +} + +//--------------------------------------------------------------------------------------------------------------------- +void ToggleDetailInLayout::Do(bool state) +{ + QDomElement detail = doc->elementById(m_id); + if (detail.isElement()) + { + if (state == false) + { + doc->SetAttribute(detail, AttrInLayout, state); + } + else + { + detail.removeAttribute(AttrInLayout); + } + + VDetail det = m_data->DataDetails()->value(m_id); + det.SetInLayout(state); + m_data->UpdateDetail(m_id, det); + + emit NeedLiteParsing(Document::LiteParse); + } + else + { + qDebug("Can't get detail by id = %u.", m_id); + return; + } +} diff --git a/src/libs/vtools/undocommands/toggledetailinlayout.h b/src/libs/vtools/undocommands/toggledetailinlayout.h new file mode 100644 index 000000000..ca9833ce0 --- /dev/null +++ b/src/libs/vtools/undocommands/toggledetailinlayout.h @@ -0,0 +1,57 @@ +/************************************************************************ + ** + ** @file toggledetailinlayout.h + ** @author Roman Telezhynskyi + ** @date 25 6, 2016 + ** + ** @brief + ** @copyright + ** This source code is part of the Valentine project, a pattern making + ** program, whose allow create and modeling patterns of clothing. + ** Copyright (C) 2016 Valentina project + ** All Rights Reserved. + ** + ** Valentina 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 3 of the License, or + ** (at your option) any later version. + ** + ** Valentina 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 Valentina. If not, see . + ** + *************************************************************************/ + +#ifndef TOGGLEDETAILINLAYOUT_H +#define TOGGLEDETAILINLAYOUT_H + +#include "vundocommand.h" + +class ToggleDetailInLayout : public VUndoCommand +{ + Q_OBJECT +public: + ToggleDetailInLayout(quint32 id, bool state, VContainer *data, VAbstractPattern *doc, + QUndoCommand *parent = nullptr); + 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; +private: + Q_DISABLE_COPY(ToggleDetailInLayout) + quint32 m_id; + VContainer *m_data; + bool m_oldState; + bool m_newState; + + void Do(bool state); +}; + +#endif // TOGGLEDETAILINLAYOUT_H diff --git a/src/libs/vtools/undocommands/undocommands.pri b/src/libs/vtools/undocommands/undocommands.pri index a20f58d15..39a455dc1 100644 --- a/src/libs/vtools/undocommands/undocommands.pri +++ b/src/libs/vtools/undocommands/undocommands.pri @@ -22,7 +22,8 @@ HEADERS += \ $$PWD/addgroup.h \ $$PWD/delgroup.h \ $$PWD/label/rotationmovelabel.h \ - undocommands/label/moveabstractlabel.h + $$PWD/label/moveabstractlabel.h \ + $$PWD/toggledetailinlayout.h SOURCES += \ $$PWD/addtocalc.cpp \ @@ -45,4 +46,5 @@ SOURCES += \ $$PWD/addgroup.cpp \ $$PWD/delgroup.cpp \ $$PWD/label/rotationmovelabel.cpp \ - undocommands/label/moveabstractlabel.cpp + $$PWD/label/moveabstractlabel.cpp \ + $$PWD/toggledetailinlayout.cpp diff --git a/src/libs/vtools/undocommands/vundocommand.h b/src/libs/vtools/undocommands/vundocommand.h index e86cfce82..241288ad2 100644 --- a/src/libs/vtools/undocommands/vundocommand.h +++ b/src/libs/vtools/undocommands/vundocommand.h @@ -50,7 +50,8 @@ enum class UndoCommand: char { AddPatternPiece, RenamePP, MoveLabel, MoveDoubleLabel, - RotationMoveLabel + RotationMoveLabel, + ToggleDetailInLayout }; class VPattern;