2022-08-19 15:59:36 +02:00
|
|
|
// Copyright (C) 2016 The Qt Company Ltd.
|
2022-12-21 10:12:09 +01:00
|
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
2012-07-24 17:02:42 +02:00
|
|
|
|
|
|
|
|
#include "loadcoredialog.h"
|
|
|
|
|
|
2014-02-10 13:53:24 +01:00
|
|
|
#include "debuggerkitinformation.h"
|
2022-07-05 15:37:08 +02:00
|
|
|
#include "debuggertr.h"
|
2017-09-08 08:53:15 +02:00
|
|
|
#include "gdb/gdbengine.h"
|
2012-07-24 17:02:42 +02:00
|
|
|
|
2022-04-12 21:01:45 +02:00
|
|
|
#include <projectexplorer/devicesupport/idevice.h>
|
2022-05-24 07:12:02 +02:00
|
|
|
#include <projectexplorer/kitchooser.h>
|
2022-06-22 15:43:33 +02:00
|
|
|
#include <projectexplorer/projectexplorerconstants.h>
|
|
|
|
|
|
2023-02-02 14:27:50 +01:00
|
|
|
#include <utils/asynctask.h>
|
2022-08-26 23:18:00 +02:00
|
|
|
#include <utils/layoutbuilder.h>
|
2012-07-24 17:02:42 +02:00
|
|
|
#include <utils/pathchooser.h>
|
2022-05-24 07:12:02 +02:00
|
|
|
#include <utils/processinterface.h>
|
2023-02-02 14:27:50 +01:00
|
|
|
#include <utils/progressindicator.h>
|
2012-07-24 17:02:42 +02:00
|
|
|
#include <utils/qtcassert.h>
|
2023-02-02 14:27:50 +01:00
|
|
|
#include <utils/tasktree.h>
|
2017-01-19 16:44:22 +01:00
|
|
|
#include <utils/temporaryfile.h>
|
2012-07-24 17:02:42 +02:00
|
|
|
|
2012-10-22 11:14:18 +02:00
|
|
|
#include <QCheckBox>
|
2012-07-24 17:02:42 +02:00
|
|
|
#include <QDialogButtonBox>
|
|
|
|
|
#include <QFormLayout>
|
|
|
|
|
#include <QHeaderView>
|
2012-10-22 11:14:18 +02:00
|
|
|
#include <QLabel>
|
2012-07-24 17:02:42 +02:00
|
|
|
#include <QLineEdit>
|
2023-02-02 14:27:50 +01:00
|
|
|
#include <QMessageBox>
|
2012-07-24 17:02:42 +02:00
|
|
|
#include <QPushButton>
|
|
|
|
|
#include <QSortFilterProxyModel>
|
|
|
|
|
#include <QTextBrowser>
|
|
|
|
|
#include <QTreeView>
|
|
|
|
|
|
|
|
|
|
using namespace Core;
|
|
|
|
|
using namespace ProjectExplorer;
|
|
|
|
|
using namespace Utils;
|
|
|
|
|
|
2022-07-05 15:37:08 +02:00
|
|
|
namespace Debugger::Internal {
|
2012-07-24 17:02:42 +02:00
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
|
|
|
//
|
|
|
|
|
// AttachCoreDialog
|
|
|
|
|
//
|
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
class AttachCoreDialogPrivate
|
|
|
|
|
{
|
|
|
|
|
public:
|
2012-09-03 18:31:44 +02:00
|
|
|
KitChooser *kitChooser;
|
2012-07-24 17:02:42 +02:00
|
|
|
|
2019-01-31 09:28:10 +01:00
|
|
|
PathChooser *symbolFileName;
|
2023-02-02 14:27:50 +01:00
|
|
|
PathChooser *coreFileName;
|
2012-07-24 17:02:42 +02:00
|
|
|
PathChooser *overrideStartScriptFileName;
|
2020-06-29 18:14:20 +03:00
|
|
|
PathChooser *sysRootDirectory;
|
2012-07-24 17:02:42 +02:00
|
|
|
|
2023-02-02 14:27:50 +01:00
|
|
|
FilePath debuggerPath;
|
|
|
|
|
|
2012-07-24 17:02:42 +02:00
|
|
|
QDialogButtonBox *buttonBox;
|
2023-02-02 14:27:50 +01:00
|
|
|
ProgressIndicator *progressIndicator;
|
|
|
|
|
QLabel *progressLabel;
|
|
|
|
|
|
|
|
|
|
TaskTree taskTree;
|
|
|
|
|
expected_str<FilePath> coreFileResult;
|
|
|
|
|
expected_str<FilePath> symbolFileResult;
|
2014-07-21 14:39:54 +02:00
|
|
|
|
|
|
|
|
struct State
|
|
|
|
|
{
|
|
|
|
|
bool isValid() const
|
|
|
|
|
{
|
2019-01-31 09:28:10 +01:00
|
|
|
return validKit && validSymbolFilename && validCoreFilename;
|
2014-07-21 14:39:54 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool validKit;
|
2019-01-31 09:28:10 +01:00
|
|
|
bool validSymbolFilename;
|
2014-07-21 14:39:54 +02:00
|
|
|
bool validCoreFilename;
|
|
|
|
|
};
|
|
|
|
|
|
2023-02-02 14:27:50 +01:00
|
|
|
State getDialogState() const
|
2014-07-21 14:39:54 +02:00
|
|
|
{
|
|
|
|
|
State st;
|
2018-07-23 22:28:49 +02:00
|
|
|
st.validKit = (kitChooser->currentKit() != nullptr);
|
2019-01-31 09:28:10 +01:00
|
|
|
st.validSymbolFilename = symbolFileName->isValid();
|
2023-02-02 14:27:50 +01:00
|
|
|
st.validCoreFilename = coreFileName->isValid();
|
2014-07-21 14:39:54 +02:00
|
|
|
return st;
|
|
|
|
|
}
|
2012-07-24 17:02:42 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
AttachCoreDialog::AttachCoreDialog(QWidget *parent)
|
|
|
|
|
: QDialog(parent), d(new AttachCoreDialogPrivate)
|
|
|
|
|
{
|
2022-07-05 15:37:08 +02:00
|
|
|
setWindowTitle(Tr::tr("Load Core File"));
|
2012-07-24 17:02:42 +02:00
|
|
|
|
2014-07-16 13:57:22 +02:00
|
|
|
d->buttonBox = new QDialogButtonBox(this);
|
|
|
|
|
d->buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok);
|
|
|
|
|
d->buttonBox->button(QDialogButtonBox::Ok)->setDefault(true);
|
|
|
|
|
d->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
|
|
|
|
|
|
2019-06-11 10:27:16 +02:00
|
|
|
d->kitChooser = new KitChooser(this);
|
|
|
|
|
d->kitChooser->setShowIcons(true);
|
2012-09-05 10:55:05 +02:00
|
|
|
d->kitChooser->populate();
|
2012-07-24 17:02:42 +02:00
|
|
|
|
2023-02-02 14:27:50 +01:00
|
|
|
d->coreFileName = new PathChooser(this);
|
|
|
|
|
d->coreFileName->setHistoryCompleter("Debugger.CoreFile.History");
|
|
|
|
|
d->coreFileName->setExpectedKind(PathChooser::File);
|
|
|
|
|
d->coreFileName->setPromptDialogTitle(Tr::tr("Select Core File"));
|
|
|
|
|
d->coreFileName->setAllowPathFromDevice(true);
|
2013-03-18 14:19:31 +01:00
|
|
|
|
2019-01-31 09:28:10 +01:00
|
|
|
d->symbolFileName = new PathChooser(this);
|
2023-02-02 14:27:50 +01:00
|
|
|
d->symbolFileName->setHistoryCompleter("Executable");
|
2019-01-31 09:28:10 +01:00
|
|
|
d->symbolFileName->setExpectedKind(PathChooser::File);
|
2022-07-05 15:37:08 +02:00
|
|
|
d->symbolFileName->setPromptDialogTitle(Tr::tr("Select Executable or Symbol File"));
|
2023-02-02 14:27:50 +01:00
|
|
|
d->symbolFileName->setAllowPathFromDevice(true);
|
2019-01-31 09:28:10 +01:00
|
|
|
d->symbolFileName->setToolTip(
|
2022-07-05 15:37:08 +02:00
|
|
|
Tr::tr("Select a file containing debug information corresponding to the core file. "
|
2019-01-31 09:28:10 +01:00
|
|
|
"Typically, this is the executable or a *.debug file if the debug "
|
|
|
|
|
"information is stored separately from the executable."));
|
2014-07-16 13:57:22 +02:00
|
|
|
|
2012-07-24 17:02:42 +02:00
|
|
|
d->overrideStartScriptFileName = new PathChooser(this);
|
2018-10-07 22:38:47 +03:00
|
|
|
d->overrideStartScriptFileName->setHistoryCompleter("Debugger.StartupScript.History");
|
2012-07-24 17:02:42 +02:00
|
|
|
d->overrideStartScriptFileName->setExpectedKind(PathChooser::File);
|
2022-07-05 15:37:08 +02:00
|
|
|
d->overrideStartScriptFileName->setPromptDialogTitle(Tr::tr("Select Startup Script"));
|
2012-07-24 17:02:42 +02:00
|
|
|
|
2020-06-29 18:14:20 +03:00
|
|
|
d->sysRootDirectory = new PathChooser(this);
|
|
|
|
|
d->sysRootDirectory->setHistoryCompleter("Debugger.SysRoot.History");
|
|
|
|
|
d->sysRootDirectory->setExpectedKind(PathChooser::Directory);
|
2022-07-05 15:37:08 +02:00
|
|
|
d->sysRootDirectory->setPromptDialogTitle(Tr::tr("Select SysRoot Directory"));
|
|
|
|
|
d->sysRootDirectory->setToolTip(Tr::tr(
|
2020-06-29 18:14:20 +03:00
|
|
|
"This option can be used to override the kit's SysRoot setting"));
|
|
|
|
|
|
2023-02-02 14:27:50 +01:00
|
|
|
d->progressIndicator = new ProgressIndicator(ProgressIndicatorSize::Small, this);
|
|
|
|
|
d->progressIndicator->setVisible(false);
|
|
|
|
|
|
|
|
|
|
d->progressLabel = new QLabel();
|
|
|
|
|
d->progressLabel->setVisible(false);
|
|
|
|
|
|
|
|
|
|
// clang-format off
|
|
|
|
|
using namespace Layouting;
|
|
|
|
|
|
|
|
|
|
Column {
|
|
|
|
|
Form {
|
|
|
|
|
Tr::tr("Kit:"), d->kitChooser, br,
|
|
|
|
|
Tr::tr("Core file:"), d->coreFileName, br,
|
|
|
|
|
Tr::tr("&Executable or symbol file:"), d->symbolFileName, br,
|
|
|
|
|
Tr::tr("Override &start script:"), d->overrideStartScriptFileName, br,
|
|
|
|
|
Tr::tr("Override S&ysRoot:"), d->sysRootDirectory, br,
|
|
|
|
|
},
|
|
|
|
|
st,
|
|
|
|
|
hr,
|
|
|
|
|
Row {
|
|
|
|
|
d->progressIndicator, d->progressLabel, d->buttonBox
|
|
|
|
|
}
|
|
|
|
|
}.attachTo(this);
|
|
|
|
|
// clang-format on
|
2012-10-22 11:14:18 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
AttachCoreDialog::~AttachCoreDialog()
|
|
|
|
|
{
|
|
|
|
|
delete d;
|
|
|
|
|
}
|
2012-07-24 17:02:42 +02:00
|
|
|
|
2012-10-22 11:14:18 +02:00
|
|
|
int AttachCoreDialog::exec()
|
|
|
|
|
{
|
2022-09-02 11:49:36 +02:00
|
|
|
connect(d->symbolFileName, &PathChooser::textChanged, this, &AttachCoreDialog::changed);
|
2023-02-02 14:27:50 +01:00
|
|
|
connect(d->coreFileName, &PathChooser::textChanged, this, [this] {
|
|
|
|
|
coreFileChanged(d->coreFileName->rawFilePath());
|
2022-09-02 11:49:36 +02:00
|
|
|
});
|
2015-02-05 12:26:16 +01:00
|
|
|
connect(d->kitChooser, &KitChooser::currentIndexChanged, this, &AttachCoreDialog::changed);
|
|
|
|
|
connect(d->buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
|
2023-02-02 14:27:50 +01:00
|
|
|
connect(d->buttonBox, &QDialogButtonBox::accepted, this, &AttachCoreDialog::accepted);
|
2012-10-10 00:08:56 +02:00
|
|
|
changed();
|
2012-07-24 17:02:42 +02:00
|
|
|
|
2023-02-02 14:27:50 +01:00
|
|
|
connect(&d->taskTree, &TaskTree::done, this, [&]() {
|
|
|
|
|
setEnabled(true);
|
|
|
|
|
d->progressIndicator->setVisible(false);
|
|
|
|
|
d->progressLabel->setVisible(false);
|
|
|
|
|
|
|
|
|
|
if (!d->coreFileResult) {
|
|
|
|
|
QMessageBox::critical(this,
|
|
|
|
|
Tr::tr("Error"),
|
|
|
|
|
Tr::tr("Failed to copy core file to device: %1")
|
|
|
|
|
.arg(d->coreFileResult.error()));
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!d->symbolFileResult) {
|
|
|
|
|
QMessageBox::critical(this,
|
|
|
|
|
Tr::tr("Error"),
|
|
|
|
|
Tr::tr("Failed to copy symbol file to device: %1")
|
|
|
|
|
.arg(d->coreFileResult.error()));
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
accept();
|
|
|
|
|
});
|
|
|
|
|
connect(&d->taskTree, &TaskTree::progressValueChanged, this, [this](int value) {
|
|
|
|
|
const QString text = Tr::tr("Copying files to device... %1/%2")
|
|
|
|
|
.arg(value)
|
|
|
|
|
.arg(d->taskTree.progressMaximum());
|
|
|
|
|
d->progressLabel->setText(text);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
AttachCoreDialogPrivate::State st = d->getDialogState();
|
2014-07-21 14:39:54 +02:00
|
|
|
if (!st.validKit) {
|
|
|
|
|
d->kitChooser->setFocus();
|
|
|
|
|
} else if (!st.validCoreFilename) {
|
2023-02-02 14:27:50 +01:00
|
|
|
d->coreFileName->setFocus();
|
2019-01-31 09:28:10 +01:00
|
|
|
} else if (!st.validSymbolFilename) {
|
|
|
|
|
d->symbolFileName->setFocus();
|
2014-07-21 14:39:54 +02:00
|
|
|
}
|
|
|
|
|
|
2012-10-22 11:14:18 +02:00
|
|
|
return QDialog::exec();
|
2012-07-24 17:02:42 +02:00
|
|
|
}
|
|
|
|
|
|
2023-02-02 14:27:50 +01:00
|
|
|
void AttachCoreDialog::accepted()
|
2012-07-24 17:02:42 +02:00
|
|
|
{
|
2023-02-02 14:27:50 +01:00
|
|
|
const DebuggerItem *debuggerItem = Debugger::DebuggerKitAspect::debugger(kit());
|
|
|
|
|
const FilePath debuggerCommand = debuggerItem->command();
|
2012-10-22 11:14:18 +02:00
|
|
|
|
2023-02-02 14:27:50 +01:00
|
|
|
using namespace Tasking;
|
|
|
|
|
|
|
|
|
|
const auto copyFile = [debuggerCommand](const FilePath &srcPath) -> expected_str<FilePath> {
|
|
|
|
|
if (!srcPath.isSameDevice(debuggerCommand)) {
|
|
|
|
|
const expected_str<FilePath> tmpPath = debuggerCommand.tmpDir();
|
|
|
|
|
if (!tmpPath)
|
|
|
|
|
return make_unexpected(tmpPath.error());
|
|
|
|
|
|
|
|
|
|
const FilePath pattern = (tmpPath.value()
|
|
|
|
|
/ (srcPath.fileName() + ".XXXXXXXXXXX"));
|
|
|
|
|
|
|
|
|
|
const expected_str<FilePath> resultPath = pattern.createTempFile();
|
|
|
|
|
if (!resultPath)
|
|
|
|
|
return make_unexpected(resultPath.error());
|
|
|
|
|
const expected_str<void> result = srcPath.copyFile(resultPath.value());
|
|
|
|
|
if (!result)
|
|
|
|
|
return make_unexpected(result.error());
|
|
|
|
|
|
|
|
|
|
return resultPath;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return srcPath;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
using ResultType = expected_str<FilePath>;
|
|
|
|
|
|
2023-02-12 02:12:54 +01:00
|
|
|
const auto copyFileAsync = [=](QPromise<ResultType> &promise, const FilePath &srcPath) {
|
|
|
|
|
promise.addResult(copyFile(srcPath));
|
2023-02-02 14:27:50 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const Group root = {
|
|
|
|
|
parallel,
|
2023-05-03 14:33:12 +02:00
|
|
|
AsyncTask<ResultType>{[=](auto &task) {
|
2023-02-12 02:12:54 +01:00
|
|
|
task.setConcurrentCallData(copyFileAsync, this->coreFile());
|
2023-02-02 14:27:50 +01:00
|
|
|
},
|
|
|
|
|
[=](const auto &task) { d->coreFileResult = task.result(); }},
|
2023-05-03 14:33:12 +02:00
|
|
|
AsyncTask<ResultType>{[=](auto &task) {
|
2023-02-12 02:12:54 +01:00
|
|
|
task.setConcurrentCallData(copyFileAsync, this->symbolFile());
|
2023-02-02 14:27:50 +01:00
|
|
|
},
|
|
|
|
|
[=](const auto &task) { d->symbolFileResult = task.result(); }},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
d->taskTree.setupRoot(root);
|
|
|
|
|
d->taskTree.start();
|
|
|
|
|
|
|
|
|
|
d->progressLabel->setText(Tr::tr("Copying files to device..."));
|
|
|
|
|
|
|
|
|
|
setEnabled(false);
|
|
|
|
|
d->progressIndicator->setVisible(true);
|
|
|
|
|
d->progressLabel->setVisible(true);
|
2012-07-24 17:02:42 +02:00
|
|
|
}
|
|
|
|
|
|
2022-06-29 15:39:04 +02:00
|
|
|
void AttachCoreDialog::coreFileChanged(const FilePath &coreFile)
|
2014-02-10 13:53:24 +01:00
|
|
|
{
|
2021-09-27 15:52:05 +02:00
|
|
|
if (coreFile.osType() != OsType::OsTypeWindows && coreFile.exists()) {
|
2014-07-14 15:04:47 +03:00
|
|
|
Kit *k = d->kitChooser->currentKit();
|
|
|
|
|
QTC_ASSERT(k, return);
|
2019-02-06 12:50:51 +01:00
|
|
|
Runnable debugger = DebuggerKitAspect::runnable(k);
|
2021-09-27 15:52:05 +02:00
|
|
|
CoreInfo cinfo = CoreInfo::readExecutableNameFromCore(debugger, coreFile);
|
2014-07-24 11:56:40 +02:00
|
|
|
if (!cinfo.foundExecutableName.isEmpty())
|
2021-08-11 08:36:15 +02:00
|
|
|
d->symbolFileName->setFilePath(cinfo.foundExecutableName);
|
2019-01-31 09:28:10 +01:00
|
|
|
else if (!d->symbolFileName->isValid() && !cinfo.rawStringFromCore.isEmpty())
|
2020-04-09 11:05:50 +02:00
|
|
|
d->symbolFileName->setFilePath(FilePath::fromString(cinfo.rawStringFromCore));
|
2014-07-14 15:04:47 +03:00
|
|
|
}
|
2014-02-10 13:53:24 +01:00
|
|
|
changed();
|
|
|
|
|
}
|
|
|
|
|
|
2012-07-24 17:02:42 +02:00
|
|
|
void AttachCoreDialog::changed()
|
|
|
|
|
{
|
2023-02-02 14:27:50 +01:00
|
|
|
AttachCoreDialogPrivate::State st = d->getDialogState();
|
2014-07-21 14:39:54 +02:00
|
|
|
d->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(st.isValid());
|
2012-07-24 17:02:42 +02:00
|
|
|
}
|
|
|
|
|
|
2023-02-02 14:27:50 +01:00
|
|
|
FilePath AttachCoreDialog::coreFile() const
|
2012-07-24 17:02:42 +02:00
|
|
|
{
|
2023-02-02 14:27:50 +01:00
|
|
|
return d->coreFileName->filePath();
|
2012-07-24 17:02:42 +02:00
|
|
|
}
|
|
|
|
|
|
2019-06-20 17:19:12 +02:00
|
|
|
FilePath AttachCoreDialog::symbolFile() const
|
2012-07-24 17:02:42 +02:00
|
|
|
{
|
2020-04-09 11:05:50 +02:00
|
|
|
return d->symbolFileName->filePath();
|
2012-07-24 17:02:42 +02:00
|
|
|
}
|
|
|
|
|
|
2023-02-02 14:27:50 +01:00
|
|
|
FilePath AttachCoreDialog::coreFileCopy() const
|
2012-07-24 17:02:42 +02:00
|
|
|
{
|
2023-02-02 14:27:50 +01:00
|
|
|
return d->coreFileResult.value_or(d->symbolFileName->filePath());
|
2012-07-24 17:02:42 +02:00
|
|
|
}
|
|
|
|
|
|
2023-02-02 14:27:50 +01:00
|
|
|
FilePath AttachCoreDialog::symbolFileCopy() const
|
2012-07-24 17:02:42 +02:00
|
|
|
{
|
2023-02-02 14:27:50 +01:00
|
|
|
return d->symbolFileResult.value_or(d->symbolFileName->filePath());
|
2012-07-24 17:02:42 +02:00
|
|
|
}
|
|
|
|
|
|
2023-02-02 14:27:50 +01:00
|
|
|
void AttachCoreDialog::setSymbolFile(const FilePath &symbolFilePath)
|
2012-07-24 17:02:42 +02:00
|
|
|
{
|
2023-02-02 14:27:50 +01:00
|
|
|
d->symbolFileName->setFilePath(symbolFilePath);
|
2012-07-24 17:02:42 +02:00
|
|
|
}
|
|
|
|
|
|
2023-02-02 14:27:50 +01:00
|
|
|
void AttachCoreDialog::setCoreFile(const FilePath &coreFilePath)
|
2012-07-24 17:02:42 +02:00
|
|
|
{
|
2023-02-02 14:27:50 +01:00
|
|
|
d->coreFileName->setFilePath(coreFilePath);
|
2012-07-24 17:02:42 +02:00
|
|
|
}
|
|
|
|
|
|
2015-02-03 23:58:49 +02:00
|
|
|
void AttachCoreDialog::setKitId(Id id)
|
2012-07-24 17:02:42 +02:00
|
|
|
{
|
2012-09-03 18:31:44 +02:00
|
|
|
d->kitChooser->setCurrentKitId(id);
|
2012-10-22 11:14:18 +02:00
|
|
|
}
|
|
|
|
|
|
2012-09-03 18:31:44 +02:00
|
|
|
Kit *AttachCoreDialog::kit() const
|
2012-07-24 17:02:42 +02:00
|
|
|
{
|
2012-09-03 18:31:44 +02:00
|
|
|
return d->kitChooser->currentKit();
|
2012-07-24 17:02:42 +02:00
|
|
|
}
|
|
|
|
|
|
2021-09-27 15:52:05 +02:00
|
|
|
FilePath AttachCoreDialog::overrideStartScript() const
|
2012-07-24 17:02:42 +02:00
|
|
|
{
|
2021-09-27 15:52:05 +02:00
|
|
|
return d->overrideStartScriptFileName->filePath();
|
2012-07-24 17:02:42 +02:00
|
|
|
}
|
|
|
|
|
|
2021-09-27 15:52:05 +02:00
|
|
|
void AttachCoreDialog::setOverrideStartScript(const FilePath &scriptName)
|
2012-07-24 17:02:42 +02:00
|
|
|
{
|
2021-09-27 15:52:05 +02:00
|
|
|
d->overrideStartScriptFileName->setFilePath(scriptName);
|
2012-07-24 17:02:42 +02:00
|
|
|
}
|
|
|
|
|
|
2020-06-29 18:14:20 +03:00
|
|
|
FilePath AttachCoreDialog::sysRoot() const
|
|
|
|
|
{
|
|
|
|
|
return d->sysRootDirectory->filePath();
|
|
|
|
|
}
|
|
|
|
|
|
2021-09-27 15:52:05 +02:00
|
|
|
void AttachCoreDialog::setSysRoot(const FilePath &sysRoot)
|
2020-06-29 18:14:20 +03:00
|
|
|
{
|
2021-09-27 15:52:05 +02:00
|
|
|
d->sysRootDirectory->setFilePath(sysRoot);
|
2020-06-29 18:14:20 +03:00
|
|
|
}
|
|
|
|
|
|
2022-07-05 15:37:08 +02:00
|
|
|
} // Debugger::Internal
|