Merge remote-tracking branch 'upstream/feature/manual-layout' into feature/manual-layout
This commit is contained in:
commit
828bd8dd3f
5
dist/OBS_debian/debian.control
vendored
5
dist/OBS_debian/debian.control
vendored
|
@ -12,11 +12,12 @@ Build-Depends: debhelper (>= 8.0.0),
|
|||
libqt5opengl5-dev (>= 5.4.0)
|
||||
Standards-Version: 3.9.5
|
||||
Homepage: https://valentinaproject.bitbucket.io/
|
||||
Vcs-Browser: https://bitbucket.org/dismine/valentina
|
||||
Vcs-Browser: https://gitlab.com/smart-pattern/valentina
|
||||
|
||||
Package: valentina
|
||||
Architecture: i386 amd64
|
||||
Depends: libc6 (>= 2.4), libgcc1 (>= 1:4.1.1), libqt5core5a (>= 5.4.0) | libqt5core5 (>= 5.4.0), libqt5gui5 (>= 5.4.0) | libqt5gui5-gles (>= 5.4.0), libqt5printsupport5 (>= 5.4.0), libqt5svg5 (>= 5.4.0), libqt5widgets5 (>= 5.4.0), libqt5xml5 (>= 5.4.0), libqt5xmlpatterns5 (>= 5.4.0), libqt5concurrent5(>= 5.4.0), libqt5opengl5 (>= 5.4.0), libstdc++6 (>= 4.8), xpdf
|
||||
Depends: libc6 (>= 2.4), libgcc1 (>= 1:4.1.1), libqt5core5a (>= 5.4.0) | libqt5core5 (>= 5.4.0), libqt5gui5 (>= 5.4.0) | libqt5gui5-gles (>= 5.4.0), libqt5printsupport5 (>= 5.4.0), libqt5svg5 (>= 5.4.0), libqt5widgets5 (>= 5.4.0), libqt5xml5 (>= 5.4.0), libqt5xmlpatterns5 (>= 5.4.0), libqt5concurrent5(>= 5.4.0), libqt5opengl5 (>= 5.4.0), libstdc++6 (>= 4.8)
|
||||
Suggests: xpdf
|
||||
Conflicts: seamly2d
|
||||
Description: Pattern making program.
|
||||
Valentina is a cross-platform patternmaking program which allows designers
|
||||
|
|
5
dist/debian/control
vendored
5
dist/debian/control
vendored
|
@ -12,11 +12,12 @@ Build-Depends: debhelper (>= 8.0.0),
|
|||
libqt5opengl5-dev (>= 5.4.0)
|
||||
Standards-Version: 3.9.5
|
||||
Homepage: https://valentinaproject.bitbucket.io/
|
||||
Vcs-Browser: https://bitbucket.org/dismine/valentina
|
||||
Vcs-Browser: https://gitlab.com/smart-pattern/valentina
|
||||
|
||||
Package: valentina
|
||||
Architecture: i386 amd64
|
||||
Depends: libc6 (>= 2.4), libgcc1 (>= 1:4.1.1), libqt5core5a (>= 5.4.0) | libqt5core5 (>= 5.4.0), libqt5gui5 (>= 5.4.0) | libqt5gui5-gles (>= 5.4.0), libqt5printsupport5 (>= 5.4.0), libqt5svg5 (>= 5.4.0), libqt5widgets5 (>= 5.4.0), libqt5xml5 (>= 5.4.0), libqt5xmlpatterns5 (>= 5.4.0), libqt5concurrent5(>= 5.4.0), libqt5opengl5 (>= 5.4.0), libstdc++6 (>= 4.8), xpdf
|
||||
Depends: libc6 (>= 2.4), libgcc1 (>= 1:4.1.1), libqt5core5a (>= 5.4.0) | libqt5core5 (>= 5.4.0), libqt5gui5 (>= 5.4.0) | libqt5gui5-gles (>= 5.4.0), libqt5printsupport5 (>= 5.4.0), libqt5svg5 (>= 5.4.0), libqt5widgets5 (>= 5.4.0), libqt5xml5 (>= 5.4.0), libqt5xmlpatterns5 (>= 5.4.0), libqt5concurrent5(>= 5.4.0), libqt5opengl5 (>= 5.4.0), libstdc++6 (>= 4.8)
|
||||
Suggests: xpdf
|
||||
Conflicts: seamly2d
|
||||
Description: Pattern making program.
|
||||
Valentina is a cross-platform patternmaking program which allows designers
|
||||
|
|
2
dist/rpm/valentina.spec
vendored
2
dist/rpm/valentina.spec
vendored
|
@ -83,7 +83,7 @@ Requires: poppler-utils
|
|||
|
||||
Version: 0.7.0
|
||||
Release: 0
|
||||
URL: https://bitbucket.org/dismine/valentina
|
||||
URL: https://gitlab.com/smart-pattern/valentina
|
||||
License: GPL-3.0+
|
||||
Source0: %{name}-%{version}.tar.gz
|
||||
Group: Graphics
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
# File with common stuff for whole project
|
||||
include(../../../common.pri)
|
||||
|
||||
QT += core gui widgets network xml xmlpatterns printsupport
|
||||
QT += core gui widgets network xml xmlpatterns printsupport concurrent
|
||||
|
||||
# Name of binary file
|
||||
TARGET = puzzle
|
||||
|
@ -187,7 +187,7 @@ noRunPath{ # For enable run qmake with CONFIG+=noRunPath
|
|||
# When the GNU linker sees a library, it discards all symbols that it doesn't need.
|
||||
# Dependent library go first.
|
||||
|
||||
#VTools static library (depend on VWidgets, VMisc, VPatternDB)
|
||||
##VTools static library (depend on VWidgets, VMisc, VPatternDB)
|
||||
#unix|win32: LIBS += -L$$OUT_PWD/../../libs/vtools/$${DESTDIR}/ -lvtools
|
||||
|
||||
#INCLUDEPATH += $$PWD/../../libs/vtools
|
||||
|
@ -215,14 +215,23 @@ noRunPath{ # For enable run qmake with CONFIG+=noRunPath
|
|||
#win32:!win32-g++: PRE_TARGETDEPS += $$OUT_PWD/../../libs/vformat/$${DESTDIR}/vformat.lib
|
||||
#else:unix|win32-g++: PRE_TARGETDEPS += $$OUT_PWD/../../libs/vformat/$${DESTDIR}/libvformat.a
|
||||
|
||||
##VPatternDB static library (depend on vgeometry, vmisc, VLayout)
|
||||
#unix|win32: LIBS += -L$$OUT_PWD/../../libs/vpatterndb/$${DESTDIR} -lvpatterndb
|
||||
# VLayout static library (depend on VGeometry)
|
||||
unix|win32: LIBS += -L$$OUT_PWD/../../libs/vlayout/$${DESTDIR}/ -lvlayout
|
||||
|
||||
#INCLUDEPATH += $$PWD/../../libs/vpatterndb
|
||||
#DEPENDPATH += $$PWD/../../libs/vpatterndb
|
||||
INCLUDEPATH += $$PWD/../../libs/vlayout
|
||||
DEPENDPATH += $$PWD/../../libs/vlayout
|
||||
|
||||
#win32:!win32-g++: PRE_TARGETDEPS += $$OUT_PWD/../../libs/vpatterndb/$${DESTDIR}/vpatterndb.lib
|
||||
#else:unix|win32-g++: PRE_TARGETDEPS += $$OUT_PWD/../../libs/vpatterndb/$${DESTDIR}/libvpatterndb.a
|
||||
win32:!win32-g++: PRE_TARGETDEPS += $$OUT_PWD/../../libs/vlayout/$${DESTDIR}/vlayout.lib
|
||||
else:unix|win32-g++: PRE_TARGETDEPS += $$OUT_PWD/../../libs/vlayout/$${DESTDIR}/libvlayout.a
|
||||
|
||||
#VPatternDB static library (depend on vgeometry, vmisc)
|
||||
unix|win32: LIBS += -L$$OUT_PWD/../../libs/vpatterndb/$${DESTDIR} -lvpatterndb
|
||||
|
||||
INCLUDEPATH += $$PWD/../../libs/vpatterndb
|
||||
DEPENDPATH += $$PWD/../../libs/vpatterndb
|
||||
|
||||
win32:!win32-g++: PRE_TARGETDEPS += $$OUT_PWD/../../libs/vpatterndb/$${DESTDIR}/vpatterndb.lib
|
||||
else:unix|win32-g++: PRE_TARGETDEPS += $$OUT_PWD/../../libs/vpatterndb/$${DESTDIR}/libvpatterndb.a
|
||||
|
||||
# Fervor static library (depend on VMisc, IFC)
|
||||
unix|win32: LIBS += -L$$OUT_PWD/../../libs/fervor/$${DESTDIR}/ -lfervor
|
||||
|
@ -251,31 +260,22 @@ DEPENDPATH += $$PWD/../../libs/vmisc
|
|||
win32:!win32-g++: PRE_TARGETDEPS += $$OUT_PWD/../../libs/vmisc/$${DESTDIR}/vmisc.lib
|
||||
else:unix|win32-g++: PRE_TARGETDEPS += $$OUT_PWD/../../libs/vmisc/$${DESTDIR}/libvmisc.a
|
||||
|
||||
## VLayout static library (depend on VGeometry)
|
||||
#unix|win32: LIBS += -L$$OUT_PWD/../../libs/vlayout/$${DESTDIR}/ -lvlayout
|
||||
# VGeometry static library (depend on ifc)
|
||||
unix|win32: LIBS += -L$$OUT_PWD/../../libs/vgeometry/$${DESTDIR}/ -lvgeometry
|
||||
|
||||
#INCLUDEPATH += $$PWD/../../libs/vlayout
|
||||
#DEPENDPATH += $$PWD/../../libs/vlayout
|
||||
INCLUDEPATH += $$PWD/../../libs/vgeometry
|
||||
DEPENDPATH += $$PWD/../../libs/vgeometry
|
||||
|
||||
#win32:!win32-g++: PRE_TARGETDEPS += $$OUT_PWD/../../libs/vlayout/$${DESTDIR}/vlayout.lib
|
||||
#else:unix|win32-g++: PRE_TARGETDEPS += $$OUT_PWD/../../libs/vlayout/$${DESTDIR}/libvlayout.a
|
||||
win32:!win32-g++: PRE_TARGETDEPS += $$OUT_PWD/../../libs/vgeometry/$${DESTDIR}/vgeometry.lib
|
||||
else:unix|win32-g++: PRE_TARGETDEPS += $$OUT_PWD/../../libs/vgeometry/$${DESTDIR}/libvgeometry.a
|
||||
|
||||
## VGeometry static library (depend on ifc)
|
||||
#unix|win32: LIBS += -L$$OUT_PWD/../../libs/vgeometry/$${DESTDIR}/ -lvgeometry
|
||||
# QMuParser library
|
||||
win32:CONFIG(release, debug|release): LIBS += -L$${OUT_PWD}/../../libs/qmuparser/$${DESTDIR} -lqmuparser2
|
||||
else:win32:CONFIG(debug, debug|release): LIBS += -L$${OUT_PWD}/../../libs/qmuparser/$${DESTDIR} -lqmuparser2
|
||||
else:unix: LIBS += -L$${OUT_PWD}/../../libs/qmuparser/$${DESTDIR} -lqmuparser
|
||||
|
||||
#INCLUDEPATH += $$PWD/../../libs/vgeometry
|
||||
#DEPENDPATH += $$PWD/../../libs/vgeometry
|
||||
|
||||
#win32:!win32-g++: PRE_TARGETDEPS += $$OUT_PWD/../../libs/vgeometry/$${DESTDIR}/vgeometry.lib
|
||||
#else:unix|win32-g++: PRE_TARGETDEPS += $$OUT_PWD/../../libs/vgeometry/$${DESTDIR}/libvgeometry.a
|
||||
|
||||
## QMuParser library
|
||||
#win32:CONFIG(release, debug|release): LIBS += -L$${OUT_PWD}/../../libs/qmuparser/$${DESTDIR} -lqmuparser2
|
||||
#else:win32:CONFIG(debug, debug|release): LIBS += -L$${OUT_PWD}/../../libs/qmuparser/$${DESTDIR} -lqmuparser2
|
||||
#else:unix: LIBS += -L$${OUT_PWD}/../../libs/qmuparser/$${DESTDIR} -lqmuparser
|
||||
|
||||
#INCLUDEPATH += $${PWD}/../../libs/qmuparser
|
||||
#DEPENDPATH += $${PWD}/../../libs/qmuparser
|
||||
INCLUDEPATH += $${PWD}/../../libs/qmuparser
|
||||
DEPENDPATH += $${PWD}/../../libs/qmuparser
|
||||
|
||||
## VPropertyExplorer library
|
||||
#win32:CONFIG(release, debug|release): LIBS += -L$${OUT_PWD}/../../libs/vpropertyexplorer/$${DESTDIR} -lvpropertyexplorer
|
||||
|
|
|
@ -337,7 +337,7 @@ PuzzleMainWindow *PuzzleApplication::MainWindow()
|
|||
{
|
||||
VPuzzleCommandLinePtr cmd;
|
||||
VPuzzleCommandLine::ProcessInstance(cmd, QStringList());
|
||||
NewMainWindow(true);
|
||||
NewMainWindow(VPuzzleCommandLinePtr());
|
||||
}
|
||||
return mainWindows[0];
|
||||
}
|
||||
|
@ -355,11 +355,11 @@ QList<PuzzleMainWindow *> PuzzleApplication::MainWindows()
|
|||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
PuzzleMainWindow *PuzzleApplication::NewMainWindow(bool guiMode)
|
||||
PuzzleMainWindow *PuzzleApplication::NewMainWindow(const VPuzzleCommandLinePtr &cmd)
|
||||
{
|
||||
PuzzleMainWindow *puzzle = new PuzzleMainWindow();
|
||||
PuzzleMainWindow *puzzle = new PuzzleMainWindow(cmd);
|
||||
mainWindows.prepend(puzzle);
|
||||
if (guiMode)
|
||||
if (cmd->IsGuiEnabled())
|
||||
{
|
||||
puzzle->show();
|
||||
}
|
||||
|
@ -505,7 +505,7 @@ void PuzzleApplication::ProcessArguments(const VPuzzleCommandLinePtr &cmd)
|
|||
|
||||
for (auto &arg : args)
|
||||
{
|
||||
NewMainWindow(cmd->IsGuiEnabled());
|
||||
NewMainWindow(cmd);
|
||||
if (not MainWindow()->LoadFile(arg))
|
||||
{
|
||||
if (not cmd->IsGuiEnabled())
|
||||
|
@ -516,10 +516,10 @@ void PuzzleApplication::ProcessArguments(const VPuzzleCommandLinePtr &cmd)
|
|||
continue;
|
||||
}
|
||||
|
||||
// if (rawLayouts.size() > 0)
|
||||
// {
|
||||
// MainWindow()->ImportRawLayouts(rawLayouts);
|
||||
// }
|
||||
if (rawLayouts.size() > 0)
|
||||
{
|
||||
MainWindow()->ImportRawLayouts(rawLayouts);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -530,12 +530,12 @@ void PuzzleApplication::ProcessArguments(const VPuzzleCommandLinePtr &cmd)
|
|||
cmd.get()->parser.showHelp(V_EX_USAGE);
|
||||
}
|
||||
|
||||
NewMainWindow(cmd->IsGuiEnabled());
|
||||
// if (rawLayouts.size() > 0)
|
||||
// {
|
||||
NewMainWindow(cmd);
|
||||
if (rawLayouts.size() > 0)
|
||||
{
|
||||
// MainWindow()->New(); // prepare layout settings
|
||||
// MainWindow()->ImportRawLayouts(rawLayouts);
|
||||
// }
|
||||
MainWindow()->ImportRawLayouts(rawLayouts);
|
||||
}
|
||||
}
|
||||
|
||||
if (not cmd->IsGuiEnabled())
|
||||
|
|
|
@ -58,7 +58,7 @@ public:
|
|||
virtual bool IsAppInGUIMode() const override;
|
||||
PuzzleMainWindow *MainWindow();
|
||||
QList<PuzzleMainWindow*> MainWindows();
|
||||
PuzzleMainWindow *NewMainWindow(bool guiMode);
|
||||
PuzzleMainWindow *NewMainWindow(const VPuzzleCommandLinePtr &cmd);
|
||||
|
||||
void InitOptions();
|
||||
|
||||
|
|
|
@ -34,17 +34,27 @@
|
|||
#include "xml/vpuzzlelayoutfilewriter.h"
|
||||
#include "xml/vpuzzlelayoutfilereader.h"
|
||||
#include "puzzleapplication.h"
|
||||
#include "../vlayout/vrawlayout.h"
|
||||
#include "../vmisc/vsysexits.h"
|
||||
|
||||
Q_LOGGING_CATEGORY(vPuzzleMainWindow, "v.puzzlemainwindow")
|
||||
#include <QLoggingCategory>
|
||||
|
||||
QT_WARNING_PUSH
|
||||
QT_WARNING_DISABLE_CLANG("-Wmissing-prototypes")
|
||||
QT_WARNING_DISABLE_INTEL(1418)
|
||||
|
||||
Q_LOGGING_CATEGORY(pWindow, "p.window")
|
||||
|
||||
QT_WARNING_POP
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
PuzzleMainWindow::PuzzleMainWindow(QWidget *parent) :
|
||||
PuzzleMainWindow::PuzzleMainWindow(const VPuzzleCommandLinePtr &cmd, QWidget *parent) :
|
||||
QMainWindow(parent),
|
||||
ui(new Ui::PuzzleMainWindow),
|
||||
pieceCarrousel(new VPieceCarrousel),
|
||||
m_layout (nullptr),
|
||||
m_selectedPiece (nullptr)
|
||||
m_selectedPiece (nullptr),
|
||||
m_cmd(cmd)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
|
@ -107,7 +117,25 @@ bool PuzzleMainWindow::SaveFile(const QString &path)
|
|||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void PuzzleMainWindow::ImportRawLayouts(const QStringList &layouts)
|
||||
{
|
||||
Q_UNUSED(layouts)
|
||||
VRawLayout layoutReader;
|
||||
|
||||
for(auto &path : layouts)
|
||||
{
|
||||
VRawLayoutData data;
|
||||
if (layoutReader.ReadFile(path, data))
|
||||
{
|
||||
// Do somethinmg with raw layout data
|
||||
}
|
||||
else
|
||||
{
|
||||
qCCritical(pWindow, "%s\n", qPrintable(tr("Could not extract data from file '%1'. %2")
|
||||
.arg(path, layoutReader.ErrorString())));
|
||||
if (m_cmd != nullptr && not m_cmd->IsGuiEnabled())
|
||||
{
|
||||
m_cmd->ShowHelp(V_EX_DATAERR);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
|
@ -399,7 +427,7 @@ void PuzzleMainWindow::New()
|
|||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void PuzzleMainWindow::Open()
|
||||
{
|
||||
qCDebug(vPuzzleMainWindow, "Openning puzzle layout file.");
|
||||
qCDebug(pWindow, "Openning puzzle layout file.");
|
||||
|
||||
const QString filter(tr("Layout files") + QLatin1String(" (*.vlt)"));
|
||||
|
||||
|
@ -415,7 +443,7 @@ void PuzzleMainWindow::Open()
|
|||
//Absolute path to last open file
|
||||
dir = QFileInfo(recentFiles.first()).absolutePath();
|
||||
}
|
||||
qCDebug(vPuzzleMainWindow, "Run QFileDialog::getOpenFileName: dir = %s.", qUtf8Printable(dir));
|
||||
qCDebug(pWindow, "Run QFileDialog::getOpenFileName: dir = %s.", qUtf8Printable(dir));
|
||||
const QString filePath = QFileDialog::getOpenFileName(
|
||||
this, tr("Open file"), dir, filter, nullptr,
|
||||
#ifdef Q_OS_LINUX
|
||||
|
|
|
@ -36,6 +36,7 @@
|
|||
#include "vpiececarrousel.h"
|
||||
#include "vpuzzlelayout.h"
|
||||
#include "vpuzzlepiece.h"
|
||||
#include "vpuzzlecommandline.h"
|
||||
|
||||
namespace Ui
|
||||
{
|
||||
|
@ -47,7 +48,7 @@ class PuzzleMainWindow : public QMainWindow
|
|||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit PuzzleMainWindow(QWidget *parent = nullptr);
|
||||
PuzzleMainWindow(const VPuzzleCommandLinePtr &cmd, QWidget *parent = nullptr);
|
||||
virtual ~PuzzleMainWindow();
|
||||
|
||||
/**
|
||||
|
@ -77,6 +78,7 @@ private:
|
|||
Q_DISABLE_COPY(PuzzleMainWindow)
|
||||
Ui::PuzzleMainWindow *ui;
|
||||
VPieceCarrousel *pieceCarrousel;
|
||||
VPuzzleCommandLinePtr m_cmd;
|
||||
|
||||
VPuzzleLayout *m_layout;
|
||||
|
||||
|
|
|
@ -96,6 +96,12 @@ bool VPuzzleCommandLine::IsNoScalingEnabled() const
|
|||
return IsOptionSet(LONG_OPTION_NO_HDPI_SCALING);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
void VPuzzleCommandLine::ShowHelp(int exitCode)
|
||||
{
|
||||
parser.showHelp(exitCode);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------------------------
|
||||
VPuzzleCommandLine::VPuzzleCommandLine():
|
||||
parser(),
|
||||
|
|
|
@ -61,6 +61,8 @@ public:
|
|||
|
||||
/** @brief if high dpi scaling is enabled */
|
||||
bool IsNoScalingEnabled() const;
|
||||
|
||||
Q_NORETURN void ShowHelp(int exitCode = 0);
|
||||
protected:
|
||||
VPuzzleCommandLine();
|
||||
|
||||
|
|
|
@ -62,6 +62,28 @@ QT_WARNING_POP
|
|||
|
||||
Q_DECL_CONSTEXPR auto DAYS_TO_KEEP_LOGS = 3;
|
||||
|
||||
namespace
|
||||
{
|
||||
QString AppFilePath(const QString &appName)
|
||||
{
|
||||
QString appNameExe = appName;
|
||||
#ifdef Q_OS_WIN
|
||||
appNameExe += ".exe";
|
||||
#endif
|
||||
QFileInfo canonicalFile(QString("%1/%2").arg(QCoreApplication::applicationDirPath(), appNameExe));
|
||||
if (canonicalFile.exists())
|
||||
{
|
||||
return canonicalFile.absoluteFilePath();
|
||||
}
|
||||
else
|
||||
{
|
||||
QFileInfo debugFile(QString("%1/../../%2/bin/%3")
|
||||
.arg(QCoreApplication::applicationDirPath(), appName, appNameExe));
|
||||
return debugFile.exists() ? debugFile.absoluteFilePath() : appNameExe;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
inline void noisyFailureMsgHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)
|
||||
{
|
||||
|
@ -447,54 +469,13 @@ void VApplication::ActivateDarkMode()
|
|||
//---------------------------------------------------------------------------------------------------------------------
|
||||
QString VApplication::TapeFilePath() const
|
||||
{
|
||||
const QString tape = QStringLiteral("tape");
|
||||
#ifdef Q_OS_WIN
|
||||
QFileInfo tapeFile(QCoreApplication::applicationDirPath() + "/" + tape + ".exe");
|
||||
if (tapeFile.exists())
|
||||
{
|
||||
return tapeFile.absoluteFilePath();
|
||||
}
|
||||
else
|
||||
{
|
||||
return QCoreApplication::applicationDirPath() + "/../../tape/bin/" + tape + ".exe";
|
||||
}
|
||||
#elif defined(Q_OS_MAC)
|
||||
QFileInfo tapeFile(QCoreApplication::applicationDirPath() + "/" + tape);
|
||||
if (tapeFile.exists())
|
||||
{
|
||||
return tapeFile.absoluteFilePath();
|
||||
}
|
||||
else
|
||||
{
|
||||
QFileInfo file(QCoreApplication::applicationDirPath() + "/../../tape/bin/" + tape);
|
||||
if (file.exists())
|
||||
{
|
||||
return file.absoluteFilePath();
|
||||
}
|
||||
else
|
||||
{
|
||||
return tape;
|
||||
}
|
||||
}
|
||||
#else // Unix
|
||||
QFileInfo file(QCoreApplication::applicationDirPath() + "/../../tape/bin/" + tape);
|
||||
if (file.exists())
|
||||
{
|
||||
return file.absoluteFilePath();
|
||||
}
|
||||
else
|
||||
{
|
||||
QFileInfo tapeFile(QCoreApplication::applicationDirPath() + "/" + tape);
|
||||
if (tapeFile.exists())
|
||||
{
|
||||
return tapeFile.absoluteFilePath();
|
||||
}
|
||||
else
|
||||
{
|
||||
return tape;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return AppFilePath(QStringLiteral("tape"));
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
QString VApplication::PuzzleFilePath() const
|
||||
{
|
||||
return AppFilePath(QStringLiteral("puzzle"));
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
|
|
|
@ -58,6 +58,7 @@ public:
|
|||
void InitOptions();
|
||||
|
||||
QString TapeFilePath() const;
|
||||
QString PuzzleFilePath() const;
|
||||
|
||||
QTimer *getAutoSaveTimer() const;
|
||||
void setAutoSaveTimer(QTimer *value);
|
||||
|
|
|
@ -72,6 +72,7 @@ QStringList PreferencesPathPage::Apply()
|
|||
settings->SetPathLayout(ui->pathTable->item(3, 1)->text());
|
||||
settings->SetPathTemplate(ui->pathTable->item(4, 1)->text());
|
||||
settings->SetPathLabelTemplate(ui->pathTable->item(5, 1)->text());
|
||||
settings->SetPathManualLayouts(ui->pathTable->item(6, 1)->text());
|
||||
|
||||
return QStringList(); // No changes those require restart.
|
||||
}
|
||||
|
@ -118,6 +119,9 @@ void PreferencesPathPage::DefaultPath()
|
|||
case 5: // label templates
|
||||
path = VCommonSettings::GetDefPathLabelTemplate();
|
||||
break;
|
||||
case 6: // manual layouts
|
||||
path = VCommonSettings::GetDefPathManualLayouts();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -155,6 +159,9 @@ void PreferencesPathPage::EditPath()
|
|||
case 5: // label templates
|
||||
path = qApp->ValentinaSettings()->GetPathLabelTemplate();
|
||||
break;
|
||||
case 6: // manual layouts
|
||||
path = qApp->ValentinaSettings()->GetPathManualLayouts();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -196,7 +203,7 @@ void PreferencesPathPage::EditPath()
|
|||
void PreferencesPathPage::InitTable()
|
||||
{
|
||||
ui->pathTable->clearContents();
|
||||
ui->pathTable->setRowCount(6);
|
||||
ui->pathTable->setRowCount(7);
|
||||
ui->pathTable->setColumnCount(2);
|
||||
|
||||
const VSettings *settings = qApp->ValentinaSettings();
|
||||
|
@ -243,6 +250,13 @@ void PreferencesPathPage::InitTable()
|
|||
ui->pathTable->setItem(5, 1, item);
|
||||
}
|
||||
|
||||
{
|
||||
ui->pathTable->setItem(6, 0, new QTableWidgetItem(tr("My manual layouts")));
|
||||
QTableWidgetItem *item = new QTableWidgetItem(settings->GetPathManualLayouts());
|
||||
item->setToolTip(settings->GetPathManualLayouts());
|
||||
ui->pathTable->setItem(6, 1, item);
|
||||
}
|
||||
|
||||
ui->pathTable->verticalHeader()->setDefaultSectionSize(20);
|
||||
ui->pathTable->resizeColumnsToContents();
|
||||
ui->pathTable->resizeRowsToContents();
|
||||
|
|
|
@ -110,6 +110,7 @@ DialogSaveLayout::DialogSaveLayout(int count, Draw mode, const QString &fileName
|
|||
}
|
||||
else
|
||||
{
|
||||
RemoveFormatFromList(LayoutExportFormats::RLD);
|
||||
ui->checkBoxTextAsPaths->setVisible(false);
|
||||
}
|
||||
|
||||
|
@ -238,6 +239,7 @@ void DialogSaveLayout::SetBinaryDXFFormat(bool binary)
|
|||
case LayoutExportFormats::PS:
|
||||
case LayoutExportFormats::EPS:
|
||||
case LayoutExportFormats::NC:
|
||||
case LayoutExportFormats::RLD:
|
||||
default:
|
||||
ui->checkBoxBinaryDXF->setChecked(false);
|
||||
break;
|
||||
|
@ -285,6 +287,7 @@ bool DialogSaveLayout::IsBinaryDXFFormat() const
|
|||
case LayoutExportFormats::PS:
|
||||
case LayoutExportFormats::EPS:
|
||||
case LayoutExportFormats::NC:
|
||||
case LayoutExportFormats::RLD:
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
@ -424,6 +427,8 @@ QString DialogSaveLayout::ExportFormatDescription(LayoutExportFormats format)
|
|||
return QStringLiteral("PDF %1 %2 (*.pdf)").arg(tr("tiled"), filesStr);
|
||||
case LayoutExportFormats::NC:
|
||||
return QStringLiteral("%1 %2 (*.nc)").arg(tr("Numerical control"), filesStr);
|
||||
case LayoutExportFormats::RLD:
|
||||
return QStringLiteral("%1 %2 (*.rld)").arg(tr("Raw Layout Data"), filesStr);
|
||||
default:
|
||||
return QString();
|
||||
}
|
||||
|
@ -477,6 +482,8 @@ QString DialogSaveLayout::ExportFormatSuffix(LayoutExportFormats format)
|
|||
return QStringLiteral(".dxf");
|
||||
case LayoutExportFormats::NC:
|
||||
return QStringLiteral(".nc");
|
||||
case LayoutExportFormats::RLD:
|
||||
return QStringLiteral(".rld");
|
||||
default:
|
||||
return QString();
|
||||
}
|
||||
|
@ -566,6 +573,7 @@ void DialogSaveLayout::ShowExample()
|
|||
ui->checkBoxBinaryDXF->setEnabled(false);
|
||||
ui->groupBoxPaperFormat->setEnabled(false);
|
||||
ui->groupBoxMargins->setEnabled(false);
|
||||
ui->checkBoxTextAsPaths->setEnabled(true);
|
||||
|
||||
switch(currentFormat)
|
||||
{
|
||||
|
@ -602,6 +610,9 @@ void DialogSaveLayout::ShowExample()
|
|||
ui->groupBoxPaperFormat->setEnabled(true);
|
||||
ui->groupBoxMargins->setEnabled(true);
|
||||
break;
|
||||
case LayoutExportFormats::RLD:
|
||||
ui->checkBoxTextAsPaths->setEnabled(false);
|
||||
break;
|
||||
case LayoutExportFormats::SVG:
|
||||
case LayoutExportFormats::PDF:
|
||||
case LayoutExportFormats::PNG:
|
||||
|
@ -869,6 +880,7 @@ QVector<std::pair<QString, LayoutExportFormats> > DialogSaveLayout::InitFormats(
|
|||
InitFormat(LayoutExportFormats::DXF_AC1027_ASTM);
|
||||
InitFormat(LayoutExportFormats::PDFTiled);
|
||||
// InitFormat(LayoutExportFormats::NC);
|
||||
InitFormat(LayoutExportFormats::RLD);
|
||||
|
||||
return list;
|
||||
}
|
||||
|
|
|
@ -2143,13 +2143,13 @@ void MainWindow::ToolBarDraws()
|
|||
|
||||
connect(ui->actionOptionDraw, &QAction::triggered, this, [this]()
|
||||
{
|
||||
const QString activDraw = doc->GetNameActivPP();
|
||||
const QString nameDraw = PatternPieceName(activDraw);
|
||||
if (nameDraw.isEmpty() || activDraw == nameDraw)
|
||||
QString draw = doc->GetNameActivPP();
|
||||
bool ok = PatternPieceName(draw);
|
||||
if (not ok)
|
||||
{
|
||||
return;
|
||||
}
|
||||
qApp->getUndoStack()->push(new RenamePP(doc, nameDraw, comboBoxDraws));
|
||||
qApp->getUndoStack()->push(new RenamePP(doc, draw, comboBoxDraws));
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -3149,6 +3149,148 @@ void MainWindow::on_actionOpen_triggered()
|
|||
LoadPattern(filePath);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void MainWindow::on_actionOpenPuzzle_triggered()
|
||||
{
|
||||
const QString puzzle = qApp->PuzzleFilePath();
|
||||
const QString workingDirectory = QFileInfo(puzzle).absoluteDir().absolutePath();
|
||||
|
||||
QStringList arguments;
|
||||
if (isNoScaling)
|
||||
{
|
||||
arguments.append(QLatin1String("--") + LONG_OPTION_NO_HDPI_SCALING);
|
||||
}
|
||||
|
||||
QProcess::startDetached(puzzle, arguments, workingDirectory);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void MainWindow::on_actionCreateManualLayout_triggered()
|
||||
{
|
||||
QTemporaryFile rldFile(QDir::tempPath()+"/puzzle.rld.XXXXXX");
|
||||
if (rldFile.open())
|
||||
{
|
||||
QVector<DetailForLayout> detailsInLayout = SortDetailsForLayout(pattern->DataPieces());
|
||||
|
||||
if (detailsInLayout.count() == 0)
|
||||
{
|
||||
QMessageBox::information(this, tr("Layout mode"), tr("You don't have enough details to export. Please, "
|
||||
"include at least one detail in layout."),
|
||||
QMessageBox::Ok, QMessageBox::Ok);
|
||||
return;
|
||||
}
|
||||
|
||||
QVector<VLayoutPiece> listDetails;
|
||||
try
|
||||
{
|
||||
listDetails = PrepareDetailsForLayout(detailsInLayout);
|
||||
}
|
||||
catch (VException &e)
|
||||
{
|
||||
QMessageBox::warning(this, tr("Export details"),
|
||||
tr("Can't export details.") + QLatin1String(" \n") + e.ErrorMessage(),
|
||||
QMessageBox::Ok, QMessageBox::Ok);
|
||||
return;
|
||||
}
|
||||
|
||||
RLDFile(rldFile.fileName(), listDetails);
|
||||
|
||||
QStringList arguments {"-r", rldFile.fileName()};
|
||||
if (isNoScaling)
|
||||
{
|
||||
arguments.append(QLatin1String("--") + LONG_OPTION_NO_HDPI_SCALING);
|
||||
}
|
||||
|
||||
rldFile.setAutoRemove(false);
|
||||
|
||||
const QString puzzle = qApp->PuzzleFilePath();
|
||||
const QString workingDirectory = QFileInfo(puzzle).absoluteDir().absolutePath();
|
||||
QProcess::startDetached(puzzle, arguments, workingDirectory);
|
||||
}
|
||||
else
|
||||
{
|
||||
qCCritical(vMainWindow, "%s", qUtf8Printable(tr("Unable to prepare raw layout data.")));
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void MainWindow::on_actionUpdateManualLayout_triggered()
|
||||
{
|
||||
const QString filter(tr("Manual layout files") + QLatin1String(" (*.vlt)"));
|
||||
|
||||
//Use standard path to manual layouts
|
||||
const QString path = qApp->ValentinaSettings()->GetPathManualLayouts();
|
||||
|
||||
bool usedNotExistedDir = false;
|
||||
QDir directory(path);
|
||||
if (not directory.exists())
|
||||
{
|
||||
usedNotExistedDir = directory.mkpath(QChar('.'));
|
||||
}
|
||||
|
||||
auto RemoveUnsuded = qScopeGuard([usedNotExistedDir, path]()
|
||||
{
|
||||
if (usedNotExistedDir)
|
||||
{
|
||||
QDir directory(path);
|
||||
directory.rmpath(QChar('.'));
|
||||
}
|
||||
});
|
||||
|
||||
const QString filePath = QFileDialog::getOpenFileName(this, tr("Select manual layout"), path, filter, nullptr);
|
||||
|
||||
if (filePath.isEmpty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
QTemporaryFile rldFile(QDir::tempPath()+"/puzzle.rld.XXXXXX");
|
||||
rldFile.setAutoRemove(false);
|
||||
if (rldFile.open())
|
||||
{
|
||||
QVector<DetailForLayout> detailsInLayout = SortDetailsForLayout(pattern->DataPieces());
|
||||
|
||||
if (detailsInLayout.count() == 0)
|
||||
{
|
||||
QMessageBox::information(this, tr("Layout mode"), tr("You don't have enough details to export. Please, "
|
||||
"include at least one detail in layout."),
|
||||
QMessageBox::Ok, QMessageBox::Ok);
|
||||
return;
|
||||
}
|
||||
|
||||
QVector<VLayoutPiece> listDetails;
|
||||
try
|
||||
{
|
||||
listDetails = PrepareDetailsForLayout(detailsInLayout);
|
||||
}
|
||||
catch (VException &e)
|
||||
{
|
||||
QMessageBox::warning(this, tr("Export details"),
|
||||
tr("Can't export details.") + QLatin1String(" \n") + e.ErrorMessage(),
|
||||
QMessageBox::Ok, QMessageBox::Ok);
|
||||
return;
|
||||
}
|
||||
|
||||
RLDFile(rldFile.fileName(), listDetails);
|
||||
|
||||
QStringList arguments {filePath, "-r", rldFile.fileName()};
|
||||
if (isNoScaling)
|
||||
{
|
||||
arguments.append(QLatin1String("--") + LONG_OPTION_NO_HDPI_SCALING);
|
||||
}
|
||||
|
||||
rldFile.setAutoRemove(false);
|
||||
|
||||
const QString puzzle = qApp->PuzzleFilePath();
|
||||
const QString workingDirectory = QFileInfo(puzzle).absoluteDir().absolutePath();
|
||||
QProcess::startDetached(puzzle, arguments, workingDirectory);
|
||||
}
|
||||
else
|
||||
{
|
||||
qCCritical(vMainWindow, "%s", qUtf8Printable(tr("Unable to prepare raw layout data.")));
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
/**
|
||||
* @brief Clear reset to default window.
|
||||
|
@ -3554,7 +3696,9 @@ void MainWindow::SetEnableWidgets(bool enable)
|
|||
{
|
||||
const bool drawStage = (qApp->GetDrawMode() == Draw::Calculation);
|
||||
const bool detailsStage = (qApp->GetDrawMode() == Draw::Modeling);
|
||||
const bool layoutStage = (qApp->GetDrawMode() == Draw::Layout);
|
||||
const bool designStage = (drawStage || detailsStage);
|
||||
const bool piecesStage = (detailsStage || layoutStage);
|
||||
|
||||
comboBoxDraws->setEnabled(enable && drawStage);
|
||||
ui->actionOptionDraw->setEnabled(enable && drawStage);
|
||||
|
@ -3588,6 +3732,8 @@ void MainWindow::SetEnableWidgets(bool enable)
|
|||
ui->actionDecreaseLabelFont->setEnabled(enable);
|
||||
ui->actionOriginalLabelFont->setEnabled(enable);
|
||||
ui->actionHideLabels->setEnabled(enable);
|
||||
ui->actionCreateManualLayout->setEnabled(enable && piecesStage);
|
||||
ui->actionUpdateManualLayout->setEnabled(enable && piecesStage);
|
||||
|
||||
ui->actionLoadWatermark->setEnabled(enable);
|
||||
ui->actionRemoveWatermark->setEnabled(enable && not doc->GetWatermarkPath().isEmpty());
|
||||
|
@ -4524,11 +4670,10 @@ void MainWindow::CreateActions()
|
|||
qCDebug(vMainWindow, "Generated PP name: %s", qUtf8Printable(patternPieceName));
|
||||
|
||||
qCDebug(vMainWindow, "PP count %d", comboBoxDraws->count());
|
||||
patternPieceName = PatternPieceName(patternPieceName);
|
||||
bool ok = PatternPieceName(patternPieceName);
|
||||
qCDebug(vMainWindow, "PP name: %s", qUtf8Printable(patternPieceName));
|
||||
if (patternPieceName.isEmpty())
|
||||
if (not ok)
|
||||
{
|
||||
qCDebug(vMainWindow, "Name empty.");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -4733,7 +4878,7 @@ void MainWindow::InitAutoSave()
|
|||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
QString MainWindow::PatternPieceName(const QString &text)
|
||||
bool MainWindow::PatternPieceName(QString &name)
|
||||
{
|
||||
QScopedPointer<QInputDialog> dlg(new QInputDialog(this));
|
||||
dlg->setInputMode( QInputDialog::TextInput );
|
||||
|
@ -4741,23 +4886,29 @@ QString MainWindow::PatternPieceName(const QString &text)
|
|||
dlg->setTextEchoMode(QLineEdit::Normal);
|
||||
dlg->setWindowTitle(tr("Enter a new label for the pattern piece."));
|
||||
dlg->resize(300, 100);
|
||||
dlg->setTextValue(text);
|
||||
dlg->setTextValue(name);
|
||||
QString nameDraw;
|
||||
while (1)
|
||||
{
|
||||
const bool bOk = dlg->exec();
|
||||
nameDraw = dlg->textValue();
|
||||
if (bOk == false || nameDraw.isEmpty() || text == nameDraw)
|
||||
if (not bOk)
|
||||
{
|
||||
return text;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (nameDraw.isEmpty())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (comboBoxDraws->findText(nameDraw) == -1)
|
||||
{
|
||||
break;//repeate show dialog
|
||||
name = nameDraw;
|
||||
break;// unique name
|
||||
}
|
||||
}
|
||||
return nameDraw;
|
||||
return true;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
|
|
|
@ -184,6 +184,10 @@ private slots:
|
|||
bool on_actionSave_triggered();
|
||||
void on_actionOpen_triggered();
|
||||
|
||||
void on_actionOpenPuzzle_triggered();
|
||||
void on_actionCreateManualLayout_triggered();
|
||||
void on_actionUpdateManualLayout_triggered();
|
||||
|
||||
void ClosedDialogUnionDetails(int result);
|
||||
void ClosedDialogDuplicateDetail(int result);
|
||||
void ClosedDialogGroup(int result);
|
||||
|
@ -335,7 +339,7 @@ private:
|
|||
void CreateMenus();
|
||||
void CreateActions();
|
||||
void InitAutoSave();
|
||||
QString PatternPieceName(const QString &text);
|
||||
bool PatternPieceName(QString &name);
|
||||
QString CheckPathToMeasurements(const QString &patternPath, const QString &path);
|
||||
QComboBox *SetGradationList(QLabel *label, const QStringList &list);
|
||||
void ChangePP(int index, bool zoomBestFit = true);
|
||||
|
|
|
@ -372,7 +372,7 @@
|
|||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>104</width>
|
||||
<width>140</width>
|
||||
<height>108</height>
|
||||
</rect>
|
||||
</property>
|
||||
|
@ -481,7 +481,7 @@
|
|||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>104</width>
|
||||
<width>126</width>
|
||||
<height>243</height>
|
||||
</rect>
|
||||
</property>
|
||||
|
@ -746,7 +746,7 @@
|
|||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>104</width>
|
||||
<width>126</width>
|
||||
<height>282</height>
|
||||
</rect>
|
||||
</property>
|
||||
|
@ -1037,7 +1037,7 @@
|
|||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>98</width>
|
||||
<width>140</width>
|
||||
<height>102</height>
|
||||
</rect>
|
||||
</property>
|
||||
|
@ -1120,7 +1120,7 @@
|
|||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>104</width>
|
||||
<width>126</width>
|
||||
<height>192</height>
|
||||
</rect>
|
||||
</property>
|
||||
|
@ -1324,7 +1324,7 @@
|
|||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>104</width>
|
||||
<width>126</width>
|
||||
<height>237</height>
|
||||
</rect>
|
||||
</property>
|
||||
|
@ -1589,8 +1589,8 @@
|
|||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>104</width>
|
||||
<height>57</height>
|
||||
<width>140</width>
|
||||
<height>170</height>
|
||||
</rect>
|
||||
</property>
|
||||
<attribute name="icon">
|
||||
|
@ -1690,7 +1690,7 @@
|
|||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>1100</width>
|
||||
<height>22</height>
|
||||
<height>21</height>
|
||||
</rect>
|
||||
</property>
|
||||
<widget class="QMenu" name="menuFile">
|
||||
|
@ -1804,12 +1804,21 @@
|
|||
<addaction name="actionLoadWatermark"/>
|
||||
<addaction name="actionRemoveWatermark"/>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menuManual_Layout">
|
||||
<property name="title">
|
||||
<string>Manual Layout</string>
|
||||
</property>
|
||||
<addaction name="actionOpenPuzzle"/>
|
||||
<addaction name="actionCreateManualLayout"/>
|
||||
<addaction name="actionUpdateManualLayout"/>
|
||||
</widget>
|
||||
<addaction name="menuFile"/>
|
||||
<addaction name="menuPatternPiece"/>
|
||||
<addaction name="menuMode"/>
|
||||
<addaction name="menuMeasurements"/>
|
||||
<addaction name="menuHistory"/>
|
||||
<addaction name="menuWatermark"/>
|
||||
<addaction name="menuManual_Layout"/>
|
||||
<addaction name="menuWindow"/>
|
||||
<addaction name="menuHelp"/>
|
||||
</widget>
|
||||
|
@ -3026,6 +3035,36 @@
|
|||
<string>Create or edit a watermark</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionOpenPuzzle">
|
||||
<property name="text">
|
||||
<string>Open Puzzle</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Open the Puzzle app</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionCreateManualLayout">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Create</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Create manual layout</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionUpdateManualLayout">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Update</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Update manual layout</string>
|
||||
</property>
|
||||
</action>
|
||||
</widget>
|
||||
<layoutdefault spacing="6" margin="11"/>
|
||||
<customwidgets>
|
||||
|
|
|
@ -53,6 +53,7 @@
|
|||
#include "../ifc/xml/vvstconverter.h"
|
||||
#include "../ifc/xml/vvitconverter.h"
|
||||
#include "../ifc/xml/vwatermarkconverter.h"
|
||||
#include "../vlayout/vrawlayout.h"
|
||||
|
||||
#include <QFileDialog>
|
||||
#include <QFileInfo>
|
||||
|
@ -523,7 +524,8 @@ void MainWindowsNoGUI::ExportData(const QVector<VLayoutPiece> &listDetails)
|
|||
format == LayoutExportFormats::DXF_AC1018_ASTM ||
|
||||
format == LayoutExportFormats::DXF_AC1021_ASTM ||
|
||||
format == LayoutExportFormats::DXF_AC1024_ASTM ||
|
||||
format == LayoutExportFormats::DXF_AC1027_ASTM)
|
||||
format == LayoutExportFormats::DXF_AC1027_ASTM ||
|
||||
format == LayoutExportFormats::RLD)
|
||||
{
|
||||
if (m_dialogSaveLayout->Mode() == Draw::Layout)
|
||||
{
|
||||
|
@ -731,6 +733,9 @@ void MainWindowsNoGUI::ExportApparelLayout(const QVector<VLayoutPiece> &details,
|
|||
case LayoutExportFormats::DXF_AC1027_AAMA:
|
||||
AAMADxfFile(name, DRW::AC1027, m_dialogSaveLayout->IsBinaryDXFFormat(), size, details);
|
||||
break;
|
||||
case LayoutExportFormats::RLD:
|
||||
RLDFile(name, details, m_dialogSaveLayout->GetXScale(), m_dialogSaveLayout->GetYScale());
|
||||
break;
|
||||
default:
|
||||
qDebug() << "Can't recognize file type." << Q_FUNC_INFO;
|
||||
break;
|
||||
|
@ -1488,6 +1493,25 @@ void MainWindowsNoGUI::ASTMDxfFile(const QString &name, int version, bool binary
|
|||
generator.ExportToASTM(details);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void MainWindowsNoGUI::RLDFile(const QString &name, QVector<VLayoutPiece> details, qreal xScale, qreal yScale) const
|
||||
{
|
||||
for(auto detail : details)
|
||||
{
|
||||
detail.Scale(xScale, yScale);
|
||||
}
|
||||
|
||||
VRawLayoutData layoutDate;
|
||||
layoutDate.pieces = details;
|
||||
|
||||
VRawLayout generator;
|
||||
if (not generator.WriteFile(name, layoutDate))
|
||||
{
|
||||
const QString errorMsg = tr("Export raw layout data failed. %1.").arg(generator.ErrorString());
|
||||
qApp->IsPedantic() ? throw VException(errorMsg) : qCritical() << errorMsg;
|
||||
}
|
||||
}
|
||||
|
||||
QT_WARNING_POP
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
|
|
|
@ -150,6 +150,8 @@ protected:
|
|||
QSharedPointer<VMeasurements> OpenMeasurementFile(const QString &path) const;
|
||||
|
||||
void CheckRequiredMeasurements(const VMeasurements *m) const;
|
||||
|
||||
void RLDFile(const QString &name, QVector<VLayoutPiece> details, qreal xScale=1, qreal yScale=1) const;
|
||||
private slots:
|
||||
void PrintPages (QPrinter *printer);
|
||||
private:
|
||||
|
|
|
@ -829,6 +829,7 @@ void VPattern::ParseDetailElement(QDomElement &domElement, const Document &parse
|
|||
VToolSeamAllowanceInitData initData;
|
||||
initData.id = GetParametrId(domElement);
|
||||
initData.detail.SetName(GetParametrString(domElement, AttrName, tr("Detail")));
|
||||
initData.detail.SetUUID(GetParametrEmptyString(domElement, AttrUUID));
|
||||
initData.detail.SetMx(qApp->toPixel(GetParametrDouble(domElement, AttrMx, QStringLiteral("0.0"))));
|
||||
initData.detail.SetMy(qApp->toPixel(GetParametrDouble(domElement, AttrMy, QStringLiteral("0.0"))));
|
||||
initData.detail.SetSeamAllowance(GetParametrBool(domElement, VToolSeamAllowance::AttrSeamAllowance, falseStr));
|
||||
|
|
|
@ -47,6 +47,7 @@ const QString AttrType = QStringLiteral("type");
|
|||
const QString AttrMx = QStringLiteral("mx");
|
||||
const QString AttrMy = QStringLiteral("my");
|
||||
const QString AttrName = QStringLiteral("name");
|
||||
const QString AttrUUID = QStringLiteral("uuid");
|
||||
const QString AttrMx1 = QStringLiteral("mx1");
|
||||
const QString AttrMy1 = QStringLiteral("my1");
|
||||
const QString AttrName1 = QStringLiteral("name1");
|
||||
|
|
|
@ -65,6 +65,7 @@ extern const QString AttrType;
|
|||
extern const QString AttrMx;
|
||||
extern const QString AttrMy;
|
||||
extern const QString AttrName;
|
||||
extern const QString AttrUUID;
|
||||
extern const QString AttrMx1;
|
||||
extern const QString AttrMy1;
|
||||
extern const QString AttrName1;
|
||||
|
|
|
@ -59,6 +59,7 @@
|
|||
<file>schema/pattern/v0.8.5.xsd</file>
|
||||
<file>schema/pattern/v0.8.6.xsd</file>
|
||||
<file>schema/pattern/v0.8.7.xsd</file>
|
||||
<file>schema/pattern/v0.8.8.xsd</file>
|
||||
<file>schema/standard_measurements/v0.3.0.xsd</file>
|
||||
<file>schema/standard_measurements/v0.4.0.xsd</file>
|
||||
<file>schema/standard_measurements/v0.4.1.xsd</file>
|
||||
|
|
1260
src/libs/ifc/schema/pattern/v0.8.8.xsd
Normal file
1260
src/libs/ifc/schema/pattern/v0.8.8.xsd
Normal file
File diff suppressed because it is too large
Load Diff
|
@ -41,6 +41,7 @@
|
|||
#include <QStringDataPtr>
|
||||
#include <algorithm>
|
||||
#include <QGlobalStatic>
|
||||
#include <QUuid>
|
||||
|
||||
#include "../exception/vexception.h"
|
||||
#include "../exception/vexceptionemptyparameter.h"
|
||||
|
@ -59,8 +60,8 @@ class QDomElement;
|
|||
*/
|
||||
|
||||
const QString VPatternConverter::PatternMinVerStr = QStringLiteral("0.1.4");
|
||||
const QString VPatternConverter::PatternMaxVerStr = QStringLiteral("0.8.7");
|
||||
const QString VPatternConverter::CurrentSchema = QStringLiteral("://schema/pattern/v0.8.7.xsd");
|
||||
const QString VPatternConverter::PatternMaxVerStr = QStringLiteral("0.8.8");
|
||||
const QString VPatternConverter::CurrentSchema = QStringLiteral("://schema/pattern/v0.8.8.xsd");
|
||||
|
||||
//VPatternConverter::PatternMinVer; // <== DON'T FORGET TO UPDATE TOO!!!!
|
||||
//VPatternConverter::PatternMaxVer; // <== DON'T FORGET TO UPDATE TOO!!!!
|
||||
|
@ -135,6 +136,7 @@ Q_GLOBAL_STATIC_WITH_ARGS(const QString, strMy, (QLatin1String("my")))
|
|||
//Q_GLOBAL_STATIC_WITH_ARGS(const QString, strForbidFlipping, (QLatin1String("forbidFlipping")))
|
||||
//Q_GLOBAL_STATIC_WITH_ARGS(const QString, strInLayout, (QLatin1String("inLayout")))
|
||||
Q_GLOBAL_STATIC_WITH_ARGS(const QString, strSeamAllowance, (QLatin1String("seamAllowance")))
|
||||
Q_GLOBAL_STATIC_WITH_ARGS(const QString, strUUID, (QLatin1String("uuid")))
|
||||
//Q_GLOBAL_STATIC_WITH_ARGS(const QString, strNodeType, (QLatin1String("nodeType")))
|
||||
Q_GLOBAL_STATIC_WITH_ARGS(const QString, strDet, (QLatin1String("det")))
|
||||
Q_GLOBAL_STATIC_WITH_ARGS(const QString, strTypeObject, (QLatin1String("typeObject")))
|
||||
|
@ -237,7 +239,8 @@ QString VPatternConverter::XSDSchema(int ver) const
|
|||
std::make_pair(FORMAT_VERSION(0, 8, 4), QStringLiteral("://schema/pattern/v0.8.4.xsd")),
|
||||
std::make_pair(FORMAT_VERSION(0, 8, 5), QStringLiteral("://schema/pattern/v0.8.5.xsd")),
|
||||
std::make_pair(FORMAT_VERSION(0, 8, 6), QStringLiteral("://schema/pattern/v0.8.6.xsd")),
|
||||
std::make_pair(FORMAT_VERSION(0, 8, 7), CurrentSchema)
|
||||
std::make_pair(FORMAT_VERSION(0, 8, 7), QStringLiteral("://schema/pattern/v0.8.7.xsd")),
|
||||
std::make_pair(FORMAT_VERSION(0, 8, 8), CurrentSchema)
|
||||
};
|
||||
|
||||
if (schemas.contains(ver))
|
||||
|
@ -486,6 +489,10 @@ void VPatternConverter::ApplyPatches()
|
|||
ValidateXML(XSDSchema(FORMAT_VERSION(0, 8, 7)));
|
||||
Q_FALLTHROUGH();
|
||||
case (FORMAT_VERSION(0, 8, 7)):
|
||||
ToV0_8_8();
|
||||
ValidateXML(XSDSchema(FORMAT_VERSION(0, 8, 8)));
|
||||
Q_FALLTHROUGH();
|
||||
case (FORMAT_VERSION(0, 8, 8)):
|
||||
break;
|
||||
default:
|
||||
InvalidVersion(m_ver);
|
||||
|
@ -503,7 +510,7 @@ void VPatternConverter::DowngradeToCurrentMaxVersion()
|
|||
bool VPatternConverter::IsReadOnly() const
|
||||
{
|
||||
// Check if attribute readOnly was not changed in file format
|
||||
Q_STATIC_ASSERT_X(VPatternConverter::PatternMaxVer == FORMAT_VERSION(0, 8, 7),
|
||||
Q_STATIC_ASSERT_X(VPatternConverter::PatternMaxVer == FORMAT_VERSION(0, 8, 8),
|
||||
"Check attribute readOnly.");
|
||||
|
||||
// Possibly in future attribute readOnly will change position etc.
|
||||
|
@ -1143,6 +1150,17 @@ void VPatternConverter::ToV0_8_7()
|
|||
Save();
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void VPatternConverter::ToV0_8_8()
|
||||
{
|
||||
// TODO. Delete if minimal supported version is 0.8.8
|
||||
Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 8, 8),
|
||||
"Time to refactor the code.");
|
||||
SetVersion(QStringLiteral("0.8.8"));
|
||||
AddPieceUUIDV0_8_8();
|
||||
Save();
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void VPatternConverter::TagUnitToV0_2_0()
|
||||
{
|
||||
|
@ -2662,6 +2680,25 @@ void VPatternConverter::AddTagPreviewCalculationsV0_6_2()
|
|||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void VPatternConverter::AddPieceUUIDV0_8_8()
|
||||
{
|
||||
// TODO. Delete if minimal supported version is 0.8.8
|
||||
Q_STATIC_ASSERT_X(VPatternConverter::PatternMinVer < FORMAT_VERSION(0, 8, 8),
|
||||
"Time to refactor the code.");
|
||||
|
||||
const QDomNodeList list = elementsByTagName(*strDetail);
|
||||
for (int i=0; i < list.size(); ++i)
|
||||
{
|
||||
QDomElement dom = list.at(i).toElement();
|
||||
|
||||
if (not dom.isNull())
|
||||
{
|
||||
dom.setAttribute(*strUUID, QUuid::createUuid().toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void VPatternConverter::TagUnionDetailsToV0_4_0()
|
||||
{
|
||||
|
|
|
@ -53,7 +53,7 @@ public:
|
|||
static const QString PatternMaxVerStr;
|
||||
static const QString CurrentSchema;
|
||||
static Q_DECL_CONSTEXPR const int PatternMinVer = FORMAT_VERSION(0, 1, 4);
|
||||
static Q_DECL_CONSTEXPR const int PatternMaxVer = FORMAT_VERSION(0, 8, 7);
|
||||
static Q_DECL_CONSTEXPR const int PatternMaxVer = FORMAT_VERSION(0, 8, 8);
|
||||
|
||||
protected:
|
||||
virtual int MinVer() const override;
|
||||
|
@ -130,6 +130,7 @@ private:
|
|||
void ToV0_8_5();
|
||||
void ToV0_8_6();
|
||||
void ToV0_8_7();
|
||||
void ToV0_8_8();
|
||||
|
||||
void TagUnitToV0_2_0();
|
||||
void TagIncrementToV0_2_0();
|
||||
|
@ -182,6 +183,8 @@ private:
|
|||
void RemoveUniqueTagV0_6_0(const QString &tag);
|
||||
|
||||
void AddTagPreviewCalculationsV0_6_2();
|
||||
|
||||
void AddPieceUUIDV0_8_8();
|
||||
};
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
|
|
|
@ -49,7 +49,7 @@
|
|||
#include <QJsonDocument>
|
||||
|
||||
const quint32 VAbstractPieceData::streamHeader = 0x05CDD73A; // CRC-32Q string "VAbstractPieceData"
|
||||
const quint16 VAbstractPieceData::classVersion = 2;
|
||||
const quint16 VAbstractPieceData::classVersion = 3;
|
||||
|
||||
const qreal maxL = 3.5;
|
||||
|
||||
|
@ -1652,6 +1652,25 @@ void VAbstractPiece::SetPriority(uint value)
|
|||
d->m_priority = value;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
QUuid VAbstractPiece::GetUUID() const
|
||||
{
|
||||
return d->m_uuid;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void VAbstractPiece::SetUUID(const QUuid &uuid)
|
||||
{
|
||||
d->m_uuid = uuid;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void VAbstractPiece::SetUUID(const QString &uuid)
|
||||
{
|
||||
const QUuid temp = QUuid(uuid);
|
||||
d->m_uuid = temp.isNull() ? QUuid::createUuid() : temp;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
qreal VSAPoint::GetSABefore(qreal width) const
|
||||
{
|
||||
|
|
|
@ -91,6 +91,10 @@ public:
|
|||
uint GetPriority() const;
|
||||
void SetPriority(uint value);
|
||||
|
||||
QUuid GetUUID() const;
|
||||
void SetUUID(const QUuid &uuid);
|
||||
void SetUUID(const QString &uuid);
|
||||
|
||||
static QVector<QPointF> Equidistant(QVector<VSAPoint> points, qreal width, const QString &name);
|
||||
static qreal SumTrapezoids(const QVector<QPointF> &points);
|
||||
static QVector<QPointF> CheckLoops(const QVector<QPointF> &points);
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
#include <QSharedData>
|
||||
#include <QString>
|
||||
#include <QCoreApplication>
|
||||
#include <QUuid>
|
||||
|
||||
#include "../vmisc/diagnostic.h"
|
||||
#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0)
|
||||
|
@ -62,7 +63,8 @@ public:
|
|||
m_width(piece.m_width),
|
||||
m_mx(piece.m_mx),
|
||||
m_my(piece.m_my),
|
||||
m_priority(piece.m_priority)
|
||||
m_priority(piece.m_priority),
|
||||
m_uuid(piece.m_uuid)
|
||||
{}
|
||||
|
||||
~VAbstractPieceData() Q_DECL_EQ_DEFAULT;
|
||||
|
@ -81,6 +83,7 @@ public:
|
|||
qreal m_mx{0};
|
||||
qreal m_my{0};
|
||||
uint m_priority{0};
|
||||
QUuid m_uuid{QUuid::createUuid()};
|
||||
|
||||
private:
|
||||
Q_DISABLE_ASSIGN(VAbstractPieceData)
|
||||
|
@ -111,6 +114,9 @@ inline QDataStream &operator<<(QDataStream &dataStream, const VAbstractPieceData
|
|||
// Added in classVersion = 2
|
||||
dataStream << piece.m_priority;
|
||||
|
||||
// Added in classVersion = 3
|
||||
dataStream << piece.m_uuid;
|
||||
|
||||
return dataStream;
|
||||
}
|
||||
|
||||
|
@ -155,6 +161,11 @@ inline QDataStream &operator>>(QDataStream &dataStream, VAbstractPieceData &piec
|
|||
dataStream >> piece.m_priority;
|
||||
}
|
||||
|
||||
if (actualClassVersion >= 3)
|
||||
{
|
||||
dataStream >> piece.m_uuid;
|
||||
}
|
||||
|
||||
return dataStream;
|
||||
}
|
||||
|
||||
|
|
|
@ -13,6 +13,7 @@ HEADERS += \
|
|||
$$PWD/vcontour_p.h \
|
||||
$$PWD/vbestsquare.h \
|
||||
$$PWD/vposition.h \
|
||||
$$PWD/vrawlayout.h \
|
||||
$$PWD/vsapoint.h \
|
||||
$$PWD/vtextmanager.h \
|
||||
$$PWD/vposter.h \
|
||||
|
@ -34,6 +35,7 @@ SOURCES += \
|
|||
$$PWD/vcontour.cpp \
|
||||
$$PWD/vbestsquare.cpp \
|
||||
$$PWD/vposition.cpp \
|
||||
$$PWD/vrawlayout.cpp \
|
||||
$$PWD/vtextmanager.cpp \
|
||||
$$PWD/vposter.cpp \
|
||||
$$PWD/vgraphicsfillitem.cpp \
|
||||
|
|
|
@ -72,6 +72,7 @@ enum class LayoutExportFormats : qint8
|
|||
DXF_AC1027_ASTM = 32, /* ACAD 2013. */
|
||||
PDFTiled = 33,
|
||||
NC = 34, /*G-code. Reserved for future*/
|
||||
RLD = 35, /*Raw Layout Data*/
|
||||
COUNT /*Use only for validation*/
|
||||
};
|
||||
|
||||
|
|
|
@ -44,6 +44,7 @@
|
|||
#include <QTransform>
|
||||
#include <Qt>
|
||||
#include <QtDebug>
|
||||
#include <QUuid>
|
||||
|
||||
#include "../vpatterndb/floatItemData/vpatternlabeldata.h"
|
||||
#include "../vpatterndb/floatItemData/vpiecelabeldata.h"
|
||||
|
@ -452,6 +453,7 @@ VLayoutPiece VLayoutPiece::Create(const VPiece &piece, vidtype id, const VContai
|
|||
det.SetMy(piece.GetMy());
|
||||
|
||||
det.SetName(piece.GetName());
|
||||
det.SetUUID(piece.GetUUID());
|
||||
|
||||
det.SetSAWidth(qApp->toPixel(piece.GetSAWidth()));
|
||||
det.SetForbidFlipping(piece.IsForbidFlipping());
|
||||
|
|
248
src/libs/vlayout/vrawlayout.cpp
Normal file
248
src/libs/vlayout/vrawlayout.cpp
Normal file
|
@ -0,0 +1,248 @@
|
|||
/************************************************************************
|
||||
**
|
||||
** @file vrawlayout.cpp
|
||||
** @author Roman Telezhynskyi <dismine(at)gmail.com>
|
||||
** @date 21 4, 2020
|
||||
**
|
||||
** @brief
|
||||
** @copyright
|
||||
** This source code is part of the Valentina project, a pattern making
|
||||
** program, whose allow create and modeling patterns of clothing.
|
||||
** Copyright (C) 2020 Valentina project
|
||||
** <https://gitlab.com/smart-pattern/valentina> 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 <http://www.gnu.org/licenses/>.
|
||||
**
|
||||
*************************************************************************/
|
||||
#include "vrawlayout.h"
|
||||
|
||||
#include <QDataStream>
|
||||
#include <QIODevice>
|
||||
#include <QDebug>
|
||||
#include <QFile>
|
||||
|
||||
#if QT_VERSION < QT_VERSION_CHECK(5, 12, 0)
|
||||
#include "../vmisc/backport/qscopeguard.h"
|
||||
#else
|
||||
#include <QScopeGuard>
|
||||
#endif
|
||||
|
||||
#include "../vmisc/def.h"
|
||||
#include "../vmisc/vdatastreamenum.h"
|
||||
#include "../ifc/exception/vexception.h"
|
||||
|
||||
const QByteArray VRawLayout::fileHeaderByteArray = QByteArray("RLD!...");
|
||||
const quint16 VRawLayout::fileVersion = 1;
|
||||
|
||||
const quint32 VRawLayoutData::streamHeader = 0x8B0E8A27; // CRC-32Q string "VRawLayoutData"
|
||||
const quint16 VRawLayoutData::classVersion = 1;
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
QDataStream &operator<<(QDataStream &dataStream, const VRawLayoutData &data)
|
||||
{
|
||||
dataStream << VRawLayoutData::streamHeader << VRawLayoutData::classVersion;
|
||||
|
||||
// Added in classVersion = 1
|
||||
dataStream << data.pieces;
|
||||
|
||||
// Added in classVersion = 2
|
||||
|
||||
return dataStream;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
QDataStream &operator>>(QDataStream &dataStream, VRawLayoutData &data)
|
||||
{
|
||||
quint32 actualStreamHeader = 0;
|
||||
dataStream >> actualStreamHeader;
|
||||
|
||||
if (actualStreamHeader != VRawLayoutData::streamHeader)
|
||||
{
|
||||
QString message = QCoreApplication::tr("VRawLayoutData prefix mismatch error: actualStreamHeader = 0x%1 and "
|
||||
"streamHeader = 0x%2")
|
||||
.arg(actualStreamHeader, 8, 0x10, QChar('0'))
|
||||
.arg(VRawLayoutData::streamHeader, 8, 0x10, QChar('0'));
|
||||
throw VException(message);
|
||||
}
|
||||
|
||||
quint16 actualClassVersion = 0;
|
||||
dataStream >> actualClassVersion;
|
||||
|
||||
if (actualClassVersion > VRawLayoutData::classVersion)
|
||||
{
|
||||
QString message = QCoreApplication::tr("VRawLayoutData compatibility error: actualClassVersion = %1 and "
|
||||
"classVersion = %2")
|
||||
.arg( actualClassVersion ).arg(VRawLayoutData::classVersion);
|
||||
throw VException(message);
|
||||
}
|
||||
|
||||
dataStream >> data.pieces;
|
||||
|
||||
// if (actualClassVersion >= 2)
|
||||
// {
|
||||
// // read value in version 2
|
||||
// }
|
||||
|
||||
return dataStream;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
VRawLayout::VRawLayout()
|
||||
{}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
bool VRawLayout::WriteFile(QIODevice *ioDevice, const VRawLayoutData &data)
|
||||
{
|
||||
SCASSERT(ioDevice != nullptr)
|
||||
m_errorString.clear();
|
||||
|
||||
const bool wasOpen = ioDevice->isOpen();
|
||||
|
||||
if (wasOpen || ioDevice->open(QIODevice::WriteOnly))
|
||||
{
|
||||
QDataStream dataStream(ioDevice);
|
||||
dataStream.setVersion(QDataStream::Qt_5_4);
|
||||
|
||||
// Don't use the << operator for QByteArray. See the note in ReadFile() below.
|
||||
dataStream.writeRawData(fileHeaderByteArray.constData(), fileHeaderByteArray.size());
|
||||
dataStream << fileVersion;
|
||||
dataStream << data;
|
||||
|
||||
if (not wasOpen)
|
||||
{
|
||||
ioDevice->close(); // Only close this if it was opened by this function.
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_errorString = ioDevice->errorString();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
bool VRawLayout::ReadFile(QIODevice *ioDevice, VRawLayoutData &data)
|
||||
{
|
||||
SCASSERT(ioDevice != nullptr)
|
||||
m_errorString.clear();
|
||||
|
||||
const bool wasOpen = ioDevice->isOpen();
|
||||
|
||||
if (wasOpen || ioDevice->open(QIODevice::ReadOnly))
|
||||
{
|
||||
auto CloseFile = qScopeGuard([wasOpen, ioDevice]()
|
||||
{
|
||||
if (not wasOpen) // Only close this if it was opened by this function.
|
||||
{
|
||||
ioDevice->close();
|
||||
}
|
||||
});
|
||||
|
||||
QDataStream dataStream(ioDevice);
|
||||
dataStream.setVersion(QDataStream::Qt_5_4);
|
||||
|
||||
// Note: we could have used the QDataStream << and >> operators on QByteArray but since the first
|
||||
// bytes of the stream will be the size of the array, we might end up attempting to allocate
|
||||
// a large amount of memory if the wrong file type was read. Instead, we'll just read the
|
||||
// same number of bytes that are in the array we are comparing it to. No size was written.
|
||||
const int len = fileHeaderByteArray.size();
|
||||
QByteArray actualFileHeaderByteArray( len, '\0' );
|
||||
dataStream.readRawData( actualFileHeaderByteArray.data(), len );
|
||||
|
||||
if (actualFileHeaderByteArray != fileHeaderByteArray)
|
||||
{
|
||||
// prefixes don't match
|
||||
m_errorString = tr("VRawLayout::ReadFile() failed. Raw layout format prefix mismatch error.");
|
||||
return false;
|
||||
}
|
||||
|
||||
quint16 actualFileVersion = 0;
|
||||
dataStream >> actualFileVersion;
|
||||
|
||||
if (actualFileVersion > fileVersion)
|
||||
{
|
||||
// file is from a future version that we don't know how to load
|
||||
m_errorString = tr("VRawLayout::ReadFile() failed.\n"
|
||||
"Raw layout format compatibility error: actualFileVersion = %1 and fileVersion = %2" )
|
||||
.arg(actualFileVersion).arg(fileVersion);
|
||||
return false;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
// This may throw an exception if one of the VRawLayoutData objects is corrupt or unsupported.
|
||||
// For example, if this file is from a future version of this code.
|
||||
dataStream >> data;
|
||||
}
|
||||
catch (const VException& e)
|
||||
{
|
||||
qCritical() << e.ErrorMessage();
|
||||
|
||||
m_errorString = e.ErrorMessage();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_errorString = ioDevice->errorString();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
bool VRawLayout::WriteFile(const QString &filePath, const VRawLayoutData &data)
|
||||
{
|
||||
QFile file(filePath);
|
||||
if (file.open(QIODevice::WriteOnly | QIODevice::Truncate))
|
||||
{
|
||||
auto CloseFile = qScopeGuard([&file]()
|
||||
{
|
||||
file.flush();
|
||||
file.close();
|
||||
});
|
||||
return WriteFile(&file, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_errorString = file.errorString();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
bool VRawLayout::ReadFile(const QString &filePath, VRawLayoutData &data)
|
||||
{
|
||||
QFile file(filePath);
|
||||
if (file.open(QIODevice::ReadOnly))
|
||||
{
|
||||
auto CloseFile = qScopeGuard([&file]()
|
||||
{
|
||||
file.flush();
|
||||
file.close();
|
||||
});
|
||||
return ReadFile(&file, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_errorString = file.errorString();
|
||||
return false;
|
||||
}
|
||||
}
|
73
src/libs/vlayout/vrawlayout.h
Normal file
73
src/libs/vlayout/vrawlayout.h
Normal file
|
@ -0,0 +1,73 @@
|
|||
/************************************************************************
|
||||
**
|
||||
** @file vrawlayout.h
|
||||
** @author Roman Telezhynskyi <dismine(at)gmail.com>
|
||||
** @date 21 4, 2020
|
||||
**
|
||||
** @brief
|
||||
** @copyright
|
||||
** This source code is part of the Valentina project, a pattern making
|
||||
** program, whose allow create and modeling patterns of clothing.
|
||||
** Copyright (C) 2020 Valentina project
|
||||
** <https://gitlab.com/smart-pattern/valentina> 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 <http://www.gnu.org/licenses/>.
|
||||
**
|
||||
*************************************************************************/
|
||||
#ifndef VRAWLAYOUT_H
|
||||
#define VRAWLAYOUT_H
|
||||
|
||||
#include "vlayoutpiece.h"
|
||||
|
||||
struct VRawLayoutData
|
||||
{
|
||||
QVector<VLayoutPiece> pieces{};
|
||||
|
||||
friend QDataStream& operator<< (QDataStream& dataStream, const VRawLayoutData& date);
|
||||
friend QDataStream& operator>> (QDataStream& dataStream, VRawLayoutData& date);
|
||||
|
||||
private:
|
||||
static const quint32 streamHeader;
|
||||
static const quint16 classVersion;
|
||||
};
|
||||
|
||||
|
||||
class VRawLayout
|
||||
{
|
||||
Q_DECLARE_TR_FUNCTIONS(VRawLayout)
|
||||
public:
|
||||
VRawLayout();
|
||||
|
||||
bool WriteFile(QIODevice* ioDevice, const VRawLayoutData& data);
|
||||
bool ReadFile(QIODevice* ioDevice, VRawLayoutData& data);
|
||||
|
||||
bool WriteFile(const QString& filePath, const VRawLayoutData& data);
|
||||
bool ReadFile(const QString& filePath, VRawLayoutData& data);
|
||||
|
||||
QString ErrorString() const;
|
||||
|
||||
private:
|
||||
QString m_errorString{};
|
||||
|
||||
static const QByteArray fileHeaderByteArray;
|
||||
static const quint16 fileVersion;
|
||||
};
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
inline QString VRawLayout::ErrorString() const
|
||||
{
|
||||
return m_errorString;
|
||||
}
|
||||
|
||||
#endif // VRAWLAYOUT_H
|
|
@ -54,6 +54,7 @@ Q_GLOBAL_STATIC_WITH_ARGS(const QString, settingPathsMultisizeMeasurements, (QLa
|
|||
Q_GLOBAL_STATIC_WITH_ARGS(const QString, settingPathsPattern, (QLatin1String("paths/pattern")))
|
||||
Q_GLOBAL_STATIC_WITH_ARGS(const QString, settingPathsTemplates, (QLatin1String("paths/templates")))
|
||||
Q_GLOBAL_STATIC_WITH_ARGS(const QString, settingPathsLabelTemplate, (QLatin1String("paths/labels")))
|
||||
Q_GLOBAL_STATIC_WITH_ARGS(const QString, settingPathsManualLayouts, (QLatin1String("paths/manualLayouts")))
|
||||
|
||||
Q_GLOBAL_STATIC_WITH_ARGS(const QString, settingConfigurationOsSeparator, (QLatin1String("configuration/osSeparator")))
|
||||
Q_GLOBAL_STATIC_WITH_ARGS(const QString, settingConfigurationAutosaveState, (QLatin1String("configuration/autosave/state")))
|
||||
|
@ -425,6 +426,24 @@ void VCommonSettings::SetPathLabelTemplate(const QString &value)
|
|||
setValue(*settingPathsLabelTemplate, value);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
QString VCommonSettings::GetDefPathManualLayouts()
|
||||
{
|
||||
return QDir::homePath() + QLatin1String("/valentina/") + tr("manual layouts");
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
QString VCommonSettings::GetPathManualLayouts() const
|
||||
{
|
||||
return value(*settingPathsManualLayouts, GetDefPathManualLayouts()).toString();
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void VCommonSettings::SetPathManualLayouts(const QString &value)
|
||||
{
|
||||
setValue(*settingPathsManualLayouts, value);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
bool VCommonSettings::GetOsSeparator() const
|
||||
{
|
||||
|
|
|
@ -75,6 +75,10 @@ public:
|
|||
QString GetPathLabelTemplate() const;
|
||||
void SetPathLabelTemplate(const QString &value);
|
||||
|
||||
static QString GetDefPathManualLayouts();
|
||||
QString GetPathManualLayouts() const;
|
||||
void SetPathManualLayouts(const QString &value);
|
||||
|
||||
bool GetOsSeparator() const;
|
||||
void SetOsSeparator(const bool &value);
|
||||
|
||||
|
|
|
@ -53,6 +53,7 @@
|
|||
|
||||
#include <QMenu>
|
||||
#include <QTimer>
|
||||
#include <QUuid>
|
||||
#include <QtNumeric>
|
||||
|
||||
enum TabOrder {Paths=0, Pins=1, Labels=2, Grainline=3, Passmarks=4, PlaceLabels=5, Count=6};
|
||||
|
@ -117,6 +118,7 @@ DialogSeamAllowance::DialogSeamAllowance(const VContainer *data, quint32 toolId,
|
|||
flagFormulaAfter(true),
|
||||
flagMainPathIsValid(true),
|
||||
flagName(true), //We have default name of piece.
|
||||
flagUUID(true),
|
||||
flagFormula(true),
|
||||
m_bAddMode(true),
|
||||
m_dialog(),
|
||||
|
@ -149,6 +151,7 @@ DialogSeamAllowance::DialogSeamAllowance(const VContainer *data, quint32 toolId,
|
|||
EnableApply(applyAllowed);
|
||||
|
||||
InitMainPathTab();
|
||||
InitPieceTab();
|
||||
InitSeamAllowanceTab();
|
||||
InitInternalPathsTab();
|
||||
InitPatternPieceDataTab();
|
||||
|
@ -318,6 +321,7 @@ void DialogSeamAllowance::SetPiece(const VPiece &piece)
|
|||
uiTabPaths->checkBoxSeams->setChecked(piece.IsSeamAllowance());
|
||||
uiTabPaths->checkBoxBuiltIn->setChecked(piece.IsSeamAllowanceBuiltIn());
|
||||
uiTabPaths->lineEditName->setText(piece.GetName());
|
||||
uiTabPaths->lineEditUUID->setText(piece.GetUUID().toString());
|
||||
uiTabPaths->spinBoxPriority->setValue(static_cast<int>(piece.GetPriority()));
|
||||
|
||||
uiTabPaths->plainTextEditFormulaWidth->setPlainText(
|
||||
|
@ -493,7 +497,7 @@ void DialogSeamAllowance::CheckState()
|
|||
|
||||
if (flagFormula && flagFormulaBefore && flagFormulaAfter)
|
||||
{
|
||||
if (flagMainPathIsValid && flagName)
|
||||
if (flagMainPathIsValid && flagName && flagUUID)
|
||||
{
|
||||
m_ftb->SetTabText(TabOrder::Paths, tr("Paths"));
|
||||
}
|
||||
|
@ -508,9 +512,9 @@ void DialogSeamAllowance::CheckState()
|
|||
uiTabPaths->tabWidget->setTabIcon(uiTabPaths->tabWidget->indexOf(uiTabPaths->tabSeamAllowance), icon);
|
||||
}
|
||||
|
||||
if (flagMainPathIsValid && flagName)
|
||||
if (flagMainPathIsValid)
|
||||
{
|
||||
if (flagFormula && flagFormulaBefore && flagFormulaAfter)
|
||||
if (flagFormula && flagFormulaBefore && flagFormulaAfter && flagName && flagUUID)
|
||||
{
|
||||
m_ftb->SetTabText(TabOrder::Paths, tr("Paths"));
|
||||
}
|
||||
|
@ -532,6 +536,22 @@ void DialogSeamAllowance::CheckState()
|
|||
uiTabPaths->tabWidget->setTabIcon(uiTabPaths->tabWidget->indexOf(uiTabPaths->tabMainPath), icon);
|
||||
}
|
||||
|
||||
if (flagName && flagUUID)
|
||||
{
|
||||
if (flagFormula && flagFormulaBefore && flagFormulaAfter && flagMainPathIsValid)
|
||||
{
|
||||
m_ftb->SetTabText(TabOrder::Paths, tr("Paths"));
|
||||
}
|
||||
uiTabPaths->tabWidget->setTabIcon(uiTabPaths->tabWidget->indexOf(uiTabPaths->tabPiece), QIcon());
|
||||
}
|
||||
else
|
||||
{
|
||||
m_ftb->SetTabText(TabOrder::Paths, tr("Paths") + '*');
|
||||
const QIcon icon = QIcon::fromTheme("dialog-warning",
|
||||
QIcon(":/icons/win.icon.theme/16x16/status/dialog-warning.png"));
|
||||
uiTabPaths->tabWidget->setTabIcon(uiTabPaths->tabWidget->indexOf(uiTabPaths->tabPiece), icon);
|
||||
}
|
||||
|
||||
uiTabPaths->comboBoxNodes->setEnabled(flagFormulaBefore && flagFormulaAfter);
|
||||
|
||||
if (uiTabPassmarks->comboBoxPassmarks->count() == 0)
|
||||
|
@ -620,6 +640,30 @@ void DialogSeamAllowance::NameDetailChanged()
|
|||
CheckState();
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void DialogSeamAllowance::DetailUUIDChanged()
|
||||
{
|
||||
QLineEdit* edit = qobject_cast<QLineEdit*>(sender());
|
||||
if (edit)
|
||||
{
|
||||
QRegularExpression re("^$|^{[0-9a-fA-F]{8}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-"
|
||||
"[0-9a-fA-F]{12}}$");
|
||||
QRegularExpressionMatch match = re.match(edit->text());
|
||||
|
||||
if (match.hasMatch())
|
||||
{
|
||||
flagUUID = true;
|
||||
ChangeColor(uiTabPaths->labelEditUUID, OkColor(this));
|
||||
}
|
||||
else
|
||||
{
|
||||
flagUUID = false;
|
||||
ChangeColor(uiTabPaths->labelEditUUID, errorColor);
|
||||
}
|
||||
}
|
||||
CheckState();
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void DialogSeamAllowance::ShowMainPathContextMenu(const QPoint &pos)
|
||||
{
|
||||
|
@ -2454,6 +2498,7 @@ VPiece DialogSeamAllowance::CreatePiece() const
|
|||
piece.SetSeamAllowanceBuiltIn(uiTabPaths->checkBoxBuiltIn->isChecked());
|
||||
piece.SetHideMainPath(uiTabPaths->checkBoxHideMainPath->isChecked());
|
||||
piece.SetName(uiTabPaths->lineEditName->text());
|
||||
piece.SetUUID(uiTabPaths->lineEditUUID->text());
|
||||
piece.SetPriority(static_cast<uint>(uiTabPaths->spinBoxPriority->value()));
|
||||
piece.SetFormulaSAWidth(GetFormulaFromUser(uiTabPaths->plainTextEditFormulaWidth), m_saWidth);
|
||||
piece.GetPatternPieceData().SetLetter(uiTabLabels->lineEditLetter->text());
|
||||
|
@ -2831,6 +2876,29 @@ void DialogSeamAllowance::InitFancyTabBar()
|
|||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void DialogSeamAllowance::InitMainPathTab()
|
||||
{
|
||||
uiTabPaths->checkBoxHideMainPath->setChecked(qApp->Settings()->IsHideMainPath());
|
||||
|
||||
uiTabPaths->listWidgetMainPath->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
connect(uiTabPaths->listWidgetMainPath, &QListWidget::customContextMenuRequested, this,
|
||||
&DialogSeamAllowance::ShowMainPathContextMenu);
|
||||
connect(uiTabPaths->listWidgetMainPath->model(), &QAbstractItemModel::rowsMoved, this,
|
||||
&DialogSeamAllowance::ListChanged);
|
||||
connect(uiTabPaths->listWidgetMainPath, &QListWidget::itemSelectionChanged, this,
|
||||
&DialogSeamAllowance::SetMoveControls);
|
||||
|
||||
connect(uiTabPaths->toolButtonTop, &QToolButton::clicked, this,
|
||||
[this](){MoveListRowTop(uiTabPaths->listWidgetMainPath);});
|
||||
connect(uiTabPaths->toolButtonUp, &QToolButton::clicked, this,
|
||||
[this](){MoveListRowUp(uiTabPaths->listWidgetMainPath);});
|
||||
connect(uiTabPaths->toolButtonDown, &QToolButton::clicked, this,
|
||||
[this](){MoveListRowDown(uiTabPaths->listWidgetMainPath);});
|
||||
connect(uiTabPaths->toolButtonBottom, &QToolButton::clicked, this,
|
||||
[this](){MoveListRowBottom(uiTabPaths->listWidgetMainPath);});
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
void DialogSeamAllowance::InitPieceTab()
|
||||
{
|
||||
connect(uiTabPaths->lineEditName, &QLineEdit::textChanged, this, &DialogSeamAllowance::NameDetailChanged);
|
||||
|
||||
|
@ -2855,24 +2923,8 @@ void DialogSeamAllowance::InitMainPathTab()
|
|||
|
||||
uiTabPaths->checkBoxForbidFlipping->setChecked(qApp->Settings()->GetForbidWorkpieceFlipping());
|
||||
uiTabPaths->checkBoxForceFlipping->setChecked(qApp->Settings()->GetForceWorkpieceFlipping());
|
||||
uiTabPaths->checkBoxHideMainPath->setChecked(qApp->Settings()->IsHideMainPath());
|
||||
|
||||
uiTabPaths->listWidgetMainPath->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
connect(uiTabPaths->listWidgetMainPath, &QListWidget::customContextMenuRequested, this,
|
||||
&DialogSeamAllowance::ShowMainPathContextMenu);
|
||||
connect(uiTabPaths->listWidgetMainPath->model(), &QAbstractItemModel::rowsMoved, this,
|
||||
&DialogSeamAllowance::ListChanged);
|
||||
connect(uiTabPaths->listWidgetMainPath, &QListWidget::itemSelectionChanged, this,
|
||||
&DialogSeamAllowance::SetMoveControls);
|
||||
|
||||
connect(uiTabPaths->toolButtonTop, &QToolButton::clicked, this,
|
||||
[this](){MoveListRowTop(uiTabPaths->listWidgetMainPath);});
|
||||
connect(uiTabPaths->toolButtonUp, &QToolButton::clicked, this,
|
||||
[this](){MoveListRowUp(uiTabPaths->listWidgetMainPath);});
|
||||
connect(uiTabPaths->toolButtonDown, &QToolButton::clicked, this,
|
||||
[this](){MoveListRowDown(uiTabPaths->listWidgetMainPath);});
|
||||
connect(uiTabPaths->toolButtonBottom, &QToolButton::clicked, this,
|
||||
[this](){MoveListRowBottom(uiTabPaths->listWidgetMainPath);});
|
||||
connect(uiTabPaths->lineEditUUID, &QLineEdit::textChanged, this, &DialogSeamAllowance::DetailUUIDChanged);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------------------
|
||||
|
|
|
@ -85,6 +85,7 @@ protected:
|
|||
|
||||
private slots:
|
||||
void NameDetailChanged();
|
||||
void DetailUUIDChanged();
|
||||
void ShowMainPathContextMenu(const QPoint &pos);
|
||||
void ShowCustomSAContextMenu(const QPoint &pos);
|
||||
void ShowInternalPathsContextMenu(const QPoint &pos);
|
||||
|
@ -192,6 +193,7 @@ private:
|
|||
bool flagFormulaPassmarkLength{true};
|
||||
bool flagMainPathIsValid;
|
||||
bool flagName;
|
||||
bool flagUUID;
|
||||
bool flagFormula;
|
||||
bool m_bAddMode;
|
||||
|
||||
|
@ -247,6 +249,7 @@ private:
|
|||
|
||||
void InitFancyTabBar();
|
||||
void InitMainPathTab();
|
||||
void InitPieceTab();
|
||||
void InitSeamAllowanceTab();
|
||||
void InitNodesList();
|
||||
void InitPassmarksList();
|
||||
|
@ -292,7 +295,7 @@ private:
|
|||
//---------------------------------------------------------------------------------------------------------------------
|
||||
inline bool DialogSeamAllowance::IsValid() const
|
||||
{
|
||||
return flagName && flagMainPathIsValid && flagFormula && flagFormulaBefore && flagFormulaAfter
|
||||
return flagName && flagUUID && flagMainPathIsValid && flagFormula && flagFormulaBefore && flagFormulaAfter
|
||||
&& (flagGFormulas || flagGPin) && flagDLAngle && (flagDLFormulas || flagDPin) && flagPLAngle
|
||||
&& (flagPLFormulas || flagPPin) && flagFormulaPassmarkLength;
|
||||
}
|
||||
|
|
|
@ -6,8 +6,8 @@
|
|||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>426</width>
|
||||
<height>637</height>
|
||||
<width>422</width>
|
||||
<height>624</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
|
@ -28,8 +28,8 @@
|
|||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>406</width>
|
||||
<height>617</height>
|
||||
<width>402</width>
|
||||
<height>604</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
|
@ -73,64 +73,6 @@
|
|||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QFormLayout" name="formLayout">
|
||||
<property name="fieldGrowthPolicy">
|
||||
<enum>QFormLayout::ExpandingFieldsGrow</enum>
|
||||
</property>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="labelEditName">
|
||||
<property name="text">
|
||||
<string>Name of detail:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="VLineEdit" name="lineEditName">
|
||||
<property name="text">
|
||||
<string>Detail</string>
|
||||
</property>
|
||||
<property name="placeholderText">
|
||||
<string>Name can't be empty</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>Priority:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QSpinBox" name="spinBoxPriority">
|
||||
<property name="toolTip">
|
||||
<string>Controls priority in layout. 0 - no priority.</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="checkBoxForbidFlipping">
|
||||
<property name="toolTip">
|
||||
<string>Forbid piece be mirrored in a layout.</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Forbid flipping</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="checkBoxForceFlipping">
|
||||
<property name="toolTip">
|
||||
<string>Force piece to be always flipped in a layout.</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Force flipping</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="checkBoxHideMainPath">
|
||||
<property name="toolTip">
|
||||
|
@ -248,6 +190,101 @@
|
|||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="tabPiece">
|
||||
<attribute name="title">
|
||||
<string>Piece</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_9">
|
||||
<item>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="labelEditUUID">
|
||||
<property name="text">
|
||||
<string notr="true">UUID:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>Priority:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="labelEditName">
|
||||
<property name="text">
|
||||
<string>Name of detail:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QSpinBox" name="spinBoxPriority">
|
||||
<property name="toolTip">
|
||||
<string>Controls priority in layout. 0 - no priority.</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="VLineEdit" name="lineEditName">
|
||||
<property name="text">
|
||||
<string>Detail</string>
|
||||
</property>
|
||||
<property name="placeholderText">
|
||||
<string>Name can't be empty</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QLineEdit" name="lineEditUUID">
|
||||
<property name="toolTip">
|
||||
<string>Universally Unique IDentifier of piece. Used to identifier piece while updating manual layout. Left empty to generate new value.</string>
|
||||
</property>
|
||||
<property name="placeholderText">
|
||||
<string>{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}</string>
|
||||
</property>
|
||||
<property name="clearButtonEnabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="checkBoxForbidFlipping">
|
||||
<property name="toolTip">
|
||||
<string>Forbid piece be mirrored in a layout.</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Forbid flipping</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="checkBoxForceFlipping">
|
||||
<property name="toolTip">
|
||||
<string>Force piece to be always flipped in a layout.</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Force flipping</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="tabSeamAllowance">
|
||||
<attribute name="title">
|
||||
<string>Seam allowance</string>
|
||||
|
|
|
@ -64,6 +64,7 @@
|
|||
#include <QMenu>
|
||||
#include <QMessageBox>
|
||||
#include <QTimer>
|
||||
#include <QUuid>
|
||||
|
||||
// Current version of seam allowance tag need for backward compatibility
|
||||
const quint8 VToolSeamAllowance::pieceVersion = 2;
|
||||
|
@ -270,6 +271,7 @@ void VToolSeamAllowance::AddAttributes(VAbstractPattern *doc, QDomElement &domEl
|
|||
|
||||
doc->SetAttribute(domElement, VDomDocument::AttrId, id);
|
||||
doc->SetAttribute(domElement, AttrName, piece.GetName());
|
||||
doc->SetAttribute(domElement, AttrUUID, piece.GetUUID().toString());
|
||||
doc->SetAttribute(domElement, AttrVersion, QString().setNum(pieceVersion));
|
||||
doc->SetAttribute(domElement, AttrMx, qApp->fromPixel(piece.GetMx()));
|
||||
doc->SetAttribute(domElement, AttrMy, qApp->fromPixel(piece.GetMy()));
|
||||
|
|
Loading…
Reference in New Issue
Block a user