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:
Roc R. Currius 2024-04-24 13:16:08 +01:00 committed by Brad King
parent a67bb7f488
commit a872844908
3 changed files with 60 additions and 6 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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;