@ -15,6 +15,7 @@
# include <FormLineEditWidget.h>
# include <FormBrowseEditWidget.h>
# include <PathValidator.h>
# include <EngineInfo.h>
# include <QVBoxLayout>
# include <QHBoxLayout>
@ -49,16 +50,16 @@ namespace O3DE::ProjectManager
vLayout - > setContentsMargins ( 0 , 0 , 0 , 0 ) ;
vLayout - > setAlignment ( Qt : : AlignTop ) ;
{
m_projectName = new FormLineEditWidget ( tr ( " Project name " ) , tr ( " New Project " ) , this ) ;
m_projectName - > setErrorLabelText (
tr ( " A project with this name already exists at this location. Please choose a new name or location. " ) ) ;
const QString defaultName { " NewProject " } ;
const QString defaultPath = QDir : : toNativeSeparators ( GetDefaultProjectPath ( ) + " / " + defaultName ) ;
m_projectName = new FormLineEditWidget ( tr ( " Project name " ) , defaultName , this ) ;
connect ( m_projectName - > lineEdit ( ) , & QLineEdit : : textChanged , this , & NewProjectSettingsScreen : : ValidateProjectPath ) ;
vLayout - > addWidget ( m_projectName ) ;
m_projectPath =
new FormBrowseEditWidget ( tr ( " Project Location " ) , QStandardPaths : : writableLocation ( QStandardPaths : : DocumentsLocation ) , this ) ;
m_projectPath = new FormBrowseEditWidget ( tr ( " Project Location " ) , defaultPath , this ) ;
m_projectPath - > lineEdit ( ) - > setReadOnly ( true ) ;
m_projectPath - > setErrorLabelText ( tr ( " Please provide a valid path to a folder that exists " ) ) ;
m_projectPath - > lineEdit ( ) - > setValidator ( new PathValidator ( PathValidator : : PathMode : : ExistingFolder , this ) ) ;
connect ( m_projectPath - > lineEdit ( ) , & QLineEdit : : textChanged , this , & NewProjectSettingsScreen : : ValidateProjectPath ) ;
vLayout - > addWidget ( m_projectPath ) ;
// if we don't use a QFrame we cannot "contain" the widgets inside and move them around
@ -112,17 +113,41 @@ namespace O3DE::ProjectManager
this - > setLayout ( hLayout ) ;
}
QString NewProjectSettingsScreen : : GetDefaultProjectPath ( )
{
QString defaultPath = QStandardPaths : : writableLocation ( QStandardPaths : : DocumentsLocation ) ;
AZ : : Outcome < EngineInfo > engineInfoResult = PythonBindingsInterface : : Get ( ) - > GetEngineInfo ( ) ;
if ( engineInfoResult . IsSuccess ( ) )
{
QDir path ( QDir : : toNativeSeparators ( engineInfoResult . GetValue ( ) . m_defaultProjectsFolder ) ) ;
if ( path . exists ( ) )
{
defaultPath = path . absolutePath ( ) ;
}
}
return defaultPath ;
}
ProjectManagerScreen NewProjectSettingsScreen : : GetScreenEnum ( )
{
return ProjectManagerScreen : : NewProjectSettings ;
}
void NewProjectSettingsScreen : : ValidateProjectPath ( )
{
Validate ( ) ;
}
void NewProjectSettingsScreen : : NotifyCurrentScreen ( )
{
Validate ( ) ;
}
ProjectInfo NewProjectSettingsScreen : : GetProjectInfo ( )
{
ProjectInfo projectInfo ;
projectInfo . m_projectName = m_projectName - > lineEdit ( ) - > text ( ) ;
projectInfo . m_path = QDir : : toNativeSeparators ( m_projectPath - > lineEdit ( ) - > text ( ) + " / " + projectInfo . m_projectName ) ;
projectInfo . m_path = m_projectPath- > lineEdit ( ) - > text ( ) ;
return projectInfo ;
}
@ -133,24 +158,44 @@ namespace O3DE::ProjectManager
bool NewProjectSettingsScreen : : Validate ( )
{
bool projectNameIsValid = true ;
if ( m_projectName - > lineEdit ( ) - > text ( ) . isEmpty ( ) )
{
projectNameIsValid = false ;
}
bool projectPathIsValid = true ;
if ( m_projectPath - > lineEdit ( ) - > text ( ) . isEmpty ( ) )
{
projectPathIsValid = false ;
m_projectPath - > setErrorLabelText ( tr ( " Please provide a valid location. " ) ) ;
}
else
{
QDir path ( m_projectPath - > lineEdit ( ) - > text ( ) ) ;
if ( path . exists ( ) & & ! path . isEmpty ( ) )
{
projectPathIsValid = false ;
m_projectPath - > setErrorLabelText ( tr ( " This folder exists and isn't empty. Please choose a different location. " ) ) ;
}
}
QDir path ( QDir : : toNativeSeparators ( m_projectPath - > lineEdit ( ) - > text ( ) + " / " + m_projectName - > lineEdit ( ) - > text ( ) ) ) ;
if ( path . exists ( ) & & ! path . isEmpty ( ) )
bool projectNameIsValid = true ;
if ( m_projectName- > lineEdit ( ) - > text ( ) . isEmpty ( ) )
{
projectPathIsValid = false ;
projectNameIsValid = false ;
m_projectName - > setErrorLabelText ( tr ( " Please provide a project name. " ) ) ;
}
else
{
// this validation should roughly match the utils.validate_identifier which the cli
// uses to validate project names
QRegExp validProjectNameRegex ( " [A-Za-z][A-Za-z0-9_-]{0,63} " ) ;
const bool result = validProjectNameRegex . exactMatch ( m_projectName - > lineEdit ( ) - > text ( ) ) ;
if ( ! result )
{
projectNameIsValid = false ;
m_projectName - > setErrorLabelText ( tr ( " Project names must start with a letter and consist of up to 64 letter, number, '_' or '-' characters " ) ) ;
}
}
m_projectName - > setErrorLabelVisible ( ! projectNameIsValid ) ;
m_projectPath - > setErrorLabelVisible ( ! projectPathIsValid ) ;
return projectNameIsValid & & projectPathIsValid ;
}
} // namespace O3DE::ProjectManager