cmake-gui: Handle relative paths in the build directory text input
Interpret a relative path with respect to the previously configured directory.
This commit is contained in:
parent
a67bb7f488
commit
a872844908
@ -350,8 +350,24 @@ void CMakeSetupDialog::initialize()
|
||||
if (!this->SourceDirectory->text().isEmpty() &&
|
||||
!this->DeferredPreset.isNull()) {
|
||||
this->onSourceDirectoryChanged(this->SourceDirectory->text());
|
||||
if (!this->BinaryDirectory->lineEdit()->text().isEmpty()) {
|
||||
this->onBinaryDirectoryChanged(
|
||||
this->BinaryDirectory->lineEdit()->text());
|
||||
}
|
||||
} else if (!this->SourceDirectory->text().isEmpty() ||
|
||||
!this->BinaryDirectory->lineEdit()->text().isEmpty()) {
|
||||
if (this->SourceDirectory->text().isEmpty() &&
|
||||
!cmSystemTools::FileIsFullPath(
|
||||
this->BinaryDirectory->lineEdit()->text().toStdString())) {
|
||||
// If the binary directory is relative, load the previous source path
|
||||
// from the config
|
||||
QSettings settings;
|
||||
settings.beginGroup("Settings/StartPath");
|
||||
QString srcDir = settings.value(QString("WhereSource")).toString();
|
||||
this->SourceDirectory->blockSignals(true);
|
||||
this->SourceDirectory->setText(srcDir);
|
||||
this->SourceDirectory->blockSignals(false);
|
||||
}
|
||||
this->onSourceDirectoryChanged(this->SourceDirectory->text());
|
||||
this->onBinaryDirectoryChanged(this->BinaryDirectory->lineEdit()->text());
|
||||
} else {
|
||||
@ -411,8 +427,13 @@ bool CMakeSetupDialog::prepareConfigure()
|
||||
}
|
||||
}
|
||||
|
||||
// remember path
|
||||
this->addBinaryPath(dir.absolutePath());
|
||||
// remember paths
|
||||
this->addBinaryPath(
|
||||
this->CMakeThread->cmakeInstance()->relativeBinaryDirectory());
|
||||
QSettings settings;
|
||||
settings.beginGroup("Settings/StartPath");
|
||||
settings.setValue("WhereSource",
|
||||
this->CMakeThread->cmakeInstance()->sourceDirectory());
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -742,8 +763,15 @@ void CMakeSetupDialog::showPresetLoadError(const QString& dir,
|
||||
|
||||
void CMakeSetupDialog::doBinaryBrowse()
|
||||
{
|
||||
QString abs_path = this->BinaryDirectory->currentText();
|
||||
if (!cmSystemTools::FileIsFullPath(abs_path.toStdString())) {
|
||||
if (!this->SourceDirectory->text().endsWith("/")) {
|
||||
abs_path = "/" + abs_path;
|
||||
}
|
||||
abs_path = this->SourceDirectory->text() + abs_path;
|
||||
}
|
||||
QString dir = QFileDialog::getExistingDirectory(
|
||||
this, tr("Enter Path to Build"), this->BinaryDirectory->currentText(),
|
||||
this, tr("Enter Path to Build"), abs_path,
|
||||
QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
|
||||
if (!dir.isEmpty() && dir != this->BinaryDirectory->currentText()) {
|
||||
this->setBinaryDirectory(dir);
|
||||
|
@ -94,6 +94,10 @@ void QCMake::setSourceDirectory(const QString& _dir)
|
||||
emit this->sourceDirChanged(this->SourceDirectory);
|
||||
this->loadPresets();
|
||||
this->setPreset(QString{});
|
||||
if (!cmSystemTools::FileIsFullPath(
|
||||
this->MaybeRelativeBinaryDirectory.toStdString())) {
|
||||
this->setBinaryDirectory(this->MaybeRelativeBinaryDirectory);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -101,9 +105,23 @@ void QCMake::setBinaryDirectory(const QString& _dir)
|
||||
{
|
||||
QString dir = QString::fromStdString(
|
||||
cmSystemTools::GetActualCaseForPath(_dir.toStdString()));
|
||||
if (this->BinaryDirectory != dir) {
|
||||
this->BinaryDirectory = QDir::fromNativeSeparators(dir);
|
||||
emit this->binaryDirChanged(this->BinaryDirectory);
|
||||
|
||||
QString absDir = dir;
|
||||
|
||||
if (!cmSystemTools::FileIsFullPath(absDir.toStdString())) {
|
||||
if (!this->SourceDirectory.isEmpty()) {
|
||||
if (!this->SourceDirectory.endsWith("/")) {
|
||||
absDir = "/" + absDir;
|
||||
}
|
||||
absDir = this->SourceDirectory + absDir;
|
||||
}
|
||||
}
|
||||
|
||||
if (this->BinaryDirectory != absDir ||
|
||||
this->MaybeRelativeBinaryDirectory != dir) {
|
||||
this->MaybeRelativeBinaryDirectory = QDir::fromNativeSeparators(dir);
|
||||
this->BinaryDirectory = QDir::fromNativeSeparators(absDir);
|
||||
emit this->binaryDirChanged(this->MaybeRelativeBinaryDirectory);
|
||||
cmState* state = this->CMakeInstance->GetState();
|
||||
this->setGenerator(QString());
|
||||
this->setToolset(QString());
|
||||
@ -600,6 +618,11 @@ QString QCMake::binaryDirectory() const
|
||||
return this->BinaryDirectory;
|
||||
}
|
||||
|
||||
QString QCMake::relativeBinaryDirectory() const
|
||||
{
|
||||
return this->MaybeRelativeBinaryDirectory;
|
||||
}
|
||||
|
||||
QString QCMake::sourceDirectory() const
|
||||
{
|
||||
return this->SourceDirectory;
|
||||
|
@ -130,6 +130,8 @@ public:
|
||||
QCMakePropertyList properties() const;
|
||||
/// get the current binary directory
|
||||
QString binaryDirectory() const;
|
||||
/// get the current binary directory, possibly a relative path
|
||||
QString relativeBinaryDirectory() const;
|
||||
/// get the current source directory
|
||||
QString sourceDirectory() const;
|
||||
/// get the current generator
|
||||
@ -196,6 +198,7 @@ protected:
|
||||
bool WarnUninitializedMode;
|
||||
QString SourceDirectory;
|
||||
QString BinaryDirectory;
|
||||
QString MaybeRelativeBinaryDirectory;
|
||||
QString Generator;
|
||||
QString Platform;
|
||||
QString Toolset;
|
||||
|
Loading…
Reference in New Issue
Block a user