Merge
--HG-- branch : develop
This commit is contained in:
commit
35ddb14011
16
README.txt
16
README.txt
|
@ -4,7 +4,7 @@ Valentina Web page: http://www.valentina-project.org/
|
||||||
Valentina user manual https://bitbucket.org/dismine/valentina/wiki/manual/Content
|
Valentina user manual https://bitbucket.org/dismine/valentina/wiki/manual/Content
|
||||||
Valentina main repository: https://bitbucket.org/dismine/valentina/overview
|
Valentina main repository: https://bitbucket.org/dismine/valentina/overview
|
||||||
Valentina mail list (forum) https://groups.google.com/forum/#!forum/valentina-project-list
|
Valentina mail list (forum) https://groups.google.com/forum/#!forum/valentina-project-list
|
||||||
PPA for Ubuntu 14.04(develop): https://launchpad.net/~dismine/+archive/valentina-dev
|
PPA for Ubuntu (develop): https://launchpad.net/~dismine/+archive/valentina-dev
|
||||||
Help translate https://www.transifex.com/organization/valentina
|
Help translate https://www.transifex.com/organization/valentina
|
||||||
|
|
||||||
Valentina
|
Valentina
|
||||||
|
@ -27,7 +27,7 @@ Building the sources requires Qt 5.2.1 or later.
|
||||||
Compiling Valentina
|
Compiling Valentina
|
||||||
====================
|
====================
|
||||||
Prerequisites:
|
Prerequisites:
|
||||||
* Qt 5.0.2 or later (On Unix development packages needed)
|
* Qt 5.2.1 or later (On Unix development packages needed)
|
||||||
* mercurial
|
* mercurial
|
||||||
* On Unix:
|
* On Unix:
|
||||||
- ccache
|
- ccache
|
||||||
|
@ -45,7 +45,7 @@ The installed toolchains have to match the one Qt was compiled with.
|
||||||
You can build Valentina with
|
You can build Valentina with
|
||||||
|
|
||||||
cd $SOURCE_DIRECTORY
|
cd $SOURCE_DIRECTORY
|
||||||
qmake -r
|
qmake Valentina.pro -r (or qmake-qt5, depending on your platform)
|
||||||
make (or mingw32-make or nmake or jom, depending on your platform)
|
make (or mingw32-make or nmake or jom, depending on your platform)
|
||||||
|
|
||||||
Note:In order to build and use Valentina, the PATH environment variable
|
Note:In order to build and use Valentina, the PATH environment variable
|
||||||
|
@ -61,6 +61,14 @@ You may also need to ensure that the locations of your compiler and
|
||||||
other build tools are listed in the PATH variable. This will depend on
|
other build tools are listed in the PATH variable. This will depend on
|
||||||
your choice of software development environment.
|
your choice of software development environment.
|
||||||
|
|
||||||
|
Unix systems:
|
||||||
|
Default prefix for command "make install" is /usr. For using another
|
||||||
|
prefix build with qmake command:
|
||||||
|
|
||||||
|
qmake PREFIX=/usr/local Valentina.pro -r
|
||||||
|
|
||||||
|
where /usr/local is a new prefix for installation.
|
||||||
|
|
||||||
LICENSING
|
LICENSING
|
||||||
==========
|
==========
|
||||||
Valentina is free software: you can redistribute it and/or modify
|
Valentina is free software: you can redistribute it and/or modify
|
||||||
|
@ -73,4 +81,4 @@ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
See LICENSE file for further information
|
See LICENSE file for further information
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
include(Valentina.pri)
|
include(Valentina.pri)
|
||||||
|
|
||||||
#Check if Qt version >= 5.0.2
|
#Check if Qt version >= 5.2.1
|
||||||
!minQtVersion(5, 0, 2) {
|
!minQtVersion(5, 2, 1) {
|
||||||
message("Cannot build Valentina with Qt version $${QT_VERSION}.")
|
message("Cannot build Valentina with Qt version $${QT_VERSION}.")
|
||||||
error("Use at least Qt 5.0.2.")
|
error("Use at least Qt 5.2.1.")
|
||||||
}
|
}
|
||||||
|
|
||||||
TEMPLATE = subdirs
|
TEMPLATE = subdirs
|
||||||
|
|
12
dist/debian/control
vendored
12
dist/debian/control
vendored
|
@ -3,20 +3,20 @@ Section: graphics
|
||||||
Priority: optional
|
Priority: optional
|
||||||
Maintainer: Roman Telezhynskyi <dismine@gmail.com>
|
Maintainer: Roman Telezhynskyi <dismine@gmail.com>
|
||||||
Build-Depends: debhelper (>= 8.0.0),
|
Build-Depends: debhelper (>= 8.0.0),
|
||||||
qtbase5-dev (>= 5.0.2),
|
qtbase5-dev (>= 5.2.1),
|
||||||
libqt5svg5-dev (>= 5.0.2),
|
libqt5svg5-dev (>= 5.2.1),
|
||||||
ccache,
|
ccache,
|
||||||
g++ (>= 4.6.0),
|
g++ (>= 4.6.0),
|
||||||
qt5-default (>= 5.0.2),
|
qt5-default (>= 5.2.1),
|
||||||
qttools5-dev-tools (>= 5.0.2),
|
qttools5-dev-tools (>= 5.2.1),
|
||||||
libqt5xmlpatterns5-dev (>= 5.0.2)
|
libqt5xmlpatterns5-dev (>= 5.2.1)
|
||||||
Standards-Version: 3.9.5
|
Standards-Version: 3.9.5
|
||||||
Homepage: http://www.valentina-project.org/
|
Homepage: http://www.valentina-project.org/
|
||||||
Vcs-Browser: https://bitbucket.org/dismine/valentina
|
Vcs-Browser: https://bitbucket.org/dismine/valentina
|
||||||
|
|
||||||
Package: valentina
|
Package: valentina
|
||||||
Architecture: i386 amd64
|
Architecture: i386 amd64
|
||||||
Depends: libc6 (>= 2.4), libgcc1 (>= 1:4.1.1), libqt5core5a (>= 5.0.2), libqt5gui5 (>= 5.0.2) | libqt5gui5-gles (>= 5.0.2), libqt5printsupport5 (>= 5.0.2), libqt5svg5 (>= 5.0.2), libqt5widgets5 (>= 5.0.2), libqt5xml5 (>= 5.0.2), libqt5xmlpatterns5 (>= 5.0.2), libstdc++6 (>= 4.6), xpdf
|
Depends: libc6 (>= 2.4), libgcc1 (>= 1:4.1.1), libqt5core5a (>= 5.2.0), libqt5gui5 (>= 5.2.0) | libqt5gui5-gles (>= 5.2.0), libqt5printsupport5 (>= 5.2.0), libqt5svg5 (>= 5.2.0), libqt5widgets5 (>= 5.2.0), libqt5xml5 (>= 5.2.0), libqt5xmlpatterns5 (>= 5.2.0), libstdc++6 (>= 4.6), xpdf
|
||||||
Description: Pattern making program.
|
Description: Pattern making program.
|
||||||
Valentina is a cross-platform patternmaking program which allows designers
|
Valentina is a cross-platform patternmaking program which allows designers
|
||||||
to create and model patterns of clothing. This software allows pattern
|
to create and model patterns of clothing. This software allows pattern
|
||||||
|
|
10
dist/debian/rules
vendored
10
dist/debian/rules
vendored
|
@ -4,6 +4,14 @@
|
||||||
#export DH_VERBOSE=1
|
#export DH_VERBOSE=1
|
||||||
|
|
||||||
APPNAME := Valentina
|
APPNAME := Valentina
|
||||||
|
|
||||||
|
DEB_HOST_ARCH := $(shell dpkg-architecture -qDEB_HOST_ARCH)
|
||||||
|
ifeq ($(DEB_HOST_ARCH),amd64)
|
||||||
|
LIBPATH:= /debian/tmp/usr/lib64
|
||||||
|
else
|
||||||
|
LIBPATH:= /debian/tmp/usr/lib
|
||||||
|
endif
|
||||||
|
|
||||||
builddir:
|
builddir:
|
||||||
mkdir -p builddir
|
mkdir -p builddir
|
||||||
|
|
||||||
|
@ -48,7 +56,7 @@
|
||||||
dh_fixperms
|
dh_fixperms
|
||||||
dh_makeshlibs
|
dh_makeshlibs
|
||||||
dh_installdeb
|
dh_installdeb
|
||||||
dh_shlibdeps -Llibqmuparser2 -l$(CURDIR)/debian/tmp/usr/lib -Llibvpropertyexplorer -l$(CURDIR)/debian/tmp/usr/lib
|
dh_shlibdeps -Llibqmuparser2 -l$(CURDIR)$(LIBPATH) -Llibvpropertyexplorer -l$(CURDIR)$(LIBPATH)
|
||||||
dh_shlibdeps
|
dh_shlibdeps
|
||||||
dh_gencontrol
|
dh_gencontrol
|
||||||
dh_md5sums
|
dh_md5sums
|
||||||
|
|
2
dist/debian/valentina.install
vendored
2
dist/debian/valentina.install
vendored
|
@ -1,5 +1,5 @@
|
||||||
usr/bin/*
|
usr/bin/*
|
||||||
usr/lib/lib*
|
usr/lib*
|
||||||
usr/share/valentina/translations/*
|
usr/share/valentina/translations/*
|
||||||
usr/share/valentina/tables/standard/*
|
usr/share/valentina/tables/standard/*
|
||||||
usr/share/pixmaps/*
|
usr/share/pixmaps/*
|
||||||
|
|
|
@ -144,7 +144,6 @@ CONFIG(debug, debug|release){
|
||||||
DEFINES += "LOC_REV=0"
|
DEFINES += "LOC_REV=0"
|
||||||
}else{
|
}else{
|
||||||
# Release mode
|
# Release mode
|
||||||
DEFINES += QT_NO_DEBUG_OUTPUT
|
|
||||||
|
|
||||||
!unix:*-g++{
|
!unix:*-g++{
|
||||||
QMAKE_CXXFLAGS += -fno-omit-frame-pointer # Need for exchndl.dll
|
QMAKE_CXXFLAGS += -fno-omit-frame-pointer # Need for exchndl.dll
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#include <QSettings>
|
#include <QSettings>
|
||||||
#include "../core/vapplication.h"
|
#include "../core/vapplication.h"
|
||||||
#include "vcontainer.h"
|
#include "vcontainer.h"
|
||||||
|
#include "../core/vsettings.h"
|
||||||
|
|
||||||
using namespace qmu;
|
using namespace qmu;
|
||||||
|
|
||||||
|
@ -52,6 +53,7 @@ using namespace qmu;
|
||||||
Calculator::Calculator(const VContainer *data)
|
Calculator::Calculator(const VContainer *data)
|
||||||
:QmuParser(), vVarVal(nullptr), data(data)
|
:QmuParser(), vVarVal(nullptr), data(data)
|
||||||
{
|
{
|
||||||
|
SCASSERT(data != nullptr)
|
||||||
InitCharacterSets();
|
InitCharacterSets();
|
||||||
setAllowSubexpressions(false);//Only one expression per time
|
setAllowSubexpressions(false);//Only one expression per time
|
||||||
|
|
||||||
|
@ -88,6 +90,7 @@ Calculator::Calculator(const QString &formula, bool fromUser)
|
||||||
Eval();
|
Eval();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
Calculator::~Calculator()
|
Calculator::~Calculator()
|
||||||
{
|
{
|
||||||
delete [] vVarVal;
|
delete [] vVarVal;
|
||||||
|
@ -112,7 +115,7 @@ qreal Calculator::EvalFormula(const QString &formula)
|
||||||
QMap<int, QString> tokens = this->GetTokens();
|
QMap<int, QString> tokens = this->GetTokens();
|
||||||
|
|
||||||
// Remove "-" from tokens list if exist. If don't do that unary minus operation will broken.
|
// Remove "-" from tokens list if exist. If don't do that unary minus operation will broken.
|
||||||
RemoveAll(tokens, "-");
|
RemoveAll(tokens, QStringLiteral("-"));
|
||||||
|
|
||||||
if (tokens.isEmpty())
|
if (tokens.isEmpty())
|
||||||
{
|
{
|
||||||
|
@ -132,6 +135,7 @@ void Calculator::InitVariables(const VContainer *data, const QMap<int, QString>
|
||||||
vVarVal = new qreal[2];
|
vVarVal = new qreal[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SCASSERT(data != nullptr)
|
||||||
const QHash<QString, QSharedPointer<VInternalVariable> > *vars = data->DataVariables();
|
const QHash<QString, QSharedPointer<VInternalVariable> > *vars = data->DataVariables();
|
||||||
|
|
||||||
QMap<int, QString>::const_iterator i = tokens.constBegin();
|
QMap<int, QString>::const_iterator i = tokens.constBegin();
|
||||||
|
@ -225,7 +229,7 @@ void Calculator::SetSepForTr(bool fromUser)
|
||||||
{
|
{
|
||||||
if (fromUser)
|
if (fromUser)
|
||||||
{
|
{
|
||||||
bool osSeparatorValue = qApp->getSettings()->value("configuration/osSeparator", 1).toBool();
|
const bool osSeparatorValue = qApp->getSettings()->GetOsSeparator();
|
||||||
|
|
||||||
if (osSeparatorValue)
|
if (osSeparatorValue)
|
||||||
{
|
{
|
||||||
|
|
|
@ -68,7 +68,7 @@ private:
|
||||||
static qreal* AddVariable(const QString &a_szName, void *a_pUserData);
|
static qreal* AddVariable(const QString &a_szName, void *a_pUserData);
|
||||||
void SetSepForEval();
|
void SetSepForEval();
|
||||||
void SetSepForTr(bool fromUser);
|
void SetSepForTr(bool fromUser);
|
||||||
void RemoveAll(QMap<int, QString> &map, const QString &val);
|
static void RemoveAll(QMap<int, QString> &map, const QString &val);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // CALCULATOR_H
|
#endif // CALCULATOR_H
|
||||||
|
|
|
@ -1,35 +1,35 @@
|
||||||
SOURCES += \
|
SOURCES += \
|
||||||
container/vcontainer.cpp \
|
container/vcontainer.cpp \
|
||||||
container/calculator.cpp \
|
container/calculator.cpp \
|
||||||
container/vmeasurement.cpp \
|
container/variables/vmeasurement.cpp \
|
||||||
container/vincrement.cpp \
|
container/variables/vincrement.cpp \
|
||||||
container/vvariable.cpp \
|
container/variables/vvariable.cpp \
|
||||||
container/vinternalvariable.cpp \
|
container/variables/vinternalvariable.cpp \
|
||||||
container/vlineangle.cpp \
|
container/variables/vlineangle.cpp \
|
||||||
container/varclength.cpp \
|
container/variables/varclength.cpp \
|
||||||
container/vcurvelength.cpp \
|
container/variables/vcurvelength.cpp \
|
||||||
container/vlinelength.cpp \
|
container/variables/vlinelength.cpp \
|
||||||
container/vsplinelength.cpp \
|
container/variables/vsplinelength.cpp \
|
||||||
container/vformula.cpp
|
container/vformula.cpp
|
||||||
|
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
container/vcontainer.h \
|
container/vcontainer.h \
|
||||||
container/calculator.h \
|
container/calculator.h \
|
||||||
container/vmeasurement.h \
|
container/variables/vmeasurement.h \
|
||||||
container/vincrement.h \
|
container/variables/vincrement.h \
|
||||||
container/vvariable.h \
|
container/variables/vvariable.h \
|
||||||
container/vinternalvariable.h \
|
container/variables/vinternalvariable.h \
|
||||||
container/vlineangle.h \
|
container/variables/vlineangle.h \
|
||||||
container/variables.h \
|
container/variables.h \
|
||||||
container/vcurvelength.h \
|
container/variables/vcurvelength.h \
|
||||||
container/varclength.h \
|
container/variables/varclength.h \
|
||||||
container/vlinelength.h \
|
container/variables/vlinelength.h \
|
||||||
container/vsplinelength.h \
|
container/variables/vsplinelength.h \
|
||||||
container/vinternalvariable_p.h \
|
container/variables/vinternalvariable_p.h \
|
||||||
container/vvariable_p.h \
|
container/variables/vvariable_p.h \
|
||||||
container/vincrement_p.h \
|
container/variables/vincrement_p.h \
|
||||||
container/vcurvelength_p.h \
|
container/variables/vcurvelength_p.h \
|
||||||
container/vlineangle_p.h \
|
container/variables/vlineangle_p.h \
|
||||||
container/vlinelength_p.h \
|
container/variables/vlinelength_p.h \
|
||||||
container/vmeasurement_p.h \
|
container/variables/vmeasurement_p.h \
|
||||||
container/vformula.h
|
container/vformula.h
|
||||||
|
|
|
@ -29,12 +29,12 @@
|
||||||
#ifndef VARIABLES_H
|
#ifndef VARIABLES_H
|
||||||
#define VARIABLES_H
|
#define VARIABLES_H
|
||||||
|
|
||||||
#include "vinternalvariable.h"
|
#include "variables/vinternalvariable.h"
|
||||||
#include "vmeasurement.h"
|
#include "variables/vmeasurement.h"
|
||||||
#include "vincrement.h"
|
#include "variables/vincrement.h"
|
||||||
#include "varclength.h"
|
#include "variables/varclength.h"
|
||||||
#include "vsplinelength.h"
|
#include "variables/vsplinelength.h"
|
||||||
#include "vlinelength.h"
|
#include "variables/vlinelength.h"
|
||||||
#include "vlineangle.h"
|
#include "variables/vlineangle.h"
|
||||||
|
|
||||||
#endif // VARIABLES_H
|
#endif // VARIABLES_H
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#include "../container/calculator.h"
|
#include "../container/calculator.h"
|
||||||
#include "../container/vcontainer.h"
|
#include "../container/vcontainer.h"
|
||||||
#include "../core/vapplication.h"
|
#include "../core/vapplication.h"
|
||||||
|
#include "../core/vsettings.h"
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
|
||||||
//VFormula
|
//VFormula
|
||||||
|
@ -239,7 +240,7 @@ void VFormula::Eval()
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
QLocale loc;
|
QLocale loc;
|
||||||
if (qApp->getSettings()->value("configuration/osSeparator", 1).toBool())
|
if (qApp->getSettings()->GetOsSeparator())
|
||||||
{
|
{
|
||||||
loc = QLocale::system();
|
loc = QLocale::system();
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,12 +2,10 @@ HEADERS += \
|
||||||
core/vapplication.h \
|
core/vapplication.h \
|
||||||
core/vtranslation.h \
|
core/vtranslation.h \
|
||||||
core/undoevent.h \
|
core/undoevent.h \
|
||||||
core/qcommandlineoption.h \
|
core/vsettings.h
|
||||||
core/qcommandlineparser.h
|
|
||||||
|
|
||||||
SOURCES += \
|
SOURCES += \
|
||||||
core/vapplication.cpp \
|
core/vapplication.cpp \
|
||||||
core/vtranslation.cpp \
|
core/vtranslation.cpp \
|
||||||
core/undoevent.cpp \
|
core/undoevent.cpp \
|
||||||
core/qcommandlineoption.cpp \
|
core/vsettings.cpp
|
||||||
core/qcommandlineparser.cpp
|
|
||||||
|
|
|
@ -1,320 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2013 Laszlo Papp <lpapp@kde.org>
|
|
||||||
** Copyright (C) 2013 David Faure <faure@kde.org>
|
|
||||||
** Contact: http://www.qt-project.org/legal
|
|
||||||
**
|
|
||||||
** This file is part of the QtCore module of the Qt Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
** Commercial License Usage
|
|
||||||
** Licensees holding valid commercial Qt licenses may use this file in
|
|
||||||
** accordance with the commercial license agreement provided with the
|
|
||||||
** Software or, alternatively, in accordance with the terms contained in
|
|
||||||
** a written agreement between you and Digia. For licensing terms and
|
|
||||||
** conditions see http://qt.digia.com/licensing. For further information
|
|
||||||
** use the contact form at http://qt.digia.com/contact-us.
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** In addition, as a special exception, Digia gives you certain additional
|
|
||||||
** rights. These rights are described in the Digia Qt LGPL Exception
|
|
||||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
|
||||||
**
|
|
||||||
** GNU General Public License Usage
|
|
||||||
** Alternatively, this file may be used under the terms of the GNU
|
|
||||||
** General Public License version 3.0 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.GPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU General Public License version 3.0 requirements will be
|
|
||||||
** met: http://www.gnu.org/copyleft/gpl.html.
|
|
||||||
**
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include "qcommandlineoption.h"
|
|
||||||
|
|
||||||
#if QT_VERSION < QT_VERSION_CHECK(5, 2, 1)
|
|
||||||
|
|
||||||
#include <QSet>
|
|
||||||
|
|
||||||
#ifdef Q_CC_GNU
|
|
||||||
#pragma GCC diagnostic push
|
|
||||||
#pragma GCC diagnostic ignored "-Weffc++"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
class QCommandLineOptionPrivate : public QSharedData
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
inline QCommandLineOptionPrivate()
|
|
||||||
{ }
|
|
||||||
|
|
||||||
void setNames(const QStringList &nameList);
|
|
||||||
|
|
||||||
//! The list of names used for this option.
|
|
||||||
QStringList names;
|
|
||||||
|
|
||||||
//! The documentation name for the value, if one is expected
|
|
||||||
//! Example: "-o <file>" means valueName == "file"
|
|
||||||
QString valueName;
|
|
||||||
|
|
||||||
//! The description used for this option.
|
|
||||||
QString description;
|
|
||||||
|
|
||||||
//! The list of default values used for this option.
|
|
||||||
QStringList defaultValues;
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef Q_CC_GNU
|
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\since 5.2
|
|
||||||
\class QCommandLineOption
|
|
||||||
\brief The QCommandLineOption class defines a possible command-line option.
|
|
||||||
\inmodule QtCore
|
|
||||||
\ingroup shared
|
|
||||||
\ingroup tools
|
|
||||||
|
|
||||||
This class is used to describe an option on the command line. It allows
|
|
||||||
different ways of defining the same option with multiple aliases possible.
|
|
||||||
It is also used to describe how the option is used - it may be a flag (e.g. \c{-v})
|
|
||||||
or take an argument (e.g. \c{-o file}).
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
\snippet code/src_corelib_tools_qcommandlineoption.cpp 0
|
|
||||||
|
|
||||||
\sa QCommandLineParser
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Constructs a command line option object with the given arguments.
|
|
||||||
|
|
||||||
The name of the option is set to \a name.
|
|
||||||
The name can be either short or long. If the name is one character in
|
|
||||||
length, it is considered a short name. Option names must not be empty,
|
|
||||||
must not start with a dash or a slash character, must not contain a \c{=}
|
|
||||||
and cannot be repeated.
|
|
||||||
|
|
||||||
The description is set to \a description. It is customary to add a "."
|
|
||||||
at the end of the description.
|
|
||||||
|
|
||||||
In addition, the \a valueName can be set if the option expects a value.
|
|
||||||
The default value for the option is set to \a defaultValue.
|
|
||||||
|
|
||||||
\sa setDescription(), setValueName(), setDefaultValues()
|
|
||||||
*/
|
|
||||||
QCommandLineOption::QCommandLineOption(const QString &name, const QString &description,
|
|
||||||
const QString &valueName,
|
|
||||||
const QString &defaultValue)
|
|
||||||
: d(new QCommandLineOptionPrivate)
|
|
||||||
{
|
|
||||||
d->setNames(QStringList(name));
|
|
||||||
setValueName(valueName);
|
|
||||||
setDescription(description);
|
|
||||||
setDefaultValue(defaultValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Constructs a command line option object with the given arguments.
|
|
||||||
|
|
||||||
This overload allows to set multiple names for the option, for instance
|
|
||||||
\c{o} and \c{output}.
|
|
||||||
|
|
||||||
The names of the option are set to \a names.
|
|
||||||
The names can be either short or long. Any name in the list that is one
|
|
||||||
character in length is a short name. Option names must not be empty,
|
|
||||||
must not start with a dash or a slash character, must not contain a \c{=}
|
|
||||||
and cannot be repeated.
|
|
||||||
|
|
||||||
The description is set to \a description. It is customary to add a "."
|
|
||||||
at the end of the description.
|
|
||||||
|
|
||||||
In addition, the \a valueName can be set if the option expects a value.
|
|
||||||
The default value for the option is set to \a defaultValue.
|
|
||||||
|
|
||||||
\sa setDescription(), setValueName(), setDefaultValues()
|
|
||||||
*/
|
|
||||||
QCommandLineOption::QCommandLineOption(const QStringList &names, const QString &description,
|
|
||||||
const QString &valueName,
|
|
||||||
const QString &defaultValue)
|
|
||||||
: d(new QCommandLineOptionPrivate)
|
|
||||||
{
|
|
||||||
d->setNames(names);
|
|
||||||
setValueName(valueName);
|
|
||||||
setDescription(description);
|
|
||||||
setDefaultValue(defaultValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Constructs a QCommandLineOption object that is a copy of the QCommandLineOption
|
|
||||||
object \a other.
|
|
||||||
|
|
||||||
\sa operator=()
|
|
||||||
*/
|
|
||||||
QCommandLineOption::QCommandLineOption(const QCommandLineOption &other)
|
|
||||||
: d(other.d)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Destroys the command line option object.
|
|
||||||
*/
|
|
||||||
QCommandLineOption::~QCommandLineOption()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Makes a copy of the \a other object and assigns it to this QCommandLineOption
|
|
||||||
object.
|
|
||||||
*/
|
|
||||||
QCommandLineOption &QCommandLineOption::operator=(const QCommandLineOption &other)
|
|
||||||
{
|
|
||||||
d = other.d;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns the names set for this option.
|
|
||||||
*/
|
|
||||||
QStringList QCommandLineOption::names() const
|
|
||||||
{
|
|
||||||
return d->names;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QCommandLineOptionPrivate::setNames(const QStringList &nameList)
|
|
||||||
{
|
|
||||||
QStringList newNames;
|
|
||||||
newNames.reserve(nameList.size());
|
|
||||||
if (nameList.isEmpty())
|
|
||||||
qWarning("QCommandLineOption: Options must have at least one name");
|
|
||||||
Q_FOREACH (const QString &name, nameList) {
|
|
||||||
if (name.isEmpty()) {
|
|
||||||
qWarning("QCommandLineOption: Option names cannot be empty");
|
|
||||||
} else {
|
|
||||||
const QChar c = name.at(0);
|
|
||||||
if (c == QLatin1Char('-'))
|
|
||||||
qWarning("QCommandLineOption: Option names cannot start with a '-'");
|
|
||||||
else if (c == QLatin1Char('/'))
|
|
||||||
qWarning("QCommandLineOption: Option names cannot start with a '/'");
|
|
||||||
else if (name.contains(QLatin1Char('=')))
|
|
||||||
qWarning("QCommandLineOption: Option names cannot contain a '='");
|
|
||||||
else
|
|
||||||
newNames.append(name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// commit
|
|
||||||
names.swap(newNames);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Sets the name of the expected value, for the documentation, to \a valueName.
|
|
||||||
|
|
||||||
Options without a value assigned have a boolean-like behavior:
|
|
||||||
either the user specifies --option or they don't.
|
|
||||||
|
|
||||||
Options with a value assigned need to set a name for the expected value,
|
|
||||||
for the documentation of the option in the help output. An option with names \c{o} and \c{output},
|
|
||||||
and a value name of \c{file} will appear as \c{-o, --output <file>}.
|
|
||||||
|
|
||||||
Call QCommandLineParser::argument() if you expect the option to be present
|
|
||||||
only once, and QCommandLineParser::arguments() if you expect that option
|
|
||||||
to be present multiple times.
|
|
||||||
|
|
||||||
\sa valueName()
|
|
||||||
*/
|
|
||||||
void QCommandLineOption::setValueName(const QString &valueName)
|
|
||||||
{
|
|
||||||
d->valueName = valueName;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns the name of the expected value.
|
|
||||||
|
|
||||||
If empty, the option doesn't take a value.
|
|
||||||
|
|
||||||
\sa setValueName()
|
|
||||||
*/
|
|
||||||
QString QCommandLineOption::valueName() const
|
|
||||||
{
|
|
||||||
return d->valueName;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Sets the description used for this option to \a description.
|
|
||||||
|
|
||||||
It is customary to add a "." at the end of the description.
|
|
||||||
|
|
||||||
The description is used by QCommandLineParser::showHelp().
|
|
||||||
|
|
||||||
\sa description()
|
|
||||||
*/
|
|
||||||
void QCommandLineOption::setDescription(const QString &description)
|
|
||||||
{
|
|
||||||
d->description = description;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns the description set for this option.
|
|
||||||
|
|
||||||
\sa setDescription()
|
|
||||||
*/
|
|
||||||
QString QCommandLineOption::description() const
|
|
||||||
{
|
|
||||||
return d->description;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Sets the default value used for this option to \a defaultValue.
|
|
||||||
|
|
||||||
The default value is used if the user of the application does not specify
|
|
||||||
the option on the command line.
|
|
||||||
|
|
||||||
If \a defaultValue is empty, the option has no default values.
|
|
||||||
|
|
||||||
\sa defaultValues() setDefaultValues()
|
|
||||||
*/
|
|
||||||
void QCommandLineOption::setDefaultValue(const QString &defaultValue)
|
|
||||||
{
|
|
||||||
QStringList newDefaultValues;
|
|
||||||
if (!defaultValue.isEmpty()) {
|
|
||||||
newDefaultValues.reserve(1);
|
|
||||||
newDefaultValues << defaultValue;
|
|
||||||
}
|
|
||||||
// commit:
|
|
||||||
d->defaultValues.swap(newDefaultValues);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Sets the list of default values used for this option to \a defaultValues.
|
|
||||||
|
|
||||||
The default values are used if the user of the application does not specify
|
|
||||||
the option on the command line.
|
|
||||||
|
|
||||||
\sa defaultValues() setDefaultValue()
|
|
||||||
*/
|
|
||||||
void QCommandLineOption::setDefaultValues(const QStringList &defaultValues)
|
|
||||||
{
|
|
||||||
d->defaultValues = defaultValues;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns the default values set for this option.
|
|
||||||
|
|
||||||
\sa setDefaultValues()
|
|
||||||
*/
|
|
||||||
QStringList QCommandLineOption::defaultValues() const
|
|
||||||
{
|
|
||||||
return d->defaultValues;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif //QT_VERSION < QT_VERSION_CHECK(5, 2, 1)
|
|
|
@ -1,96 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2013 Laszlo Papp <lpapp@kde.org>
|
|
||||||
** Contact: http://www.qt-project.org/legal
|
|
||||||
**
|
|
||||||
** This file is part of the QtCore module of the Qt Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
** Commercial License Usage
|
|
||||||
** Licensees holding valid commercial Qt licenses may use this file in
|
|
||||||
** accordance with the commercial license agreement provided with the
|
|
||||||
** Software or, alternatively, in accordance with the terms contained in
|
|
||||||
** a written agreement between you and Digia. For licensing terms and
|
|
||||||
** conditions see http://qt.digia.com/licensing. For further information
|
|
||||||
** use the contact form at http://qt.digia.com/contact-us.
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** In addition, as a special exception, Digia gives you certain additional
|
|
||||||
** rights. These rights are described in the Digia Qt LGPL Exception
|
|
||||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
|
||||||
**
|
|
||||||
** GNU General Public License Usage
|
|
||||||
** Alternatively, this file may be used under the terms of the GNU
|
|
||||||
** General Public License version 3.0 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.GPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU General Public License version 3.0 requirements will be
|
|
||||||
** met: http://www.gnu.org/copyleft/gpl.html.
|
|
||||||
**
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QCOMMANDLINEOPTION_H
|
|
||||||
#define QCOMMANDLINEOPTION_H
|
|
||||||
|
|
||||||
#include <QtGlobal>
|
|
||||||
|
|
||||||
#if QT_VERSION < QT_VERSION_CHECK(5, 2, 1)
|
|
||||||
|
|
||||||
#include <QStringList>
|
|
||||||
#include <QSharedData>
|
|
||||||
|
|
||||||
#ifdef Q_CC_GNU
|
|
||||||
#pragma GCC diagnostic push
|
|
||||||
#pragma GCC diagnostic ignored "-Weffc++"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
class QCommandLineOptionPrivate;
|
|
||||||
|
|
||||||
class QCommandLineOption
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
explicit QCommandLineOption(const QString &name, const QString &description = QString(),
|
|
||||||
const QString &valueName = QString(),
|
|
||||||
const QString &defaultValue = QString());
|
|
||||||
explicit QCommandLineOption(const QStringList &names, const QString &description = QString(),
|
|
||||||
const QString &valueName = QString(),
|
|
||||||
const QString &defaultValue = QString());
|
|
||||||
QCommandLineOption(const QCommandLineOption &other);
|
|
||||||
|
|
||||||
~QCommandLineOption();
|
|
||||||
|
|
||||||
QCommandLineOption &operator=(const QCommandLineOption &other);
|
|
||||||
|
|
||||||
QStringList names() const;
|
|
||||||
|
|
||||||
void setValueName(const QString &name);
|
|
||||||
QString valueName() const;
|
|
||||||
|
|
||||||
void setDescription(const QString &description);
|
|
||||||
QString description() const;
|
|
||||||
|
|
||||||
void setDefaultValue(const QString &defaultValue);
|
|
||||||
void setDefaultValues(const QStringList &defaultValues);
|
|
||||||
QStringList defaultValues() const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
QSharedDataPointer<QCommandLineOptionPrivate> d;
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef Q_CC_GNU
|
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif //QT_VERSION < QT_VERSION_CHECK(5, 2, 1)
|
|
||||||
|
|
||||||
#endif // QCOMMANDLINEOPTION_H
|
|
|
@ -1,959 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2013 Laszlo Papp <lpapp@kde.org>
|
|
||||||
** Copyright (C) 2013 David Faure <faure@kde.org>
|
|
||||||
** Contact: http://www.qt-project.org/legal
|
|
||||||
**
|
|
||||||
** This file is part of the QtCore module of the Qt Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
** Commercial License Usage
|
|
||||||
** Licensees holding valid commercial Qt licenses may use this file in
|
|
||||||
** accordance with the commercial license agreement provided with the
|
|
||||||
** Software or, alternatively, in accordance with the terms contained in
|
|
||||||
** a written agreement between you and Digia. For licensing terms and
|
|
||||||
** conditions see http://qt.digia.com/licensing. For further information
|
|
||||||
** use the contact form at http://qt.digia.com/contact-us.
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** In addition, as a special exception, Digia gives you certain additional
|
|
||||||
** rights. These rights are described in the Digia Qt LGPL Exception
|
|
||||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
|
||||||
**
|
|
||||||
** GNU General Public License Usage
|
|
||||||
** Alternatively, this file may be used under the terms of the GNU
|
|
||||||
** General Public License version 3.0 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.GPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU General Public License version 3.0 requirements will be
|
|
||||||
** met: http://www.gnu.org/copyleft/gpl.html.
|
|
||||||
**
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include "qcommandlineparser.h"
|
|
||||||
|
|
||||||
#if QT_VERSION < QT_VERSION_CHECK(5, 2, 1)
|
|
||||||
|
|
||||||
#include <QCoreApplication>
|
|
||||||
#include <QHash>
|
|
||||||
#include <QVector>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
typedef QHash<QString, int> NameHash_t;
|
|
||||||
|
|
||||||
#ifdef Q_CC_GNU
|
|
||||||
#pragma GCC diagnostic push
|
|
||||||
#pragma GCC diagnostic ignored "-Weffc++"
|
|
||||||
#pragma GCC diagnostic ignored "-Wswitch-default"
|
|
||||||
#pragma GCC diagnostic ignored "-Wsuggest-attribute=noreturn"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
class QCommandLineParserPrivate
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
inline QCommandLineParserPrivate()
|
|
||||||
: singleDashWordOptionMode(QCommandLineParser::ParseAsCompactedShortOptions),
|
|
||||||
builtinVersionOption(false),
|
|
||||||
builtinHelpOption(false),
|
|
||||||
needsParsing(true)
|
|
||||||
{ }
|
|
||||||
|
|
||||||
bool parse(const QStringList &args);
|
|
||||||
void checkParsed(const char *method);
|
|
||||||
QStringList aliases(const QString &name) const;
|
|
||||||
QString helpText() const;
|
|
||||||
bool registerFoundOption(const QString &optionName);
|
|
||||||
bool parseOptionValue(const QString &optionName, const QString &argument,
|
|
||||||
QStringList::const_iterator *argumentIterator,
|
|
||||||
QStringList::const_iterator argsEnd);
|
|
||||||
|
|
||||||
//! Error text set when parse() returns false
|
|
||||||
QString errorText;
|
|
||||||
|
|
||||||
//! The command line options used for parsing
|
|
||||||
QList<QCommandLineOption> commandLineOptionList;
|
|
||||||
|
|
||||||
//! Hash mapping option names to their offsets in commandLineOptionList and optionArgumentList.
|
|
||||||
NameHash_t nameHash;
|
|
||||||
|
|
||||||
//! Option values found (only for options with a value)
|
|
||||||
QHash<int, QStringList> optionValuesHash;
|
|
||||||
|
|
||||||
//! Names of options found on the command line.
|
|
||||||
QStringList optionNames;
|
|
||||||
|
|
||||||
//! Arguments which did not belong to any option.
|
|
||||||
QStringList positionalArgumentList;
|
|
||||||
|
|
||||||
//! Names of options which were unknown.
|
|
||||||
QStringList unknownOptionNames;
|
|
||||||
|
|
||||||
//! Application description
|
|
||||||
QString description;
|
|
||||||
|
|
||||||
//! Documentation for positional arguments
|
|
||||||
struct PositionalArgumentDefinition
|
|
||||||
{
|
|
||||||
QString name;
|
|
||||||
QString description;
|
|
||||||
QString syntax;
|
|
||||||
};
|
|
||||||
QVector<PositionalArgumentDefinition> positionalArgumentDefinitions;
|
|
||||||
|
|
||||||
//! The parsing mode for "-abc"
|
|
||||||
QCommandLineParser::SingleDashWordOptionMode singleDashWordOptionMode;
|
|
||||||
|
|
||||||
//! Whether addVersionOption was called
|
|
||||||
bool builtinVersionOption;
|
|
||||||
|
|
||||||
//! Whether addHelpOption was called
|
|
||||||
bool builtinHelpOption;
|
|
||||||
|
|
||||||
//! True if parse() needs to be called
|
|
||||||
bool needsParsing;
|
|
||||||
};
|
|
||||||
|
|
||||||
QStringList QCommandLineParserPrivate::aliases(const QString &optionName) const
|
|
||||||
{
|
|
||||||
const NameHash_t::const_iterator it = nameHash.find(optionName);
|
|
||||||
if (it == nameHash.end()) {
|
|
||||||
qWarning("QCommandLineParser: option not defined: \"%s\"", qPrintable(optionName));
|
|
||||||
return QStringList();
|
|
||||||
}
|
|
||||||
return commandLineOptionList.at(*it).names();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\since 5.2
|
|
||||||
\class QCommandLineParser
|
|
||||||
\inmodule QtCore
|
|
||||||
\ingroup tools
|
|
||||||
|
|
||||||
\brief The QCommandLineParser class provides a means for handling the
|
|
||||||
command line options.
|
|
||||||
|
|
||||||
QCoreApplication provides the command-line arguments as a simple list of strings.
|
|
||||||
QCommandLineParser provides the ability to define a set of options, parse the
|
|
||||||
command-line arguments, and store which options have actually been used, as
|
|
||||||
well as option values.
|
|
||||||
|
|
||||||
Any argument that isn't an option (i.e. doesn't start with a \c{-}) is stored
|
|
||||||
as a "positional argument".
|
|
||||||
|
|
||||||
The parser handles short names, long names, more than one name for the same
|
|
||||||
option, and option values.
|
|
||||||
|
|
||||||
Options on the command line are recognized as starting with a single or
|
|
||||||
double \c{-} character(s).
|
|
||||||
The option \c{-} (single dash alone) is a special case, often meaning standard
|
|
||||||
input, and not treated as an option. The parser will treat everything after the
|
|
||||||
option \c{--} (double dash) as positional arguments.
|
|
||||||
|
|
||||||
Short options are single letters. The option \c{v} would be specified by
|
|
||||||
passing \c{-v} on the command line. In the default parsing mode, short options
|
|
||||||
can be written in a compact form, for instance \c{-abc} is equivalent to \c{-a -b -c}.
|
|
||||||
The parsing mode for can be set to ParseAsLongOptions, in which case \c{-abc}
|
|
||||||
will be parsed as the long option \c{abc}.
|
|
||||||
|
|
||||||
Long options are more than one letter long and cannot be compacted together.
|
|
||||||
The long option \c{verbose} would be passed as \c{--verbose} or \c{-verbose}.
|
|
||||||
|
|
||||||
Passing values to options can be done using the assignment operator: \c{-v=value}
|
|
||||||
\c{--verbose=value}, or a space: \c{-v value} \c{--verbose value}, i.e. the next
|
|
||||||
argument is used as value (even if it starts with a \c{-}).
|
|
||||||
|
|
||||||
The parser does not support optional values - if an option is set to
|
|
||||||
require a value, one must be present. If such an option is placed last
|
|
||||||
and has no value, the option will be treated as if it had not been
|
|
||||||
specified.
|
|
||||||
|
|
||||||
The parser does not automatically support negating or disabling long options
|
|
||||||
by using the format \c{--disable-option} or \c{--no-option}. However, it is
|
|
||||||
possible to handle this case explicitly by making an option with \c{no-option}
|
|
||||||
as one of its names, and handling the option explicitly.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
\snippet code/src_corelib_tools_qcommandlineparser_main.cpp 0
|
|
||||||
|
|
||||||
Known limitation: the parsing of Qt options inside QCoreApplication and subclasses
|
|
||||||
happens before QCommandLineParser exists, so it can't take it into account. This
|
|
||||||
means any option value that looks like a builtin Qt option, will be treated by
|
|
||||||
QCoreApplication as a builtin Qt option. Example: \c{--profile -reverse} will
|
|
||||||
lead to QGuiApplication seeing the -reverse option set, and removing it from
|
|
||||||
QCoreApplication::arguments() before QCommandLineParser defines the \c{profile}
|
|
||||||
option and parses the command line.
|
|
||||||
|
|
||||||
\sa QCommandLineOption, QCoreApplication
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Constructs a command line parser object.
|
|
||||||
*/
|
|
||||||
QCommandLineParser::QCommandLineParser()
|
|
||||||
: d(new QCommandLineParserPrivate)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Destroys the command line parser object.
|
|
||||||
*/
|
|
||||||
QCommandLineParser::~QCommandLineParser()
|
|
||||||
{
|
|
||||||
delete d;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\enum QCommandLineParser::SingleDashWordOptionMode
|
|
||||||
|
|
||||||
This enum describes the way the parser interprets command-line
|
|
||||||
options that use a single dash followed by multiple letters, as as \c{-abc}.
|
|
||||||
|
|
||||||
\value ParseAsCompactedShortOptions \c{-abc} is interpreted as \c{-a -b -c},
|
|
||||||
i.e. as three short options that have been compacted on the command-line,
|
|
||||||
if none of the options take a value. If \c{a} takes a value, then it
|
|
||||||
is interpreted as \c{-a bc}, i.e. the short option \c{a} followed by the value \c{bc}.
|
|
||||||
This is typically used in tools that behave like compilers, in order
|
|
||||||
to handle options such as \c{-DDEFINE=VALUE} or \c{-I/include/path}.
|
|
||||||
This is the default parsing mode. New applications are recommended to
|
|
||||||
use this mode.
|
|
||||||
|
|
||||||
\value ParseAsLongOptions \c{-abc} is interpreted as \c{--abc},
|
|
||||||
i.e. as the long option named \c{abc}. This is how Qt's own tools
|
|
||||||
(uic, rcc...) have always been parsing arguments. This mode should be
|
|
||||||
used for preserving compatibility in applications that were parsing
|
|
||||||
arguments in such a way.
|
|
||||||
|
|
||||||
\sa setSingleDashWordOptionMode()
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Sets the parsing mode to \a singleDashWordOptionMode.
|
|
||||||
This must be called before process() or parse().
|
|
||||||
*/
|
|
||||||
void QCommandLineParser::setSingleDashWordOptionMode(QCommandLineParser::SingleDashWordOptionMode singleDashWordOptionMode)
|
|
||||||
{
|
|
||||||
d->singleDashWordOptionMode = singleDashWordOptionMode;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Adds the option \a option to look for while parsing.
|
|
||||||
|
|
||||||
Returns \c true if adding the option was successful; otherwise returns \c false.
|
|
||||||
|
|
||||||
Adding the option fails if there is no name attached to the option, or
|
|
||||||
the option has a name that clashes with an option name added before.
|
|
||||||
*/
|
|
||||||
bool QCommandLineParser::addOption(const QCommandLineOption &option)
|
|
||||||
{
|
|
||||||
QStringList optionNames = option.names();
|
|
||||||
|
|
||||||
if (!optionNames.isEmpty()) {
|
|
||||||
Q_FOREACH (const QString &name, optionNames) {
|
|
||||||
if (d->nameHash.contains(name))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
d->commandLineOptionList.append(option);
|
|
||||||
|
|
||||||
const int offset = d->commandLineOptionList.size() - 1;
|
|
||||||
Q_FOREACH (const QString &name, optionNames)
|
|
||||||
d->nameHash.insert(name, offset);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Adds the \c{-v} / \c{--version} option, which displays the version string of the application.
|
|
||||||
|
|
||||||
This option is handled automatically by QCommandLineParser.
|
|
||||||
|
|
||||||
You can set the actual version string by using QCoreApplication::setApplicationVersion().
|
|
||||||
|
|
||||||
Returns the option instance, which can be used to call isSet().
|
|
||||||
*/
|
|
||||||
QCommandLineOption QCommandLineParser::addVersionOption()
|
|
||||||
{
|
|
||||||
QCommandLineOption opt(QStringList() << "v" << "version", tr("Displays version information."));
|
|
||||||
addOption(opt);
|
|
||||||
d->builtinVersionOption = true;
|
|
||||||
return opt;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Adds the help option (\c{-h}, \c{--help} and \c{-?} on Windows)
|
|
||||||
This option is handled automatically by QCommandLineParser.
|
|
||||||
|
|
||||||
Remember to use setApplicationDescription to set the application description,
|
|
||||||
which will be displayed when this option is used.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
\snippet code/src_corelib_tools_qcommandlineparser_main.cpp 0
|
|
||||||
|
|
||||||
Returns the option instance, which can be used to call isSet().
|
|
||||||
*/
|
|
||||||
QCommandLineOption QCommandLineParser::addHelpOption()
|
|
||||||
{
|
|
||||||
QCommandLineOption opt(QStringList()
|
|
||||||
#ifdef Q_OS_WIN
|
|
||||||
<< "?"
|
|
||||||
#endif
|
|
||||||
<< "h"
|
|
||||||
<< "help", tr("Displays this help."));
|
|
||||||
addOption(opt);
|
|
||||||
d->builtinHelpOption = true;
|
|
||||||
return opt;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Sets the application \a description shown by helpText().
|
|
||||||
*/
|
|
||||||
void QCommandLineParser::setApplicationDescription(const QString &description)
|
|
||||||
{
|
|
||||||
d->description = description;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns the application description set in setApplicationDescription().
|
|
||||||
*/
|
|
||||||
QString QCommandLineParser::applicationDescription() const
|
|
||||||
{
|
|
||||||
return d->description;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Defines an additional argument to the application, for the benefit of the help text.
|
|
||||||
|
|
||||||
The argument \a name and \a description will appear under the \c{Arguments:} section
|
|
||||||
of the help. If \a syntax is specified, it will be appended to the Usage line, otherwise
|
|
||||||
the \a name will be appended.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
\snippet code/src_corelib_tools_qcommandlineparser.cpp 2
|
|
||||||
|
|
||||||
\sa addHelpOption(), helpText()
|
|
||||||
*/
|
|
||||||
void QCommandLineParser::addPositionalArgument(const QString &name, const QString &description, const QString &syntax)
|
|
||||||
{
|
|
||||||
QCommandLineParserPrivate::PositionalArgumentDefinition arg;
|
|
||||||
arg.name = name;
|
|
||||||
arg.description = description;
|
|
||||||
arg.syntax = syntax.isEmpty() ? name : syntax;
|
|
||||||
d->positionalArgumentDefinitions.append(arg);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Clears the definitions of additional arguments from the help text.
|
|
||||||
|
|
||||||
This is only needed for the special case of tools which support multiple commands
|
|
||||||
with different options. Once the actual command has been identified, the options
|
|
||||||
for this command can be defined, and the help text for the command can be adjusted
|
|
||||||
accordingly.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
\snippet code/src_corelib_tools_qcommandlineparser.cpp 3
|
|
||||||
*/
|
|
||||||
void QCommandLineParser::clearPositionalArguments()
|
|
||||||
{
|
|
||||||
d->positionalArgumentDefinitions.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Parses the command line \a arguments.
|
|
||||||
|
|
||||||
Most programs don't need to call this, a simple call to process() is enough.
|
|
||||||
|
|
||||||
parse() is more low-level, and only does the parsing. The application will have to
|
|
||||||
take care of the error handling, using errorText() if parse() returns \c false.
|
|
||||||
This can be useful for instance to show a graphical error message in graphical programs.
|
|
||||||
|
|
||||||
Calling parse() instead of process() can also be useful in order to ignore unknown
|
|
||||||
options temporarily, because more option definitions will be provided later on
|
|
||||||
(depending on one of the arguments), before calling process().
|
|
||||||
|
|
||||||
Don't forget that \a arguments must start with the name of the executable (ignored, though).
|
|
||||||
|
|
||||||
Returns \c false in case of a parse error (unknown option or missing value); returns \c true otherwise.
|
|
||||||
|
|
||||||
\sa process()
|
|
||||||
*/
|
|
||||||
bool QCommandLineParser::parse(const QStringList &arguments)
|
|
||||||
{
|
|
||||||
return d->parse(arguments);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns a translated error text for the user.
|
|
||||||
This should only be called when parse() returns \c false.
|
|
||||||
*/
|
|
||||||
QString QCommandLineParser::errorText() const
|
|
||||||
{
|
|
||||||
if (!d->errorText.isEmpty())
|
|
||||||
return d->errorText;
|
|
||||||
if (d->unknownOptionNames.count() == 1)
|
|
||||||
return tr("Unknown option '%1'.").arg(d->unknownOptionNames.first());
|
|
||||||
if (d->unknownOptionNames.count() > 1)
|
|
||||||
return tr("Unknown options: %1.").arg(d->unknownOptionNames.join(", "));
|
|
||||||
return QString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Processes the command line \a arguments.
|
|
||||||
|
|
||||||
In addition to parsing the options (like parse()), this function also handles the builtin
|
|
||||||
options and handles errors.
|
|
||||||
|
|
||||||
The builtin options are \c{--version} if addVersionOption was called and \c{--help} if addHelpOption was called.
|
|
||||||
|
|
||||||
When invoking one of these options, or when an error happens (for instance an unknown option was
|
|
||||||
passed), the current process will then stop, using the exit() function.
|
|
||||||
|
|
||||||
\sa QCoreApplication::arguments(), parse()
|
|
||||||
*/
|
|
||||||
void QCommandLineParser::process(const QStringList &arguments)
|
|
||||||
{
|
|
||||||
if (!d->parse(arguments)) {
|
|
||||||
fprintf(stderr, "%s\n", qPrintable(errorText()));
|
|
||||||
::exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (d->builtinVersionOption && isSet("version")) {
|
|
||||||
printf("%s %s\n", qPrintable(QCoreApplication::applicationName()), qPrintable(QCoreApplication::applicationVersion()));
|
|
||||||
::exit(EXIT_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (d->builtinHelpOption && isSet("help"))
|
|
||||||
showHelp(EXIT_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\overload
|
|
||||||
|
|
||||||
The command line is obtained from the QCoreApplication instance \a app.
|
|
||||||
*/
|
|
||||||
void QCommandLineParser::process(const QCoreApplication &app)
|
|
||||||
{
|
|
||||||
// QCoreApplication::arguments() is static, but the app instance must exist so we require it as parameter
|
|
||||||
Q_UNUSED(app);
|
|
||||||
process(QCoreApplication::arguments());
|
|
||||||
}
|
|
||||||
|
|
||||||
void QCommandLineParserPrivate::checkParsed(const char *method)
|
|
||||||
{
|
|
||||||
if (needsParsing)
|
|
||||||
qWarning("QCommandLineParser: call process() or parse() before %s", method);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\internal
|
|
||||||
Looks up the option \a optionName (found on the command line) and register it as found.
|
|
||||||
Returns \c true on success.
|
|
||||||
*/
|
|
||||||
bool QCommandLineParserPrivate::registerFoundOption(const QString &optionName)
|
|
||||||
{
|
|
||||||
if (nameHash.contains(optionName)) {
|
|
||||||
optionNames.append(optionName);
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
unknownOptionNames.append(optionName);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\internal
|
|
||||||
\brief Parse the value for a given option, if it was defined to expect one.
|
|
||||||
|
|
||||||
The value is taken from the next argument, or after the equal sign in \a argument.
|
|
||||||
|
|
||||||
\param optionName the short option name
|
|
||||||
\param argument the argument from the command line currently parsed. Only used for -k=value parsing.
|
|
||||||
\param argumentIterator iterator to the currently parsed argument. Incremented if the next argument contains the value.
|
|
||||||
\param argsEnd args.end(), to check if ++argumentIterator goes out of bounds
|
|
||||||
Returns \c true on success.
|
|
||||||
*/
|
|
||||||
bool QCommandLineParserPrivate::parseOptionValue(const QString &optionName, const QString &argument,
|
|
||||||
QStringList::const_iterator *argumentIterator, QStringList::const_iterator argsEnd)
|
|
||||||
{
|
|
||||||
const QLatin1Char assignChar('=');
|
|
||||||
const NameHash_t::const_iterator nameHashIt = nameHash.constFind(optionName);
|
|
||||||
if (nameHashIt != nameHash.constEnd()) {
|
|
||||||
const int assignPos = argument.indexOf(assignChar);
|
|
||||||
const NameHash_t::mapped_type optionOffset = *nameHashIt;
|
|
||||||
const bool withValue = !commandLineOptionList.at(optionOffset).valueName().isEmpty();
|
|
||||||
if (withValue) {
|
|
||||||
if (assignPos == -1) {
|
|
||||||
++(*argumentIterator);
|
|
||||||
if (*argumentIterator == argsEnd) {
|
|
||||||
errorText = QCommandLineParser::tr("Missing value after '%1'.").arg(argument);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
optionValuesHash[optionOffset].append(*(*argumentIterator));
|
|
||||||
} else {
|
|
||||||
optionValuesHash[optionOffset].append(argument.mid(assignPos + 1));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (assignPos != -1) {
|
|
||||||
errorText = QCommandLineParser::tr("Unexpected value after '%1'.").arg(argument.left(assignPos));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\internal
|
|
||||||
|
|
||||||
Parse the list of arguments \a args, and fills in
|
|
||||||
optionNames, optionValuesHash, unknownOptionNames, positionalArguments, and errorText.
|
|
||||||
|
|
||||||
Any results from a previous parse operation are removed.
|
|
||||||
|
|
||||||
The parser will not look for further options once it encounters the option
|
|
||||||
\c{--}; this does not include when \c{--} follows an option that requires a value.
|
|
||||||
*/
|
|
||||||
bool QCommandLineParserPrivate::parse(const QStringList &args)
|
|
||||||
{
|
|
||||||
needsParsing = false;
|
|
||||||
bool error = false;
|
|
||||||
|
|
||||||
const QString doubleDashString("--");
|
|
||||||
const QLatin1Char dashChar('-');
|
|
||||||
const QLatin1Char assignChar('=');
|
|
||||||
|
|
||||||
bool doubleDashFound = false;
|
|
||||||
errorText.clear();
|
|
||||||
positionalArgumentList.clear();
|
|
||||||
optionNames.clear();
|
|
||||||
unknownOptionNames.clear();
|
|
||||||
optionValuesHash.clear();
|
|
||||||
|
|
||||||
if (args.isEmpty()) {
|
|
||||||
qWarning("QCommandLineParser: argument list cannot be empty, it should contain at least the executable name");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
QStringList::const_iterator argumentIterator = args.begin();
|
|
||||||
++argumentIterator; // skip executable name
|
|
||||||
|
|
||||||
for (; argumentIterator != args.end() ; ++argumentIterator) {
|
|
||||||
QString argument = *argumentIterator;
|
|
||||||
|
|
||||||
if (doubleDashFound) {
|
|
||||||
positionalArgumentList.append(argument);
|
|
||||||
} else if (argument.startsWith(doubleDashString)) {
|
|
||||||
if (argument.length() > 2) {
|
|
||||||
QString optionName = argument.mid(2).section(assignChar, 0, 0);
|
|
||||||
if (registerFoundOption(optionName)) {
|
|
||||||
if (!parseOptionValue(optionName, argument, &argumentIterator, args.end()))
|
|
||||||
error = true;
|
|
||||||
} else {
|
|
||||||
error = true;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
doubleDashFound = true;
|
|
||||||
}
|
|
||||||
} else if (argument.startsWith(dashChar)) {
|
|
||||||
if (argument.size() == 1) { // single dash ("stdin")
|
|
||||||
positionalArgumentList.append(argument);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
switch (singleDashWordOptionMode) {
|
|
||||||
case QCommandLineParser::ParseAsCompactedShortOptions:
|
|
||||||
{
|
|
||||||
QString optionName;
|
|
||||||
bool valueFound = false;
|
|
||||||
for (int pos = 1 ; pos < argument.size(); ++pos) {
|
|
||||||
optionName = argument.mid(pos, 1);
|
|
||||||
if (!registerFoundOption(optionName)) {
|
|
||||||
error = true;
|
|
||||||
} else {
|
|
||||||
const NameHash_t::const_iterator nameHashIt = nameHash.constFind(optionName);
|
|
||||||
Q_ASSERT(nameHashIt != nameHash.constEnd()); // checked by registerFoundOption
|
|
||||||
const NameHash_t::mapped_type optionOffset = *nameHashIt;
|
|
||||||
const bool withValue = !commandLineOptionList.at(optionOffset).valueName().isEmpty();
|
|
||||||
if (withValue) {
|
|
||||||
if (pos + 1 < argument.size()) {
|
|
||||||
if (argument.at(pos + 1) == assignChar)
|
|
||||||
++pos;
|
|
||||||
optionValuesHash[optionOffset].append(argument.mid(pos + 1));
|
|
||||||
valueFound = true;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (pos + 1 < argument.size() && argument.at(pos + 1) == assignChar)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!valueFound && !parseOptionValue(optionName, argument, &argumentIterator, args.end()))
|
|
||||||
error = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case QCommandLineParser::ParseAsLongOptions:
|
|
||||||
{
|
|
||||||
const QString optionName = argument.mid(1).section(assignChar, 0, 0);
|
|
||||||
if (registerFoundOption(optionName)) {
|
|
||||||
if (!parseOptionValue(optionName, argument, &argumentIterator, args.end()))
|
|
||||||
error = true;
|
|
||||||
} else {
|
|
||||||
error = true;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
positionalArgumentList.append(argument);
|
|
||||||
}
|
|
||||||
if (argumentIterator == args.end())
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return !error;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Checks whether the option \a name was passed to the application.
|
|
||||||
|
|
||||||
Returns \c true if the option \a name was set, false otherwise.
|
|
||||||
|
|
||||||
The name provided can be any long or short name of any option that was
|
|
||||||
added with \c addOption(). All the options names are treated as being
|
|
||||||
equivalent. If the name is not recognized or that option was not present,
|
|
||||||
false is returned.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
\snippet code/src_corelib_tools_qcommandlineparser.cpp 0
|
|
||||||
*/
|
|
||||||
|
|
||||||
bool QCommandLineParser::isSet(const QString &name) const
|
|
||||||
{
|
|
||||||
d->checkParsed("isSet");
|
|
||||||
if (d->optionNames.contains(name))
|
|
||||||
return true;
|
|
||||||
const QStringList aliases = d->aliases(name);
|
|
||||||
Q_FOREACH (const QString &optionName, d->optionNames) {
|
|
||||||
if (aliases.contains(optionName))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns the option value found for the given option name \a optionName, or
|
|
||||||
an empty string if not found.
|
|
||||||
|
|
||||||
The name provided can be any long or short name of any option that was
|
|
||||||
added with \c addOption(). All the option names are treated as being
|
|
||||||
equivalent. If the name is not recognized or that option was not present, an
|
|
||||||
empty string is returned.
|
|
||||||
|
|
||||||
For options found by the parser, the last value found for
|
|
||||||
that option is returned. If the option wasn't specified on the command line,
|
|
||||||
the default value is returned.
|
|
||||||
|
|
||||||
An empty string is returned if the option does not take a value.
|
|
||||||
|
|
||||||
\sa values(), QCommandLineOption::setDefaultValue(), QCommandLineOption::setDefaultValues()
|
|
||||||
*/
|
|
||||||
|
|
||||||
QString QCommandLineParser::value(const QString &optionName) const
|
|
||||||
{
|
|
||||||
d->checkParsed("value");
|
|
||||||
const QStringList valueList = values(optionName);
|
|
||||||
|
|
||||||
if (!valueList.isEmpty())
|
|
||||||
return valueList.last();
|
|
||||||
|
|
||||||
return QString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns a list of option values found for the given option name \a
|
|
||||||
optionName, or an empty list if not found.
|
|
||||||
|
|
||||||
The name provided can be any long or short name of any option that was
|
|
||||||
added with \c addOption(). All the options names are treated as being
|
|
||||||
equivalent. If the name is not recognized or that option was not present, an
|
|
||||||
empty list is returned.
|
|
||||||
|
|
||||||
For options found by the parser, the list will contain an entry for
|
|
||||||
each time the option was encountered by the parser. If the option wasn't
|
|
||||||
specified on the command line, the default values are returned.
|
|
||||||
|
|
||||||
An empty list is returned if the option does not take a value.
|
|
||||||
|
|
||||||
\sa value(), QCommandLineOption::setDefaultValue(), QCommandLineOption::setDefaultValues()
|
|
||||||
*/
|
|
||||||
|
|
||||||
QStringList QCommandLineParser::values(const QString &optionName) const
|
|
||||||
{
|
|
||||||
d->checkParsed("values");
|
|
||||||
const NameHash_t::const_iterator it = d->nameHash.constFind(optionName);
|
|
||||||
if (it != d->nameHash.constEnd()) {
|
|
||||||
const int optionOffset = *it;
|
|
||||||
QStringList values = d->optionValuesHash.value(optionOffset);
|
|
||||||
if (values.isEmpty())
|
|
||||||
values = d->commandLineOptionList.at(optionOffset).defaultValues();
|
|
||||||
return values;
|
|
||||||
}
|
|
||||||
|
|
||||||
qWarning("QCommandLineParser: option not defined: \"%s\"", qPrintable(optionName));
|
|
||||||
return QStringList();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\overload
|
|
||||||
Checks whether the \a option was passed to the application.
|
|
||||||
|
|
||||||
Returns \c true if the \a option was set, false otherwise.
|
|
||||||
|
|
||||||
This is the recommended way to check for options with no values.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
\snippet code/src_corelib_tools_qcommandlineparser.cpp 1
|
|
||||||
*/
|
|
||||||
bool QCommandLineParser::isSet(const QCommandLineOption &option) const
|
|
||||||
{
|
|
||||||
// option.names() might be empty if the constructor failed
|
|
||||||
return !option.names().isEmpty() && isSet(option.names().first());
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\overload
|
|
||||||
Returns the option value found for the given \a option, or
|
|
||||||
an empty string if not found.
|
|
||||||
|
|
||||||
For options found by the parser, the last value found for
|
|
||||||
that option is returned. If the option wasn't specified on the command line,
|
|
||||||
the default value is returned.
|
|
||||||
|
|
||||||
An empty string is returned if the option does not take a value.
|
|
||||||
|
|
||||||
\sa values(), QCommandLineOption::setDefaultValue(), QCommandLineOption::setDefaultValues()
|
|
||||||
*/
|
|
||||||
QString QCommandLineParser::value(const QCommandLineOption &option) const
|
|
||||||
{
|
|
||||||
return value(option.names().first());
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\overload
|
|
||||||
Returns a list of option values found for the given \a option,
|
|
||||||
or an empty list if not found.
|
|
||||||
|
|
||||||
For options found by the parser, the list will contain an entry for
|
|
||||||
each time the option was encountered by the parser. If the option wasn't
|
|
||||||
specified on the command line, the default values are returned.
|
|
||||||
|
|
||||||
An empty list is returned if the option does not take a value.
|
|
||||||
|
|
||||||
\sa value(), QCommandLineOption::setDefaultValue(), QCommandLineOption::setDefaultValues()
|
|
||||||
*/
|
|
||||||
QStringList QCommandLineParser::values(const QCommandLineOption &option) const
|
|
||||||
{
|
|
||||||
return values(option.names().first());
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns a list of positional arguments.
|
|
||||||
|
|
||||||
These are all of the arguments that were not recognized as part of an
|
|
||||||
option.
|
|
||||||
*/
|
|
||||||
|
|
||||||
QStringList QCommandLineParser::positionalArguments() const
|
|
||||||
{
|
|
||||||
d->checkParsed("positionalArguments");
|
|
||||||
return d->positionalArgumentList;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns a list of option names that were found.
|
|
||||||
|
|
||||||
This returns a list of all the recognized option names found by the
|
|
||||||
parser, in the order in which they were found. For any long options
|
|
||||||
that were in the form {--option=value}, the value part will have been
|
|
||||||
dropped.
|
|
||||||
|
|
||||||
The names in this list do not include the preceding dash characters.
|
|
||||||
Names may appear more than once in this list if they were encountered
|
|
||||||
more than once by the parser.
|
|
||||||
|
|
||||||
Any entry in the list can be used with \c value() or with
|
|
||||||
\c values() to get any relevant option values.
|
|
||||||
*/
|
|
||||||
|
|
||||||
QStringList QCommandLineParser::optionNames() const
|
|
||||||
{
|
|
||||||
d->checkParsed("optionNames");
|
|
||||||
return d->optionNames;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns a list of unknown option names.
|
|
||||||
|
|
||||||
This list will include both long an short name options that were not
|
|
||||||
recognized. For any long options that were in the form {--option=value},
|
|
||||||
the value part will have been dropped and only the long name is added.
|
|
||||||
|
|
||||||
The names in this list do not include the preceding dash characters.
|
|
||||||
Names may appear more than once in this list if they were encountered
|
|
||||||
more than once by the parser.
|
|
||||||
|
|
||||||
\sa optionNames()
|
|
||||||
*/
|
|
||||||
|
|
||||||
QStringList QCommandLineParser::unknownOptionNames() const
|
|
||||||
{
|
|
||||||
d->checkParsed("unknownOptionNames");
|
|
||||||
return d->unknownOptionNames;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Displays the help information, and exits the application.
|
|
||||||
This is automatically triggered by the --help option, but can also
|
|
||||||
be used to display the help when the user is not invoking the
|
|
||||||
application correctly.
|
|
||||||
The exit code is set to \a exitCode. It should be set to 0 if the
|
|
||||||
user requested to see the help, and to any other value in case of
|
|
||||||
an error.
|
|
||||||
|
|
||||||
\sa helpText()
|
|
||||||
*/
|
|
||||||
void QCommandLineParser::showHelp(int exitCode)
|
|
||||||
{
|
|
||||||
fprintf(stdout, "%s", qPrintable(d->helpText()));
|
|
||||||
::exit(exitCode);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns a string containing the complete help information.
|
|
||||||
|
|
||||||
\sa showHelp()
|
|
||||||
*/
|
|
||||||
QString QCommandLineParser::helpText() const
|
|
||||||
{
|
|
||||||
return d->helpText();
|
|
||||||
}
|
|
||||||
|
|
||||||
static QString wrapText(const QString &names, int longestOptionNameString, const QString &description)
|
|
||||||
{
|
|
||||||
const QLatin1Char nl('\n');
|
|
||||||
QString text = QString(" ") + names.leftJustified(longestOptionNameString) + QLatin1Char(' ');
|
|
||||||
const int indent = text.length();
|
|
||||||
int lineStart = 0;
|
|
||||||
int lastBreakable = -1;
|
|
||||||
const int max = 79 - indent;
|
|
||||||
int x = 0;
|
|
||||||
const int len = description.length();
|
|
||||||
|
|
||||||
for (int i = 0; i < len; ++i) {
|
|
||||||
++x;
|
|
||||||
const QChar c = description.at(i);
|
|
||||||
if (c.isSpace())
|
|
||||||
lastBreakable = i;
|
|
||||||
|
|
||||||
int breakAt = -1;
|
|
||||||
int nextLineStart = -1;
|
|
||||||
if (x > max && lastBreakable != -1) {
|
|
||||||
// time to break and we know where
|
|
||||||
breakAt = lastBreakable;
|
|
||||||
nextLineStart = lastBreakable + 1;
|
|
||||||
} else if ((x > max - 1 && lastBreakable == -1) || i == len - 1) {
|
|
||||||
// time to break but found nowhere [-> break here], or end of last line
|
|
||||||
breakAt = i + 1;
|
|
||||||
nextLineStart = breakAt;
|
|
||||||
} else if (c == nl) {
|
|
||||||
// forced break
|
|
||||||
breakAt = i;
|
|
||||||
nextLineStart = i + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (breakAt != -1) {
|
|
||||||
const int numChars = breakAt - lineStart;
|
|
||||||
//qDebug() << "breakAt=" << description.at(breakAt) << "breakAtSpace=" << breakAtSpace << lineStart << "to" << breakAt << description.mid(lineStart, numChars);
|
|
||||||
if (lineStart > 0)
|
|
||||||
text += QString(indent, QLatin1Char(' '));
|
|
||||||
text += description.mid(lineStart, numChars) + nl;
|
|
||||||
x = 0;
|
|
||||||
lastBreakable = -1;
|
|
||||||
lineStart = nextLineStart;
|
|
||||||
if (lineStart < len && description.at(lineStart).isSpace())
|
|
||||||
++lineStart; // don't start a line with a space
|
|
||||||
i = lineStart;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return text;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString QCommandLineParserPrivate::helpText() const
|
|
||||||
{
|
|
||||||
const QLatin1Char nl('\n');
|
|
||||||
QString text;
|
|
||||||
const QString exeName = QCoreApplication::instance()->arguments().first();
|
|
||||||
QString usage = exeName;
|
|
||||||
if (!commandLineOptionList.isEmpty()) {
|
|
||||||
usage += QLatin1Char(' ');
|
|
||||||
usage += QCommandLineParser::tr("[options]");
|
|
||||||
}
|
|
||||||
Q_FOREACH (const PositionalArgumentDefinition &arg, positionalArgumentDefinitions) {
|
|
||||||
usage += QLatin1Char(' ');
|
|
||||||
usage += arg.syntax;
|
|
||||||
}
|
|
||||||
text += QCommandLineParser::tr("Usage: %1").arg(usage) + nl;
|
|
||||||
if (!description.isEmpty())
|
|
||||||
text += description + nl;
|
|
||||||
text += nl;
|
|
||||||
if (!commandLineOptionList.isEmpty())
|
|
||||||
text += QCommandLineParser::tr("Options:") + nl;
|
|
||||||
QStringList optionNameList;
|
|
||||||
int longestOptionNameString = 0;
|
|
||||||
Q_FOREACH (const QCommandLineOption &option, commandLineOptionList) {
|
|
||||||
QStringList optionNames;
|
|
||||||
Q_FOREACH (const QString &optionName, option.names()) {
|
|
||||||
if (optionName.length() == 1)
|
|
||||||
optionNames.append(QLatin1Char('-') + optionName);
|
|
||||||
else
|
|
||||||
optionNames.append(QString("--") + optionName);
|
|
||||||
}
|
|
||||||
QString optionNamesString = optionNames.join(", ");
|
|
||||||
if (!option.valueName().isEmpty())
|
|
||||||
optionNamesString += QString(" <") + option.valueName() + QLatin1Char('>');
|
|
||||||
optionNameList.append(optionNamesString);
|
|
||||||
longestOptionNameString = qMax(longestOptionNameString, optionNamesString.length());
|
|
||||||
}
|
|
||||||
++longestOptionNameString;
|
|
||||||
for (int i = 0; i < commandLineOptionList.count(); ++i) {
|
|
||||||
const QCommandLineOption &option = commandLineOptionList.at(i);
|
|
||||||
text += wrapText(optionNameList.at(i), longestOptionNameString, option.description());
|
|
||||||
}
|
|
||||||
if (!positionalArgumentDefinitions.isEmpty()) {
|
|
||||||
if (!commandLineOptionList.isEmpty())
|
|
||||||
text += nl;
|
|
||||||
text += QCommandLineParser::tr("Arguments:") + nl;
|
|
||||||
Q_FOREACH (const PositionalArgumentDefinition &arg, positionalArgumentDefinitions) {
|
|
||||||
text += wrapText(arg.name, longestOptionNameString, arg.description);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return text;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef Q_CC_GNU
|
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif //QT_VERSION < QT_VERSION_CHECK(5, 2, 1)
|
|
|
@ -1,117 +0,0 @@
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2013 Laszlo Papp <lpapp@kde.org>
|
|
||||||
** Contact: http://www.qt-project.org/legal
|
|
||||||
**
|
|
||||||
** This file is part of the QtCore module of the Qt Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
** Commercial License Usage
|
|
||||||
** Licensees holding valid commercial Qt licenses may use this file in
|
|
||||||
** accordance with the commercial license agreement provided with the
|
|
||||||
** Software or, alternatively, in accordance with the terms contained in
|
|
||||||
** a written agreement between you and Digia. For licensing terms and
|
|
||||||
** conditions see http://qt.digia.com/licensing. For further information
|
|
||||||
** use the contact form at http://qt.digia.com/contact-us.
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 2.1 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** In addition, as a special exception, Digia gives you certain additional
|
|
||||||
** rights. These rights are described in the Digia Qt LGPL Exception
|
|
||||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
|
||||||
**
|
|
||||||
** GNU General Public License Usage
|
|
||||||
** Alternatively, this file may be used under the terms of the GNU
|
|
||||||
** General Public License version 3.0 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.GPL included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU General Public License version 3.0 requirements will be
|
|
||||||
** met: http://www.gnu.org/copyleft/gpl.html.
|
|
||||||
**
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QCOMMANDLINEPARSER_H
|
|
||||||
#define QCOMMANDLINEPARSER_H
|
|
||||||
|
|
||||||
#include <QtGlobal>
|
|
||||||
|
|
||||||
#if QT_VERSION < QT_VERSION_CHECK(5, 2, 1)
|
|
||||||
|
|
||||||
#include <QStringList>
|
|
||||||
#include <QCoreApplication>
|
|
||||||
|
|
||||||
#include "qcommandlineoption.h"
|
|
||||||
|
|
||||||
#ifdef Q_CC_GNU
|
|
||||||
#pragma GCC diagnostic push
|
|
||||||
#pragma GCC diagnostic ignored "-Weffc++"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
class QCommandLineParserPrivate;
|
|
||||||
class QCoreApplication;
|
|
||||||
|
|
||||||
class QCommandLineParser
|
|
||||||
{
|
|
||||||
Q_DECLARE_TR_FUNCTIONS(QCommandLineParser)
|
|
||||||
public:
|
|
||||||
QCommandLineParser();
|
|
||||||
~QCommandLineParser();
|
|
||||||
|
|
||||||
enum SingleDashWordOptionMode {
|
|
||||||
ParseAsCompactedShortOptions,
|
|
||||||
ParseAsLongOptions
|
|
||||||
};
|
|
||||||
void setSingleDashWordOptionMode(SingleDashWordOptionMode parsingMode);
|
|
||||||
|
|
||||||
bool addOption(const QCommandLineOption &commandLineOption);
|
|
||||||
|
|
||||||
QCommandLineOption addVersionOption();
|
|
||||||
QCommandLineOption addHelpOption();
|
|
||||||
void setApplicationDescription(const QString &description);
|
|
||||||
QString applicationDescription() const;
|
|
||||||
void addPositionalArgument(const QString &name, const QString &description, const QString &syntax = QString());
|
|
||||||
void clearPositionalArguments();
|
|
||||||
|
|
||||||
void process(const QStringList &arguments);
|
|
||||||
void process(const QCoreApplication &app);
|
|
||||||
|
|
||||||
bool parse(const QStringList &arguments);
|
|
||||||
QString errorText() const;
|
|
||||||
|
|
||||||
bool isSet(const QString &name) const;
|
|
||||||
QString value(const QString &name) const;
|
|
||||||
QStringList values(const QString &name) const;
|
|
||||||
|
|
||||||
bool isSet(const QCommandLineOption &option) const;
|
|
||||||
QString value(const QCommandLineOption &option) const;
|
|
||||||
QStringList values(const QCommandLineOption &option) const;
|
|
||||||
|
|
||||||
QStringList positionalArguments() const;
|
|
||||||
QStringList optionNames() const;
|
|
||||||
QStringList unknownOptionNames() const;
|
|
||||||
|
|
||||||
void showHelp(int exitCode = 0);
|
|
||||||
QString helpText() const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
Q_DISABLE_COPY(QCommandLineParser)
|
|
||||||
|
|
||||||
QCommandLineParserPrivate * const d;
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef Q_CC_GNU
|
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif //QT_VERSION < QT_VERSION_CHECK(5, 2, 1)
|
|
||||||
|
|
||||||
#endif // QCOMMANDLINEPARSER_H
|
|
|
@ -35,6 +35,7 @@
|
||||||
#include "vmaingraphicsview.h"
|
#include "vmaingraphicsview.h"
|
||||||
#include "../container/calculator.h"
|
#include "../container/calculator.h"
|
||||||
#include "../version.h"
|
#include "../version.h"
|
||||||
|
#include "vsettings.h"
|
||||||
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
|
@ -43,6 +44,96 @@
|
||||||
#include <QUndoStack>
|
#include <QUndoStack>
|
||||||
#include <QtCore/qmath.h>
|
#include <QtCore/qmath.h>
|
||||||
#include <QTemporaryFile>
|
#include <QTemporaryFile>
|
||||||
|
#include <QFile>
|
||||||
|
#include <QStandardPaths>
|
||||||
|
#include <QMessageBox>
|
||||||
|
#include <QLoggingCategory>
|
||||||
|
|
||||||
|
Q_LOGGING_CATEGORY(vApp, "v.application")
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
inline void noisyFailureMsgHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)
|
||||||
|
{
|
||||||
|
// Why on earth didn't Qt want to make failed signal/slot connections qWarning?
|
||||||
|
if ((type == QtDebugMsg) && msg.contains("::connect"))
|
||||||
|
{
|
||||||
|
type = QtWarningMsg;
|
||||||
|
}
|
||||||
|
|
||||||
|
// this is another one that doesn't make sense as just a debug message. pretty serious
|
||||||
|
// sign of a problem
|
||||||
|
// http://www.developer.nokia.com/Community/Wiki/QPainter::begin:Paint_device_returned_engine_%3D%3D_0_(Known_Issue)
|
||||||
|
if ((type == QtDebugMsg) && msg.contains("QPainter::begin") && msg.contains("Paint device returned engine"))
|
||||||
|
{
|
||||||
|
type = QtWarningMsg;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This qWarning about "Cowardly refusing to send clipboard message to hung application..."
|
||||||
|
// is something that can easily happen if you are debugging and the application is paused.
|
||||||
|
// As it is so common, not worth popping up a dialog.
|
||||||
|
if ((type == QtWarningMsg) && QString(msg).contains("QClipboard::event")
|
||||||
|
&& QString(msg).contains("Cowardly refusing"))
|
||||||
|
{
|
||||||
|
type = QtDebugMsg;
|
||||||
|
}
|
||||||
|
|
||||||
|
// only the GUI thread should display message boxes. If you are
|
||||||
|
// writing a multithreaded application and the error happens on
|
||||||
|
// a non-GUI thread, you'll have to queue the message to the GUI
|
||||||
|
QCoreApplication *instance = QCoreApplication::instance();
|
||||||
|
const bool isGuiThread = instance && (QThread::currentThread() == instance->thread());
|
||||||
|
|
||||||
|
if (isGuiThread)
|
||||||
|
{
|
||||||
|
QString debugdate = QDateTime::currentDateTime().toString("yyyy.MM.dd hh:mm:ss");
|
||||||
|
QMessageBox messageBox;
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case QtDebugMsg:
|
||||||
|
debugdate += QString(" [Debug] %1: \"%2\" %3").arg(context.category).arg(msg).arg(context.function);
|
||||||
|
break;
|
||||||
|
case QtWarningMsg:
|
||||||
|
debugdate += QString(" [Warning] %1: \"%2\" %3").arg(context.category).arg(msg).arg(context.function);
|
||||||
|
messageBox.setIcon(QMessageBox::Warning);
|
||||||
|
messageBox.setInformativeText(msg);
|
||||||
|
messageBox.setStandardButtons(QMessageBox::Ok);
|
||||||
|
messageBox.exec();
|
||||||
|
break;
|
||||||
|
case QtCriticalMsg:
|
||||||
|
debugdate += QString(" [Critical] %1: \"%2\" %3").arg(context.category).arg(msg).arg(context.function);
|
||||||
|
messageBox.setIcon(QMessageBox::Critical);
|
||||||
|
messageBox.setInformativeText(msg);
|
||||||
|
messageBox.setStandardButtons(QMessageBox::Ok);
|
||||||
|
messageBox.exec();
|
||||||
|
break;
|
||||||
|
case QtFatalMsg:
|
||||||
|
debugdate += QString(" [Fatal] %1: \"%2\" %3").arg(context.category).arg(msg).arg(context.function);
|
||||||
|
messageBox.setIcon(QMessageBox::Critical);
|
||||||
|
messageBox.setInformativeText(msg);
|
||||||
|
messageBox.setStandardButtons(QMessageBox::Ok);
|
||||||
|
messageBox.exec();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
(*qApp->LogFile()) << debugdate << endl;
|
||||||
|
|
||||||
|
if (QtFatalMsg == type)
|
||||||
|
{
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (type != QtDebugMsg)
|
||||||
|
{
|
||||||
|
abort(); // be NOISY unless overridden!
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
const qreal VApplication::PrintDPI = 96.0;
|
const qreal VApplication::PrintDPI = 96.0;
|
||||||
|
|
||||||
|
@ -64,8 +155,8 @@ VApplication::VApplication(int &argc, char **argv)
|
||||||
guiTexts(QMap<QString, VTranslation>()), descriptions(QMap<QString, VTranslation>()),
|
guiTexts(QMap<QString, VTranslation>()), descriptions(QMap<QString, VTranslation>()),
|
||||||
variables(QMap<QString, VTranslation>()), functions(QMap<QString, VTranslation>()),
|
variables(QMap<QString, VTranslation>()), functions(QMap<QString, VTranslation>()),
|
||||||
postfixOperators(QMap<QString, VTranslation>()), stDescriptions(QMap<QString, VTranslation>()),
|
postfixOperators(QMap<QString, VTranslation>()), stDescriptions(QMap<QString, VTranslation>()),
|
||||||
undoStack(nullptr), sceneView(nullptr), currentScene(nullptr),
|
undoStack(nullptr), sceneView(nullptr), currentScene(nullptr), autoSaveTimer(nullptr), mainWindow(nullptr),
|
||||||
autoSaveTimer(nullptr), mainWindow(nullptr), openingPattern(false), settings(nullptr), doc(nullptr)
|
openingPattern(false), settings(nullptr), doc(nullptr), log(nullptr), out(nullptr)
|
||||||
{
|
{
|
||||||
undoStack = new QUndoStack(this);
|
undoStack = new QUndoStack(this);
|
||||||
|
|
||||||
|
@ -77,6 +168,20 @@ VApplication::VApplication(int &argc, char **argv)
|
||||||
InitSTDescriptions();
|
InitSTDescriptions();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
VApplication::~VApplication()
|
||||||
|
{
|
||||||
|
qCDebug(vApp)<<"Application closing.";
|
||||||
|
qInstallMessageHandler(0); // Resore the message handler
|
||||||
|
delete out;
|
||||||
|
|
||||||
|
if (log != nullptr)
|
||||||
|
{
|
||||||
|
log->close();
|
||||||
|
delete log;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
/**
|
/**
|
||||||
* @brief NewValentina start Valentina in new process, send path to pattern file in argument.
|
* @brief NewValentina start Valentina in new process, send path to pattern file in argument.
|
||||||
|
@ -84,18 +189,36 @@ VApplication::VApplication(int &argc, char **argv)
|
||||||
*/
|
*/
|
||||||
void VApplication::NewValentina(const QString &fileName)
|
void VApplication::NewValentina(const QString &fileName)
|
||||||
{
|
{
|
||||||
QProcess *v = new QProcess();
|
qCDebug(vApp)<<"Open new detached process.";
|
||||||
QStringList arguments;
|
|
||||||
arguments << fileName;
|
|
||||||
if (fileName.isEmpty())
|
if (fileName.isEmpty())
|
||||||
{
|
{
|
||||||
v->startDetached(QCoreApplication::applicationFilePath());
|
qCDebug(vApp)<<"New process without arguments. program ="<<QCoreApplication::applicationFilePath();
|
||||||
|
// Path can contain spaces.
|
||||||
|
if (QProcess::startDetached("\""+QCoreApplication::applicationFilePath()+"\""))
|
||||||
|
{
|
||||||
|
qCDebug(vApp)<<"The process was started successfully.";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
qCWarning(vApp)<<"The operation timed out or an error occurred.";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
v->startDetached(QCoreApplication::applicationFilePath(), arguments);
|
QStringList arguments;
|
||||||
|
arguments << fileName;
|
||||||
|
qCDebug(vApp)<<"New process with arguments. program ="<<QCoreApplication::applicationFilePath()
|
||||||
|
<<", arguments = "<<arguments;
|
||||||
|
// Path can contain spaces.
|
||||||
|
if(QProcess::startDetached("\""+QCoreApplication::applicationFilePath()+"\"", arguments))
|
||||||
|
{
|
||||||
|
qCDebug(vApp)<<"The process was started successfully.";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
qCWarning(vApp)<<"The operation timed out or an error occurred.";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
delete v;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
@ -295,6 +418,25 @@ void VApplication::InitMeasurement(const QString &name, const VTranslation &m, c
|
||||||
descriptions.insert(name, d);
|
descriptions.insert(name, d);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
QString VApplication::LogDirPath() const
|
||||||
|
{
|
||||||
|
#if defined(Q_OS_WIN) || defined(Q_OS_OSX)
|
||||||
|
const QString logDirPath = QStandardPaths::locate(QStandardPaths::GenericDataLocation, QString(),
|
||||||
|
QStandardPaths::LocateDirectory) + "Valentina";
|
||||||
|
#else
|
||||||
|
const QString logDirPath = QStandardPaths::locate(QStandardPaths::ConfigLocation, QString(),
|
||||||
|
QStandardPaths::LocateDirectory) + organizationName();
|
||||||
|
#endif
|
||||||
|
return logDirPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
QString VApplication::LogPath() const
|
||||||
|
{
|
||||||
|
return LogDirPath() + "/valentina.log";
|
||||||
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
void VApplication::InitMeasurements()
|
void VApplication::InitMeasurements()
|
||||||
{
|
{
|
||||||
|
@ -1523,10 +1665,8 @@ QString VApplication::FormulaFromUser(const QString &formula)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool osSeparatorValue = getSettings()->value("configuration/osSeparator", 1).toBool();
|
|
||||||
|
|
||||||
QLocale loc = QLocale::system();
|
QLocale loc = QLocale::system();
|
||||||
if (loc != QLocale(QLocale::C) && osSeparatorValue)
|
if (loc != QLocale(QLocale::C) && getSettings()->GetOsSeparator())
|
||||||
{
|
{
|
||||||
QList<int> nKeys = numbers.keys();
|
QList<int> nKeys = numbers.keys();
|
||||||
QList<QString> nValues = numbers.values();
|
QList<QString> nValues = numbers.values();
|
||||||
|
@ -1639,10 +1779,8 @@ QString VApplication::FormulaToUser(const QString &formula)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool osSeparatorValue = getSettings()->value("configuration/osSeparator", 1).toBool();
|
|
||||||
|
|
||||||
QLocale loc = QLocale::system();
|
QLocale loc = QLocale::system();
|
||||||
if (loc != QLocale::C && osSeparatorValue)
|
if (loc != QLocale::C && getSettings()->GetOsSeparator())
|
||||||
{
|
{
|
||||||
QList<int> nKeys = numbers.keys();
|
QList<int> nKeys = numbers.keys();
|
||||||
QList<QString> nValues = numbers.values();
|
QList<QString> nValues = numbers.values();
|
||||||
|
@ -1709,7 +1847,7 @@ void VApplication::setOpeningPattern()
|
||||||
*/
|
*/
|
||||||
void VApplication::OpenSettings()
|
void VApplication::OpenSettings()
|
||||||
{
|
{
|
||||||
settings = new QSettings(QSettings::IniFormat, QSettings::UserScope, QApplication::organizationName(),
|
settings = new VSettings(QSettings::IniFormat, QSettings::UserScope, QApplication::organizationName(),
|
||||||
QApplication::applicationName(), this);
|
QApplication::applicationName(), this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1718,7 +1856,7 @@ void VApplication::OpenSettings()
|
||||||
* @brief VApplication::getSettings hide settings constructor.
|
* @brief VApplication::getSettings hide settings constructor.
|
||||||
* @return pointer to class for acssesing to settings in ini file.
|
* @return pointer to class for acssesing to settings in ini file.
|
||||||
*/
|
*/
|
||||||
QSettings *VApplication::getSettings()
|
VSettings *VApplication::getSettings()
|
||||||
{
|
{
|
||||||
SCASSERT(settings != nullptr);
|
SCASSERT(settings != nullptr);
|
||||||
return settings;
|
return settings;
|
||||||
|
@ -1802,7 +1940,7 @@ QString VApplication::STDescription(const QString &id) const
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
qWarning()<<"Unknown id number. Got"<<id;
|
qDebug()<<"Unknown id number. Got"<<id;
|
||||||
}
|
}
|
||||||
return QString();
|
return QString();
|
||||||
}
|
}
|
||||||
|
@ -1854,6 +1992,43 @@ bool VApplication::SafeCopy(const QString &source, const QString &destination, Q
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void VApplication::StartLogging()
|
||||||
|
{
|
||||||
|
#if (QT_VERSION < QT_VERSION_CHECK(5, 3, 0))
|
||||||
|
// In Qt 5.2 need manualy enable debug information for categories. This work
|
||||||
|
// because Qt doesn't provide debug information for categories itself. And in this
|
||||||
|
// case will show our messages. Another situation with Qt 5.3 that has many debug
|
||||||
|
// messages itself. We don't need this information and can turn on later if need.
|
||||||
|
// But here Qt already show our debug messages without enabling.
|
||||||
|
QLoggingCategory::setFilterRules("*.debug=true\n");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
QDir logDir(LogDirPath());
|
||||||
|
if (logDir.exists() == false)
|
||||||
|
{
|
||||||
|
logDir.mkpath("."); // Create directory for log if need
|
||||||
|
}
|
||||||
|
|
||||||
|
log = new QFile(LogPath());
|
||||||
|
if (log->open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text))
|
||||||
|
{
|
||||||
|
out = new QTextStream(log);
|
||||||
|
qInstallMessageHandler(noisyFailureMsgHandler);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
delete log;
|
||||||
|
qDebug() << "Error opening log file '" << LogPath() << "'. All debug output redirected to console.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
QTextStream *VApplication::LogFile()
|
||||||
|
{
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
#if defined(Q_OS_WIN) && defined(Q_CC_GNU)
|
#if defined(Q_OS_WIN) && defined(Q_CC_GNU)
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
// Catch exception and create report. Use if program build with Mingw compiler.
|
// Catch exception and create report. Use if program build with Mingw compiler.
|
||||||
|
@ -1881,7 +2056,7 @@ void VApplication::CollectReports() const
|
||||||
return;// Settings was not opened.
|
return;// Settings was not opened.
|
||||||
}
|
}
|
||||||
|
|
||||||
if (settings->value("configuration/send_report/state", 1).toBool())
|
if (settings->GetSendReportState())
|
||||||
{ // Try send report
|
{ // Try send report
|
||||||
// Remove gist.json file before close app.
|
// Remove gist.json file before close app.
|
||||||
connect(this, &VApplication::aboutToQuit, this, &VApplication::CleanGist, Qt::UniqueConnection);
|
connect(this, &VApplication::aboutToQuit, this, &VApplication::CleanGist, Qt::UniqueConnection);
|
||||||
|
@ -1905,12 +2080,16 @@ void VApplication::CollectReport(const QString &reportName) const
|
||||||
}
|
}
|
||||||
|
|
||||||
const QDateTime now = QDateTime::currentDateTime();
|
const QDateTime now = QDateTime::currentDateTime();
|
||||||
const QString timestamp = now.toString(QLatin1String("yyyyMMdd-hhmmsszzz"));
|
const QString timestamp = now.toString(QLatin1String("yyyy.MM.dd-hh_mm_ss"));
|
||||||
const QString filename = QString("%1/reports/crash-%2.RPT").arg(qApp->applicationDirPath()).arg(timestamp);
|
QString filename = QString("%1/reports/crash-%2.RPT").arg(qApp->applicationDirPath()).arg(timestamp);
|
||||||
|
|
||||||
QFile reportFile(reportName);
|
QFile reportFile(reportName);
|
||||||
reportFile.copy(filename); // Collect new crash
|
reportFile.copy(filename); // Collect new crash
|
||||||
reportFile.remove(); // Clear after yourself
|
reportFile.remove(); // Clear after yourself
|
||||||
|
|
||||||
|
filename = QString("%1/reports/log-%2.log").arg(qApp->applicationDirPath()).arg(timestamp);
|
||||||
|
QFile logFile(LogPath());
|
||||||
|
logFile.copy(filename); // Collect log
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
@ -1928,23 +2107,22 @@ void VApplication::SendReport(const QString &reportName) const
|
||||||
{
|
{
|
||||||
QString content;
|
QString content;
|
||||||
QFile reportFile(reportName);
|
QFile reportFile(reportName);
|
||||||
if (!reportFile.open(QIODevice::ReadOnly | QIODevice::Text))
|
if (reportFile.open(QIODevice::ReadOnly | QIODevice::Text))
|
||||||
{
|
{
|
||||||
return;
|
content = ReadFileForSending(reportFile);
|
||||||
|
reportFile.close();
|
||||||
}
|
}
|
||||||
|
else
|
||||||
QTextStream in(&reportFile);
|
|
||||||
while (!in.atEnd())
|
|
||||||
{
|
{
|
||||||
content.append(in.readLine()+"\r\n");// Windows end of line
|
content = "RPT file error:" + reportFile.errorString() + "\r\n";
|
||||||
}
|
}
|
||||||
reportFile.close();
|
|
||||||
|
|
||||||
// Additional information
|
// Additional information
|
||||||
content.append(QString("-------------------------------")+"\r\n");
|
content.append(QString("-------------------------------")+"\r\n");
|
||||||
content.append(QString("Version:%1").arg(APP_VERSION)+"\r\n");
|
content.append(QString("Version:%1").arg(APP_VERSION)+"\r\n");
|
||||||
content.append(QString("Based on Qt %2 (32 bit)").arg(QT_VERSION_STR)+"\r\n");
|
content.append(QString("Based on Qt %2 (32 bit)").arg(QT_VERSION_STR)+"\r\n");
|
||||||
content.append(QString("Built on %3 at %4").arg(__DATE__).arg(__TIME__)+"\r\n");
|
content.append(QString("Built on %3 at %4").arg(__DATE__).arg(__TIME__)+"\r\n");
|
||||||
|
content.append("\r\n");
|
||||||
|
|
||||||
// Creating json with report
|
// Creating json with report
|
||||||
// Example:
|
// Example:
|
||||||
|
@ -1952,7 +2130,7 @@ void VApplication::SendReport(const QString &reportName) const
|
||||||
// "description":"Crash report",
|
// "description":"Crash report",
|
||||||
// "public":"true",
|
// "public":"true",
|
||||||
// "files":{
|
// "files":{
|
||||||
// "file1.txt":{
|
// "valentina.RPT":{
|
||||||
// "content":"Report text here"
|
// "content":"Report text here"
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
@ -1967,12 +2145,28 @@ void VApplication::SendReport(const QString &reportName) const
|
||||||
reportObject.insert(QStringLiteral("description"), QJsonValue(report));
|
reportObject.insert(QStringLiteral("description"), QJsonValue(report));
|
||||||
reportObject.insert(QStringLiteral("public"), QJsonValue(QString("true")));
|
reportObject.insert(QStringLiteral("public"), QJsonValue(QString("true")));
|
||||||
|
|
||||||
QJsonObject contentObject;
|
content.append(QString("\r\n-------------------------------\r\n"));
|
||||||
contentObject.insert(QStringLiteral("content"), QJsonValue(content));
|
content.append(QString("Log:")+"\r\n");
|
||||||
|
|
||||||
|
QFile logFile(LogPath());
|
||||||
|
if (logFile.open(QIODevice::ReadOnly | QIODevice::Text))
|
||||||
|
{
|
||||||
|
content.append(ReadFileForSending(logFile));
|
||||||
|
logFile.close();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
content.append("\r\n Log file error:" + logFile.errorString() + "\r\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
const QString contentSection = QStringLiteral("content");
|
||||||
|
QJsonObject contentObject;
|
||||||
|
contentObject.insert(contentSection, QJsonValue(content));
|
||||||
|
|
||||||
|
const QString filesSection = QStringLiteral("files");
|
||||||
QJsonObject fileObject;
|
QJsonObject fileObject;
|
||||||
fileObject.insert(QFileInfo(reportName).fileName(), QJsonValue(contentObject));
|
fileObject.insert(QFileInfo(reportName).fileName(), QJsonValue(contentObject));
|
||||||
reportObject.insert(QStringLiteral("files"), QJsonValue(fileObject));
|
reportObject.insert(filesSection, QJsonValue(fileObject));
|
||||||
|
|
||||||
QFile gistFile(GistFileName);
|
QFile gistFile(GistFileName);
|
||||||
if (!gistFile.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text))
|
if (!gistFile.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text))
|
||||||
|
@ -2001,4 +2195,16 @@ void VApplication::SendReport(const QString &reportName) const
|
||||||
CollectReport(reportName);
|
CollectReport(reportName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
QString VApplication::ReadFileForSending(QFile &file) const
|
||||||
|
{
|
||||||
|
QString content;
|
||||||
|
QTextStream in(&file);
|
||||||
|
while (!in.atEnd())
|
||||||
|
{
|
||||||
|
content.append(in.readLine()+"\r\n");// Windows end of line
|
||||||
|
}
|
||||||
|
return content;
|
||||||
|
}
|
||||||
#endif //defined(Q_OS_WIN) && defined(Q_CC_GNU)
|
#endif //defined(Q_OS_WIN) && defined(Q_CC_GNU)
|
||||||
|
|
|
@ -32,7 +32,6 @@
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include "../options.h"
|
#include "../options.h"
|
||||||
#include "vtranslation.h"
|
#include "vtranslation.h"
|
||||||
#include <QSettings>
|
|
||||||
#include "../widgets/vmaingraphicsview.h"
|
#include "../widgets/vmaingraphicsview.h"
|
||||||
|
|
||||||
class VApplication;// used in define
|
class VApplication;// used in define
|
||||||
|
@ -40,6 +39,8 @@ class QUndoStack;
|
||||||
class VMainGraphicsView;
|
class VMainGraphicsView;
|
||||||
class VMainGraphicsScene;
|
class VMainGraphicsScene;
|
||||||
class VPattern;
|
class VPattern;
|
||||||
|
class QFile;
|
||||||
|
class VSettings;
|
||||||
|
|
||||||
#if defined(qApp)
|
#if defined(qApp)
|
||||||
#undef qApp
|
#undef qApp
|
||||||
|
@ -54,7 +55,7 @@ class VApplication : public QApplication
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
VApplication(int &argc, char ** argv);
|
VApplication(int &argc, char ** argv);
|
||||||
virtual ~VApplication() {}
|
virtual ~VApplication();
|
||||||
static void NewValentina(const QString &fileName = QString());
|
static void NewValentina(const QString &fileName = QString());
|
||||||
static void CheckFactor(qreal &oldFactor, const qreal &Newfactor);
|
static void CheckFactor(qreal &oldFactor, const qreal &Newfactor);
|
||||||
virtual bool notify(QObject * receiver, QEvent * event);
|
virtual bool notify(QObject * receiver, QEvent * event);
|
||||||
|
@ -89,8 +90,10 @@ public:
|
||||||
void setMainWindow(QWidget *value);
|
void setMainWindow(QWidget *value);
|
||||||
bool getOpeningPattern() const;
|
bool getOpeningPattern() const;
|
||||||
void setOpeningPattern();
|
void setOpeningPattern();
|
||||||
|
|
||||||
void OpenSettings();
|
void OpenSettings();
|
||||||
QSettings *getSettings();
|
VSettings *getSettings();
|
||||||
|
|
||||||
VMainGraphicsScene *getCurrentScene() const;
|
VMainGraphicsScene *getCurrentScene() const;
|
||||||
void setCurrentScene(VMainGraphicsScene *value);
|
void setCurrentScene(VMainGraphicsScene *value);
|
||||||
|
|
||||||
|
@ -103,13 +106,19 @@ public:
|
||||||
static QStringList LabelLanguages();
|
static QStringList LabelLanguages();
|
||||||
QString STDescription(const QString &id)const;
|
QString STDescription(const QString &id)const;
|
||||||
static bool SafeCopy(const QString &source, const QString &destination, QString &error);
|
static bool SafeCopy(const QString &source, const QString &destination, QString &error);
|
||||||
|
void StartLogging();
|
||||||
|
QTextStream *LogFile();
|
||||||
|
|
||||||
#if defined(Q_OS_WIN) && defined(Q_CC_GNU)
|
#if defined(Q_OS_WIN) && defined(Q_CC_GNU)
|
||||||
static void DrMingw();
|
static void DrMingw();
|
||||||
void CollectReports() const;
|
void CollectReports() const;
|
||||||
|
#endif // defined(Q_OS_WIN) && defined(Q_CC_GNU)
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
#if defined(Q_OS_WIN) && defined(Q_CC_GNU)
|
||||||
void CleanGist() const;
|
void CleanGist() const;
|
||||||
#endif // defined(Q_OS_WIN) && defined(Q_CC_GNU)
|
#endif // defined(Q_OS_WIN) && defined(Q_CC_GNU)
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Q_DISABLE_COPY(VApplication)
|
Q_DISABLE_COPY(VApplication)
|
||||||
Unit _patternUnit;
|
Unit _patternUnit;
|
||||||
|
@ -140,9 +149,11 @@ private:
|
||||||
/**
|
/**
|
||||||
* @brief settings pointer to settings. Help hide constructor creation settings. Make make code more readable.
|
* @brief settings pointer to settings. Help hide constructor creation settings. Make make code more readable.
|
||||||
*/
|
*/
|
||||||
QSettings *settings;
|
VSettings *settings;
|
||||||
|
|
||||||
VPattern *doc;
|
VPattern *doc;
|
||||||
|
QFile *log;
|
||||||
|
QTextStream *out;
|
||||||
void InitLineWidth();
|
void InitLineWidth();
|
||||||
void InitMeasurements();
|
void InitMeasurements();
|
||||||
void InitVariables();
|
void InitVariables();
|
||||||
|
@ -166,7 +177,11 @@ private:
|
||||||
|
|
||||||
void CollectReport(const QString &reportName) const;
|
void CollectReport(const QString &reportName) const;
|
||||||
void SendReport(const QString &reportName) const;
|
void SendReport(const QString &reportName) const;
|
||||||
|
QString ReadFileForSending(QFile &file)const;
|
||||||
#endif // defined(Q_OS_WIN) && defined(Q_CC_GNU)
|
#endif // defined(Q_OS_WIN) && defined(Q_CC_GNU)
|
||||||
|
|
||||||
|
QString LogDirPath()const;
|
||||||
|
QString LogPath()const;
|
||||||
};
|
};
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
402
src/app/core/vsettings.cpp
Normal file
402
src/app/core/vsettings.cpp
Normal file
|
@ -0,0 +1,402 @@
|
||||||
|
/************************************************************************
|
||||||
|
**
|
||||||
|
** @file vsettings.cpp
|
||||||
|
** @author Roman Telezhynskyi <dismine(at)gmail.com>
|
||||||
|
** @date 22 11, 2014
|
||||||
|
**
|
||||||
|
** @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) 2014 Valentina project
|
||||||
|
** <https://bitbucket.org/dismine/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 "vsettings.h"
|
||||||
|
|
||||||
|
#include <QDir>
|
||||||
|
|
||||||
|
const QString VSettings::SettingConfigurationOsSeparator = QStringLiteral("configuration/osSeparator");
|
||||||
|
const QString VSettings::SettingConfigurationAutosaveState = QStringLiteral("configuration/autosave/state");
|
||||||
|
const QString VSettings::SettingConfigurationAutosaveTime = QStringLiteral("configuration/autosave/time");
|
||||||
|
const QString VSettings::SettingConfigurationSendReportState = QStringLiteral("configuration/send_report/state");
|
||||||
|
const QString VSettings::SettingConfigurationLocale = QStringLiteral("configuration/locale");
|
||||||
|
const QString VSettings::SettingConfigurationUnit = QStringLiteral("configuration/unit");
|
||||||
|
const QString VSettings::SettingConfigurationLabelLanguage = QStringLiteral("configuration/label_language");
|
||||||
|
|
||||||
|
const QString VSettings::SettingPathsIndividualMeasurements = QStringLiteral("paths/individual_measurements");
|
||||||
|
const QString VSettings::SettingPathsPattern = QStringLiteral("paths/pattern");
|
||||||
|
|
||||||
|
const QString VSettings::SettingPatternUser = QStringLiteral("pattern/user");
|
||||||
|
const QString VSettings::SettingPatternGraphicalOutput = QStringLiteral("pattern/graphicalOutput");
|
||||||
|
const QString VSettings::SettingPatternUndo = QStringLiteral("pattern/undo");
|
||||||
|
|
||||||
|
const QString VSettings::SettingGeneralRecentFileList = QStringLiteral("recentFileList");
|
||||||
|
const QString VSettings::SettingGeneralRestoreFileList = QStringLiteral("restoreFileList");
|
||||||
|
const QString VSettings::SettingGeneralGeometry = QStringLiteral("geometry");
|
||||||
|
const QString VSettings::SettingGeneralWindowState = QStringLiteral("windowState");
|
||||||
|
|
||||||
|
const QString VSettings::SettingCommunityServer = QStringLiteral("community/server");
|
||||||
|
const QString VSettings::SettingCommunityServerSecure = QStringLiteral("community/serverSecure");
|
||||||
|
const QString VSettings::SettingCommunityUseProxy = QStringLiteral("community/useProxy");
|
||||||
|
const QString VSettings::SettingCommunityProxyAddress = QStringLiteral("community/proxyAddress");
|
||||||
|
const QString VSettings::SettingCommunityProxyPort = QStringLiteral("community/proxyPort");
|
||||||
|
const QString VSettings::SettingCommunityProxyUser = QStringLiteral("community/proxyUser");
|
||||||
|
const QString VSettings::SettingCommunityProxyPass = QStringLiteral("community/proxyPass");
|
||||||
|
const QString VSettings::SettingCommunityUsername = QStringLiteral("community/username");
|
||||||
|
const QString VSettings::SettingCommunitySavePassword = QStringLiteral("community/savePassword");
|
||||||
|
const QString VSettings::SettingCommunityUserPassword = QStringLiteral("community/userpassword");
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
VSettings::VSettings(Format format, Scope scope, const QString &organization, const QString &application,
|
||||||
|
QObject *parent)
|
||||||
|
:QSettings(format, scope, organization, application, parent)
|
||||||
|
{}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
bool VSettings::GetOsSeparator()
|
||||||
|
{
|
||||||
|
return value(SettingConfigurationOsSeparator, 1).toBool();
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void VSettings::SetOsSeparator(const bool &value)
|
||||||
|
{
|
||||||
|
setValue(SettingConfigurationOsSeparator, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
bool VSettings::GetAutosaveState()
|
||||||
|
{
|
||||||
|
return value(SettingConfigurationAutosaveState, 1).toBool();
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void VSettings::SetAutosaveState(const bool &value)
|
||||||
|
{
|
||||||
|
setValue(SettingConfigurationAutosaveState, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
int VSettings::GetAutosaveTime()
|
||||||
|
{
|
||||||
|
bool ok = false;
|
||||||
|
int val = value(SettingConfigurationAutosaveTime, 1).toInt(&ok);
|
||||||
|
if (ok == false)
|
||||||
|
{
|
||||||
|
qDebug()<<"Could not convert value"<<value(SettingConfigurationAutosaveTime, 1)
|
||||||
|
<<"to int. Return default value for autosave time"<<1<<"minutes.";
|
||||||
|
val = 1;
|
||||||
|
}
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void VSettings::SetAutosaveTime(const int &value)
|
||||||
|
{
|
||||||
|
setValue(SettingConfigurationAutosaveTime, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
bool VSettings::GetSendReportState()
|
||||||
|
{
|
||||||
|
return value(SettingConfigurationSendReportState, 1).toBool();
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void VSettings::SetSendReportState(const bool &value)
|
||||||
|
{
|
||||||
|
setValue(SettingConfigurationSendReportState, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
QString VSettings::GetLocale()
|
||||||
|
{
|
||||||
|
return value(SettingConfigurationLocale, QLocale::system().name()).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void VSettings::SetLocale(const QString &value)
|
||||||
|
{
|
||||||
|
setValue(SettingConfigurationLocale, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
QString VSettings::GetUnit()
|
||||||
|
{
|
||||||
|
return value(SettingConfigurationUnit, "cm").toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void VSettings::SetUnit(const QString &value)
|
||||||
|
{
|
||||||
|
setValue(SettingConfigurationUnit, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
QString VSettings::GetLabelLanguage()
|
||||||
|
{
|
||||||
|
return value(SettingConfigurationLabelLanguage, QLocale::system().bcp47Name()).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void VSettings::SetLabelLanguage(const QString &value)
|
||||||
|
{
|
||||||
|
setValue(SettingConfigurationLabelLanguage, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
QString VSettings::GetPathIndividualMeasurements()
|
||||||
|
{
|
||||||
|
return value(SettingPathsIndividualMeasurements, QDir::homePath()).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void VSettings::SetPathIndividualMeasurements(const QString &value)
|
||||||
|
{
|
||||||
|
setValue(SettingPathsIndividualMeasurements, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
QString VSettings::GetPathPattern()
|
||||||
|
{
|
||||||
|
return value(SettingPathsPattern, QDir::homePath()).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void VSettings::SetPathPattern(const QString &value)
|
||||||
|
{
|
||||||
|
setValue(SettingPathsPattern, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
QString VSettings::GetUser()
|
||||||
|
{
|
||||||
|
QString user;
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
|
user = value(SettingPatternUser, QString::fromLocal8Bit(qgetenv("USERNAME").constData())).toString();
|
||||||
|
#else
|
||||||
|
user = value(SettingPatternUser, QString::fromLocal8Bit(qgetenv("USER").constData())).toString();
|
||||||
|
#endif
|
||||||
|
return user;
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void VSettings::SetUser(const QString &value)
|
||||||
|
{
|
||||||
|
setValue(SettingPatternUser, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
bool VSettings::GetGraphicalOutput()
|
||||||
|
{
|
||||||
|
return value(SettingPatternGraphicalOutput, 1).toBool();
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void VSettings::SetGraphicalOutput(const bool &value)
|
||||||
|
{
|
||||||
|
setValue(SettingPatternGraphicalOutput, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
int VSettings::GetUndoCount()
|
||||||
|
{
|
||||||
|
bool ok = false;
|
||||||
|
int val = value(SettingPatternUndo, 0).toInt(&ok);
|
||||||
|
if (ok == false)
|
||||||
|
{
|
||||||
|
qDebug()<<"Could not convert value"<<value(SettingPatternUndo, 0)
|
||||||
|
<<"to int. Return default value for undo counts 0 (no limit).";
|
||||||
|
val = 0;
|
||||||
|
}
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void VSettings::SetUndoCount(const int &value)
|
||||||
|
{
|
||||||
|
setValue(SettingPatternUndo, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
QStringList VSettings::GetRecentFileList()
|
||||||
|
{
|
||||||
|
return value(SettingGeneralRecentFileList).toStringList();
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void VSettings::SetRecentFileList(const QStringList &value)
|
||||||
|
{
|
||||||
|
setValue(SettingGeneralRecentFileList, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
QStringList VSettings::GetRestoreFileList()
|
||||||
|
{
|
||||||
|
return value(SettingGeneralRestoreFileList).toStringList();
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void VSettings::SetRestoreFileList(const QStringList &value)
|
||||||
|
{
|
||||||
|
setValue(SettingGeneralRestoreFileList, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
QByteArray VSettings::GetGeometry()
|
||||||
|
{
|
||||||
|
return value(SettingGeneralGeometry).toByteArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void VSettings::SetGeometry(const QByteArray &value)
|
||||||
|
{
|
||||||
|
setValue(SettingGeneralGeometry, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
QByteArray VSettings::GetWindowState()
|
||||||
|
{
|
||||||
|
return value(SettingGeneralWindowState).toByteArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void VSettings::SetWindowState(const QByteArray &value)
|
||||||
|
{
|
||||||
|
setValue(SettingGeneralWindowState, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
QString VSettings::GetServer()
|
||||||
|
{
|
||||||
|
return value(SettingCommunityServer, "community.valentina-project.org").toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void VSettings::SetServer(const QString &value)
|
||||||
|
{
|
||||||
|
setValue(SettingCommunityServer, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
bool VSettings::GetServerSecure()
|
||||||
|
{
|
||||||
|
return value(SettingCommunityServerSecure, 0).toBool();
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void VSettings::SetServerSecure(const bool &value)
|
||||||
|
{
|
||||||
|
setValue(SettingCommunityServerSecure, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
bool VSettings::GetProxy()
|
||||||
|
{
|
||||||
|
return value(SettingCommunityUseProxy, 0).toBool();
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void VSettings::SetProxy(const bool &value)
|
||||||
|
{
|
||||||
|
setValue(SettingCommunityUseProxy, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
QString VSettings::GetProxyAddress()
|
||||||
|
{
|
||||||
|
return value(SettingCommunityProxyAddress).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void VSettings::SetProxyAddress(const QString &value)
|
||||||
|
{
|
||||||
|
setValue(SettingCommunityProxyAddress, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
QString VSettings::GetProxyPort()
|
||||||
|
{
|
||||||
|
return value(SettingCommunityProxyPort).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void VSettings::SetProxyPort(const QString &value)
|
||||||
|
{
|
||||||
|
setValue(SettingCommunityProxyPort, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
QString VSettings::GetProxyUser()
|
||||||
|
{
|
||||||
|
return value(SettingCommunityProxyUser).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void VSettings::SetProxyUser(const QString &value)
|
||||||
|
{
|
||||||
|
setValue(SettingCommunityProxyUser, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
QString VSettings::GetProxyPass()
|
||||||
|
{
|
||||||
|
return value(SettingCommunityProxyPass).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void VSettings::SetProxyPass(const QString &value)
|
||||||
|
{
|
||||||
|
setValue(SettingCommunityProxyPass, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
QString VSettings::GetUsername()
|
||||||
|
{
|
||||||
|
return value(SettingCommunityUsername).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void VSettings::SetUsername(const QString &value)
|
||||||
|
{
|
||||||
|
setValue(SettingCommunityUsername, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
bool VSettings::GetSavePassword()
|
||||||
|
{
|
||||||
|
return value(SettingCommunitySavePassword, 0).toBool();
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void VSettings::SetSavePassword(const bool &value)
|
||||||
|
{
|
||||||
|
setValue(SettingCommunitySavePassword, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
QString VSettings::GetUserPassword()
|
||||||
|
{
|
||||||
|
return value(SettingCommunityUserPassword).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void VSettings::SetUserPassword(const QString &value)
|
||||||
|
{
|
||||||
|
setValue(SettingCommunityUserPassword, value);
|
||||||
|
}
|
153
src/app/core/vsettings.h
Normal file
153
src/app/core/vsettings.h
Normal file
|
@ -0,0 +1,153 @@
|
||||||
|
/************************************************************************
|
||||||
|
**
|
||||||
|
** @file vsettings.h
|
||||||
|
** @author Roman Telezhynskyi <dismine(at)gmail.com>
|
||||||
|
** @date 22 11, 2014
|
||||||
|
**
|
||||||
|
** @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) 2014 Valentina project
|
||||||
|
** <https://bitbucket.org/dismine/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 VSETTINGS_H
|
||||||
|
#define VSETTINGS_H
|
||||||
|
|
||||||
|
#include <QSettings>
|
||||||
|
|
||||||
|
class VSettings : public QSettings
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
VSettings(Format format, Scope scope, const QString &organization, const QString &application = QString(),
|
||||||
|
QObject *parent = 0);
|
||||||
|
|
||||||
|
bool GetOsSeparator();
|
||||||
|
void SetOsSeparator(const bool &value);
|
||||||
|
|
||||||
|
bool GetAutosaveState();
|
||||||
|
void SetAutosaveState(const bool &value);
|
||||||
|
|
||||||
|
int GetAutosaveTime();
|
||||||
|
void SetAutosaveTime(const int &value);
|
||||||
|
|
||||||
|
bool GetSendReportState();
|
||||||
|
void SetSendReportState(const bool &value);
|
||||||
|
|
||||||
|
QString GetLocale();
|
||||||
|
void SetLocale(const QString &value);
|
||||||
|
|
||||||
|
QString GetUnit();
|
||||||
|
void SetUnit(const QString &value);
|
||||||
|
|
||||||
|
QString GetLabelLanguage();
|
||||||
|
void SetLabelLanguage(const QString &value);
|
||||||
|
|
||||||
|
QString GetPathIndividualMeasurements();
|
||||||
|
void SetPathIndividualMeasurements(const QString &value);
|
||||||
|
|
||||||
|
QString GetPathPattern();
|
||||||
|
void SetPathPattern(const QString &value);
|
||||||
|
|
||||||
|
QString GetUser();
|
||||||
|
void SetUser(const QString &value);
|
||||||
|
|
||||||
|
bool GetGraphicalOutput();
|
||||||
|
void SetGraphicalOutput(const bool &value);
|
||||||
|
|
||||||
|
int GetUndoCount();
|
||||||
|
void SetUndoCount(const int &value);
|
||||||
|
|
||||||
|
QStringList GetRecentFileList();
|
||||||
|
void SetRecentFileList(const QStringList &value);
|
||||||
|
|
||||||
|
QStringList GetRestoreFileList();
|
||||||
|
void SetRestoreFileList(const QStringList &value);
|
||||||
|
|
||||||
|
QByteArray GetGeometry();
|
||||||
|
void SetGeometry(const QByteArray &value);
|
||||||
|
|
||||||
|
QByteArray GetWindowState();
|
||||||
|
void SetWindowState(const QByteArray &value);
|
||||||
|
|
||||||
|
QString GetServer();
|
||||||
|
void SetServer(const QString &value);
|
||||||
|
|
||||||
|
bool GetServerSecure();
|
||||||
|
void SetServerSecure(const bool &value);
|
||||||
|
|
||||||
|
bool GetProxy();
|
||||||
|
void SetProxy(const bool &value);
|
||||||
|
|
||||||
|
QString GetProxyAddress();
|
||||||
|
void SetProxyAddress(const QString &value);
|
||||||
|
|
||||||
|
QString GetProxyPort();
|
||||||
|
void SetProxyPort(const QString &value);
|
||||||
|
|
||||||
|
QString GetProxyUser();
|
||||||
|
void SetProxyUser(const QString &value);
|
||||||
|
|
||||||
|
QString GetProxyPass();
|
||||||
|
void SetProxyPass(const QString &value);
|
||||||
|
|
||||||
|
QString GetUsername();
|
||||||
|
void SetUsername(const QString &value);
|
||||||
|
|
||||||
|
bool GetSavePassword();
|
||||||
|
void SetSavePassword(const bool &value);
|
||||||
|
|
||||||
|
QString GetUserPassword();
|
||||||
|
void SetUserPassword(const QString &value);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Q_DISABLE_COPY(VSettings)
|
||||||
|
static const QString SettingConfigurationOsSeparator;
|
||||||
|
static const QString SettingConfigurationAutosaveState;
|
||||||
|
static const QString SettingConfigurationAutosaveTime;
|
||||||
|
static const QString SettingConfigurationSendReportState;
|
||||||
|
static const QString SettingConfigurationLocale;
|
||||||
|
static const QString SettingConfigurationUnit;
|
||||||
|
static const QString SettingConfigurationLabelLanguage;
|
||||||
|
|
||||||
|
static const QString SettingPathsIndividualMeasurements;
|
||||||
|
static const QString SettingPathsPattern;
|
||||||
|
|
||||||
|
static const QString SettingPatternUser;
|
||||||
|
static const QString SettingPatternGraphicalOutput;
|
||||||
|
static const QString SettingPatternUndo;
|
||||||
|
|
||||||
|
static const QString SettingGeneralRecentFileList;
|
||||||
|
static const QString SettingGeneralRestoreFileList;
|
||||||
|
static const QString SettingGeneralGeometry;
|
||||||
|
static const QString SettingGeneralWindowState;
|
||||||
|
|
||||||
|
static const QString SettingCommunityServer;
|
||||||
|
static const QString SettingCommunityServerSecure;
|
||||||
|
static const QString SettingCommunityUseProxy;
|
||||||
|
static const QString SettingCommunityProxyAddress;
|
||||||
|
static const QString SettingCommunityProxyPort;
|
||||||
|
static const QString SettingCommunityProxyUser;
|
||||||
|
static const QString SettingCommunityProxyPass;
|
||||||
|
static const QString SettingCommunityUsername;
|
||||||
|
static const QString SettingCommunitySavePassword;
|
||||||
|
static const QString SettingCommunityUserPassword;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // VSETTINGS_H
|
|
@ -38,7 +38,7 @@
|
||||||
* I took idea from this article http://ololoepepe.blogspot.com/2013/08/qt.html.
|
* I took idea from this article http://ololoepepe.blogspot.com/2013/08/qt.html.
|
||||||
* As you know, if wrap string to a function translate, it will be marked for translation. No matter what namespace
|
* As you know, if wrap string to a function translate, it will be marked for translation. No matter what namespace
|
||||||
* contains this function. In class Translation used this circumstance.
|
* contains this function. In class Translation used this circumstance.
|
||||||
* It is mean never change name of method translate!!!!!.
|
* This mean never change name of method translate!!!!!.
|
||||||
* Instead of using QT_TRANSLATE_NOOP3 macros we can store strings in QMap.
|
* Instead of using QT_TRANSLATE_NOOP3 macros we can store strings in QMap.
|
||||||
* Example:
|
* Example:
|
||||||
* create map and fill up its
|
* create map and fill up its
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include "communitypage.h"
|
#include "communitypage.h"
|
||||||
#include "../../../options.h"
|
#include "../../../options.h"
|
||||||
#include "../../../core/vapplication.h"
|
#include "../../../core/vapplication.h"
|
||||||
|
#include "../../../core/vsettings.h"
|
||||||
#include <QGroupBox>
|
#include <QGroupBox>
|
||||||
#include <QLabel>
|
#include <QLabel>
|
||||||
#include <QSettings>
|
#include <QSettings>
|
||||||
|
@ -57,17 +58,17 @@ CommunityPage::CommunityPage(QWidget *parent):
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
void CommunityPage::Apply()
|
void CommunityPage::Apply()
|
||||||
{
|
{
|
||||||
qApp->getSettings()->setValue("community/server", this->server->text());
|
qApp->getSettings()->SetServer(this->server->text());
|
||||||
qApp->getSettings()->setValue("community/serverSecure", this->secureComm->isChecked());
|
qApp->getSettings()->SetServerSecure(this->secureComm->isChecked());
|
||||||
qApp->getSettings()->setValue("community/useProxy", this->useProxy->isChecked());
|
qApp->getSettings()->SetProxy(this->useProxy->isChecked());
|
||||||
qApp->getSettings()->setValue("community/proxyAddress", this->proxyAddress->text());
|
qApp->getSettings()->SetProxyAddress(this->proxyAddress->text());
|
||||||
qApp->getSettings()->setValue("community/proxyPort", this->proxyPort->text());
|
qApp->getSettings()->SetProxyPort(this->proxyPort->text());
|
||||||
qApp->getSettings()->setValue("community/proxyUser", this->proxyUser->text());
|
qApp->getSettings()->SetProxyUser(this->proxyUser->text());
|
||||||
qApp->getSettings()->setValue("community/proxyPass", this->proxyPass->text());
|
qApp->getSettings()->SetProxyPass(this->proxyPass->text());
|
||||||
|
|
||||||
qApp->getSettings()->setValue("community/username", this->username->text());
|
qApp->getSettings()->SetUsername(this->username->text());
|
||||||
qApp->getSettings()->setValue("community/savePassword", this->savePassword->isChecked());
|
qApp->getSettings()->SetSavePassword(this->savePassword->isChecked());
|
||||||
qApp->getSettings()->setValue("community/userpassword", this->userpassword->text());
|
qApp->getSettings()->SetUserPassword(this->userpassword->text());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -99,17 +100,13 @@ void CommunityPage::PasswordCheckChanged()
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
QGroupBox *CommunityPage::ServerGroup()
|
QGroupBox *CommunityPage::ServerGroup()
|
||||||
{
|
{
|
||||||
QSettings *settings = qApp->getSettings();
|
|
||||||
SCASSERT(settings != nullptr);
|
|
||||||
|
|
||||||
QGroupBox *ServerGroup = new QGroupBox(tr("Server"));
|
QGroupBox *ServerGroup = new QGroupBox(tr("Server"));
|
||||||
QFormLayout *serverLayout = new QFormLayout;
|
QFormLayout *serverLayout = new QFormLayout;
|
||||||
|
|
||||||
CommunityPage::add_lineedit(&this->server, serverLayout,
|
CommunityPage::add_lineedit(&this->server, serverLayout, qApp->getSettings()->GetServer(), tr("Server name/IP"));
|
||||||
settings->value("community/server", "community.valentina-project.org").toString(), tr("Server name/IP"));
|
|
||||||
|
|
||||||
CommunityPage::add_checkbox(&this->secureComm, serverLayout,
|
CommunityPage::add_checkbox(&this->secureComm, serverLayout, qApp->getSettings()->GetServerSecure(),
|
||||||
settings->value("community/serverSecure", 0).toBool(), tr("Secure connection"));
|
tr("Secure connection"));
|
||||||
|
|
||||||
ServerGroup->setLayout(serverLayout);
|
ServerGroup->setLayout(serverLayout);
|
||||||
return ServerGroup;
|
return ServerGroup;
|
||||||
|
@ -140,21 +137,12 @@ QGroupBox *CommunityPage::ProxyGroup()
|
||||||
|
|
||||||
QFormLayout *proxyLayout = new QFormLayout;
|
QFormLayout *proxyLayout = new QFormLayout;
|
||||||
|
|
||||||
CommunityPage::add_checkbox(&this->useProxy, proxyLayout,
|
CommunityPage::add_checkbox(&this->useProxy, proxyLayout, qApp->getSettings()->GetProxy(), tr("Use Proxy"));
|
||||||
qApp->getSettings()->value("community/useProxy", 0).toBool(), tr("Use Proxy"));
|
CommunityPage::add_lineedit(&this->proxyAddress, proxyLayout, qApp->getSettings()->GetProxyAddress(),
|
||||||
|
tr("Proxy address"));
|
||||||
CommunityPage::add_lineedit(&this->proxyAddress, proxyLayout,
|
CommunityPage::add_lineedit(&this->proxyPort, proxyLayout, qApp->getSettings()->GetProxyPort(), tr("Proxy port"));
|
||||||
qApp->getSettings()->value("community/proxyAddress", "").toString(), tr("Proxy address"));
|
CommunityPage::add_lineedit(&this->proxyUser, proxyLayout, qApp->getSettings()->GetProxyUser(), tr("Proxy user"));
|
||||||
|
CommunityPage::add_lineedit(&this->proxyPass, proxyLayout, qApp->getSettings()->GetProxyPass(), tr("Proxy pass"));
|
||||||
CommunityPage::add_lineedit(&this->proxyPort, proxyLayout,
|
|
||||||
qApp->getSettings()->value("community/proxyPort", "").toString(), tr("Proxy port"));
|
|
||||||
|
|
||||||
CommunityPage::add_lineedit(&this->proxyUser, proxyLayout,
|
|
||||||
qApp->getSettings()->value("community/proxyUser", "").toString(), tr("Proxy user"));
|
|
||||||
|
|
||||||
CommunityPage::add_lineedit(&this->proxyPass, proxyLayout,
|
|
||||||
qApp->getSettings()->value("community/proxyPass", "").toString(), tr("Proxy pass"));
|
|
||||||
|
|
||||||
connect(this->useProxy, &QCheckBox::stateChanged, this, &CommunityPage::ProxyCheckChanged);
|
connect(this->useProxy, &QCheckBox::stateChanged, this, &CommunityPage::ProxyCheckChanged);
|
||||||
this->ProxyCheckChanged();
|
this->ProxyCheckChanged();
|
||||||
|
|
||||||
|
@ -169,14 +157,11 @@ QGroupBox *CommunityPage::UserGroup()
|
||||||
QGroupBox *userGroup = new QGroupBox(tr("User settings"));
|
QGroupBox *userGroup = new QGroupBox(tr("User settings"));
|
||||||
QFormLayout *userLayout = new QFormLayout;
|
QFormLayout *userLayout = new QFormLayout;
|
||||||
|
|
||||||
CommunityPage::add_lineedit(&this->username, userLayout,
|
CommunityPage::add_lineedit(&this->username, userLayout, qApp->getSettings()->GetUsername(), tr("User Name"));
|
||||||
qApp->getSettings()->value("community/username", "").toString(), tr("User Name"));
|
CommunityPage::add_checkbox(&this->savePassword, userLayout, qApp->getSettings()->GetSavePassword(),
|
||||||
|
tr("Save password"));
|
||||||
CommunityPage::add_checkbox(&this->savePassword, userLayout,
|
CommunityPage::add_lineedit(&this->userpassword, userLayout, qApp->getSettings()->GetUserPassword(),
|
||||||
qApp->getSettings()->value("community/savePassword", 0).toBool(), tr("Save password"));
|
tr("Password"));
|
||||||
|
|
||||||
CommunityPage::add_lineedit(&this->userpassword, userLayout,
|
|
||||||
qApp->getSettings()->value("community/userpassword", "").toString(), tr("Password"));
|
|
||||||
|
|
||||||
connect(this->savePassword, &QCheckBox::stateChanged, this, &CommunityPage::PasswordCheckChanged);
|
connect(this->savePassword, &QCheckBox::stateChanged, this, &CommunityPage::PasswordCheckChanged);
|
||||||
this->PasswordCheckChanged();
|
this->PasswordCheckChanged();
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include "configurationpage.h"
|
#include "configurationpage.h"
|
||||||
#include "../../../options.h"
|
#include "../../../options.h"
|
||||||
#include "../../../core/vapplication.h"
|
#include "../../../core/vapplication.h"
|
||||||
|
#include "../../../core/vsettings.h"
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <QGroupBox>
|
#include <QGroupBox>
|
||||||
#include <QLabel>
|
#include <QLabel>
|
||||||
|
@ -62,46 +63,38 @@ ConfigurationPage::ConfigurationPage(QWidget *parent)
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
void ConfigurationPage::Apply()
|
void ConfigurationPage::Apply()
|
||||||
{
|
{
|
||||||
qApp->getSettings()->setValue("configuration/autosave/state", autoSaveCheck->isChecked());
|
qApp->getSettings()->SetAutosaveState(autoSaveCheck->isChecked());
|
||||||
qApp->getSettings()->setValue("configuration/autosave/time", autoTime->value());
|
qApp->getSettings()->SetAutosaveTime(autoTime->value());
|
||||||
|
|
||||||
QTimer *autoSaveTimer = qApp->getAutoSaveTimer();
|
QTimer *autoSaveTimer = qApp->getAutoSaveTimer();
|
||||||
SCASSERT(autoSaveTimer);
|
SCASSERT(autoSaveTimer);
|
||||||
|
|
||||||
if (autoSaveCheck->isChecked())
|
autoSaveCheck->isChecked() ? autoSaveTimer->start(autoTime->value()*60000) : autoSaveTimer->stop();
|
||||||
{
|
|
||||||
autoSaveTimer->start(autoTime->value()*60000);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
autoSaveTimer->stop();
|
|
||||||
}
|
|
||||||
|
|
||||||
qApp->getSettings()->setValue("configuration/osSeparator", osOptionCheck->isChecked());
|
qApp->getSettings()->SetOsSeparator(osOptionCheck->isChecked());
|
||||||
|
qApp->getSettings()->SetSendReportState(sendReportCheck->isChecked());
|
||||||
qApp->getSettings()->setValue("configuration/send_report/state", sendReportCheck->isChecked());
|
|
||||||
|
|
||||||
if (langChanged)
|
if (langChanged)
|
||||||
{
|
{
|
||||||
QString locale = qvariant_cast<QString>(langCombo->itemData(langCombo->currentIndex()));
|
const QString locale = qvariant_cast<QString>(langCombo->itemData(langCombo->currentIndex()));
|
||||||
qApp->getSettings()->setValue("configuration/locale", locale);
|
qApp->getSettings()->SetLocale(locale);
|
||||||
langChanged = false;
|
langChanged = false;
|
||||||
QString text = QString(tr("Setup user interface language updated and will be used the next time start") + " " +
|
const QString text = tr("Setup user interface language updated and will be used the next time start") + " " +
|
||||||
QApplication::applicationName());
|
QApplication::applicationName();
|
||||||
QMessageBox::information(this, QApplication::applicationName(), text);
|
QMessageBox::information(this, QApplication::applicationName(), text);
|
||||||
}
|
}
|
||||||
if (this->unitChanged)
|
if (this->unitChanged)
|
||||||
{
|
{
|
||||||
QString unit = qvariant_cast<QString>(this->unitCombo->itemData(this->unitCombo->currentIndex()));
|
const QString unit = qvariant_cast<QString>(this->unitCombo->itemData(this->unitCombo->currentIndex()));
|
||||||
qApp->getSettings()->setValue("configuration/unit", unit);
|
qApp->getSettings()->SetUnit(unit);
|
||||||
this->unitChanged = false;
|
this->unitChanged = false;
|
||||||
QString text = QString(tr("Default unit updated and will be used the next pattern creation"));
|
const QString text = tr("Default unit updated and will be used the next pattern creation");
|
||||||
QMessageBox::information(this, QApplication::applicationName(), text);
|
QMessageBox::information(this, QApplication::applicationName(), text);
|
||||||
}
|
}
|
||||||
if (labelLangChanged)
|
if (labelLangChanged)
|
||||||
{
|
{
|
||||||
QString locale = qvariant_cast<QString>(labelCombo->itemData(labelCombo->currentIndex()));
|
const QString locale = qvariant_cast<QString>(labelCombo->itemData(labelCombo->currentIndex()));
|
||||||
qApp->getSettings()->setValue("configuration/label_language", locale);
|
qApp->getSettings()->SetLabelLanguage(locale);
|
||||||
labelLangChanged = false;
|
labelLangChanged = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -127,31 +120,19 @@ void ConfigurationPage::LabelLangChanged()
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
QGroupBox *ConfigurationPage::SaveGroup()
|
QGroupBox *ConfigurationPage::SaveGroup()
|
||||||
{
|
{
|
||||||
QSettings *settings = qApp->getSettings();
|
|
||||||
SCASSERT(settings != nullptr);
|
|
||||||
|
|
||||||
QGroupBox *saveGroup = new QGroupBox(tr("Save"));
|
QGroupBox *saveGroup = new QGroupBox(tr("Save"));
|
||||||
|
|
||||||
autoSaveCheck = new QCheckBox(tr("Auto-save modified pattern"));
|
autoSaveCheck = new QCheckBox(tr("Auto-save modified pattern"));
|
||||||
bool autoSaveValue = settings->value("configuration/autosave/state", 1).toBool();
|
autoSaveCheck->setChecked(qApp->getSettings()->GetAutosaveState());
|
||||||
autoSaveCheck->setChecked(autoSaveValue);
|
|
||||||
|
|
||||||
QLabel *intervalLabel = new QLabel(tr("Interval:"));
|
|
||||||
|
|
||||||
autoTime = new QSpinBox();
|
autoTime = new QSpinBox();
|
||||||
bool ok = true;
|
|
||||||
qint32 autoTimeValue = settings->value("configuration/autosave/time", 1).toInt(&ok);
|
|
||||||
if (ok == false)
|
|
||||||
{
|
|
||||||
autoTimeValue = 5;
|
|
||||||
}
|
|
||||||
autoTime->setRange(1, 60);
|
autoTime->setRange(1, 60);
|
||||||
autoTime->setValue(autoTimeValue);
|
autoTime->setValue(qApp->getSettings()->GetAutosaveTime());
|
||||||
autoTime->setSuffix(tr("min"));
|
autoTime->setSuffix(tr("min"));
|
||||||
|
|
||||||
QHBoxLayout *autosaveLayout = new QHBoxLayout;
|
QHBoxLayout *autosaveLayout = new QHBoxLayout;
|
||||||
autosaveLayout->addWidget(autoSaveCheck);
|
autosaveLayout->addWidget(autoSaveCheck);
|
||||||
autosaveLayout->addWidget(intervalLabel);
|
autosaveLayout->addWidget(new QLabel(tr("Interval:")));
|
||||||
autosaveLayout->addWidget(autoTime);
|
autosaveLayout->addWidget(autoTime);
|
||||||
|
|
||||||
QVBoxLayout *saveLayout = new QVBoxLayout;
|
QVBoxLayout *saveLayout = new QVBoxLayout;
|
||||||
|
@ -163,19 +144,12 @@ QGroupBox *ConfigurationPage::SaveGroup()
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
QGroupBox *ConfigurationPage::LangGroup()
|
QGroupBox *ConfigurationPage::LangGroup()
|
||||||
{
|
{
|
||||||
QSettings *settings = qApp->getSettings();
|
|
||||||
SCASSERT(settings != nullptr);
|
|
||||||
|
|
||||||
QGroupBox *langGroup = new QGroupBox(tr("Language"));
|
QGroupBox *langGroup = new QGroupBox(tr("Language"));
|
||||||
QLabel *guiLabel = new QLabel(tr("GUI language"));
|
QLabel *guiLabel = new QLabel(tr("GUI language"));
|
||||||
langCombo = new QComboBox;
|
langCombo = new QComboBox;
|
||||||
|
|
||||||
// format systems language
|
QDir dir(qApp->translationsPath());
|
||||||
QString checkedLocale = settings->value("configuration/locale", QLocale::system().name()).toString();
|
const QStringList fileNames = dir.entryList(QStringList("valentina_*.qm"));
|
||||||
|
|
||||||
QString m_langPath = qApp->translationsPath();
|
|
||||||
QDir dir(m_langPath);
|
|
||||||
QStringList fileNames = dir.entryList(QStringList("valentina_*.qm"));
|
|
||||||
|
|
||||||
for (int i = 0; i < fileNames.size(); ++i)
|
for (int i = 0; i < fileNames.size(); ++i)
|
||||||
{
|
{
|
||||||
|
@ -198,7 +172,7 @@ QGroupBox *ConfigurationPage::LangGroup()
|
||||||
langCombo->addItem(ico, lang, "en_US");
|
langCombo->addItem(ico, lang, "en_US");
|
||||||
|
|
||||||
// set default translators and language checked
|
// set default translators and language checked
|
||||||
qint32 index = langCombo->findData(checkedLocale);
|
qint32 index = langCombo->findData(qApp->getSettings()->GetLocale());
|
||||||
if (index != -1)
|
if (index != -1)
|
||||||
{
|
{
|
||||||
langCombo->setCurrentIndex(index);
|
langCombo->setCurrentIndex(index);
|
||||||
|
@ -214,8 +188,7 @@ QGroupBox *ConfigurationPage::LangGroup()
|
||||||
QLabel *separatorLabel = new QLabel(tr("Decimal separator parts"));
|
QLabel *separatorLabel = new QLabel(tr("Decimal separator parts"));
|
||||||
|
|
||||||
osOptionCheck = new QCheckBox(tr("With OS options (%1)").arg(QLocale::system().decimalPoint().toLatin1()));
|
osOptionCheck = new QCheckBox(tr("With OS options (%1)").arg(QLocale::system().decimalPoint().toLatin1()));
|
||||||
bool osOptionValue = settings->value("configuration/osSeparator", 1).toBool();
|
osOptionCheck->setChecked(qApp->getSettings()->GetOsSeparator());
|
||||||
osOptionCheck->setChecked(osOptionValue);
|
|
||||||
|
|
||||||
QHBoxLayout *separatorLayout = new QHBoxLayout;
|
QHBoxLayout *separatorLayout = new QHBoxLayout;
|
||||||
separatorLayout->addWidget(separatorLabel);
|
separatorLayout->addWidget(separatorLabel);
|
||||||
|
@ -225,14 +198,12 @@ QGroupBox *ConfigurationPage::LangGroup()
|
||||||
this->unitCombo = new QComboBox;
|
this->unitCombo = new QComboBox;
|
||||||
QLabel *unitLabel = new QLabel(tr("Default unit"));
|
QLabel *unitLabel = new QLabel(tr("Default unit"));
|
||||||
|
|
||||||
QString checkedUnit = settings->value("configuration/unit", "cm").toString();
|
|
||||||
|
|
||||||
this->unitCombo->addItem(tr("Centimeters"), "cm");
|
this->unitCombo->addItem(tr("Centimeters"), "cm");
|
||||||
this->unitCombo->addItem(tr("Millimiters"), "mm");
|
this->unitCombo->addItem(tr("Millimiters"), "mm");
|
||||||
this->unitCombo->addItem(tr("Inches"), "in");
|
this->unitCombo->addItem(tr("Inches"), "in");
|
||||||
|
|
||||||
// set default unit
|
// set default unit
|
||||||
qint32 indexUnit = this->unitCombo->findData(checkedUnit);
|
qint32 indexUnit = this->unitCombo->findData(qApp->getSettings()->GetUnit());
|
||||||
if (indexUnit != -1)
|
if (indexUnit != -1)
|
||||||
{
|
{
|
||||||
this->unitCombo->setCurrentIndex(indexUnit);
|
this->unitCombo->setCurrentIndex(indexUnit);
|
||||||
|
@ -249,12 +220,9 @@ QGroupBox *ConfigurationPage::LangGroup()
|
||||||
QLabel *labelName = new QLabel(tr("Label language"));
|
QLabel *labelName = new QLabel(tr("Label language"));
|
||||||
labelCombo = new QComboBox;
|
labelCombo = new QComboBox;
|
||||||
|
|
||||||
QString checkedLabelLocale = settings->value("configuration/label_language",
|
|
||||||
QLocale::system().bcp47Name()).toString();
|
|
||||||
|
|
||||||
SetLabelComboBox(VApplication::LabelLanguages());
|
SetLabelComboBox(VApplication::LabelLanguages());
|
||||||
|
|
||||||
index = labelCombo->findData(checkedLabelLocale);
|
index = labelCombo->findData(qApp->getSettings()->GetLabelLanguage());
|
||||||
if (index != -1)
|
if (index != -1)
|
||||||
{
|
{
|
||||||
labelCombo->setCurrentIndex(index);
|
labelCombo->setCurrentIndex(index);
|
||||||
|
@ -281,14 +249,10 @@ QGroupBox *ConfigurationPage::LangGroup()
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
QGroupBox *ConfigurationPage::SendGroup()
|
QGroupBox *ConfigurationPage::SendGroup()
|
||||||
{
|
{
|
||||||
QSettings *settings = qApp->getSettings();
|
|
||||||
SCASSERT(settings != nullptr);
|
|
||||||
|
|
||||||
QGroupBox *sendGroup = new QGroupBox(tr("Send crash reports"));
|
QGroupBox *sendGroup = new QGroupBox(tr("Send crash reports"));
|
||||||
|
|
||||||
sendReportCheck = new QCheckBox(tr("Send crash reports (recommended)"));
|
sendReportCheck = new QCheckBox(tr("Send crash reports (recommended)"));
|
||||||
bool sendReportValue = settings->value("configuration/send_report/state", 1).toBool();
|
sendReportCheck->setChecked(qApp->getSettings()->GetSendReportState());
|
||||||
sendReportCheck->setChecked(sendReportValue);
|
|
||||||
|
|
||||||
QLabel *description = new QLabel(tr("After each crash Valentina collect information that may help us fix a "
|
QLabel *description = new QLabel(tr("After each crash Valentina collect information that may help us fix a "
|
||||||
"problem. We do not collect any personal information. Find more about what "
|
"problem. We do not collect any personal information. Find more about what "
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include "pathpage.h"
|
#include "pathpage.h"
|
||||||
#include "../../../options.h"
|
#include "../../../options.h"
|
||||||
#include "../../../core/vapplication.h"
|
#include "../../../core/vapplication.h"
|
||||||
|
#include "../../../core/vsettings.h"
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <QGroupBox>
|
#include <QGroupBox>
|
||||||
#include <QLabel>
|
#include <QLabel>
|
||||||
|
@ -61,8 +62,8 @@ PathPage::PathPage(QWidget *parent)
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
void PathPage::Apply()
|
void PathPage::Apply()
|
||||||
{
|
{
|
||||||
qApp->getSettings()->setValue("paths/individual_measurements", pathTable->item(0, 1)->text());
|
qApp->getSettings()->SetPathIndividualMeasurements(pathTable->item(0, 1)->text());
|
||||||
qApp->getSettings()->setValue("paths/pattern", pathTable->item(1, 1)->text());
|
qApp->getSettings()->SetPathPattern(pathTable->item(1, 1)->text());
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
@ -138,15 +139,11 @@ void PathPage::InitTable()
|
||||||
QStringList tableHeader = QStringList() << tr("Type") << tr("Path");
|
QStringList tableHeader = QStringList() << tr("Type") << tr("Path");
|
||||||
pathTable->setHorizontalHeaderLabels(tableHeader);
|
pathTable->setHorizontalHeaderLabels(tableHeader);
|
||||||
|
|
||||||
QString path;
|
|
||||||
|
|
||||||
pathTable->setItem(0, 0, new QTableWidgetItem(tr("Individual measurements")));
|
pathTable->setItem(0, 0, new QTableWidgetItem(tr("Individual measurements")));
|
||||||
path = qApp->getSettings()->value("paths/individual_measurements", QDir::homePath()).toString();
|
pathTable->setItem(0, 1, new QTableWidgetItem(qApp->getSettings()->GetPathIndividualMeasurements()));
|
||||||
pathTable->setItem(0, 1, new QTableWidgetItem(path));
|
|
||||||
|
|
||||||
pathTable->setItem(1, 0, new QTableWidgetItem(tr("Patterns")));
|
pathTable->setItem(1, 0, new QTableWidgetItem(tr("Patterns")));
|
||||||
path = qApp->getSettings()->value("paths/pattern", QDir::homePath()).toString();
|
pathTable->setItem(1, 1, new QTableWidgetItem(qApp->getSettings()->GetPathPattern()));
|
||||||
pathTable->setItem(1, 1, new QTableWidgetItem(path));
|
|
||||||
|
|
||||||
pathTable->verticalHeader()->setDefaultSectionSize(20);
|
pathTable->verticalHeader()->setDefaultSectionSize(20);
|
||||||
pathTable->resizeColumnsToContents();
|
pathTable->resizeColumnsToContents();
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include "patternpage.h"
|
#include "patternpage.h"
|
||||||
#include "../../../options.h"
|
#include "../../../options.h"
|
||||||
#include "../../../core/vapplication.h"
|
#include "../../../core/vapplication.h"
|
||||||
|
#include "../../../core/vsettings.h"
|
||||||
#include "../../../widgets/vmaingraphicsview.h"
|
#include "../../../widgets/vmaingraphicsview.h"
|
||||||
#include <QGroupBox>
|
#include <QGroupBox>
|
||||||
#include <QLabel>
|
#include <QLabel>
|
||||||
|
@ -57,35 +58,27 @@ PatternPage::PatternPage(QWidget *parent):
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
void PatternPage::Apply()
|
void PatternPage::Apply()
|
||||||
{
|
{
|
||||||
qApp->getSettings()->setValue("pattern/user", userName->text());
|
qApp->getSettings()->SetUser(userName->text());
|
||||||
|
|
||||||
// Scene antialiasing
|
// Scene antialiasing
|
||||||
qApp->getSettings()->setValue("pattern/graphicalOutput", graphOutputCheck->isChecked());
|
qApp->getSettings()->SetGraphicalOutput(graphOutputCheck->isChecked());
|
||||||
qApp->getSceneView()->setRenderHint(QPainter::Antialiasing, graphOutputCheck->isChecked());
|
qApp->getSceneView()->setRenderHint(QPainter::Antialiasing, graphOutputCheck->isChecked());
|
||||||
qApp->getSceneView()->setRenderHint(QPainter::SmoothPixmapTransform, graphOutputCheck->isChecked());
|
qApp->getSceneView()->setRenderHint(QPainter::SmoothPixmapTransform, graphOutputCheck->isChecked());
|
||||||
|
|
||||||
/* Maximum number of commands in undo stack may only be set when the undo stack is empty, since setting it on a
|
/* Maximum number of commands in undo stack may only be set when the undo stack is empty, since setting it on a
|
||||||
* non-empty stack might delete the command at the current index. Calling setUndoLimit() on a non-empty stack
|
* non-empty stack might delete the command at the current index. Calling setUndoLimit() on a non-empty stack
|
||||||
* prints a warning and does nothing.*/
|
* prints a warning and does nothing.*/
|
||||||
qApp->getSettings()->setValue("pattern/undo", undoCount->value());
|
qApp->getSettings()->SetUndoCount(undoCount->value());
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
QGroupBox *PatternPage::UserGroup()
|
QGroupBox *PatternPage::UserGroup()
|
||||||
{
|
{
|
||||||
QSettings *settings = qApp->getSettings();
|
|
||||||
SCASSERT(settings != nullptr);
|
|
||||||
|
|
||||||
QGroupBox *userGroup = new QGroupBox(tr("User"));
|
QGroupBox *userGroup = new QGroupBox(tr("User"));
|
||||||
QLabel *nameLabel = new QLabel(tr("User name"));
|
QLabel *nameLabel = new QLabel(tr("User name"));
|
||||||
|
|
||||||
userName = new QLineEdit;
|
userName = new QLineEdit;
|
||||||
#ifdef Q_OS_WIN
|
userName->setText(qApp->getSettings()->GetUser());
|
||||||
QString user = settings->value("pattern/user", QString::fromLocal8Bit(qgetenv("USERNAME").constData())).toString();
|
|
||||||
#else
|
|
||||||
QString user = settings->value("pattern/user", QString::fromLocal8Bit(qgetenv("USER").constData())).toString();
|
|
||||||
#endif
|
|
||||||
userName->setText(user);
|
|
||||||
|
|
||||||
QHBoxLayout *nameLayout = new QHBoxLayout;
|
QHBoxLayout *nameLayout = new QHBoxLayout;
|
||||||
nameLayout->addWidget(nameLabel);
|
nameLayout->addWidget(nameLabel);
|
||||||
|
@ -103,8 +96,7 @@ QGroupBox *PatternPage::GraphOutputGroup()
|
||||||
QGroupBox *graphOutputGroup = new QGroupBox(tr("Graphical output"));
|
QGroupBox *graphOutputGroup = new QGroupBox(tr("Graphical output"));
|
||||||
|
|
||||||
graphOutputCheck = new QCheckBox(tr("Use antialiasing"));
|
graphOutputCheck = new QCheckBox(tr("Use antialiasing"));
|
||||||
bool graphOutputValue = qApp->getSettings()->value("pattern/graphicalOutput", 1).toBool();
|
graphOutputCheck->setChecked(qApp->getSettings()->GetGraphicalOutput());
|
||||||
graphOutputCheck->setChecked(graphOutputValue);
|
|
||||||
|
|
||||||
QHBoxLayout *graphLayout = new QHBoxLayout;
|
QHBoxLayout *graphLayout = new QHBoxLayout;
|
||||||
graphLayout->addWidget(graphOutputCheck);
|
graphLayout->addWidget(graphOutputCheck);
|
||||||
|
@ -122,13 +114,7 @@ QGroupBox *PatternPage::UndoGroup()
|
||||||
QLabel *undoLabel = new QLabel(tr("Count steps (0 - no limit)"));
|
QLabel *undoLabel = new QLabel(tr("Count steps (0 - no limit)"));
|
||||||
undoCount = new QSpinBox;
|
undoCount = new QSpinBox;
|
||||||
undoCount->setMinimum(0);
|
undoCount->setMinimum(0);
|
||||||
bool ok = true;
|
undoCount->setValue(qApp->getSettings()->GetUndoCount());
|
||||||
qint32 count = qApp->getSettings()->value("pattern/undo", 0).toInt(&ok);
|
|
||||||
if (ok == false)
|
|
||||||
{
|
|
||||||
count = 0;
|
|
||||||
}
|
|
||||||
undoCount->setValue(count);
|
|
||||||
|
|
||||||
QHBoxLayout *countLayout = new QHBoxLayout;
|
QHBoxLayout *countLayout = new QHBoxLayout;
|
||||||
countLayout->addWidget(undoLabel);
|
countLayout->addWidget(undoLabel);
|
||||||
|
|
|
@ -201,7 +201,7 @@ QString DialogHistory::Record(const VToolRecord &tool)
|
||||||
if (domElem.isElement() == false)
|
if (domElem.isElement() == false)
|
||||||
{
|
{
|
||||||
qDebug()<<"Can't find element by id"<<Q_FUNC_INFO;
|
qDebug()<<"Can't find element by id"<<Q_FUNC_INFO;
|
||||||
return QString(tr("Can't create record."));
|
return tr("Can't create record.");
|
||||||
}
|
}
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -291,7 +291,7 @@ QString DialogHistory::Record(const VToolRecord &tool)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
qDebug()<<"Not enough points in splinepath"<<Q_FUNC_INFO;
|
qDebug()<<"Not enough points in splinepath"<<Q_FUNC_INFO;
|
||||||
return QString(tr("Can't create record."));
|
return tr("Can't create record.");
|
||||||
}
|
}
|
||||||
return record;
|
return record;
|
||||||
}
|
}
|
||||||
|
@ -397,14 +397,14 @@ QString DialogHistory::Record(const VToolRecord &tool)
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
qDebug()<<"Got wrong tool type. Ignore.";
|
qDebug()<<"Got wrong tool type. Ignore.";
|
||||||
return QString(tr("Can't create record."));
|
return tr("Can't create record.");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (const VExceptionBadId &e)
|
catch (const VExceptionBadId &e)
|
||||||
{
|
{
|
||||||
qDebug()<<e.ErrorMessage()<<Q_FUNC_INFO;
|
qDebug()<<e.ErrorMessage()<<Q_FUNC_INFO;
|
||||||
return QString(tr("Can't create record."));
|
return tr("Can't create record.");
|
||||||
}
|
}
|
||||||
return QString();
|
return QString();
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include "../../widgets/textdelegate.h"
|
#include "../../widgets/textdelegate.h"
|
||||||
#include "../../xml/vstandardmeasurements.h"
|
#include "../../xml/vstandardmeasurements.h"
|
||||||
#include "../../xml/vindividualmeasurements.h"
|
#include "../../xml/vindividualmeasurements.h"
|
||||||
|
#include "../../core/vsettings.h"
|
||||||
|
|
||||||
#include <QFileDialog>
|
#include <QFileDialog>
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
|
@ -54,8 +55,10 @@ DialogIncrements::DialogIncrements(VContainer *data, VPattern *doc, QWidget *par
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
|
||||||
|
qCDebug(vDialog)<<"Showing variables.";
|
||||||
if (qApp->patternType() == MeasurementsType::Individual)
|
if (qApp->patternType() == MeasurementsType::Individual)
|
||||||
{
|
{
|
||||||
|
qCDebug(vDialog)<<"Pattern with individual measurements.";
|
||||||
const QString filePath = doc->MPath();
|
const QString filePath = doc->MPath();
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -510,7 +513,7 @@ void DialogIncrements::OpenTable()
|
||||||
const QString filter(tr("Individual measurements (*.vit)"));
|
const QString filter(tr("Individual measurements (*.vit)"));
|
||||||
|
|
||||||
//Use standard path to individual measurements
|
//Use standard path to individual measurements
|
||||||
QString path = qApp->getSettings()->value("paths/individual_measurements", QDir::homePath()).toString();
|
const QString path = qApp->getSettings()->GetPathIndividualMeasurements();
|
||||||
|
|
||||||
const QString filePath = QFileDialog::getOpenFileName(this, tr("Open file"), path, filter);
|
const QString filePath = QFileDialog::getOpenFileName(this, tr("Open file"), path, filter);
|
||||||
if (filePath.isEmpty())
|
if (filePath.isEmpty())
|
||||||
|
@ -598,6 +601,7 @@ void DialogIncrements::OpenTable()
|
||||||
*/
|
*/
|
||||||
void DialogIncrements::clickedToolButtonAdd()
|
void DialogIncrements::clickedToolButtonAdd()
|
||||||
{
|
{
|
||||||
|
qCDebug(vDialog)<<"Add new increment";
|
||||||
ui->tableWidgetIncrement->setFocus(Qt::OtherFocusReason);
|
ui->tableWidgetIncrement->setFocus(Qt::OtherFocusReason);
|
||||||
ui->tableWidgetIncrement->blockSignals(true);
|
ui->tableWidgetIncrement->blockSignals(true);
|
||||||
qint32 currentRow = ui->tableWidgetIncrement->rowCount();
|
qint32 currentRow = ui->tableWidgetIncrement->rowCount();
|
||||||
|
@ -666,6 +670,7 @@ void DialogIncrements::clickedToolButtonRemove()
|
||||||
qint32 row = item->row();
|
qint32 row = item->row();
|
||||||
|
|
||||||
QTableWidgetItem *itemName = ui->tableWidgetIncrement->item(row, 0);
|
QTableWidgetItem *itemName = ui->tableWidgetIncrement->item(row, 0);
|
||||||
|
qCDebug(vDialog)<<"Remove increment"<<itemName->text();
|
||||||
data->RemoveIncrement(itemName->text());
|
data->RemoveIncrement(itemName->text());
|
||||||
|
|
||||||
quint32 id = qvariant_cast<quint32>(itemName->data(Qt::UserRole));
|
quint32 id = qvariant_cast<quint32>(itemName->data(Qt::UserRole));
|
||||||
|
@ -675,6 +680,10 @@ void DialogIncrements::clickedToolButtonRemove()
|
||||||
QDomNodeList list = doc->elementsByTagName(VPattern::TagIncrements);
|
QDomNodeList list = doc->elementsByTagName(VPattern::TagIncrements);
|
||||||
list.at(0).removeChild(domElement);
|
list.at(0).removeChild(domElement);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
qCDebug(vDialog)<<"Could not find object with id"<<id;
|
||||||
|
}
|
||||||
|
|
||||||
ui->tableWidgetIncrement->removeRow(row);
|
ui->tableWidgetIncrement->removeRow(row);
|
||||||
if (ui->tableWidgetIncrement->rowCount() == 0)
|
if (ui->tableWidgetIncrement->rowCount() == 0)
|
||||||
|
@ -699,6 +708,9 @@ void DialogIncrements::clickedToolButtonRemove()
|
||||||
void DialogIncrements::AddIncrementToFile(const quint32 &id, const QString &name, const qreal &base, const qreal &ksize,
|
void DialogIncrements::AddIncrementToFile(const quint32 &id, const QString &name, const qreal &base, const qreal &ksize,
|
||||||
const qreal &kheight, const QString &description)
|
const qreal &kheight, const QString &description)
|
||||||
{
|
{
|
||||||
|
qCDebug(vDialog)<<"Saving new increment to file.";
|
||||||
|
qCDebug(vDialog)<<QString("Increment: id(%1), name(%2), base(%3), ksize(%4), kheight(%5), description(%6)")
|
||||||
|
.arg(id).arg(name).arg(base).arg(ksize).arg(kheight).arg(description);
|
||||||
QDomElement element = doc->createElement(VPattern::TagIncrement);
|
QDomElement element = doc->createElement(VPattern::TagIncrement);
|
||||||
|
|
||||||
doc->SetAttribute(element, VDomDocument::AttrId, id);
|
doc->SetAttribute(element, VDomDocument::AttrId, id);
|
||||||
|
@ -730,42 +742,47 @@ void DialogIncrements::HideColumns(QTableWidget *table)
|
||||||
*/
|
*/
|
||||||
void DialogIncrements::IncrementChanged ( qint32 row, qint32 column )
|
void DialogIncrements::IncrementChanged ( qint32 row, qint32 column )
|
||||||
{
|
{
|
||||||
|
qCDebug(vDialog)<<"Increment changed.";
|
||||||
const QTableWidgetItem *itemName = ui->tableWidgetIncrement->item(row, 0);
|
const QTableWidgetItem *itemName = ui->tableWidgetIncrement->item(row, 0);
|
||||||
const QTableWidgetItem *item = ui->tableWidgetIncrement->item(row, column);
|
const QTableWidgetItem *item = ui->tableWidgetIncrement->item(row, column);
|
||||||
const quint32 id = qvariant_cast<quint32>(itemName->data(Qt::UserRole));
|
const quint32 id = qvariant_cast<quint32>(itemName->data(Qt::UserRole));
|
||||||
QDomElement domElement = doc->elementById(QString().setNum(id));
|
QDomElement domElement = doc->elementById(QString().setNum(id));
|
||||||
if (domElement.isElement() == false)
|
if (domElement.isElement() == false)
|
||||||
{
|
{
|
||||||
qDebug()<<"Cant't find increment with id = "<<id<<Q_FUNC_INFO;
|
qCDebug(vDialog)<<"Cant't find increment with id = "<<id<<Q_FUNC_INFO;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this->row = row;
|
this->row = row;
|
||||||
switch (column)
|
switch (column)
|
||||||
{
|
{
|
||||||
case 0: // VPattern::IncrementName
|
case 0: // VPattern::IncrementName
|
||||||
|
qCDebug(vDialog)<<"Changed name to"<<item->text();
|
||||||
doc->SetAttribute(domElement, VPattern::IncrementName, item->text());
|
doc->SetAttribute(domElement, VPattern::IncrementName, item->text());
|
||||||
data->ClearVariables(VarType::Increment);
|
data->ClearVariables(VarType::Increment);
|
||||||
this->column = 2;
|
this->column = 2;
|
||||||
emit FullUpdateTree(Document::LiteParse);
|
emit FullUpdateTree(Document::LiteParse);
|
||||||
break;
|
break;
|
||||||
case 2: // VPattern::IncrementBase
|
case 2: // VPattern::IncrementBase
|
||||||
|
qCDebug(vDialog)<<"Changed base to"<<item->text();
|
||||||
doc->SetAttribute(domElement, VPattern::IncrementBase, item->text());
|
doc->SetAttribute(domElement, VPattern::IncrementBase, item->text());
|
||||||
this->column = 3;
|
this->column = 3;
|
||||||
emit FullUpdateTree(Document::LiteParse);
|
emit FullUpdateTree(Document::LiteParse);
|
||||||
break;
|
break;
|
||||||
case 3: // VPattern::IncrementKsize
|
case 3: // VPattern::IncrementKsize
|
||||||
|
qCDebug(vDialog)<<"Changed ksize to"<<item->text();
|
||||||
doc->SetAttribute(domElement, VPattern::IncrementKsize, item->text());
|
doc->SetAttribute(domElement, VPattern::IncrementKsize, item->text());
|
||||||
this->column = 4;
|
this->column = 4;
|
||||||
emit FullUpdateTree(Document::LiteParse);
|
emit FullUpdateTree(Document::LiteParse);
|
||||||
break;
|
break;
|
||||||
case 4: // VPattern::IncrementKgrowth
|
case 4: // VPattern::IncrementKgrowth
|
||||||
|
qCDebug(vDialog)<<"Changed kheight to"<<item->text();
|
||||||
doc->SetAttribute(domElement, VPattern::IncrementKgrowth, item->text());
|
doc->SetAttribute(domElement, VPattern::IncrementKgrowth, item->text());
|
||||||
this->column = 5;
|
this->column = 5;
|
||||||
emit FullUpdateTree(Document::LiteParse);
|
emit FullUpdateTree(Document::LiteParse);
|
||||||
break;
|
break;
|
||||||
case 5: // VPattern::IncrementDescription
|
case 5: // VPattern::IncrementDescription
|
||||||
{
|
{
|
||||||
|
qCDebug(vDialog)<<"Changed description to"<<item->text();
|
||||||
doc->SetAttribute(domElement, VPattern::IncrementDescription, item->text());
|
doc->SetAttribute(domElement, VPattern::IncrementDescription, item->text());
|
||||||
QSharedPointer<VIncrement> incr = data->GetVariable<VIncrement>(itemName->text());
|
QSharedPointer<VIncrement> incr = data->GetVariable<VIncrement>(itemName->text());
|
||||||
incr->SetDescription(item->text());
|
incr->SetDescription(item->text());
|
||||||
|
@ -785,6 +802,7 @@ void DialogIncrements::IncrementChanged ( qint32 row, qint32 column )
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
void DialogIncrements::MeasurementChanged(qint32 row, qint32 column)
|
void DialogIncrements::MeasurementChanged(qint32 row, qint32 column)
|
||||||
{
|
{
|
||||||
|
qCDebug(vDialog)<<"Measurement changed.";
|
||||||
switch (column)
|
switch (column)
|
||||||
{
|
{
|
||||||
case 2:// value column
|
case 2:// value column
|
||||||
|
@ -798,7 +816,7 @@ void DialogIncrements::MeasurementChanged(qint32 row, qint32 column)
|
||||||
QDomElement domElement = list.at(0).toElement();
|
QDomElement domElement = list.at(0).toElement();
|
||||||
if (domElement.isElement() == false)
|
if (domElement.isElement() == false)
|
||||||
{
|
{
|
||||||
qDebug()<<"Can't find measurement "<<tag<<Q_FUNC_INFO;
|
qCDebug(vDialog)<<"Can't find measurement "<<tag<<Q_FUNC_INFO;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -808,12 +826,13 @@ void DialogIncrements::MeasurementChanged(qint32 row, qint32 column)
|
||||||
{
|
{
|
||||||
measur->SetBase(0);
|
measur->SetBase(0);
|
||||||
item->setText("0");
|
item->setText("0");
|
||||||
qDebug()<<"Can't convert toDouble measurement value"<<Q_FUNC_INFO;
|
qCDebug(vDialog)<<"Can't convert toDouble measurement value"<<Q_FUNC_INFO;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
measur->SetBase(base);
|
measur->SetBase(base);
|
||||||
}
|
}
|
||||||
|
qCDebug(vDialog)<<"Changed value to"<<base;
|
||||||
|
|
||||||
// Convert value to measurements table unit
|
// Convert value to measurements table unit
|
||||||
base = VAbstractMeasurements::UnitConvertor(base, qApp->patternUnit(), m->MUnit());
|
base = VAbstractMeasurements::UnitConvertor(base, qApp->patternUnit(), m->MUnit());
|
||||||
|
|
|
@ -29,13 +29,15 @@
|
||||||
#include "dialogindividualmeasurements.h"
|
#include "dialogindividualmeasurements.h"
|
||||||
#include "ui_dialogindividualmeasurements.h"
|
#include "ui_dialogindividualmeasurements.h"
|
||||||
#include "../../xml/vindividualmeasurements.h"
|
#include "../../xml/vindividualmeasurements.h"
|
||||||
|
#include "../../core/vapplication.h"
|
||||||
|
#include "../../core/vsettings.h"
|
||||||
|
#include "../../container/vcontainer.h"
|
||||||
|
|
||||||
#include <QFileDialog>
|
#include <QFileDialog>
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
#include <QPushButton>
|
#include <QPushButton>
|
||||||
#include <QSettings>
|
#include <QSettings>
|
||||||
#include <QDesktopWidget>
|
#include <QDesktopWidget>
|
||||||
#include "../../core/vapplication.h"
|
|
||||||
#include "../../container/vcontainer.h"
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
DialogIndividualMeasurements::DialogIndividualMeasurements(VContainer *data, const QString &patternPieceName,
|
DialogIndividualMeasurements::DialogIndividualMeasurements(VContainer *data, const QString &patternPieceName,
|
||||||
|
@ -195,7 +197,7 @@ void DialogIndividualMeasurements::CheckState()
|
||||||
void DialogIndividualMeasurements::OpenTable()
|
void DialogIndividualMeasurements::OpenTable()
|
||||||
{
|
{
|
||||||
const QString filter(tr("Individual measurements (*.vit)"));
|
const QString filter(tr("Individual measurements (*.vit)"));
|
||||||
QString path = qApp->getSettings()->value("paths/individual_measurements", QDir::homePath()).toString();
|
const QString path = qApp->getSettings()->GetPathIndividualMeasurements();
|
||||||
|
|
||||||
QString fileName = QFileDialog::getOpenFileName(this, tr("Open file"), path, filter);
|
QString fileName = QFileDialog::getOpenFileName(this, tr("Open file"), path, filter);
|
||||||
if (fileName.isEmpty())
|
if (fileName.isEmpty())
|
||||||
|
@ -251,9 +253,8 @@ void DialogIndividualMeasurements::InitUnits()
|
||||||
ui->comboBoxUnits->addItem(tr("Millimiters"), QVariant(VDomDocument::UnitsToStr(Unit::Mm)));
|
ui->comboBoxUnits->addItem(tr("Millimiters"), QVariant(VDomDocument::UnitsToStr(Unit::Mm)));
|
||||||
ui->comboBoxUnits->addItem(tr("Inches"), QVariant(VDomDocument::UnitsToStr(Unit::Inch)));
|
ui->comboBoxUnits->addItem(tr("Inches"), QVariant(VDomDocument::UnitsToStr(Unit::Inch)));
|
||||||
|
|
||||||
const QString checkedUnit = qApp->getSettings()->value("configuration/unit", "cm").toString();
|
|
||||||
// set default unit
|
// set default unit
|
||||||
const qint32 indexUnit = ui->comboBoxUnits->findData(checkedUnit);
|
const qint32 indexUnit = ui->comboBoxUnits->findData(qApp->getSettings()->GetUnit());
|
||||||
if (indexUnit != -1)
|
if (indexUnit != -1)
|
||||||
{
|
{
|
||||||
ui->comboBoxUnits->setCurrentIndex(indexUnit);
|
ui->comboBoxUnits->setCurrentIndex(indexUnit);
|
||||||
|
|
|
@ -90,7 +90,7 @@
|
||||||
<item alignment="Qt::AlignHCenter">
|
<item alignment="Qt::AlignHCenter">
|
||||||
<widget class="QLabel" name="label_2">
|
<widget class="QLabel" name="label_2">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||||
<horstretch>0</horstretch>
|
<horstretch>0</horstretch>
|
||||||
<verstretch>0</verstretch>
|
<verstretch>0</verstretch>
|
||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
|
@ -139,7 +139,7 @@
|
||||||
<item alignment="Qt::AlignHCenter">
|
<item alignment="Qt::AlignHCenter">
|
||||||
<widget class="QLabel" name="label_4">
|
<widget class="QLabel" name="label_4">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||||
<horstretch>0</horstretch>
|
<horstretch>0</horstretch>
|
||||||
<verstretch>0</verstretch>
|
<verstretch>0</verstretch>
|
||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
|
|
|
@ -458,7 +458,7 @@ void DialogPatternXmlEdit::ButtonApplyChangesClicked()
|
||||||
Changes += currentChange->element->GettreeNodeName();
|
Changes += currentChange->element->GettreeNodeName();
|
||||||
Changes += "/";
|
Changes += "/";
|
||||||
Changes += (currentChange->element->GettreeNodeValueSet()) ?
|
Changes += (currentChange->element->GettreeNodeValueSet()) ?
|
||||||
currentChange->element->GettreeNodeValue(): QString(tr("<no value>"));
|
currentChange->element->GettreeNodeValue(): tr("<no value>");
|
||||||
Changes += "\n";
|
Changes += "\n";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -466,9 +466,9 @@ void DialogPatternXmlEdit::ButtonApplyChangesClicked()
|
||||||
if (currentChange->type == DialogPatternXmlEdit::ChangeTypeModify)
|
if (currentChange->type == DialogPatternXmlEdit::ChangeTypeModify)
|
||||||
{
|
{
|
||||||
Changes += QString("Modified type %1 : ").arg(nodetype);
|
Changes += QString("Modified type %1 : ").arg(nodetype);
|
||||||
Changes += (currentChange->changedText) ? *currentChange->newText : QString(tr("Unchanged"));
|
Changes += (currentChange->changedText) ? *currentChange->newText : tr("Unchanged");
|
||||||
Changes += "/";
|
Changes += "/";
|
||||||
Changes += (currentChange->changedValue) ? *currentChange->newValue: QString(tr("Unchanged"));
|
Changes += (currentChange->changedValue) ? *currentChange->newValue: tr("Unchanged");
|
||||||
Changes += "\n";
|
Changes += "\n";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -479,7 +479,7 @@ void DialogPatternXmlEdit::ButtonApplyChangesClicked()
|
||||||
Changes += currentChange->element->GettreeNodeName();
|
Changes += currentChange->element->GettreeNodeName();
|
||||||
Changes += "/";
|
Changes += "/";
|
||||||
Changes += (currentChange->element->GettreeNodeValueSet()) ?
|
Changes += (currentChange->element->GettreeNodeValueSet()) ?
|
||||||
currentChange->element->GettreeNodeValue(): QString(tr("<no value>"));
|
currentChange->element->GettreeNodeValue(): tr("<no value>");
|
||||||
Changes += "\n";
|
Changes += "\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,9 @@
|
||||||
#include "../../xml/vstandardmeasurements.h"
|
#include "../../xml/vstandardmeasurements.h"
|
||||||
#include "../../core/vapplication.h"
|
#include "../../core/vapplication.h"
|
||||||
#include "../../container/vcontainer.h"
|
#include "../../container/vcontainer.h"
|
||||||
|
#include <QLoggingCategory>
|
||||||
|
|
||||||
|
Q_LOGGING_CATEGORY(vStMeasur, "v.st.measurements")
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
DialogStandardMeasurements::DialogStandardMeasurements(VContainer *data, const QString &patternPieceName,
|
DialogStandardMeasurements::DialogStandardMeasurements(VContainer *data, const QString &patternPieceName,
|
||||||
|
@ -57,6 +60,7 @@ DialogStandardMeasurements::DialogStandardMeasurements(VContainer *data, const Q
|
||||||
connect(bCansel, &QPushButton::clicked, this, &DialogStandardMeasurements::DialogRejected);
|
connect(bCansel, &QPushButton::clicked, this, &DialogStandardMeasurements::DialogRejected);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qCDebug(vStMeasur)<<"Pattern piece name"<<_name;
|
||||||
ui->lineEditName->setText(_name);
|
ui->lineEditName->setText(_name);
|
||||||
|
|
||||||
LoadStandardTables();
|
LoadStandardTables();
|
||||||
|
@ -143,6 +147,7 @@ void DialogStandardMeasurements::CheckState()
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
void DialogStandardMeasurements::LoadStandardTables()
|
void DialogStandardMeasurements::LoadStandardTables()
|
||||||
{
|
{
|
||||||
|
qCDebug(vStMeasur)<<"Loading standard table.";
|
||||||
QStringList filters{"*.vst"};
|
QStringList filters{"*.vst"};
|
||||||
QDir tablesDir(qApp->pathToTables());
|
QDir tablesDir(qApp->pathToTables());
|
||||||
tablesDir.setNameFilters(filters);
|
tablesDir.setNameFilters(filters);
|
||||||
|
@ -151,11 +156,13 @@ void DialogStandardMeasurements::LoadStandardTables()
|
||||||
const QStringList allFiles = tablesDir.entryList(QDir::NoDotAndDotDot | QDir::Files);
|
const QStringList allFiles = tablesDir.entryList(QDir::NoDotAndDotDot | QDir::Files);
|
||||||
if (allFiles.isEmpty() == true)
|
if (allFiles.isEmpty() == true)
|
||||||
{
|
{
|
||||||
|
qCDebug(vStMeasur)<<"Can't find standard measurements in path"<<qApp->pathToTables();
|
||||||
ui->comboBoxTables->clear();
|
ui->comboBoxTables->clear();
|
||||||
CheckState();
|
CheckState();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qCDebug(vStMeasur)<<"Was found"<<allFiles.size()<<"tables.";
|
||||||
for (int i = 0; i < allFiles.size(); ++i)
|
for (int i = 0; i < allFiles.size(); ++i)
|
||||||
{
|
{
|
||||||
QFileInfo fi(allFiles.at(i));
|
QFileInfo fi(allFiles.at(i));
|
||||||
|
@ -166,24 +173,27 @@ void DialogStandardMeasurements::LoadStandardTables()
|
||||||
m.setContent(fi.absoluteFilePath());
|
m.setContent(fi.absoluteFilePath());
|
||||||
if (m.MUnit() == Unit::Inch)
|
if (m.MUnit() == Unit::Inch)
|
||||||
{
|
{
|
||||||
qWarning()<<"We do not support inches for standard table. Ignore table"<<fi.absoluteFilePath()<<".";
|
qCWarning(vStMeasur)<<"We do not support inches for standard table. Ignore table"
|
||||||
|
<<fi.absoluteFilePath()<<".";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
const QString trDesc = qApp->STDescription(m.Id());
|
const QString trDesc = qApp->STDescription(m.Id());
|
||||||
if (trDesc.isEmpty() == false)
|
if (trDesc.isEmpty() == false)
|
||||||
{
|
{
|
||||||
|
qCDebug(vStMeasur)<<"Adding user table from"<<fi.absoluteFilePath();
|
||||||
ui->comboBoxTables->addItem(trDesc, QVariant(fi.absoluteFilePath()));
|
ui->comboBoxTables->addItem(trDesc, QVariant(fi.absoluteFilePath()));
|
||||||
}
|
}
|
||||||
else if (m.Description().isEmpty() == false)
|
else if (m.Description().isEmpty() == false)
|
||||||
{
|
{
|
||||||
|
qCDebug(vStMeasur)<<"Adding table with id"<<m.Id()<<"from"<<fi.absoluteFilePath();
|
||||||
ui->comboBoxTables->addItem(m.Description(), QVariant(fi.absoluteFilePath()));
|
ui->comboBoxTables->addItem(m.Description(), QVariant(fi.absoluteFilePath()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (VException &e)
|
catch (VException &e)
|
||||||
{
|
{
|
||||||
qDebug()<<"File error."<<e.ErrorMessage()<<e.DetailedInformation()<<Q_FUNC_INFO;
|
qCDebug(vStMeasur)<<"File error."<<e.ErrorMessage()<<e.DetailedInformation()<<Q_FUNC_INFO;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -190,6 +190,13 @@ void DialogAlongLine::SaveData()
|
||||||
line->RefreshGeometry();
|
line->RefreshGeometry();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void DialogAlongLine::closeEvent(QCloseEvent *event)
|
||||||
|
{
|
||||||
|
ui->plainTextEditFormula->blockSignals(true);
|
||||||
|
DialogTool::closeEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
/**
|
/**
|
||||||
* @brief setSecondPointId set id second point of line
|
* @brief setSecondPointId set id second point of line
|
||||||
|
|
|
@ -78,6 +78,7 @@ protected:
|
||||||
* @brief SaveData Put dialog data in local variables
|
* @brief SaveData Put dialog data in local variables
|
||||||
*/
|
*/
|
||||||
virtual void SaveData();
|
virtual void SaveData();
|
||||||
|
virtual void closeEvent(QCloseEvent *event);
|
||||||
private:
|
private:
|
||||||
Q_DISABLE_COPY(DialogAlongLine)
|
Q_DISABLE_COPY(DialogAlongLine)
|
||||||
|
|
||||||
|
|
|
@ -45,8 +45,9 @@
|
||||||
*/
|
*/
|
||||||
DialogArc::DialogArc(const VContainer *data, const quint32 &toolId, QWidget *parent)
|
DialogArc::DialogArc(const VContainer *data, const quint32 &toolId, QWidget *parent)
|
||||||
:DialogTool(data, toolId, parent), ui(new Ui::DialogArc), flagRadius(false), flagF1(false), flagF2(false),
|
:DialogTool(data, toolId, parent), ui(new Ui::DialogArc), flagRadius(false), flagF1(false), flagF2(false),
|
||||||
timerRadius(nullptr), timerF1(nullptr), timerF2(nullptr), center(NULL_ID), radius(QString()), f1(QString()),
|
timerRadius(nullptr), timerF1(nullptr), timerF2(nullptr), center(NULL_ID), radius(QString()),
|
||||||
f2(QString()), formulaBaseHeight(0), formulaBaseHeightF1(0), formulaBaseHeightF2(0), path(nullptr)
|
f1(QString()), f2(QString()), formulaBaseHeight(0), formulaBaseHeightF1(0), formulaBaseHeightF2(0), path(nullptr),
|
||||||
|
angleF1(INT_MIN), angleF2(INT_MIN)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
|
||||||
|
@ -65,10 +66,10 @@ DialogArc::DialogArc(const VContainer *data, const quint32 &toolId, QWidget *par
|
||||||
connect(timerRadius, &QTimer::timeout, this, &DialogArc::EvalRadius);
|
connect(timerRadius, &QTimer::timeout, this, &DialogArc::EvalRadius);
|
||||||
|
|
||||||
timerF1 = new QTimer(this);
|
timerF1 = new QTimer(this);
|
||||||
connect(timerF1, &QTimer::timeout, this, &DialogArc::EvalF1);
|
connect(timerF1, &QTimer::timeout, this, &DialogArc::EvalF);
|
||||||
|
|
||||||
timerF2 = new QTimer(this);
|
timerF2 = new QTimer(this);
|
||||||
connect(timerF2, &QTimer::timeout, this, &DialogArc::EvalF2);
|
connect(timerF2, &QTimer::timeout, this, &DialogArc::EvalF);
|
||||||
|
|
||||||
InitOkCancelApply(ui);
|
InitOkCancelApply(ui);
|
||||||
|
|
||||||
|
@ -81,8 +82,8 @@ DialogArc::DialogArc(const VContainer *data, const quint32 &toolId, QWidget *par
|
||||||
connect(ui->toolButtonPutHereF2, &QPushButton::clicked, this, &DialogArc::PutF2);
|
connect(ui->toolButtonPutHereF2, &QPushButton::clicked, this, &DialogArc::PutF2);
|
||||||
|
|
||||||
connect(ui->toolButtonEqualRadius, &QPushButton::clicked, this, &DialogArc::EvalRadius);
|
connect(ui->toolButtonEqualRadius, &QPushButton::clicked, this, &DialogArc::EvalRadius);
|
||||||
connect(ui->toolButtonEqualF1, &QPushButton::clicked, this, &DialogArc::EvalF1);
|
connect(ui->toolButtonEqualF1, &QPushButton::clicked, this, &DialogArc::EvalF);
|
||||||
connect(ui->toolButtonEqualF2, &QPushButton::clicked, this, &DialogArc::EvalF2);
|
connect(ui->toolButtonEqualF2, &QPushButton::clicked, this, &DialogArc::EvalF);
|
||||||
|
|
||||||
connect(ui->plainTextEditFormula, &QPlainTextEdit::textChanged, this, &DialogArc::RadiusChanged);
|
connect(ui->plainTextEditFormula, &QPlainTextEdit::textChanged, this, &DialogArc::RadiusChanged);
|
||||||
connect(ui->plainTextEditF1, &QPlainTextEdit::textChanged, this, &DialogArc::F1Changed);
|
connect(ui->plainTextEditF1, &QPlainTextEdit::textChanged, this, &DialogArc::F1Changed);
|
||||||
|
@ -239,6 +240,15 @@ void DialogArc::SaveData()
|
||||||
path->RefreshGeometry();
|
path->RefreshGeometry();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void DialogArc::closeEvent(QCloseEvent *event)
|
||||||
|
{
|
||||||
|
ui->plainTextEditFormula->blockSignals(true);
|
||||||
|
ui->plainTextEditF1->blockSignals(true);
|
||||||
|
ui->plainTextEditF2->blockSignals(true);
|
||||||
|
DialogTool::closeEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
/**
|
/**
|
||||||
* @brief ValChenged show description angles of lines
|
* @brief ValChenged show description angles of lines
|
||||||
|
@ -351,27 +361,32 @@ void DialogArc::EvalRadius()
|
||||||
{
|
{
|
||||||
labelEditFormula = ui->labelEditRadius;
|
labelEditFormula = ui->labelEditRadius;
|
||||||
const QString postfix = VDomDocument::UnitsToStr(qApp->patternUnit(), true);
|
const QString postfix = VDomDocument::UnitsToStr(qApp->patternUnit(), true);
|
||||||
Eval(ui->plainTextEditFormula->toPlainText(), flagRadius, ui->labelResultRadius, postfix);
|
const qreal radius = Eval(ui->plainTextEditFormula->toPlainText(), flagRadius, ui->labelResultRadius, postfix);
|
||||||
|
|
||||||
|
if (radius < 0)
|
||||||
|
{
|
||||||
|
flagRadius = false;
|
||||||
|
ChangeColor(labelEditFormula, Qt::red);
|
||||||
|
ui->labelResultRadius->setText(tr("Error"));
|
||||||
|
ui->labelResultRadius->setToolTip(tr("Radius can't be negative"));
|
||||||
|
|
||||||
|
DialogArc::CheckState();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
/**
|
/**
|
||||||
* @brief EvalF1 calculate value of first angle
|
* @brief EvalF1 calculate value of angle
|
||||||
*/
|
*/
|
||||||
void DialogArc::EvalF1()
|
void DialogArc::EvalF()
|
||||||
{
|
{
|
||||||
labelEditFormula = ui->labelEditF1;
|
labelEditFormula = ui->labelEditF1;
|
||||||
Eval(ui->plainTextEditF1->toPlainText(), flagF1, ui->labelResultF1, degreeSymbol, false);
|
angleF1 = Eval(ui->plainTextEditF1->toPlainText(), flagF1, ui->labelResultF1, degreeSymbol, false);
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
|
||||||
/**
|
|
||||||
* @brief EvalF2 calculate value of second angle
|
|
||||||
*/
|
|
||||||
void DialogArc::EvalF2()
|
|
||||||
{
|
|
||||||
labelEditFormula = ui->labelEditF2;
|
labelEditFormula = ui->labelEditF2;
|
||||||
Eval(ui->plainTextEditF2->toPlainText(), flagF2, ui->labelResultF2, degreeSymbol, false);
|
angleF2 = Eval(ui->plainTextEditF2->toPlainText(), flagF2, ui->labelResultF2, degreeSymbol, false);
|
||||||
|
|
||||||
|
CheckAngles();
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
@ -394,3 +409,27 @@ void DialogArc::ShowLineAngles()
|
||||||
}
|
}
|
||||||
ui->listWidget->setCurrentRow (0);
|
ui->listWidget->setCurrentRow (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void DialogArc::CheckAngles()
|
||||||
|
{
|
||||||
|
if (angleF1 == INT_MIN || angleF2 == INT_MIN)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (qFuzzyCompare(angleF1 + 1, angleF2 + 1))
|
||||||
|
{
|
||||||
|
flagF1 = false;
|
||||||
|
ChangeColor(ui->labelEditF1, Qt::red);
|
||||||
|
ui->labelResultF1->setText(tr("Error"));
|
||||||
|
ui->labelResultF1->setToolTip(tr("Angles equal"));
|
||||||
|
|
||||||
|
flagF2 = false;
|
||||||
|
ChangeColor(ui->labelEditF2, Qt::red);
|
||||||
|
ui->labelResultF2->setText(tr("Error"));
|
||||||
|
ui->labelResultF2->setToolTip(tr("Angles equal"));
|
||||||
|
}
|
||||||
|
|
||||||
|
DialogArc::CheckState();
|
||||||
|
}
|
||||||
|
|
|
@ -83,6 +83,7 @@ protected:
|
||||||
* @brief SaveData Put dialog data in local variables
|
* @brief SaveData Put dialog data in local variables
|
||||||
*/
|
*/
|
||||||
virtual void SaveData();
|
virtual void SaveData();
|
||||||
|
virtual void closeEvent(QCloseEvent *event);
|
||||||
private:
|
private:
|
||||||
Q_DISABLE_COPY(DialogArc)
|
Q_DISABLE_COPY(DialogArc)
|
||||||
|
|
||||||
|
@ -126,11 +127,13 @@ private:
|
||||||
|
|
||||||
VisToolArc *path;
|
VisToolArc *path;
|
||||||
|
|
||||||
void EvalRadius();
|
qreal angleF1;
|
||||||
void EvalF1();
|
qreal angleF2;
|
||||||
void EvalF2();
|
|
||||||
void ShowLineAngles();
|
|
||||||
|
|
||||||
|
void EvalRadius();
|
||||||
|
void EvalF();
|
||||||
|
void ShowLineAngles();
|
||||||
|
void CheckAngles();
|
||||||
};
|
};
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
|
@ -287,3 +287,10 @@ void DialogBisector::SaveData()
|
||||||
line->setLineStyle(VAbstractTool::LineStyle(typeLine));
|
line->setLineStyle(VAbstractTool::LineStyle(typeLine));
|
||||||
line->RefreshGeometry();
|
line->RefreshGeometry();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void DialogBisector::closeEvent(QCloseEvent *event)
|
||||||
|
{
|
||||||
|
ui->plainTextEditFormula->blockSignals(true);
|
||||||
|
DialogTool::closeEvent(event);
|
||||||
|
}
|
||||||
|
|
|
@ -83,6 +83,7 @@ protected:
|
||||||
* @brief SaveData Put dialog data in local variables
|
* @brief SaveData Put dialog data in local variables
|
||||||
*/
|
*/
|
||||||
virtual void SaveData();
|
virtual void SaveData();
|
||||||
|
virtual void closeEvent(QCloseEvent *event);
|
||||||
private:
|
private:
|
||||||
Q_DISABLE_COPY(DialogBisector)
|
Q_DISABLE_COPY(DialogBisector)
|
||||||
|
|
||||||
|
|
|
@ -269,3 +269,10 @@ void DialogCurveIntersectAxis::SaveData()
|
||||||
line->setLineStyle(VAbstractTool::LineStyle(typeLine));
|
line->setLineStyle(VAbstractTool::LineStyle(typeLine));
|
||||||
line->RefreshGeometry();
|
line->RefreshGeometry();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void DialogCurveIntersectAxis::closeEvent(QCloseEvent *event)
|
||||||
|
{
|
||||||
|
ui->plainTextEditFormula->blockSignals(true);
|
||||||
|
DialogTool::closeEvent(event);
|
||||||
|
}
|
||||||
|
|
|
@ -73,6 +73,7 @@ protected:
|
||||||
* @brief SaveData Put dialog data in local variables
|
* @brief SaveData Put dialog data in local variables
|
||||||
*/
|
*/
|
||||||
virtual void SaveData();
|
virtual void SaveData();
|
||||||
|
virtual void closeEvent(QCloseEvent *event);
|
||||||
private:
|
private:
|
||||||
Q_DISABLE_COPY(DialogCurveIntersectAxis)
|
Q_DISABLE_COPY(DialogCurveIntersectAxis)
|
||||||
Ui::DialogCurveIntersectAxis *ui;
|
Ui::DialogCurveIntersectAxis *ui;
|
||||||
|
|
|
@ -137,6 +137,13 @@ void DialogCutArc::SaveData()
|
||||||
path->RefreshGeometry();
|
path->RefreshGeometry();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void DialogCutArc::closeEvent(QCloseEvent *event)
|
||||||
|
{
|
||||||
|
ui->plainTextEditFormula->blockSignals(true);
|
||||||
|
DialogTool::closeEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
/**
|
/**
|
||||||
* @brief setArcId set id of arc
|
* @brief setArcId set id of arc
|
||||||
|
|
|
@ -73,6 +73,7 @@ protected:
|
||||||
* @brief SaveData Put dialog data in local variables
|
* @brief SaveData Put dialog data in local variables
|
||||||
*/
|
*/
|
||||||
virtual void SaveData();
|
virtual void SaveData();
|
||||||
|
virtual void closeEvent(QCloseEvent *event);
|
||||||
private:
|
private:
|
||||||
Q_DISABLE_COPY(DialogCutArc)
|
Q_DISABLE_COPY(DialogCutArc)
|
||||||
/** @brief ui keeps information about user interface */
|
/** @brief ui keeps information about user interface */
|
||||||
|
|
|
@ -152,6 +152,13 @@ void DialogCutSpline::SaveData()
|
||||||
path->RefreshGeometry();
|
path->RefreshGeometry();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void DialogCutSpline::closeEvent(QCloseEvent *event)
|
||||||
|
{
|
||||||
|
ui->plainTextEditFormula->blockSignals(true);
|
||||||
|
DialogTool::closeEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
void DialogCutSpline::DeployFormulaTextEdit()
|
void DialogCutSpline::DeployFormulaTextEdit()
|
||||||
{
|
{
|
||||||
|
|
|
@ -68,6 +68,7 @@ protected:
|
||||||
* @brief SaveData Put dialog data in local variables
|
* @brief SaveData Put dialog data in local variables
|
||||||
*/
|
*/
|
||||||
virtual void SaveData();
|
virtual void SaveData();
|
||||||
|
virtual void closeEvent(QCloseEvent *event);
|
||||||
private:
|
private:
|
||||||
Q_DISABLE_COPY(DialogCutSpline)
|
Q_DISABLE_COPY(DialogCutSpline)
|
||||||
|
|
||||||
|
|
|
@ -152,6 +152,13 @@ void DialogCutSplinePath::SaveData()
|
||||||
path->RefreshGeometry();
|
path->RefreshGeometry();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void DialogCutSplinePath::closeEvent(QCloseEvent *event)
|
||||||
|
{
|
||||||
|
ui->plainTextEditFormula->blockSignals(true);
|
||||||
|
DialogTool::closeEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
void DialogCutSplinePath::DeployFormulaTextEdit()
|
void DialogCutSplinePath::DeployFormulaTextEdit()
|
||||||
{
|
{
|
||||||
|
|
|
@ -68,6 +68,7 @@ protected:
|
||||||
* @brief SaveData Put dialog data in local variables
|
* @brief SaveData Put dialog data in local variables
|
||||||
*/
|
*/
|
||||||
virtual void SaveData();
|
virtual void SaveData();
|
||||||
|
virtual void closeEvent(QCloseEvent *event);
|
||||||
private:
|
private:
|
||||||
Q_DISABLE_COPY(DialogCutSplinePath)
|
Q_DISABLE_COPY(DialogCutSplinePath)
|
||||||
|
|
||||||
|
|
|
@ -113,6 +113,13 @@ void DialogEditWrongFormula::CheckState()
|
||||||
bOk->setEnabled(flagFormula);
|
bOk->setEnabled(flagFormula);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void DialogEditWrongFormula::closeEvent(QCloseEvent *event)
|
||||||
|
{
|
||||||
|
ui->plainTextEditFormula->blockSignals(true);
|
||||||
|
DialogTool::closeEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
void DialogEditWrongFormula::setFormula(const QString &value)
|
void DialogEditWrongFormula::setFormula(const QString &value)
|
||||||
{
|
{
|
||||||
|
|
|
@ -65,6 +65,7 @@ public slots:
|
||||||
virtual void EvalFormula();
|
virtual void EvalFormula();
|
||||||
protected:
|
protected:
|
||||||
virtual void CheckState();
|
virtual void CheckState();
|
||||||
|
virtual void closeEvent(QCloseEvent *event);
|
||||||
private:
|
private:
|
||||||
Q_DISABLE_COPY(DialogEditWrongFormula)
|
Q_DISABLE_COPY(DialogEditWrongFormula)
|
||||||
Ui::DialogEditWrongFormula *ui;
|
Ui::DialogEditWrongFormula *ui;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
**
|
**
|
||||||
** @file dialogendline.cpp
|
** @file dialogendline.cpp
|
||||||
** @author Roman Telezhynskyi <dismine(at)gmail.com>
|
** @author Roman Telezhynskyi <dismine(at)gmail.com>
|
||||||
|
@ -291,6 +291,14 @@ void DialogEndLine::SaveData()
|
||||||
line->RefreshGeometry();
|
line->RefreshGeometry();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void DialogEndLine::closeEvent(QCloseEvent *event)
|
||||||
|
{
|
||||||
|
ui->plainTextEditFormula->blockSignals(true);
|
||||||
|
ui->plainTextEditAngle->blockSignals(true);
|
||||||
|
DialogTool::closeEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
DialogEndLine::~DialogEndLine()
|
DialogEndLine::~DialogEndLine()
|
||||||
{
|
{
|
||||||
|
|
|
@ -83,6 +83,7 @@ protected:
|
||||||
* @brief SaveData Put dialog data in local variables
|
* @brief SaveData Put dialog data in local variables
|
||||||
*/
|
*/
|
||||||
virtual void SaveData();
|
virtual void SaveData();
|
||||||
|
virtual void closeEvent(QCloseEvent *event);
|
||||||
private:
|
private:
|
||||||
Q_DISABLE_COPY(DialogEndLine)
|
Q_DISABLE_COPY(DialogEndLine)
|
||||||
|
|
||||||
|
|
|
@ -336,3 +336,10 @@ void DialogLineIntersectAxis::SaveData()
|
||||||
line->setLineStyle(VAbstractTool::LineStyle(typeLine));
|
line->setLineStyle(VAbstractTool::LineStyle(typeLine));
|
||||||
line->RefreshGeometry();
|
line->RefreshGeometry();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void DialogLineIntersectAxis::closeEvent(QCloseEvent *event)
|
||||||
|
{
|
||||||
|
ui->plainTextEditFormula->blockSignals(true);
|
||||||
|
DialogTool::closeEvent(event);
|
||||||
|
}
|
||||||
|
|
|
@ -77,6 +77,7 @@ protected:
|
||||||
* @brief SaveData Put dialog data in local variables
|
* @brief SaveData Put dialog data in local variables
|
||||||
*/
|
*/
|
||||||
virtual void SaveData();
|
virtual void SaveData();
|
||||||
|
virtual void closeEvent(QCloseEvent *event);
|
||||||
private:
|
private:
|
||||||
Q_DISABLE_COPY(DialogLineIntersectAxis)
|
Q_DISABLE_COPY(DialogLineIntersectAxis)
|
||||||
Ui::DialogLineIntersectAxis *ui;
|
Ui::DialogLineIntersectAxis *ui;
|
||||||
|
|
|
@ -184,6 +184,13 @@ void DialogNormal::SaveData()
|
||||||
line->RefreshGeometry();
|
line->RefreshGeometry();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void DialogNormal::closeEvent(QCloseEvent *event)
|
||||||
|
{
|
||||||
|
ui->plainTextEditFormula->blockSignals(true);
|
||||||
|
DialogTool::closeEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
/**
|
/**
|
||||||
* @brief setSecondPointId set id of second point
|
* @brief setSecondPointId set id of second point
|
||||||
|
|
|
@ -82,6 +82,7 @@ protected:
|
||||||
* @brief SaveData Put dialog data in local variables
|
* @brief SaveData Put dialog data in local variables
|
||||||
*/
|
*/
|
||||||
virtual void SaveData();
|
virtual void SaveData();
|
||||||
|
virtual void closeEvent(QCloseEvent *event);
|
||||||
private:
|
private:
|
||||||
Q_DISABLE_COPY(DialogNormal)
|
Q_DISABLE_COPY(DialogNormal)
|
||||||
|
|
||||||
|
|
|
@ -225,6 +225,13 @@ void DialogPointOfContact::SaveData()
|
||||||
line->RefreshGeometry();
|
line->RefreshGeometry();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void DialogPointOfContact::closeEvent(QCloseEvent *event)
|
||||||
|
{
|
||||||
|
ui->plainTextEditFormula->blockSignals(true);
|
||||||
|
DialogTool::closeEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
/**
|
/**
|
||||||
* @brief setSecondPoint set id second point
|
* @brief setSecondPoint set id second point
|
||||||
|
|
|
@ -80,6 +80,7 @@ protected:
|
||||||
* @brief SaveData Put dialog data in local variables
|
* @brief SaveData Put dialog data in local variables
|
||||||
*/
|
*/
|
||||||
virtual void SaveData();
|
virtual void SaveData();
|
||||||
|
virtual void closeEvent(QCloseEvent *event);
|
||||||
private:
|
private:
|
||||||
Q_DISABLE_COPY(DialogPointOfContact)
|
Q_DISABLE_COPY(DialogPointOfContact)
|
||||||
|
|
||||||
|
|
|
@ -213,6 +213,13 @@ void DialogShoulderPoint::SaveData()
|
||||||
line->RefreshGeometry();
|
line->RefreshGeometry();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void DialogShoulderPoint::closeEvent(QCloseEvent *event)
|
||||||
|
{
|
||||||
|
ui->plainTextEditFormula->blockSignals(true);
|
||||||
|
DialogTool::closeEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
/**
|
/**
|
||||||
* @brief setPShoulder set id shoulder point
|
* @brief setPShoulder set id shoulder point
|
||||||
|
|
|
@ -82,6 +82,7 @@ protected:
|
||||||
* @brief SaveData Put dialog data in local variables
|
* @brief SaveData Put dialog data in local variables
|
||||||
*/
|
*/
|
||||||
virtual void SaveData();
|
virtual void SaveData();
|
||||||
|
virtual void closeEvent(QCloseEvent *event);
|
||||||
private:
|
private:
|
||||||
Q_DISABLE_COPY(DialogShoulderPoint)
|
Q_DISABLE_COPY(DialogShoulderPoint)
|
||||||
|
|
||||||
|
|
|
@ -236,8 +236,11 @@ void DialogSplinePath::ShowDialog(bool click)
|
||||||
{
|
{
|
||||||
if (click == false)
|
if (click == false)
|
||||||
{
|
{
|
||||||
emit ToolTip("");
|
if (path.CountPoint() >= 3)
|
||||||
DialogAccepted();
|
{
|
||||||
|
emit ToolTip("");
|
||||||
|
DialogAccepted();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -35,6 +35,7 @@
|
||||||
#include "../../tools/vabstracttool.h"
|
#include "../../tools/vabstracttool.h"
|
||||||
#include "../../../libs/qmuparser/qmuparsererror.h"
|
#include "../../../libs/qmuparser/qmuparsererror.h"
|
||||||
#include "../../core/vapplication.h"
|
#include "../../core/vapplication.h"
|
||||||
|
#include "../../core/vsettings.h"
|
||||||
#include "../../xml/vdomdocument.h"
|
#include "../../xml/vdomdocument.h"
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
#include <QCloseEvent>
|
#include <QCloseEvent>
|
||||||
|
@ -48,6 +49,8 @@
|
||||||
#include <QPushButton>
|
#include <QPushButton>
|
||||||
#include <QDoubleSpinBox>
|
#include <QDoubleSpinBox>
|
||||||
|
|
||||||
|
Q_LOGGING_CATEGORY(vDialog, "v.dialog")
|
||||||
|
|
||||||
#define DIALOG_MAX_FORMULA_HEIGHT 64
|
#define DIALOG_MAX_FORMULA_HEIGHT 64
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
@ -86,7 +89,7 @@ DialogTool::~DialogTool()
|
||||||
*/
|
*/
|
||||||
void DialogTool::closeEvent(QCloseEvent *event)
|
void DialogTool::closeEvent(QCloseEvent *event)
|
||||||
{
|
{
|
||||||
DialogClosed(QDialog::Rejected);
|
DialogRejected();
|
||||||
event->accept();
|
event->accept();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -441,6 +444,7 @@ void DialogTool::ValFormulaChanged(bool &flag, QLineEdit *edit, QTimer *timer)
|
||||||
CheckState();
|
CheckState();
|
||||||
ChangeColor(labelEditFormula, Qt::red);
|
ChangeColor(labelEditFormula, Qt::red);
|
||||||
labelResultCalculation->setText(tr("Error"));
|
labelResultCalculation->setText(tr("Error"));
|
||||||
|
labelResultCalculation->setToolTip(tr("Empty field"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
timer->start(1000);
|
timer->start(1000);
|
||||||
|
@ -458,6 +462,7 @@ void DialogTool::ValFormulaChanged(bool &flag, QPlainTextEdit *edit, QTimer *tim
|
||||||
CheckState();
|
CheckState();
|
||||||
ChangeColor(labelEditFormula, Qt::red);
|
ChangeColor(labelEditFormula, Qt::red);
|
||||||
labelResultCalculation->setText(tr("Error"));
|
labelResultCalculation->setText(tr("Error"));
|
||||||
|
labelResultCalculation->setToolTip(tr("Empty field"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
timer->setSingleShot(true);
|
timer->setSingleShot(true);
|
||||||
|
@ -473,10 +478,13 @@ void DialogTool::ValFormulaChanged(bool &flag, QPlainTextEdit *edit, QTimer *tim
|
||||||
* @param postfix unit name
|
* @param postfix unit name
|
||||||
* @param checkZero true - if formula can't be equal zero
|
* @param checkZero true - if formula can't be equal zero
|
||||||
*/
|
*/
|
||||||
void DialogTool::Eval(const QString &text, bool &flag, QLabel *label, const QString& postfix, bool checkZero)
|
qreal DialogTool::Eval(const QString &text, bool &flag, QLabel *label, const QString& postfix, bool checkZero)
|
||||||
{
|
{
|
||||||
SCASSERT(label != nullptr);
|
SCASSERT(label != nullptr);
|
||||||
SCASSERT(labelEditFormula != nullptr);
|
SCASSERT(labelEditFormula != nullptr);
|
||||||
|
|
||||||
|
qreal result = INT_MIN;//Value can be 0, so use max imposible value
|
||||||
|
|
||||||
if (text.isEmpty())
|
if (text.isEmpty())
|
||||||
{
|
{
|
||||||
flag = false;
|
flag = false;
|
||||||
|
@ -493,7 +501,7 @@ void DialogTool::Eval(const QString &text, bool &flag, QLabel *label, const QStr
|
||||||
formula.replace("\n", " ");
|
formula.replace("\n", " ");
|
||||||
formula = qApp->FormulaFromUser(formula);
|
formula = qApp->FormulaFromUser(formula);
|
||||||
Calculator *cal = new Calculator(data);
|
Calculator *cal = new Calculator(data);
|
||||||
const qreal result = cal->EvalFormula(formula);
|
result = cal->EvalFormula(formula);
|
||||||
delete cal;
|
delete cal;
|
||||||
|
|
||||||
//if result equal 0
|
//if result equal 0
|
||||||
|
@ -507,7 +515,7 @@ void DialogTool::Eval(const QString &text, bool &flag, QLabel *label, const QStr
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
QLocale loc;
|
QLocale loc;
|
||||||
if (qApp->getSettings()->value("configuration/osSeparator", 1).toBool())
|
if (qApp->getSettings()->GetOsSeparator())
|
||||||
{
|
{
|
||||||
loc = QLocale::system();
|
loc = QLocale::system();
|
||||||
}
|
}
|
||||||
|
@ -537,6 +545,7 @@ void DialogTool::Eval(const QString &text, bool &flag, QLabel *label, const QStr
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
CheckState();
|
CheckState();
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
@ -904,7 +913,7 @@ void DialogTool::EvalFormula()
|
||||||
SCASSERT(plainTextEditFormula != nullptr);
|
SCASSERT(plainTextEditFormula != nullptr);
|
||||||
SCASSERT(labelResultCalculation != nullptr);
|
SCASSERT(labelResultCalculation != nullptr);
|
||||||
const QString postfix = VDomDocument::UnitsToStr(qApp->patternUnit());
|
const QString postfix = VDomDocument::UnitsToStr(qApp->patternUnit());
|
||||||
Eval(plainTextEditFormula->toPlainText(), flagFormula, labelResultCalculation, postfix);
|
Eval(plainTextEditFormula->toPlainText(), flagFormula, labelResultCalculation, postfix, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
|
@ -37,6 +37,9 @@
|
||||||
#include "../../core/vapplication.h"
|
#include "../../core/vapplication.h"
|
||||||
#include <QPushButton>
|
#include <QPushButton>
|
||||||
#include <QCheckBox>
|
#include <QCheckBox>
|
||||||
|
#include <QLoggingCategory>
|
||||||
|
|
||||||
|
Q_DECLARE_LOGGING_CATEGORY(vDialog)
|
||||||
|
|
||||||
class QDoubleSpinBox;
|
class QDoubleSpinBox;
|
||||||
class QLabel;
|
class QLabel;
|
||||||
|
@ -225,7 +228,7 @@ protected:
|
||||||
void PutValHere(QPlainTextEdit *plainTextEdit, QListWidget *listWidget);
|
void PutValHere(QPlainTextEdit *plainTextEdit, QListWidget *listWidget);
|
||||||
void ValFormulaChanged(bool &flag, QLineEdit *edit, QTimer * timer);
|
void ValFormulaChanged(bool &flag, QLineEdit *edit, QTimer * timer);
|
||||||
void ValFormulaChanged(bool &flag, QPlainTextEdit *edit, QTimer * timer);
|
void ValFormulaChanged(bool &flag, QPlainTextEdit *edit, QTimer * timer);
|
||||||
void Eval(const QString &text, bool &flag, QLabel *label, const QString &postfix,
|
qreal Eval(const QString &text, bool &flag, QLabel *label, const QString &postfix,
|
||||||
bool checkZero = true);
|
bool checkZero = true);
|
||||||
void setCurrentPointId(QComboBox *box, quint32 &pointId, const quint32 &value) const;
|
void setCurrentPointId(QComboBox *box, quint32 &pointId, const quint32 &value) const;
|
||||||
void setCurrentSplineId(QComboBox *box, quint32 &splineId, const quint32 &value,
|
void setCurrentSplineId(QComboBox *box, quint32 &splineId, const quint32 &value,
|
||||||
|
|
|
@ -32,6 +32,9 @@
|
||||||
#include <QSpacerItem>
|
#include <QSpacerItem>
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include "../options.h"
|
#include "../options.h"
|
||||||
|
#include <QLoggingCategory>
|
||||||
|
|
||||||
|
Q_LOGGING_CATEGORY(vExcep, "v.excep")
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
/**
|
/**
|
||||||
|
@ -100,6 +103,7 @@ void VException::CriticalMessageBox(const QString &situation, QWidget * parent)
|
||||||
#ifndef QT_NO_CURSOR
|
#ifndef QT_NO_CURSOR
|
||||||
QApplication::restoreOverrideCursor();
|
QApplication::restoreOverrideCursor();
|
||||||
#endif
|
#endif
|
||||||
|
qCDebug(vExcep)<<"Critical error!"<<situation<<ErrorMessage()<<DetailedInformation();
|
||||||
msgBox.exec();
|
msgBox.exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -90,8 +90,7 @@ QVector<QPointF> VAbstractCurve::IntersectLine(const QLineF &line) const
|
||||||
for ( qint32 i = 0; i < points.count()-1; ++i )
|
for ( qint32 i = 0; i < points.count()-1; ++i )
|
||||||
{
|
{
|
||||||
QPointF crosPoint;
|
QPointF crosPoint;
|
||||||
QLineF::IntersectType type = QLineF::NoIntersection;
|
QLineF::IntersectType type = line.intersect(QLineF ( points.at(i), points.at(i+1)), &crosPoint);
|
||||||
type = line.intersect(QLineF ( points.at(i), points.at(i+1)), &crosPoint);
|
|
||||||
if ( type == QLineF::BoundedIntersection )
|
if ( type == QLineF::BoundedIntersection )
|
||||||
{
|
{
|
||||||
intersections.append(crosPoint);
|
intersections.append(crosPoint);
|
||||||
|
|
|
@ -144,6 +144,11 @@ QPointF VArc::GetP2 () const
|
||||||
*/
|
*/
|
||||||
qreal VArc::AngleArc() const
|
qreal VArc::AngleArc() const
|
||||||
{
|
{
|
||||||
|
if ((qFuzzyCompare(d->f1+1, 0+1) && qFuzzyCompare(d->f2, 360)) ||
|
||||||
|
(qFuzzyCompare(d->f1, 360) && qFuzzyCompare(d->f2+1, 0+1)))
|
||||||
|
{
|
||||||
|
return 360;
|
||||||
|
}
|
||||||
QLineF l1(0, 0, 100, 100);
|
QLineF l1(0, 0, 100, 100);
|
||||||
l1.setAngle(d->f1);
|
l1.setAngle(d->f1);
|
||||||
QLineF l2(0, 0, 100, 100);
|
QLineF l2(0, 0, 100, 100);
|
||||||
|
|
119
src/app/main.cpp
119
src/app/main.cpp
|
@ -28,99 +28,16 @@
|
||||||
|
|
||||||
#include "mainwindow.h"
|
#include "mainwindow.h"
|
||||||
#include "core/vapplication.h"
|
#include "core/vapplication.h"
|
||||||
#include <QTextCodec>
|
#include "core/vsettings.h"
|
||||||
#include <QMessageBox>
|
|
||||||
#include <QThread>
|
|
||||||
|
|
||||||
#if QT_VERSION < QT_VERSION_CHECK(5, 2, 1)
|
|
||||||
#include "core/qcommandlineparser.h"
|
|
||||||
#else
|
|
||||||
#include <QCommandLineParser>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <QtXml>
|
|
||||||
#include <QLibraryInfo>
|
|
||||||
#include "tablewindow.h"
|
#include "tablewindow.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
#include <QTextCodec>
|
||||||
inline void noisyFailureMsgHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)
|
#include <QMessageBox>
|
||||||
{
|
#include <QThread>
|
||||||
// Why on earth didn't Qt want to make failed signal/slot connections qWarning?
|
#include <QCommandLineParser>
|
||||||
if ((type == QtDebugMsg) && msg.contains("::connect"))
|
#include <QtXml>
|
||||||
{
|
#include <QLibraryInfo>
|
||||||
type = QtWarningMsg;
|
|
||||||
}
|
|
||||||
|
|
||||||
// this is another one that doesn't make sense as just a debug message. pretty serious
|
|
||||||
// sign of a problem
|
|
||||||
// http://www.developer.nokia.com/Community/Wiki/QPainter::begin:Paint_device_returned_engine_%3D%3D_0_(Known_Issue)
|
|
||||||
if ((type == QtDebugMsg) && msg.contains("QPainter::begin") && msg.contains("Paint device returned engine"))
|
|
||||||
{
|
|
||||||
type = QtWarningMsg;
|
|
||||||
}
|
|
||||||
|
|
||||||
// This qWarning about "Cowardly refusing to send clipboard message to hung application..."
|
|
||||||
// is something that can easily happen if you are debugging and the application is paused.
|
|
||||||
// As it is so common, not worth popping up a dialog.
|
|
||||||
if ((type == QtWarningMsg) && QString(msg).contains("QClipboard::event")
|
|
||||||
&& QString(msg).contains("Cowardly refusing"))
|
|
||||||
{
|
|
||||||
type = QtDebugMsg;
|
|
||||||
}
|
|
||||||
|
|
||||||
// only the GUI thread should display message boxes. If you are
|
|
||||||
// writing a multithreaded application and the error happens on
|
|
||||||
// a non-GUI thread, you'll have to queue the message to the GUI
|
|
||||||
QCoreApplication *instance = QCoreApplication::instance();
|
|
||||||
const bool isGuiThread = instance && (QThread::currentThread() == instance->thread());
|
|
||||||
|
|
||||||
if (isGuiThread)
|
|
||||||
{
|
|
||||||
QByteArray localMsg = msg.toLocal8Bit();
|
|
||||||
QMessageBox messageBox;
|
|
||||||
switch (type)
|
|
||||||
{
|
|
||||||
case QtDebugMsg:
|
|
||||||
fprintf(stderr, "Debug: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line,
|
|
||||||
context.function);
|
|
||||||
return;
|
|
||||||
case QtWarningMsg:
|
|
||||||
messageBox.setIcon(QMessageBox::Warning);
|
|
||||||
messageBox.setInformativeText(msg);
|
|
||||||
messageBox.setStandardButtons(QMessageBox::Ok);
|
|
||||||
fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line,
|
|
||||||
context.function);
|
|
||||||
messageBox.exec();
|
|
||||||
break;
|
|
||||||
case QtCriticalMsg:
|
|
||||||
messageBox.setIcon(QMessageBox::Critical);
|
|
||||||
messageBox.setInformativeText(msg);
|
|
||||||
messageBox.setStandardButtons(QMessageBox::Ok);
|
|
||||||
fprintf(stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line,
|
|
||||||
context.function);
|
|
||||||
messageBox.exec();
|
|
||||||
abort();
|
|
||||||
case QtFatalMsg:
|
|
||||||
messageBox.setIcon(QMessageBox::Critical);
|
|
||||||
messageBox.setInformativeText(msg);
|
|
||||||
messageBox.setStandardButtons(QMessageBox::Ok);
|
|
||||||
fprintf(stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line,
|
|
||||||
context.function);
|
|
||||||
messageBox.exec();
|
|
||||||
abort();
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (type != QtDebugMsg)
|
|
||||||
{
|
|
||||||
abort(); // be NOISY unless overridden!
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
|
@ -130,18 +47,10 @@ int main(int argc, char *argv[])
|
||||||
Q_INIT_RESOURCE(schema);
|
Q_INIT_RESOURCE(schema);
|
||||||
Q_INIT_RESOURCE(theme);
|
Q_INIT_RESOURCE(theme);
|
||||||
|
|
||||||
QT_REQUIRE_VERSION(argc, argv, "5.0.2");
|
QT_REQUIRE_VERSION(argc, argv, "5.2.1");
|
||||||
|
|
||||||
VApplication app(argc, argv);
|
VApplication app(argc, argv);
|
||||||
|
|
||||||
#ifdef QT_DEBUG
|
|
||||||
// Because our "noisy" message handler uses the GUI subsystem for message
|
|
||||||
// boxes, we can't install it until after the QApplication is constructed. But it
|
|
||||||
// is good to be the very next thing to run, to start catching warnings ASAP.
|
|
||||||
{
|
|
||||||
qInstallMessageHandler(noisyFailureMsgHandler);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
app.setApplicationDisplayName(VER_PRODUCTNAME_STR);
|
app.setApplicationDisplayName(VER_PRODUCTNAME_STR);
|
||||||
app.setApplicationName(VER_INTERNALNAME_STR);
|
app.setApplicationName(VER_INTERNALNAME_STR);
|
||||||
app.setOrganizationName(VER_COMPANYNAME_STR);
|
app.setOrganizationName(VER_COMPANYNAME_STR);
|
||||||
|
@ -152,11 +61,21 @@ int main(int argc, char *argv[])
|
||||||
app.OpenSettings();
|
app.OpenSettings();
|
||||||
|
|
||||||
#if defined(Q_OS_WIN) && defined(Q_CC_GNU)
|
#if defined(Q_OS_WIN) && defined(Q_CC_GNU)
|
||||||
|
// Catch and send report
|
||||||
VApplication::DrMingw();
|
VApplication::DrMingw();
|
||||||
app.CollectReports();
|
app.CollectReports();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
QString checkedLocale = qApp->getSettings()->value("configuration/locale", QLocale::system().name()).toString();
|
// Run creation log after sending crash report
|
||||||
|
app.StartLogging();
|
||||||
|
|
||||||
|
qDebug()<<"Version:"<<APP_VERSION;
|
||||||
|
qDebug()<<"Based on Qt "<<QT_VERSION_STR<<"(32 bit)";
|
||||||
|
qDebug()<<"Built on"<<__DATE__<<"at"<<__TIME__;
|
||||||
|
qDebug()<<"Command-line arguments:"<<app.arguments();
|
||||||
|
|
||||||
|
const QString checkedLocale = qApp->getSettings()->GetLocale();
|
||||||
|
qDebug()<<"Checked locale:"<<checkedLocale;
|
||||||
|
|
||||||
QTranslator qtTranslator;
|
QTranslator qtTranslator;
|
||||||
#if defined(Q_OS_WIN)
|
#if defined(Q_OS_WIN)
|
||||||
|
|
|
@ -40,6 +40,7 @@
|
||||||
#include "xml/vindividualmeasurements.h"
|
#include "xml/vindividualmeasurements.h"
|
||||||
#include "core/vapplication.h"
|
#include "core/vapplication.h"
|
||||||
#include "core/undoevent.h"
|
#include "core/undoevent.h"
|
||||||
|
#include "core/vsettings.h"
|
||||||
#include "undocommands/renamepp.h"
|
#include "undocommands/renamepp.h"
|
||||||
#include "vtooloptionspropertybrowser.h"
|
#include "vtooloptionspropertybrowser.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
|
@ -59,6 +60,9 @@
|
||||||
#include <QtGlobal>
|
#include <QtGlobal>
|
||||||
#include <QDesktopWidget>
|
#include <QDesktopWidget>
|
||||||
#include <QDesktopServices>
|
#include <QDesktopServices>
|
||||||
|
#include <QLoggingCategory>
|
||||||
|
|
||||||
|
Q_LOGGING_CATEGORY(vMainWindow, "v.mainwindow")
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
/**
|
/**
|
||||||
|
@ -136,23 +140,30 @@ MainWindow::MainWindow(QWidget *parent)
|
||||||
*/
|
*/
|
||||||
void MainWindow::ActionNewPP()
|
void MainWindow::ActionNewPP()
|
||||||
{
|
{
|
||||||
|
qCDebug(vMainWindow)<<"New PP.";
|
||||||
QString patternPieceName = QString(tr("Pattern piece %1")).arg(comboBoxDraws->count()+1);
|
QString patternPieceName = QString(tr("Pattern piece %1")).arg(comboBoxDraws->count()+1);
|
||||||
|
qCDebug(vMainWindow)<<"Generated PP name:"<<patternPieceName;
|
||||||
QString path;
|
QString path;
|
||||||
if (comboBoxDraws->count() == 0)
|
if (comboBoxDraws->count() == 0)
|
||||||
{
|
{
|
||||||
|
qCDebug(vMainWindow)<<"First PP";
|
||||||
DialogMeasurements measurements(this);
|
DialogMeasurements measurements(this);
|
||||||
if (measurements.exec() == QDialog::Rejected)
|
if (measurements.exec() == QDialog::Rejected)
|
||||||
{
|
{
|
||||||
|
qCDebug(vMainWindow)<<"Creation PP was canceled";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (measurements.type() == MeasurementsType::Standard)
|
if (measurements.type() == MeasurementsType::Standard)
|
||||||
{
|
{
|
||||||
|
qCDebug(vMainWindow)<<"PP with standard measurements";
|
||||||
qApp->setPatternType(MeasurementsType::Standard);
|
qApp->setPatternType(MeasurementsType::Standard);
|
||||||
DialogStandardMeasurements stMeasurements(pattern, patternPieceName, this);
|
DialogStandardMeasurements stMeasurements(pattern, patternPieceName, this);
|
||||||
if (stMeasurements.exec() == QDialog::Accepted)
|
if (stMeasurements.exec() == QDialog::Accepted)
|
||||||
{
|
{
|
||||||
patternPieceName = stMeasurements.name();
|
patternPieceName = stMeasurements.name();
|
||||||
|
qCDebug(vMainWindow)<<"PP name:"<<patternPieceName;
|
||||||
path = stMeasurements.tablePath();
|
path = stMeasurements.tablePath();
|
||||||
|
qCDebug(vMainWindow)<<"Table path:"<<path;
|
||||||
VStandardMeasurements m(pattern);
|
VStandardMeasurements m(pattern);
|
||||||
m.setContent(path);
|
m.setContent(path);
|
||||||
m.SetSize();
|
m.SetSize();
|
||||||
|
@ -161,11 +172,13 @@ void MainWindow::ActionNewPP()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
qCDebug(vMainWindow)<<"Selection standard measurements canceled.";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
qCDebug(vMainWindow)<<"PP with individual measurements.";
|
||||||
QMessageBox::StandardButton ret;
|
QMessageBox::StandardButton ret;
|
||||||
ret = QMessageBox::question(this, tr("Individual measurements is under development"),
|
ret = QMessageBox::question(this, tr("Individual measurements is under development"),
|
||||||
tr("There is no way create individual measurements file independent on the "
|
tr("There is no way create individual measurements file independent on the "
|
||||||
|
@ -182,13 +195,16 @@ void MainWindow::ActionNewPP()
|
||||||
if (indMeasurements.exec() == QDialog::Accepted)
|
if (indMeasurements.exec() == QDialog::Accepted)
|
||||||
{
|
{
|
||||||
patternPieceName = indMeasurements.name();
|
patternPieceName = indMeasurements.name();
|
||||||
|
qCDebug(vMainWindow)<<"PP name:"<<patternPieceName;
|
||||||
path = indMeasurements.tablePath();
|
path = indMeasurements.tablePath();
|
||||||
|
qCDebug(vMainWindow)<<"Table path:"<<path;
|
||||||
VIndividualMeasurements m(pattern);
|
VIndividualMeasurements m(pattern);
|
||||||
m.setContent(path);
|
m.setContent(path);
|
||||||
m.Measurements();
|
m.Measurements();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
qCDebug(vMainWindow)<<"Selection individual measurements canceled.";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -200,16 +216,19 @@ void MainWindow::ActionNewPP()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
qCDebug(vMainWindow)<<"PP count"<<comboBoxDraws->count();
|
||||||
patternPieceName = PatternPieceName(patternPieceName);
|
patternPieceName = PatternPieceName(patternPieceName);
|
||||||
|
qCDebug(vMainWindow)<<"PP name:"<<patternPieceName;
|
||||||
if (patternPieceName.isEmpty())
|
if (patternPieceName.isEmpty())
|
||||||
{
|
{
|
||||||
|
qCDebug(vMainWindow)<<"Name empty.";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
path = doc->MPath();
|
path = doc->MPath();
|
||||||
}
|
}
|
||||||
if (doc->appendPP(patternPieceName) == false)
|
if (doc->appendPP(patternPieceName) == false)
|
||||||
{
|
{
|
||||||
qDebug()<<"Error creating pattern piece with the name "<<patternPieceName<<".";
|
qCDebug(vMainWindow)<<"Error creating pattern piece with the name "<<patternPieceName<<".";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
comboBoxDraws->blockSignals(true);
|
comboBoxDraws->blockSignals(true);
|
||||||
|
@ -795,6 +814,7 @@ void MainWindow::showEvent( QShowEvent *event )
|
||||||
*/
|
*/
|
||||||
void MainWindow::closeEvent(QCloseEvent *event)
|
void MainWindow::closeEvent(QCloseEvent *event)
|
||||||
{
|
{
|
||||||
|
qCDebug(vMainWindow)<<"Closing main window";
|
||||||
if (MaybeSave())
|
if (MaybeSave())
|
||||||
{
|
{
|
||||||
FileClosedCorrect();
|
FileClosedCorrect();
|
||||||
|
@ -804,6 +824,7 @@ void MainWindow::closeEvent(QCloseEvent *event)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
qCDebug(vMainWindow)<<"Closing canceled.";
|
||||||
event->ignore();
|
event->ignore();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1152,6 +1173,7 @@ void MainWindow::ArrowTool()
|
||||||
ui->view->setCursor(cur);
|
ui->view->setCursor(cur);
|
||||||
helpLabel->setText("");
|
helpLabel->setText("");
|
||||||
ui->view->setShowToolOptions(true);
|
ui->view->setShowToolOptions(true);
|
||||||
|
qCDebug(vMainWindow)<<"Enabled arrow tool.";
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
@ -1217,6 +1239,7 @@ void MainWindow::ActionDraw(bool checked)
|
||||||
{
|
{
|
||||||
if (checked)
|
if (checked)
|
||||||
{
|
{
|
||||||
|
qCDebug(vMainWindow)<<"Show draw scene";
|
||||||
ui->actionDetails->setChecked(false);
|
ui->actionDetails->setChecked(false);
|
||||||
SaveCurrentScene();
|
SaveCurrentScene();
|
||||||
|
|
||||||
|
@ -1253,6 +1276,7 @@ void MainWindow::ActionDetails(bool checked)
|
||||||
{
|
{
|
||||||
if (checked)
|
if (checked)
|
||||||
{
|
{
|
||||||
|
qCDebug(vMainWindow)<<"Show details scene";
|
||||||
ui->actionDraw->setChecked(false);
|
ui->actionDraw->setChecked(false);
|
||||||
SaveCurrentScene();
|
SaveCurrentScene();
|
||||||
|
|
||||||
|
@ -1290,11 +1314,10 @@ void MainWindow::ActionDetails(bool checked)
|
||||||
bool MainWindow::SaveAs()
|
bool MainWindow::SaveAs()
|
||||||
{
|
{
|
||||||
QString filters(tr("Pattern files (*.val)"));
|
QString filters(tr("Pattern files (*.val)"));
|
||||||
QString path = qApp->getSettings()->value("paths/pattern", QDir::homePath()).toString();
|
|
||||||
QString dir;
|
QString dir;
|
||||||
if (curFile.isEmpty())
|
if (curFile.isEmpty())
|
||||||
{
|
{
|
||||||
dir = path + "/" + tr("pattern") + ".val";
|
dir = qApp->getSettings()->GetPathPattern() + "/" + tr("pattern") + ".val";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1311,7 +1334,19 @@ bool MainWindow::SaveAs()
|
||||||
{
|
{
|
||||||
fileName += ".val";
|
fileName += ".val";
|
||||||
}
|
}
|
||||||
return SavePattern(fileName);
|
QString error;
|
||||||
|
bool result = SavePattern(fileName, error);
|
||||||
|
if (result == false)
|
||||||
|
{
|
||||||
|
QMessageBox messageBox;
|
||||||
|
messageBox.setIcon(QMessageBox::Warning);
|
||||||
|
messageBox.setInformativeText(tr("Could not save file"));
|
||||||
|
messageBox.setDefaultButton(QMessageBox::Ok);
|
||||||
|
messageBox.setDetailedText(error);
|
||||||
|
messageBox.setStandardButtons(QMessageBox::Ok);
|
||||||
|
messageBox.exec();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
@ -1327,13 +1362,24 @@ bool MainWindow::Save()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
bool result = SavePattern(curFile);
|
QString error;
|
||||||
|
bool result = SavePattern(curFile, error);
|
||||||
if (result)
|
if (result)
|
||||||
{
|
{
|
||||||
QString autofile = curFile +".autosave";
|
QString autofile = curFile +".autosave";
|
||||||
QFile file(autofile);
|
QFile file(autofile);
|
||||||
file.remove();
|
file.remove();
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
QMessageBox messageBox;
|
||||||
|
messageBox.setIcon(QMessageBox::Warning);
|
||||||
|
messageBox.setInformativeText(tr("Could not save file"));
|
||||||
|
messageBox.setDefaultButton(QMessageBox::Ok);
|
||||||
|
messageBox.setDetailedText(error);
|
||||||
|
messageBox.setStandardButtons(QMessageBox::Ok);
|
||||||
|
messageBox.exec();
|
||||||
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1346,7 +1392,7 @@ void MainWindow::Open()
|
||||||
{
|
{
|
||||||
const QString filter(tr("Pattern files (*.val)"));
|
const QString filter(tr("Pattern files (*.val)"));
|
||||||
//Get list last open files
|
//Get list last open files
|
||||||
const QStringList files = qApp->getSettings()->value("recentFileList").toStringList();
|
const QStringList files = qApp->getSettings()->GetRecentFileList();
|
||||||
QString dir;
|
QString dir;
|
||||||
if (files.isEmpty())
|
if (files.isEmpty())
|
||||||
{
|
{
|
||||||
|
@ -1357,6 +1403,7 @@ void MainWindow::Open()
|
||||||
//Absolute path to last open file
|
//Absolute path to last open file
|
||||||
dir = QFileInfo(files.first()).absolutePath();
|
dir = QFileInfo(files.first()).absolutePath();
|
||||||
}
|
}
|
||||||
|
qCDebug(vMainWindow)<<"Run QFileDialog::getOpenFileName: dir ="<<dir<<".";
|
||||||
const QString filePath = QFileDialog::getOpenFileName(this, tr("Open file"), dir, filter);
|
const QString filePath = QFileDialog::getOpenFileName(this, tr("Open file"), dir, filter);
|
||||||
OpenPattern(filePath);
|
OpenPattern(filePath);
|
||||||
}
|
}
|
||||||
|
@ -1377,6 +1424,7 @@ void MainWindow::Preferences()
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
void MainWindow::RepotBug()
|
void MainWindow::RepotBug()
|
||||||
{
|
{
|
||||||
|
qCDebug(vMainWindow)<<"Reporting bug";
|
||||||
QDesktopServices::openUrl(QUrl("https://bitbucket.org/dismine/valentina/issues/new"));
|
QDesktopServices::openUrl(QUrl("https://bitbucket.org/dismine/valentina/issues/new"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1386,6 +1434,8 @@ void MainWindow::RepotBug()
|
||||||
*/
|
*/
|
||||||
void MainWindow::Clear()
|
void MainWindow::Clear()
|
||||||
{
|
{
|
||||||
|
qCDebug(vMainWindow)<<"Reseting main window";
|
||||||
|
|
||||||
ui->actionDetails->setChecked(false);
|
ui->actionDetails->setChecked(false);
|
||||||
ui->actionDetails->setEnabled(false);
|
ui->actionDetails->setEnabled(false);
|
||||||
ui->actionDraw->setChecked(true);
|
ui->actionDraw->setChecked(true);
|
||||||
|
@ -1429,9 +1479,9 @@ void MainWindow::FileClosedCorrect()
|
||||||
WriteSettings();
|
WriteSettings();
|
||||||
|
|
||||||
//File was closed correct.
|
//File was closed correct.
|
||||||
QStringList restoreFiles = qApp->getSettings()->value("restoreFileList").toStringList();
|
QStringList restoreFiles = qApp->getSettings()->GetRestoreFileList();
|
||||||
restoreFiles.removeAll(curFile);
|
restoreFiles.removeAll(curFile);
|
||||||
qApp->getSettings()->setValue("restoreFileList", restoreFiles);
|
qApp->getSettings()->SetRestoreFileList(restoreFiles);
|
||||||
|
|
||||||
// Remove autosave file
|
// Remove autosave file
|
||||||
QFile autofile(curFile +".autosave");
|
QFile autofile(curFile +".autosave");
|
||||||
|
@ -1439,6 +1489,7 @@ void MainWindow::FileClosedCorrect()
|
||||||
{
|
{
|
||||||
autofile.remove();
|
autofile.remove();
|
||||||
}
|
}
|
||||||
|
qCDebug(vMainWindow)<<"File"<<curFile<<"closed correct.";
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
@ -1458,6 +1509,8 @@ void MainWindow::ResetWindow()
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
void MainWindow::FullParseFile()
|
void MainWindow::FullParseFile()
|
||||||
{
|
{
|
||||||
|
qCDebug(vMainWindow)<<"Full parsing file";
|
||||||
|
|
||||||
toolOptions->ClearPropertyBrowser();
|
toolOptions->ClearPropertyBrowser();
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -1904,10 +1957,10 @@ void MainWindow::MinimumScrollBar()
|
||||||
* @param fileName pattern file name.
|
* @param fileName pattern file name.
|
||||||
* @return true if all is good.
|
* @return true if all is good.
|
||||||
*/
|
*/
|
||||||
bool MainWindow::SavePattern(const QString &fileName)
|
bool MainWindow::SavePattern(const QString &fileName, QString &error)
|
||||||
{
|
{
|
||||||
|
qCDebug(vMainWindow)<<"Saving pattern file"<<fileName<<".";
|
||||||
QFileInfo tempInfo(fileName);
|
QFileInfo tempInfo(fileName);
|
||||||
QString error;
|
|
||||||
const bool result = doc->SaveDocument(fileName, error);
|
const bool result = doc->SaveDocument(fileName, error);
|
||||||
if (result)
|
if (result)
|
||||||
{
|
{
|
||||||
|
@ -1915,17 +1968,12 @@ bool MainWindow::SavePattern(const QString &fileName)
|
||||||
{
|
{
|
||||||
setCurrentFile(fileName);
|
setCurrentFile(fileName);
|
||||||
helpLabel->setText(tr("File saved"));
|
helpLabel->setText(tr("File saved"));
|
||||||
|
qCDebug(vMainWindow)<<"File"<<fileName<<"saved.";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
QMessageBox messageBox;
|
qCDebug(vMainWindow)<<"Could not save file"<<fileName<<"."<<error<<".";
|
||||||
messageBox.setIcon(QMessageBox::Warning);
|
|
||||||
messageBox.setInformativeText(tr("Could not save file"));
|
|
||||||
messageBox.setDefaultButton(QMessageBox::Ok);
|
|
||||||
messageBox.setDetailedText(error);
|
|
||||||
messageBox.setStandardButtons(QMessageBox::Ok);
|
|
||||||
messageBox.exec();
|
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -1936,13 +1984,13 @@ bool MainWindow::SavePattern(const QString &fileName)
|
||||||
*/
|
*/
|
||||||
void MainWindow::AutoSavePattern()
|
void MainWindow::AutoSavePattern()
|
||||||
{
|
{
|
||||||
|
qCDebug(vMainWindow)<<"Autosaving pattern.";
|
||||||
|
|
||||||
if (curFile.isEmpty() == false && this->isWindowModified() == true)
|
if (curFile.isEmpty() == false && this->isWindowModified() == true)
|
||||||
{
|
{
|
||||||
QString autofile = curFile +".autosave";
|
QString autofile = curFile +".autosave";
|
||||||
if (SavePattern(autofile) == false)
|
QString error;
|
||||||
{
|
SavePattern(autofile, error);
|
||||||
qDebug()<<"Can not save pattern"<<Q_FUNC_INFO;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1964,7 +2012,7 @@ void MainWindow::setCurrentFile(const QString &fileName)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
QStringList files = qApp->getSettings()->value("recentFileList").toStringList();
|
QStringList files = qApp->getSettings()->GetRecentFileList();
|
||||||
files.removeAll(fileName);
|
files.removeAll(fileName);
|
||||||
files.prepend(fileName);
|
files.prepend(fileName);
|
||||||
while (files.size() > MaxRecentFiles)
|
while (files.size() > MaxRecentFiles)
|
||||||
|
@ -1972,13 +2020,13 @@ void MainWindow::setCurrentFile(const QString &fileName)
|
||||||
files.removeLast();
|
files.removeLast();
|
||||||
}
|
}
|
||||||
|
|
||||||
qApp->getSettings()->setValue("recentFileList", files);
|
qApp->getSettings()->SetRecentFileList(files);
|
||||||
UpdateRecentFileActions();
|
UpdateRecentFileActions();
|
||||||
|
|
||||||
QStringList restoreFiles = qApp->getSettings()->value("restoreFileList").toStringList();
|
QStringList restoreFiles = qApp->getSettings()->GetRestoreFileList();
|
||||||
restoreFiles.removeAll(fileName);
|
restoreFiles.removeAll(fileName);
|
||||||
restoreFiles.prepend(fileName);
|
restoreFiles.prepend(fileName);
|
||||||
qApp->getSettings()->setValue("restoreFileList", restoreFiles);
|
qApp->getSettings()->SetRestoreFileList(restoreFiles);
|
||||||
}
|
}
|
||||||
shownName+="[*]";
|
shownName+="[*]";
|
||||||
setWindowTitle(shownName);
|
setWindowTitle(shownName);
|
||||||
|
@ -2001,22 +2049,16 @@ QString MainWindow::strippedName(const QString &fullFileName)
|
||||||
*/
|
*/
|
||||||
void MainWindow::ReadSettings()
|
void MainWindow::ReadSettings()
|
||||||
{
|
{
|
||||||
restoreGeometry(qApp->getSettings()->value("geometry").toByteArray());
|
restoreGeometry(qApp->getSettings()->GetGeometry());
|
||||||
restoreState(qApp->getSettings()->value("windowState").toByteArray());
|
restoreState(qApp->getSettings()->GetWindowState());
|
||||||
|
|
||||||
// Scene antialiasing
|
// Scene antialiasing
|
||||||
bool graphOutputValue = qApp->getSettings()->value("pattern/graphicalOutput", 1).toBool();
|
const bool graphOutputValue = qApp->getSettings()->GetGraphicalOutput();
|
||||||
ui->view->setRenderHint(QPainter::Antialiasing, graphOutputValue);
|
ui->view->setRenderHint(QPainter::Antialiasing, graphOutputValue);
|
||||||
ui->view->setRenderHint(QPainter::SmoothPixmapTransform, graphOutputValue);
|
ui->view->setRenderHint(QPainter::SmoothPixmapTransform, graphOutputValue);
|
||||||
|
|
||||||
// Stack limit
|
// Stack limit
|
||||||
bool ok = true;
|
qApp->getUndoStack()->setUndoLimit(qApp->getSettings()->GetUndoCount());
|
||||||
qint32 count = qApp->getSettings()->value("pattern/undo", 0).toInt(&ok);
|
|
||||||
if (ok == false)
|
|
||||||
{
|
|
||||||
count = 0;
|
|
||||||
}
|
|
||||||
qApp->getUndoStack()->setUndoLimit(count);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
@ -2025,8 +2067,8 @@ void MainWindow::ReadSettings()
|
||||||
*/
|
*/
|
||||||
void MainWindow::WriteSettings()
|
void MainWindow::WriteSettings()
|
||||||
{
|
{
|
||||||
qApp->getSettings()->setValue("geometry", saveGeometry());
|
qApp->getSettings()->SetGeometry(saveGeometry());
|
||||||
qApp->getSettings()->setValue("windowState", saveState());
|
qApp->getSettings()->SetWindowState(saveState());
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
@ -2057,9 +2099,8 @@ bool MainWindow::MaybeSave()
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
void MainWindow::UpdateRecentFileActions()
|
void MainWindow::UpdateRecentFileActions()
|
||||||
{
|
{
|
||||||
QStringList files = qApp->getSettings()->value("recentFileList").toStringList();
|
const QStringList files = qApp->getSettings()->GetRecentFileList();
|
||||||
|
const int numRecentFiles = qMin(files.size(), static_cast<int>(MaxRecentFiles));
|
||||||
int numRecentFiles = qMin(files.size(), static_cast<int>(MaxRecentFiles));
|
|
||||||
|
|
||||||
for (int i = 0; i < numRecentFiles; ++i)
|
for (int i = 0; i < numRecentFiles; ++i)
|
||||||
{
|
{
|
||||||
|
@ -2180,7 +2221,7 @@ void MainWindow::CreateActions()
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
void MainWindow::InitAutoSave()
|
void MainWindow::InitAutoSave()
|
||||||
{
|
{
|
||||||
//Autosaving file each 5 minutes
|
//Autosaving file each 1 minutes
|
||||||
delete autoSaveTimer;
|
delete autoSaveTimer;
|
||||||
autoSaveTimer = nullptr;
|
autoSaveTimer = nullptr;
|
||||||
|
|
||||||
|
@ -2189,17 +2230,11 @@ void MainWindow::InitAutoSave()
|
||||||
connect(autoSaveTimer, &QTimer::timeout, this, &MainWindow::AutoSavePattern);
|
connect(autoSaveTimer, &QTimer::timeout, this, &MainWindow::AutoSavePattern);
|
||||||
autoSaveTimer->stop();
|
autoSaveTimer->stop();
|
||||||
|
|
||||||
bool autoSave = qApp->getSettings()->value("configuration/autosave/state", 1).toBool();
|
if (qApp->getSettings()->GetAutosaveState())
|
||||||
if (autoSave)
|
|
||||||
{
|
{
|
||||||
bool ok = true;
|
const qint32 autoTime = qApp->getSettings()->GetAutosaveTime();
|
||||||
qint32 autoTime = qApp->getSettings()->value("configuration/autosave/time", 1).toInt(&ok);
|
|
||||||
if (ok == false)
|
|
||||||
{
|
|
||||||
autoTime = 5;
|
|
||||||
}
|
|
||||||
autoSaveTimer->start(autoTime*60000);
|
autoSaveTimer->start(autoTime*60000);
|
||||||
|
qCDebug(vMainWindow)<<"Autosaving each"<<autoTime<<"minutes.";
|
||||||
}
|
}
|
||||||
qApp->setAutoSaveTimer(autoSaveTimer);
|
qApp->setAutoSaveTimer(autoSaveTimer);
|
||||||
}
|
}
|
||||||
|
@ -2252,6 +2287,8 @@ MainWindow::~MainWindow()
|
||||||
*/
|
*/
|
||||||
void MainWindow::LoadPattern(const QString &fileName)
|
void MainWindow::LoadPattern(const QString &fileName)
|
||||||
{
|
{
|
||||||
|
qCDebug(vMainWindow)<<"Loading new file"<<fileName<<".";
|
||||||
|
|
||||||
//We have unsaved changes or load more then one file per time
|
//We have unsaved changes or load more then one file per time
|
||||||
OpenNewValentina(fileName);
|
OpenNewValentina(fileName);
|
||||||
|
|
||||||
|
@ -2289,6 +2326,7 @@ void MainWindow::LoadPattern(const QString &fileName)
|
||||||
{
|
{
|
||||||
QMessageBox::critical(this, tr("Wrong units."),
|
QMessageBox::critical(this, tr("Wrong units."),
|
||||||
tr("Application doesn't support standard table with inches."));
|
tr("Application doesn't support standard table with inches."));
|
||||||
|
qCDebug(vMainWindow)<<"Application doesn't support standard table with inches.";
|
||||||
Clear();
|
Clear();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2324,6 +2362,7 @@ void MainWindow::LoadPattern(const QString &fileName)
|
||||||
PatternWasModified(!patternModified);
|
PatternWasModified(!patternModified);
|
||||||
}
|
}
|
||||||
helpLabel->setText(tr("File loaded"));
|
helpLabel->setText(tr("File loaded"));
|
||||||
|
qCDebug(vMainWindow)<<"File loaded.";
|
||||||
|
|
||||||
qApp->setOpeningPattern();// End opening file
|
qApp->setOpeningPattern();// End opening file
|
||||||
|
|
||||||
|
@ -2337,9 +2376,11 @@ void MainWindow::LoadPattern(const QString &fileName)
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
void MainWindow::ReopenFilesAfterCrash(QStringList &args)
|
void MainWindow::ReopenFilesAfterCrash(QStringList &args)
|
||||||
{
|
{
|
||||||
QStringList files = qApp->getSettings()->value("restoreFileList").toStringList();
|
QStringList files = qApp->getSettings()->GetRestoreFileList();
|
||||||
if (files.size() > 0)
|
if (files.size() > 0)
|
||||||
{
|
{
|
||||||
|
qCDebug(vMainWindow)<<"Reopen files after crash.";
|
||||||
|
|
||||||
QStringList restoreFiles;
|
QStringList restoreFiles;
|
||||||
for (int i = 0; i < files.size(); ++i)
|
for (int i = 0; i < files.size(); ++i)
|
||||||
{
|
{
|
||||||
|
@ -2350,7 +2391,7 @@ void MainWindow::ReopenFilesAfterCrash(QStringList &args)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
files.clear();
|
files.clear();
|
||||||
qApp->getSettings()->setValue("restoreFileList", files);
|
qApp->getSettings()->SetRestoreFileList(files);
|
||||||
|
|
||||||
if (restoreFiles.size() > 0)
|
if (restoreFiles.size() > 0)
|
||||||
{
|
{
|
||||||
|
@ -2361,6 +2402,8 @@ void MainWindow::ReopenFilesAfterCrash(QStringList &args)
|
||||||
QMessageBox::Yes);
|
QMessageBox::Yes);
|
||||||
if (reply == QMessageBox::Yes)
|
if (reply == QMessageBox::Yes)
|
||||||
{
|
{
|
||||||
|
qCDebug(vMainWindow)<<"User said Yes.";
|
||||||
|
|
||||||
for (int i = 0; i < restoreFiles.size(); ++i)
|
for (int i = 0; i < restoreFiles.size(); ++i)
|
||||||
{
|
{
|
||||||
QString error;
|
QString error;
|
||||||
|
@ -2373,7 +2416,8 @@ void MainWindow::ReopenFilesAfterCrash(QStringList &args)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
qDebug()<< "Could not copy "<<restoreFiles.at(i) +".autosave"<<"to"<<restoreFiles.at(i)<<error;
|
qCDebug(vMainWindow) << "Could not copy "<<restoreFiles.at(i) +".autosave"<<"to"
|
||||||
|
<<restoreFiles.at(i)<<error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -228,7 +228,7 @@ private:
|
||||||
void ClosedDialogWithApply(int result);
|
void ClosedDialogWithApply(int result);
|
||||||
template <typename DrawTool>
|
template <typename DrawTool>
|
||||||
void ApplyDialog();
|
void ApplyDialog();
|
||||||
bool SavePattern(const QString &curFile);
|
bool SavePattern(const QString &curFile, QString &error);
|
||||||
void AutoSavePattern();
|
void AutoSavePattern();
|
||||||
void setCurrentFile(const QString &fileName);
|
void setCurrentFile(const QString &fileName);
|
||||||
QString strippedName(const QString &fullFileName);
|
QString strippedName(const QString &fullFileName);
|
||||||
|
|
|
@ -250,7 +250,7 @@
|
||||||
<xs:attribute name="supplement" type="xs:unsignedInt"></xs:attribute>
|
<xs:attribute name="supplement" type="xs:unsignedInt"></xs:attribute>
|
||||||
<xs:attribute name="mx" type="xs:double"></xs:attribute>
|
<xs:attribute name="mx" type="xs:double"></xs:attribute>
|
||||||
<xs:attribute name="my" type="xs:double"></xs:attribute>
|
<xs:attribute name="my" type="xs:double"></xs:attribute>
|
||||||
<xs:attribute name="width" type="xs:unsignedInt"></xs:attribute>
|
<xs:attribute name="width" type="xs:double"></xs:attribute>
|
||||||
<xs:attribute name="name" type="xs:string"></xs:attribute>
|
<xs:attribute name="name" type="xs:string"></xs:attribute>
|
||||||
<xs:attribute name="closed" type="xs:unsignedInt"></xs:attribute>
|
<xs:attribute name="closed" type="xs:unsignedInt"></xs:attribute>
|
||||||
</xs:complexType>
|
</xs:complexType>
|
||||||
|
|
|
@ -132,6 +132,7 @@ void VDrawTool::FullUpdateFromGuiApply()
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
void VDrawTool::SaveDialogChange()
|
void VDrawTool::SaveDialogChange()
|
||||||
{
|
{
|
||||||
|
qCDebug(vTool)<<"Saving tool options after using dialog";
|
||||||
QDomElement oldDomElement = doc->elementById(QString().setNum(id));
|
QDomElement oldDomElement = doc->elementById(QString().setNum(id));
|
||||||
if (oldDomElement.isElement())
|
if (oldDomElement.isElement())
|
||||||
{
|
{
|
||||||
|
@ -144,7 +145,7 @@ void VDrawTool::SaveDialogChange()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
qDebug()<<"Can't find tool with id ="<< id << Q_FUNC_INFO;
|
qCDebug(vTool)<<"Can't find tool with id ="<< id << Q_FUNC_INFO;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -214,10 +214,13 @@ void VToolArc::setFormulaRadius(const VFormula &value)
|
||||||
{
|
{
|
||||||
if (value.error() == false)
|
if (value.error() == false)
|
||||||
{
|
{
|
||||||
QSharedPointer<VGObject> obj = VAbstractTool::data.GetGObject(id);
|
if (value.getDoubleValue() > 0)// Formula don't check this, but radius can't be 0 or negative
|
||||||
QSharedPointer<VArc> arc = qSharedPointerDynamicCast<VArc>(obj);
|
{
|
||||||
arc->SetFormulaRadius(value);
|
QSharedPointer<VGObject> obj = VAbstractTool::data.GetGObject(id);
|
||||||
SaveOption(obj);
|
QSharedPointer<VArc> arc = qSharedPointerDynamicCast<VArc>(obj);
|
||||||
|
arc->SetFormulaRadius(value);
|
||||||
|
SaveOption(obj);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -241,8 +244,12 @@ void VToolArc::setFormulaF1(const VFormula &value)
|
||||||
{
|
{
|
||||||
QSharedPointer<VGObject> obj = VAbstractTool::data.GetGObject(id);
|
QSharedPointer<VGObject> obj = VAbstractTool::data.GetGObject(id);
|
||||||
QSharedPointer<VArc> arc = qSharedPointerDynamicCast<VArc>(obj);
|
QSharedPointer<VArc> arc = qSharedPointerDynamicCast<VArc>(obj);
|
||||||
arc->SetFormulaF1(value);
|
|
||||||
SaveOption(obj);
|
if (qFuzzyCompare(value.getDoubleValue() + 1, arc->GetF2() + 1)==false)// Angles can't be equal
|
||||||
|
{
|
||||||
|
arc->SetFormulaF1(value);
|
||||||
|
SaveOption(obj);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -266,8 +273,11 @@ void VToolArc::setFormulaF2(const VFormula &value)
|
||||||
{
|
{
|
||||||
QSharedPointer<VGObject> obj = VAbstractTool::data.GetGObject(id);
|
QSharedPointer<VGObject> obj = VAbstractTool::data.GetGObject(id);
|
||||||
QSharedPointer<VArc> arc = qSharedPointerDynamicCast<VArc>(obj);
|
QSharedPointer<VArc> arc = qSharedPointerDynamicCast<VArc>(obj);
|
||||||
arc->SetFormulaF2(value);
|
if (qFuzzyCompare(value.getDoubleValue() + 1, arc->GetF1() + 1)==false)// Angles can't be equal
|
||||||
SaveOption(obj);
|
{
|
||||||
|
arc->SetFormulaF2(value);
|
||||||
|
SaveOption(obj);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -241,6 +241,7 @@ int VAbstractTool::ConfirmDeletion()
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
void VAbstractTool::SaveOption(QSharedPointer<VGObject> &obj)
|
void VAbstractTool::SaveOption(QSharedPointer<VGObject> &obj)
|
||||||
{
|
{
|
||||||
|
qCDebug(vTool)<<"Saving tool options";
|
||||||
QDomElement oldDomElement = doc->elementById(QString().setNum(id));
|
QDomElement oldDomElement = doc->elementById(QString().setNum(id));
|
||||||
if (oldDomElement.isElement())
|
if (oldDomElement.isElement())
|
||||||
{
|
{
|
||||||
|
@ -254,7 +255,7 @@ void VAbstractTool::SaveOption(QSharedPointer<VGObject> &obj)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
qDebug()<<"Can't find tool with id ="<< id << Q_FUNC_INFO;
|
qCDebug(vTool)<<"Can't find tool with id ="<< id << Q_FUNC_INFO;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,8 @@
|
||||||
|
|
||||||
#include "vdatatool.h"
|
#include "vdatatool.h"
|
||||||
|
|
||||||
|
Q_LOGGING_CATEGORY(vTool, "v.tool")
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
/**
|
/**
|
||||||
* @brief VDataTool constructor.
|
* @brief VDataTool constructor.
|
||||||
|
|
|
@ -30,6 +30,9 @@
|
||||||
#define VDATATOOL_H
|
#define VDATATOOL_H
|
||||||
|
|
||||||
#include "../container/vcontainer.h"
|
#include "../container/vcontainer.h"
|
||||||
|
#include <QLoggingCategory>
|
||||||
|
|
||||||
|
Q_DECLARE_LOGGING_CATEGORY(vTool)
|
||||||
|
|
||||||
class QObject;
|
class QObject;
|
||||||
|
|
||||||
|
|
|
@ -186,6 +186,8 @@ void VToolDetail::Create(DialogTool *dialog, VMainGraphicsScene *scene, VPattern
|
||||||
}
|
}
|
||||||
det.setName(detail.getName());
|
det.setName(detail.getName());
|
||||||
det.setWidth(detail.getWidth());
|
det.setWidth(detail.getWidth());
|
||||||
|
det.setClosed(detail.getClosed());
|
||||||
|
det.setSeamAllowance(detail.getSeamAllowance());
|
||||||
Create(0, det, scene, doc, data, Document::FullParse, Source::FromGui);
|
Create(0, det, scene, doc, data, Document::FullParse, Source::FromGui);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,6 +45,8 @@ AddDet::~AddDet()
|
||||||
// cppcheck-suppress unusedFunction
|
// cppcheck-suppress unusedFunction
|
||||||
void AddDet::undo()
|
void AddDet::undo()
|
||||||
{
|
{
|
||||||
|
qCDebug(vUndo)<<"Undo.";
|
||||||
|
|
||||||
QDomElement element;
|
QDomElement element;
|
||||||
if (doc->GetActivNodeElement(VPattern::TagDetails, element))
|
if (doc->GetActivNodeElement(VPattern::TagDetails, element))
|
||||||
{
|
{
|
||||||
|
@ -53,19 +55,19 @@ void AddDet::undo()
|
||||||
{
|
{
|
||||||
if (element.removeChild(domElement).isNull())
|
if (element.removeChild(domElement).isNull())
|
||||||
{
|
{
|
||||||
qDebug()<<"Can't delete node";
|
qCDebug(vUndo)<<"Can't delete node";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
qDebug()<<"Can't get node by id = "<<nodeId<<Q_FUNC_INFO;
|
qCDebug(vUndo)<<"Can't get node by id = "<<nodeId<<".";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
qDebug()<<"Can't find tag"<<VPattern::TagDetails<< Q_FUNC_INFO;
|
qCDebug(vUndo)<<"Can't find tag"<<VPattern::TagDetails<<".";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
emit NeedFullParsing();
|
emit NeedFullParsing();
|
||||||
|
@ -75,6 +77,8 @@ void AddDet::undo()
|
||||||
// cppcheck-suppress unusedFunction
|
// cppcheck-suppress unusedFunction
|
||||||
void AddDet::redo()
|
void AddDet::redo()
|
||||||
{
|
{
|
||||||
|
qCDebug(vUndo)<<"Redo.";
|
||||||
|
|
||||||
QDomElement element;
|
QDomElement element;
|
||||||
if (doc->GetActivNodeElement(VPattern::TagDetails, element))
|
if (doc->GetActivNodeElement(VPattern::TagDetails, element))
|
||||||
{
|
{
|
||||||
|
@ -82,7 +86,7 @@ void AddDet::redo()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
qDebug()<<"Can't find tag"<<VPattern::TagDetails<< Q_FUNC_INFO;
|
qCDebug(vUndo)<<"Can't find tag"<<VPattern::TagDetails<<".";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
RedoFullParsing();
|
RedoFullParsing();
|
||||||
|
|
|
@ -44,6 +44,8 @@ AddDetNode::~AddDetNode()
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
void AddDetNode::undo()
|
void AddDetNode::undo()
|
||||||
{
|
{
|
||||||
|
qCDebug(vUndo)<<"Undo.";
|
||||||
|
|
||||||
QDomElement modelingElement;
|
QDomElement modelingElement;
|
||||||
if (doc->GetActivNodeElement(VPattern::TagModeling, modelingElement))
|
if (doc->GetActivNodeElement(VPattern::TagModeling, modelingElement))
|
||||||
{
|
{
|
||||||
|
@ -52,19 +54,19 @@ void AddDetNode::undo()
|
||||||
{
|
{
|
||||||
if (modelingElement.removeChild(domElement).isNull())
|
if (modelingElement.removeChild(domElement).isNull())
|
||||||
{
|
{
|
||||||
qDebug()<<"Can't delete node";
|
qCDebug(vUndo)<<"Can't delete node.";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
qDebug()<<"Can't get node by id = "<<nodeId<<Q_FUNC_INFO;
|
qCDebug(vUndo)<<"Can't get node by id = "<<nodeId<<".";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
qDebug()<<"Can't find tag"<<VPattern::TagModeling<< Q_FUNC_INFO;
|
qCDebug(vUndo)<<"Can't find tag"<<VPattern::TagModeling<<".";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -72,6 +74,8 @@ void AddDetNode::undo()
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
void AddDetNode::redo()
|
void AddDetNode::redo()
|
||||||
{
|
{
|
||||||
|
qCDebug(vUndo)<<"Redo.";
|
||||||
|
|
||||||
QDomElement modelingElement;
|
QDomElement modelingElement;
|
||||||
if (doc->GetActivNodeElement(VPattern::TagModeling, modelingElement))
|
if (doc->GetActivNodeElement(VPattern::TagModeling, modelingElement))
|
||||||
{
|
{
|
||||||
|
@ -79,7 +83,7 @@ void AddDetNode::redo()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
qDebug()<<"Can't find tag"<<VPattern::TagModeling<< Q_FUNC_INFO;
|
qCDebug(vUndo)<<"Can't find tag"<<VPattern::TagModeling<<".";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user