"...gui/git@code.ornl.gov:mantidproject/mantid.git" did not exist on "9a8042019eecc8e714f15a9efa88ce59381fbf6f"
Newer
Older
Gigg, Martyn Anthony
committed
//----------------------------------
// Includes
//----------------------------------
#include "MantidQtAPI/AlgorithmDialog.h"
#include "MantidQtAPI/AlgorithmInputHistory.h"
Gigg, Martyn Anthony
committed
#include "MantidKernel/PropertyWithValue.h"
#include "MantidKernel/FileValidator.h"
Gigg, Martyn Anthony
committed
#include <QIcon>
#include <QLabel>
#include <QMessageBox>
Gigg, Martyn Anthony
committed
#include <QFileDialog>
#include <QFileInfo>
#include <QLineEdit>
Gigg, Martyn Anthony
committed
using namespace MantidQt::API;
//------------------------------------------------------
// Public member functions
//------------------------------------------------------
/**
* Default Constructor
*/
AlgorithmDialog::AlgorithmDialog(QWidget* parent) :
Gigg, Martyn Anthony
committed
QDialog(parent), m_algorithm(NULL), m_algName(""), m_propertyValueMap(), m_forScript(false), m_strMessage(""),
m_msgAvailable(false), m_bIsInitialized(false), m_algProperties(), m_validators()
Gigg, Martyn Anthony
committed
{
}
/**
* Destructor
*/
AlgorithmDialog::~AlgorithmDialog()
{
}
/**
* Create the layout for this dialog.
*/
void AlgorithmDialog::initializeLayout()
{
if( isInitialized() ) return;
//Set a common title
setWindowTitle(QString::fromStdString(getAlgorithm()->name()) + " input dialog");
//Set the icon
setWindowIcon(QIcon(":/MantidPlot_Icon_32offset.png"));
createValidatorLabels();
Steve Williams
committed
//This derived class function adds buttons and dialogboxes loaded with default values
Gigg, Martyn Anthony
committed
this->initLayout();
Steve Williams
committed
//we want those default values
this->parseInput();
//because we will set properties to those values, which will do the validation, which will show users what needs chang
setPropertyValues();
Gigg, Martyn Anthony
committed
m_bIsInitialized = true;
}
/**
* Has this dialog been initialized yet
* @returns Whether initialzedLayout has been called yet
*/
bool AlgorithmDialog::isInitialized() const
{
return m_bIsInitialized;
}
//------------------------------------------------------
// Protected member functions
//------------------------------------------------------
/**
* Get the algorithm pointer
* @returns A pointer to the algorithm that is associated with the dialog
*/
Mantid::API::IAlgorithm* AlgorithmDialog::getAlgorithm() const
Gigg, Martyn Anthony
committed
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
{
return m_algorithm;
}
/**
* Are we for a script or not
* @returns A boolean inidcating whether we are being called from a script
*/
bool AlgorithmDialog::isForScript() const
{
return m_forScript;
}
/**
* Return the message string
* @returns the message string
*/
const QString & AlgorithmDialog::getOptionalMessage() const
{
return m_strMessage;
}
/*
* Is there a message string available
* @returns A boolean indicating whether the message string is empty
*/
bool AlgorithmDialog::isMessageAvailable() const
{
return !m_strMessage.isEmpty();
}
/**
* Get a named property for this algorithm
* @param propName The name of the property
*/
Mantid::Kernel::Property* AlgorithmDialog::getAlgorithmProperty(const QString & propName) const
{
if( m_algProperties.contains(propName) ) return m_algProperties[propName];
else return NULL;
}
/**
* Get a property validator label
*/
QLabel* AlgorithmDialog::getValidatorMarker(const QString & propname) const
{
Gigg, Martyn Anthony
committed
return m_validators.value(propname);
Gigg, Martyn Anthony
committed
}
/**
* Adds a property (name,value) pair to the stored map
*/
void AlgorithmDialog::addPropertyValueToMap(const QString & name, const QString & value)
{
if( name.isEmpty() /*|| value.isEmpty()*/ ) return;
Gigg, Martyn Anthony
committed
m_propertyValueMap.insert(name, value);
}
/**
* Set the properties that have been parsed from the dialog.
* @returns A boolean that indicates if the validation was successful.
*/
bool AlgorithmDialog::setPropertyValues()
{
Gigg, Martyn Anthony
committed
QHash<QString, Mantid::Kernel::Property*>::const_iterator pend = m_algProperties.end();
Gigg, Martyn Anthony
committed
QString algName = QString::fromStdString(getAlgorithm()->name());
AlgorithmInputHistory::Instance().clearAlgorithmInput(algName);
Gigg, Martyn Anthony
committed
bool allValid(true);
Gigg, Martyn Anthony
committed
for( QHash<QString, Mantid::Kernel::Property*>::const_iterator pitr = m_algProperties.begin();
Gigg, Martyn Anthony
committed
pitr != pend; ++pitr )
{
Mantid::Kernel::Property *prop = pitr.value();
QString pName = pitr.key();
Gigg, Martyn Anthony
committed
QString value = m_propertyValueMap.value(pName);
QLabel *validator = getValidatorMarker(pitr.key());
Steve Williams
committed
std::string error = "";
if ( !value.isEmpty() )
{//if there something in the box then use it
error = prop->setValue(value.toStdString());
Gigg, Martyn Anthony
committed
}
Steve Williams
committed
else
{//else use the default with may or may not be a valid property value
error = prop->setValue(prop->getDefault());
}
if( error == "" )
{//no error
Gigg, Martyn Anthony
committed
if( validator ) validator->hide();
Gigg, Martyn Anthony
committed
//Store value for future input
AlgorithmInputHistory::Instance().storeNewValue(algName, QPair<QString, QString>(pName, value));
}
else
Steve Williams
committed
{//the property could not be set
Gigg, Martyn Anthony
committed
allValid = false;
Steve Williams
committed
if( validator && validator->parent() )
{
//a description of the problem will be visible to users if they linger their mouse over validator star mark
validator->setToolTip( QString::fromStdString(error) );
validator->show();
}
Gigg, Martyn Anthony
committed
}
Gigg, Martyn Anthony
committed
}
Gigg, Martyn Anthony
committed
return allValid;
Gigg, Martyn Anthony
committed
}
Gigg, Martyn Anthony
committed
/**
* Is the value a suggested value
*/
bool AlgorithmDialog::isValueSuggested(const QString & propName) const
{
return m_suggestedValues.contains(propName);
}
Gigg, Martyn Anthony
committed
/**
* Open a file selection box
* @param The property name that this is associated with
*/
QString AlgorithmDialog::openLoadFileDialog(const QString & propName)
{
if( propName.isEmpty() ) return "";
Gigg, Martyn Anthony
committed
Mantid::Kernel::PropertyWithValue<std::string>* prop =
dynamic_cast< Mantid::Kernel::PropertyWithValue<std::string>* >( getAlgorithmProperty(propName) );
Gigg, Martyn Anthony
committed
if( !prop ) return "";
//The allowed values in this context are file extensions
std::vector<std::string> exts = prop->allowedValues();
QString filter;
if( !exts.empty() )
{
filter = "Files (";
std::vector<std::string>::const_iterator iend = exts.end();
for( std::vector<std::string>::const_iterator itr = exts.begin(); itr != iend; ++itr)
{
filter.append("*." + QString::fromStdString(*itr) + " ");
}
filter.trimmed();
filter.append(QString::fromStdString(")"));
}
else
{
filter = "All Files (*.*)";
}
Gigg, Martyn Anthony
committed
const Mantid::Kernel::FileValidator *file_checker = dynamic_cast<const Mantid::Kernel::FileValidator*>(prop->getValidator());
Gigg, Martyn Anthony
committed
QFileDialog dialog(this);
dialog.setNameFilter(filter);
dialog.setDirectory(AlgorithmInputHistory::Instance().getPreviousDirectory());
Gigg, Martyn Anthony
committed
if( file_checker && !file_checker->fileMustExist() )
{
Gigg, Martyn Anthony
committed
dialog.setFileMode(QFileDialog::AnyFile);
Gigg, Martyn Anthony
committed
}
else
{
Gigg, Martyn Anthony
committed
dialog.setFileMode(QFileDialog::ExistingFile);
Gigg, Martyn Anthony
committed
}
Gigg, Martyn Anthony
committed
QStringList file_names;
if (dialog.exec()) file_names = dialog.selectedFiles();
Gigg, Martyn Anthony
committed
Gigg, Martyn Anthony
committed
if( !file_names.isEmpty() )
{
AlgorithmInputHistory::Instance().setPreviousDirectory(QFileInfo(file_names[0]).absoluteDir().path());
return file_names[0];
}
return QString();
Gigg, Martyn Anthony
committed
}
/**
* Set old input for text edit field
* @param propName The name of the property
* @param field The QLineEdit field
*/
void AlgorithmDialog::setOldLineEditInput(const QString & propName, QLineEdit* field)
{
Mantid::Kernel::Property *prop = getAlgorithmProperty(propName);
if( !prop ) return;
Steve Williams
committed
if( isForScript() && ( prop->isValid() == "" ) &&
!prop->isDefault() && !isValueSuggested(propName))
Gigg, Martyn Anthony
committed
{
field->setText(QString::fromStdString(prop->value()));
field->setEnabled(false);
}
else
{
field->setText(AlgorithmInputHistory::Instance().previousInput(m_algName, propName));
}
}
Gigg, Martyn Anthony
committed
/**
* A slot that can be used to connect a button that accepts the dialog if
* all of the properties are valid
*/
Gigg, Martyn Anthony
committed
void AlgorithmDialog::accept()
Gigg, Martyn Anthony
committed
{
parseInput();
Gigg, Martyn Anthony
committed
if( setPropertyValues() ) QDialog::accept();
Gigg, Martyn Anthony
committed
else
{
QMessageBox::critical(this, "",
"One or more properties are invalid. The invalid properties are\n"
"marked with a *, hold your mouse over the * for more information." );
Gigg, Martyn Anthony
committed
}
}
Gigg, Martyn Anthony
committed
Gigg, Martyn Anthony
committed
//------------------------------------------------------
// Private member functions
//------------------------------------------------------
/**
* Set the algorithm pointer
* @param alg A pointer to the algorithm
*/
void AlgorithmDialog::setAlgorithm(Mantid::API::IAlgorithm* alg)
Gigg, Martyn Anthony
committed
{
m_algorithm = alg;
Gigg, Martyn Anthony
committed
m_algName = QString::fromStdString(alg->name());
Gigg, Martyn Anthony
committed
m_algProperties.clear();
std::vector<Mantid::Kernel::Property*>::const_iterator iend = alg->getProperties().end();
for( std::vector<Mantid::Kernel::Property*>::const_iterator itr = alg->getProperties().begin(); itr != iend;
++itr )
{
m_algProperties.insert(QString::fromStdString((*itr)->name()), *itr);
}
}
Gigg, Martyn Anthony
committed
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
/**
* Set a list of suggested values for the properties
* @param suggestedValues A string containing a list of "name=value" pairs with each separated by an '|' character
*/
void AlgorithmDialog::setSuggestedValues(const QString & suggestedValues)
{
if( suggestedValues.isEmpty() ) return;
QStringList suggestions = suggestedValues.split('|', QString::SkipEmptyParts);
QStringListIterator itr(suggestions);
m_suggestedValues.clear();
while( itr.hasNext() )
{
QString namevalue = itr.next();
QString name = namevalue.section('=', 0, 0);
// Simplified removes trims from start and end and replaces all n counts of whitespace with a single whitespace
QString value = namevalue.section('=', 1, 1).simplified();
if( value.startsWith('?') )
{
value.remove(0, 1);
m_suggestedValues.append(name);
}
addPropertyValueToMap(name, value.trimmed());
}
setPropertyValues();
m_propertyValueMap.clear();
}
Gigg, Martyn Anthony
committed
/**
* Set if we are for a script or not
* @param forScript A boolean inidcating whether we are being called from a script
*/
void AlgorithmDialog::isForScript(bool forScript)
{
m_forScript = forScript;
}
/**
* Set an optional message to be displayed at the top of the widget
* @param message The message string
*/
void AlgorithmDialog::setOptionalMessage(const QString & message)
{
m_strMessage = message;
if( message.isEmpty() ) m_msgAvailable = false;
}
/**
* This sets up the labels that are to be used to mark whether a property is valid. It has
* a default implmentation but can be overridden if some other marker is required
*/
void AlgorithmDialog::createValidatorLabels()
{
Gigg, Martyn Anthony
committed
QHash<QString, Mantid::Kernel::Property*>::const_iterator pend = m_algProperties.end();
for( QHash<QString, Mantid::Kernel::Property*>::const_iterator pitr = m_algProperties.begin();
Gigg, Martyn Anthony
committed
pitr != pend; ++pitr )
{
QLabel *validLbl = new QLabel("*");
QPalette pal = validLbl->palette();
pal.setColor(QPalette::WindowText, Qt::darkRed);
validLbl->setPalette(pal);
m_validators[pitr.key()] = validLbl;
}
}