Resolved issue #382. Add 'Create from existing file' option in Tape,

Create/Edit.

--HG--
branch : develop
This commit is contained in:
Roman Telezhynskyi 2015-10-15 15:37:10 +03:00
parent 1e05300ae1
commit 3358f9dbc7
8 changed files with 203 additions and 4 deletions

View File

@ -385,6 +385,28 @@ void TMainWindow::OpenTemplate()
}
}
//---------------------------------------------------------------------------------------------------------------------
void TMainWindow::CreateFromExisting()
{
if (m == nullptr)
{
const QString filter = tr("Individual measurements (*.vit)");
//Use standard path to standard measurements
const QString pathTo = qApp->TapeSettings()->GetPathIndividualMeasurements();
const QString mPath = QFileDialog::getOpenFileName(this, tr("Select file"), pathTo, filter);
if (not mPath.isEmpty())
{
LoadFromExistingFile(mPath);
}
}
else
{
qApp->NewMainWindow();
qApp->MainWindow()->CreateFromExisting();
}
}
//---------------------------------------------------------------------------------------------------------------------
void TMainWindow::Find(const QString &term)
{
@ -1557,6 +1579,7 @@ void TMainWindow::SetupMenu()
connect(ui->actionOpenIndividual, &QAction::triggered, this, &TMainWindow::OpenIndividual);
connect(ui->actionOpenStandard, &QAction::triggered, this, &TMainWindow::OpenStandard);
connect(ui->actionOpenTemplate, &QAction::triggered, this, &TMainWindow::OpenTemplate);
connect(ui->actionCreateFromExisting, &QAction::triggered, this, &TMainWindow::CreateFromExisting);
connect(ui->actionSave, &QAction::triggered, this, &TMainWindow::FileSave);
ui->actionSave->setShortcuts(QKeySequence::Save);
@ -2344,6 +2367,132 @@ void TMainWindow::UpdatePatternUnit()
ui->tableWidget->selectRow(row);
}
//---------------------------------------------------------------------------------------------------------------------
bool TMainWindow::LoadFromExistingFile(const QString &path)
{
if (m == nullptr)
{
if (not QFileInfo(path).exists())
{
qCCritical(tMainWindow, "%s", qUtf8Printable(tr("File '%1' doesn't exist!").arg(path)));
if (qApp->IsTestMode())
{
qApp->exit(V_EX_NOINPUT);
}
return false;
}
// Check if file already opened
QList<TMainWindow*>list = qApp->MainWindows();
for (int i = 0; i < list.size(); ++i)
{
if (list.at(i)->CurrentFile() == path)
{
list.at(i)->activateWindow();
close();
return false;
}
}
VlpCreateLock(lock, QFileInfo(path).fileName()+".lock");
if (not lock->IsLocked())
{
qCCritical(tMainWindow, "%s", qUtf8Printable(tr("This file already opened in another window.")));
if (qApp->IsTestMode())
{
qApp->exit(V_EX_NOINPUT);
}
return false;
}
try
{
data = new VContainer(qApp->TrVars(), &mUnit);
m = new VMeasurements(data);
m->setXMLContent(path);
mType = m->Type();
if (mType == MeasurementsType::Unknown)
{
VException e(tr("File has unknown format."));
throw e;
}
if (mType == MeasurementsType::Standard)
{
VException e(tr("Export standard measurements not supported."));
throw e;
}
else
{
VVITConverter converter(path);
converter.Convert();
VDomDocument::ValidateXML(VVITConverter::CurrentSchema, path);
}
m->setXMLContent(path);// Read again after conversion
if (not m->IsDefinedKnownNamesValid())
{
VException e(tr("File contains invalid known measurement(s)."));
throw e;
}
mUnit = m->MUnit();
pUnit = mUnit;
data->SetHeight(m->BaseHeight());
data->SetSize(m->BaseSize());
ui->labelToolTip->setVisible(false);
ui->tabWidget->setVisible(true);
InitWindow();
m->ClearForExport();
RefreshData();
if (ui->tableWidget->rowCount() > 0)
{
ui->tableWidget->selectRow(0);
}
lock.reset();// Now we can unlock the file
GUIReadOnly(m->ReadOnly()); // Keep last
}
catch (VException &e)
{
qCCritical(tMainWindow, "%s\n\n%s\n\n%s", qUtf8Printable(tr("File error.")),
qUtf8Printable(e.ErrorMessage()), qUtf8Printable(e.DetailedInformation()));
ui->labelToolTip->setVisible(true);
ui->tabWidget->setVisible(false);
delete m;
m = nullptr;
delete data;
data = nullptr;
lock.reset();
if (qApp->IsTestMode())
{
qApp->exit(V_EX_NOINPUT);
}
return false;
}
}
else
{
qApp->NewMainWindow();
return qApp->MainWindow()->LoadFile(path);
}
return true;
}
//---------------------------------------------------------------------------------------------------------------------
void TMainWindow::SetDecimals()
{

View File

@ -68,6 +68,7 @@ public slots:
void OpenIndividual();
void OpenStandard();
void OpenTemplate();
void CreateFromExisting();
protected:
virtual void closeEvent(QCloseEvent *event) Q_DECL_OVERRIDE;
@ -178,6 +179,8 @@ private:
QStringList FilterMeasurements(const QStringList &mNew, const QStringList &mFilter);
void UpdatePatternUnit();
bool LoadFromExistingFile(const QString &path);
};
#endif // TMAINWINDOW_H

View File

@ -724,6 +724,7 @@
<addaction name="actionOpenIndividual"/>
<addaction name="actionOpenStandard"/>
<addaction name="actionOpenTemplate"/>
<addaction name="actionCreateFromExisting"/>
<addaction name="separator"/>
<addaction name="actionSave"/>
<addaction name="actionSaveAs"/>
@ -958,6 +959,17 @@
<string>Import from a pattern</string>
</property>
</action>
<action name="actionCreateFromExisting">
<property name="text">
<string>Create from existing ...</string>
</property>
<property name="toolTip">
<string>Create from existing file</string>
</property>
<property name="shortcut">
<string notr="true"/>
</property>
</action>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources>

View File

@ -39,7 +39,7 @@ OBJECTS_DIR = obj
include(qmuparser.pri)
VERSION = 2.3.0
VERSION = 2.4.0
# Set "make install" command for Unix-like systems.
unix:!macx{

View File

@ -73,10 +73,14 @@ QmuTokenParser::~QmuTokenParser()
* Work only with expressions in internal (C) locale.
* @param formula expression for test
* @return true if fomula has single number
* @throw qmu::QmuParserError if expression is incorrect. Has bad separator.
*/
bool QmuTokenParser::IsSingle(const QString &formula)
{
if (formula.isEmpty())
{
return false;// if don't know say no
}
QmuTokenParser *cal = new QmuTokenParser();
// Parser doesn't know any variable on this stage. So, we just use variable factory that for each unknown
@ -84,8 +88,16 @@ bool QmuTokenParser::IsSingle(const QString &formula)
cal->SetVarFactory(AddVariable, cal);
cal->SetSepForEval();//Reset separators options
try
{
cal->SetExpr(formula);
cal->Eval();// We don't need save result, only parse formula
}
catch (const qmu::QmuParserError &e)
{
Q_UNUSED(e)
return false;// something wrong with formula, say no
}
QMap<int, QString> tokens = cal->GetTokens();// Tokens (variables, measurements)
const QMap<int, QString> numbers = cal->GetNumbers();// All numbers in expression

View File

@ -31,6 +31,7 @@
#include "../ifc/xml/vvitconverter.h"
#include "../ifc/exception/vexceptionemptyparameter.h"
#include "../vpatterndb/calculator.h"
#include "../qmuparser/qmutokenparser.h"
const QString VMeasurements::TagVST = QStringLiteral("vst");
const QString VMeasurements::TagVIT = QStringLiteral("vit");
@ -278,6 +279,24 @@ void VMeasurements::ReadMeasurements() const
delete tempData;
}
//---------------------------------------------------------------------------------------------------------------------
void VMeasurements::ClearForExport()
{
const QDomNodeList list = elementsByTagName(TagMeasurement);
for (int i=0; i < list.size(); ++i)
{
QDomElement domElement = list.at(i).toElement();
if (domElement.isNull() == false)
{
if (qmu::QmuTokenParser::IsSingle(domElement.attribute(AttrValue)))
{
SetAttribute(domElement, AttrValue, QString("0"));
}
}
}
}
//---------------------------------------------------------------------------------------------------------------------
MeasurementsType VMeasurements::Type() const
{

View File

@ -54,6 +54,7 @@ public:
void MoveBottom(const QString &name);
void ReadMeasurements() const;
void ClearForExport();
MeasurementsType Type() const;
Unit MUnit() const;

View File

@ -49,6 +49,9 @@ void TST_QmuTokenParser::IsSingle_data()
QTest::newRow("Digit and variable") << "2+a" << false;
QTest::newRow("One variable twice") << "a+a" << false;
QTest::newRow("Two variables") << "a+b" << false;
QTest::newRow("Empty string") << "" << false;
QTest::newRow("Several spaces") << " " << false;
QTest::newRow("Invalid formula") << "2*)))" << false;
}
//---------------------------------------------------------------------------------------------------------------------