X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModuleBase%2FModuleBase_WidgetFileSelector.cpp;h=dbe8e8ce30411823c8863bd989e56b5b2585101d;hb=061a63480f6840b6d945f7744b3b972e2d4cb25d;hp=a2e8186c8f2e85797ae3468b11507ab77f803405;hpb=2b0773dd16ddc859eb8d4cbb52afded33eb25c97;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_WidgetFileSelector.cpp b/src/ModuleBase/ModuleBase_WidgetFileSelector.cpp index a2e8186c8..dbe8e8ce3 100644 --- a/src/ModuleBase/ModuleBase_WidgetFileSelector.cpp +++ b/src/ModuleBase/ModuleBase_WidgetFileSelector.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D + /* * ModuleBase_WidgetFileSelector.cpp * @@ -8,20 +10,24 @@ #include #include #include +#include +#include #include +#include #include -#include #include +#include +#include #include #include #include #include +#include #include -#include -#include +#include #include ModuleBase_WidgetFileSelector::ModuleBase_WidgetFileSelector(QWidget* theParent, @@ -30,26 +36,25 @@ ModuleBase_WidgetFileSelector::ModuleBase_WidgetFileSelector(QWidget* theParent, : ModuleBase_ModelWidget(theParent, theData, theParentId) { myTitle = QString::fromStdString(theData->getProperty("title")); - //TODO(sbh): Get them from the feature - myFormats = getSupportedFormats(theData); + myType = (theData->getProperty("type") == "save") ? WFS_SAVE : WFS_OPEN; myDefaultPath = QString::fromStdString(theData->getProperty("path")); - myMainWidget = new QWidget(theParent); - QGridLayout* aMainLay = new QGridLayout(myMainWidget); - aMainLay->setContentsMargins(0, 0, 0, 0); - QLabel* aTitleLabel = new QLabel(myTitle, myMainWidget); + QGridLayout* aMainLay = new QGridLayout(this); + ModuleBase_Tools::adjustMargins(aMainLay); + QLabel* aTitleLabel = new QLabel(myTitle, this); aTitleLabel->setIndent(1); aMainLay->addWidget(aTitleLabel, 0, 0); - myPathField = new QLineEdit(myMainWidget); + myPathField = new QLineEdit(this); aMainLay->addWidget(myPathField, 1, 0); - QPushButton* aSelectPathBtn = new QPushButton("...", myMainWidget); + QPushButton* aSelectPathBtn = new QPushButton("...", this); + aSelectPathBtn->setToolTip(tr("Select file...")); aSelectPathBtn->setMaximumWidth(20); aSelectPathBtn->setMaximumHeight(20); aMainLay->addWidget(aSelectPathBtn, 1, 1); aMainLay->setColumnStretch(0, 1); myPathField->setMinimumHeight(20); aMainLay->setHorizontalSpacing(1); - myMainWidget->setLayout(aMainLay); + this->setLayout(aMainLay); connect(myPathField, SIGNAL(textChanged(const QString&)), this, SLOT(onPathChanged())); @@ -61,8 +66,11 @@ ModuleBase_WidgetFileSelector::~ModuleBase_WidgetFileSelector() { } -bool ModuleBase_WidgetFileSelector::storeValue() const +bool ModuleBase_WidgetFileSelector::storeValueCustom() const { + // A rare case when plugin was not loaded. + if (!myFeature) + return false; DataPtr aData = myFeature->data(); AttributeStringPtr aStringAttr = aData->string(attributeID()); QString aWidgetValue = myPathField->text(); @@ -71,70 +79,131 @@ bool ModuleBase_WidgetFileSelector::storeValue() const return true; } -bool ModuleBase_WidgetFileSelector::restoreValue() +bool ModuleBase_WidgetFileSelector::restoreValueCustom() { + // A rare case when plugin was not loaded. + if (!myFeature) + return false; DataPtr aData = myFeature->data(); AttributeStringPtr aStringAttr = aData->string(attributeID()); bool isBlocked = myPathField->blockSignals(true); - myPathField->setText(QString::fromStdString(aStringAttr->value())); + QString aNewText = QString::fromStdString(aStringAttr->value()); + if( myPathField->text() != aNewText ) + myPathField->setText( aNewText ); myPathField->blockSignals(isBlocked); return true; } -QWidget* ModuleBase_WidgetFileSelector::getControl() const -{ - return myMainWidget; -} - QList ModuleBase_WidgetFileSelector::getControls() const { QList result; - QPushButton * aButton = myMainWidget->findChild(); - result << aButton; result << myPathField; return result; } bool ModuleBase_WidgetFileSelector::isCurrentPathValid() { - QFileInfo aFile (myPathField->text()); - return aFile.exists() && myFormats.contains(aFile.suffix(), Qt::CaseInsensitive); + QFileInfo aFile(myPathField->text()); + return aFile.exists(); } - void ModuleBase_WidgetFileSelector::onPathSelectionBtn() { - QString aFilter = formatsString(myFormats); - QString aFileName = QFileDialog::getOpenFileName(myMainWidget, myTitle, myDefaultPath, aFilter); + QString aDefaultPath = myPathField->text().isEmpty() + ? myDefaultPath + : QFileInfo(myPathField->text()).absolutePath(); + QString aFilter = filterString(); + QString aFileName = (myType == WFS_SAVE) + ? QFileDialog::getSaveFileName(this, myTitle, aDefaultPath, aFilter, &mySelectedFilter) + : QFileDialog::getOpenFileName(this, myTitle, aDefaultPath, aFilter, &mySelectedFilter); if (!aFileName.isEmpty()) { + if (myType == WFS_SAVE) + aFileName = applyExtension(aFileName, mySelectedFilter); myPathField->setText(aFileName); } } void ModuleBase_WidgetFileSelector::onPathChanged() { - if(!isCurrentPathValid()) + if (myType == WFS_OPEN && !isCurrentPathValid()) return; storeValue(); emit valuesChanged(); } -QStringList ModuleBase_WidgetFileSelector::getSupportedFormats(const Config_WidgetAPI* theData) const +QString ModuleBase_WidgetFileSelector::formatToFilter(const QString & theFormat) { - QString aXMLFormat = QString::fromStdString(theData->getProperty("formats")); - aXMLFormat = aXMLFormat.toUpper(); - const QChar kSep = ','; - return aXMLFormat.split(kSep, QString::SkipEmptyParts); + if (theFormat.isEmpty() && !theFormat.contains(":")) + return QString(); + + QStringList aExtesionList = theFormat.section(':', 0, 0).split("|"); + QString aFormat = theFormat.section(':', 1, 1); + return QString("%1 files (%2)").arg(aFormat) + .arg(QStringList(aExtesionList).replaceInStrings(QRegExp("^(.*)$"), "*.\\1").join(" ")); } -QString ModuleBase_WidgetFileSelector::formatsString(const QStringList theFormats) const +QString ModuleBase_WidgetFileSelector::filterToShortFormat(const QString & theFilter) { + // Simplified implementation. + // It relies on theFilter was made by formatToFilter() function. + return theFilter.section(' ', 0, 0); +} + +QStringList ModuleBase_WidgetFileSelector::filterToExtensions(const QString & theFilter) +{ + // Simplified implementation. + // It relies on theFilter was made by formatToFilter() function. + QStringList anExtensions = theFilter.section("(", 1, 1).section(")", 0, 0).split(" "); + return anExtensions; +} + +QStringList ModuleBase_WidgetFileSelector::getValidatorFormats() const +{ + SessionPtr aMgr = ModelAPI_Session::get(); + ModelAPI_ValidatorsFactory* aFactory = aMgr->validators(); + + ModelAPI_ValidatorsFactory::Validators allValidators; + aFactory->validators(myFeature->getKind(), myAttributeID, allValidators); + QStringList aResult; - foreach(QString eachFormat, theFormats) { - aResult << QString("%1 files (*.%1)").arg(eachFormat); + std::list anArgumentList = allValidators.front().second; + std::list::const_iterator it = anArgumentList.begin(); + for (; it != anArgumentList.end(); ++it) { + QString aFormat = QString::fromStdString(*it); + if (!aFormat.isEmpty()) + aResult << aFormat; } + return aResult; +} + +QString ModuleBase_WidgetFileSelector::filterString() const +{ + QStringList aResult; + QStringList aValidatorFormats = getValidatorFormats(); + + foreach(const QString & eachFormat, aValidatorFormats) { + aResult << formatToFilter(eachFormat); + } + if (myType == WFS_OPEN) + aResult << QString("All files (*.*)"); return aResult.join(";;"); } +QString ModuleBase_WidgetFileSelector::applyExtension(const QString& theFileName, + const QString& theFilter) +{ + QString aResult = theFileName; + bool hasExtension = false; + QStringList anExtensions = filterToExtensions(theFilter); + foreach(const QString& anExtension, anExtensions) { + if (theFileName.endsWith(anExtension.section(".", 1, 1), Qt::CaseInsensitive)) { + hasExtension = true; + break; + } + } + if (!hasExtension && !anExtensions.isEmpty()) + aResult = QString("%1.%2").arg(theFileName).arg(anExtensions[0].section(".", 1, 1)); + return aResult; +}