aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTim Jenssen <tim.jenssen@qt.io>2024-03-26 11:16:07 +0100
committerTim Jenssen <tim.jenssen@qt.io>2024-03-26 15:59:34 +0100
commit8a1842317573d9f1ab9b3de29c244ed2f2f783ef (patch)
tree7983811693bdac3427b1fb166f2b6ab27367d8b4 /src
parent4e63bcb744df8324551f28472ef6ff48d6bd1613 (diff)
parent7821fbbf03c31eed3d3aeea7839526187cabd5e7 (diff)
Merge remote-tracking branch 'origin/13.0' into qds/dev
Diffstat (limited to 'src')
-rw-r--r--src/libs/solutions/tasking/tasktree.cpp54
-rw-r--r--src/libs/solutions/terminal/terminalview.cpp5
-rw-r--r--src/libs/utils/namevaluesdialog.cpp9
-rw-r--r--src/libs/utils/qtcprocess.cpp2
-rw-r--r--src/plugins/axivion/axivionoutputpane.cpp6
-rw-r--r--src/plugins/axivion/axivionplugin.cpp53
-rw-r--r--src/plugins/axivion/axivionplugin.h2
-rw-r--r--src/plugins/axivion/axivionprojectsettings.cpp4
-rw-r--r--src/plugins/axivion/axivionsettings.cpp1
-rw-r--r--src/plugins/bazaar/bazaarplugin.cpp2
-rw-r--r--src/plugins/clangcodemodel/clangdfindreferences.cpp5
-rw-r--r--src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp2
-rw-r--r--src/plugins/coreplugin/dialogs/externaltoolconfig.cpp22
-rw-r--r--src/plugins/coreplugin/systemsettings.cpp8
-rw-r--r--src/plugins/coreplugin/welcomepagehelper.cpp4
-rw-r--r--src/plugins/cvs/cvsplugin.cpp3
-rw-r--r--src/plugins/debugger/debuggerengine.cpp6
-rw-r--r--src/plugins/debugger/debuggerrunconfigurationaspect.cpp9
-rw-r--r--src/plugins/debugger/watchhandler.cpp4
-rw-r--r--src/plugins/fossil/fossilplugin.cpp2
-rw-r--r--src/plugins/git/gitplugin.cpp2
-rw-r--r--src/plugins/help/helpmanager.cpp4
-rw-r--r--src/plugins/languageclient/languageclientsettings.cpp2
-rw-r--r--src/plugins/languageclient/languageclientsymbolsupport.cpp28
-rw-r--r--src/plugins/mercurial/mercurialplugin.cpp5
-rw-r--r--src/plugins/projectexplorer/projectwelcomepage.cpp130
-rw-r--r--src/plugins/projectexplorer/toolchainoptionspage.cpp2
-rw-r--r--src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp3
-rw-r--r--src/plugins/qtsupport/qtbuildaspects.cpp5
-rw-r--r--src/plugins/qtsupport/qtoptionspage.cpp2
-rw-r--r--src/plugins/qtsupport/qtsupportplugin.cpp2
-rw-r--r--src/plugins/qtsupport/qtversionmanager.cpp15
-rw-r--r--src/plugins/qtsupport/qtversionmanager.h2
-rw-r--r--src/plugins/remotelinux/linuxdevice.cpp9
-rw-r--r--src/plugins/remotelinux/linuxdevice.h2
-rw-r--r--src/plugins/remotelinux/linuxdevicetester.cpp85
-rw-r--r--src/plugins/screenrecorder/screenrecorderplugin.cpp8
-rw-r--r--src/plugins/subversion/subversionplugin.cpp5
-rw-r--r--src/plugins/terminal/terminalwidget.cpp2
-rw-r--r--src/plugins/vcsbase/vcsbaseclient.cpp12
-rw-r--r--src/plugins/vcsbase/vcsbaseclient.h3
-rw-r--r--src/plugins/vcsbase/vcscommand.h1
-rw-r--r--src/plugins/welcome/images/project.pngbin175 -> 172 bytes
-rw-r--r--src/plugins/welcome/images/project@2x.pngbin225 -> 212 bytes
-rw-r--r--src/plugins/welcome/images/session.pngbin192 -> 165 bytes
-rw-r--r--src/plugins/welcome/images/session@2x.pngbin255 -> 187 bytes
m---------src/shared/qbs0
-rw-r--r--src/tools/icons/qtcreatoricons.svg42
48 files changed, 348 insertions, 226 deletions
diff --git a/src/libs/solutions/tasking/tasktree.cpp b/src/libs/solutions/tasking/tasktree.cpp
index c6e87d2774..7d37bf9758 100644
--- a/src/libs/solutions/tasking/tasktree.cpp
+++ b/src/libs/solutions/tasking/tasktree.cpp
@@ -548,18 +548,6 @@ private:
*/
/*!
- \fn GroupItem Group::withTimeout(std::chrono::milliseconds timeout, const std::function<void()> &handler) const
-
- Attaches \c TimeoutTask to a copy of \c this group, elapsing after \a timeout in milliseconds,
- with an optionally provided timeout \a handler, and returns the coupled item.
-
- When the group finishes before \a timeout passes,
- the returned item finishes immediately with the group's result.
- Otherwise, the \a handler is invoked (if provided), the group's tasks are canceled,
- and the returned item finishes with an error.
-*/
-
-/*!
\class Tasking::Sync
\inheaderfile solutions/tasking/tasktree.h
\inmodule TaskingSolution
@@ -759,17 +747,6 @@ private:
*/
/*!
- \fn template <typename Adapter> GroupItem CustomTask<Adapter>::withTimeout(std::chrono::milliseconds timeout, const std::function<void()> &handler) const
-
- Attaches \c TimeoutTask to a copy of \c this task, elapsing after \a timeout in milliseconds,
- with an optionally provided timeout \a handler, and returns the coupled item.
-
- When the task finishes before \a timeout passes, the returned item finishes immediately
- with the task's result. Otherwise, \a handler is invoked (if provided),
- the task is canceled, and the returned item finishes with an error.
-*/
-
-/*!
\enum Tasking::WorkflowPolicy
This enum describes the possible behavior of the Group element when any group's child task
@@ -1415,6 +1392,26 @@ void GroupItem::addChildren(const QList<GroupItem> &children)
}
}
+/*!
+ \class Tasking::ExecutableItem
+ \inheaderfile solutions/tasking/tasktree.h
+ \inmodule TaskingSolution
+ \brief Base class for executable task items.
+ \reentrant
+
+ \c ExecutableItem provides an additional interface for items containing executable tasks.
+ Use withTimeout() to attach a timeout to a task.
+ Use withLog() to include debugging information about the task startup and the execution result.
+*/
+
+/*!
+ Attaches \c TimeoutTask to a copy of \c this ExecutableItem, elapsing after \a timeout
+ in milliseconds, with an optionally provided timeout \a handler, and returns the coupled item.
+
+ When the ExecutableItem finishes before \a timeout passes, the returned item finishes
+ immediately with the task's result. Otherwise, \a handler is invoked (if provided),
+ the task is canceled, and the returned item finishes with an error.
+*/
ExecutableItem ExecutableItem::withTimeout(milliseconds timeout,
const std::function<void()> &handler) const
{
@@ -1433,6 +1430,17 @@ ExecutableItem ExecutableItem::withTimeout(milliseconds timeout,
static QString currentTime() { return QTime::currentTime().toString(Qt::ISODateWithMs); }
+/*!
+ Attaches a custom debug printout to a copy of \c this ExecutableItem,
+ issued on task startup and after the task is finished, and returns the coupled item.
+
+ The debug printout includes a timestamp of the event (start or finish)
+ and \a logName to identify the specific task in the debug log.
+
+ The finish printout contains the additional information whether the execution was
+ synchronous or asynchronous, its result (the value described by the DoneWith enum),
+ and the total execution time in milliseconds.
+*/
ExecutableItem ExecutableItem::withLog(const QString &logName) const
{
const auto header = [logName] {
diff --git a/src/libs/solutions/terminal/terminalview.cpp b/src/libs/solutions/terminal/terminalview.cpp
index 0cebe6d9b9..472346b3fc 100644
--- a/src/libs/solutions/terminal/terminalview.cpp
+++ b/src/libs/solutions/terminal/terminalview.cpp
@@ -958,11 +958,14 @@ void TerminalView::applySizeChange()
};
if (newLiveSize.height() <= 0)
- newLiveSize.setHeight(1);
+ return;
if (newLiveSize.width() <= 0)
newLiveSize.setWidth(1);
+ if (d->m_surface->liveSize() == newLiveSize)
+ return;
+
resizePty(newLiveSize);
d->m_surface->resize(newLiveSize);
flushVTerm(true);
diff --git a/src/libs/utils/namevaluesdialog.cpp b/src/libs/utils/namevaluesdialog.cpp
index 43511fe57f..35587f8791 100644
--- a/src/libs/utils/namevaluesdialog.cpp
+++ b/src/libs/utils/namevaluesdialog.cpp
@@ -21,8 +21,7 @@ namespace Internal {
static EnvironmentItems cleanUp(const EnvironmentItems &items)
{
- EnvironmentItems uniqueItems;
- QSet<QString> uniqueSet;
+ EnvironmentItems cleanedItems;
for (int i = items.count() - 1; i >= 0; i--) {
EnvironmentItem item = items.at(i);
if (HostOsInfo::isWindowsHost())
@@ -30,10 +29,10 @@ static EnvironmentItems cleanUp(const EnvironmentItems &items)
const QString &itemName = item.name;
QString emptyName = itemName;
emptyName.remove(QLatin1Char(' '));
- if (!emptyName.isEmpty() && Utils::insert(uniqueSet, itemName))
- uniqueItems.prepend(item);
+ if (!emptyName.isEmpty())
+ cleanedItems.prepend(item);
}
- return uniqueItems;
+ return cleanedItems;
}
class TextEditHelper : public QPlainTextEdit
diff --git a/src/libs/utils/qtcprocess.cpp b/src/libs/utils/qtcprocess.cpp
index 75974498d9..b399d86b36 100644
--- a/src/libs/utils/qtcprocess.cpp
+++ b/src/libs/utils/qtcprocess.cpp
@@ -1934,7 +1934,7 @@ void Process::runBlocking(seconds timeout, EventLoopMode eventLoopMode)
#endif
} else {
handleStart();
- if (!waitForFinished(timeout))
+ if (state() != QProcess::NotRunning && !waitForFinished(timeout))
handleTimeout();
}
if (blockingThresholdMs > 0) {
diff --git a/src/plugins/axivion/axivionoutputpane.cpp b/src/plugins/axivion/axivionoutputpane.cpp
index d1c896205f..d66468590b 100644
--- a/src/plugins/axivion/axivionoutputpane.cpp
+++ b/src/plugins/axivion/axivionoutputpane.cpp
@@ -235,7 +235,7 @@ public:
}).link;
Project *project = ProjectManager::startupProject();
FilePath baseDir = project ? project->projectDirectory() : FilePath{};
- link.targetFilePath = baseDir.resolvePath(link.targetFilePath);
+ link.targetFilePath = findFileForIssuePath(link.targetFilePath);
if (link.targetFilePath.exists())
EditorManager::openEditorAt(link);
}
@@ -736,6 +736,10 @@ public:
if (auto issues = static_cast<IssuesWidget *>(m_outputWidget->widget(1)))
issues->updateUi();
});
+ auto *butonGroup = new QButtonGroup(this);
+ butonGroup->addButton(m_showDashboard);
+ butonGroup->addButton(m_showIssues);
+ butonGroup->setExclusive(true);
connect(m_outputWidget, &QStackedWidget::currentChanged, this, [this](int idx) {
m_showDashboard->setChecked(idx == 0);
diff --git a/src/plugins/axivion/axivionplugin.cpp b/src/plugins/axivion/axivionplugin.cpp
index f0f90d3f25..0f4686e403 100644
--- a/src/plugins/axivion/axivionplugin.cpp
+++ b/src/plugins/axivion/axivionplugin.cpp
@@ -36,6 +36,7 @@
#include <utils/async.h>
#include <utils/checkablemessagebox.h>
#include <utils/environment.h>
+#include <utils/fileinprojectfinder.h>
#include <utils/networkaccessmanager.h>
#include <utils/qtcassert.h>
#include <utils/utilsicons.h>
@@ -236,6 +237,7 @@ public:
TaskTreeRunner m_taskTreeRunner;
std::unordered_map<IDocument *, std::unique_ptr<TaskTree>> m_docMarksTrees;
TaskTreeRunner m_issueInfoRunner;
+ FileInProjectFinder m_fileFinder; // FIXME maybe obsolete when path mapping is implemented
};
static AxivionPluginPrivate *dd = nullptr;
@@ -337,10 +339,17 @@ void AxivionPluginPrivate::onStartupProjectChanged(Project *project)
m_currentProjectInfo = {};
updateDashboard();
- if (!m_project)
+ if (!m_project) {
+ m_fileFinder.setProjectDirectory({});
+ m_fileFinder.setProjectFiles({});
return;
+ }
- connect(m_project, &Project::fileListChanged, this, &AxivionPluginPrivate::handleOpenedDocs);
+ m_fileFinder.setProjectDirectory(m_project->projectDirectory());
+ connect(m_project, &Project::fileListChanged, this, [this]{
+ m_fileFinder.setProjectFiles(m_project->files(Project::AllFiles));
+ handleOpenedDocs();
+ });
const AxivionProjectSettings *projSettings = AxivionProjectSettings::projectSettings(m_project);
fetchProjectInfo(projSettings->dashboardProjectName());
}
@@ -450,8 +459,10 @@ static Group dtoRecipe(const Storage<DtoStorageType<DtoType>> &dtoStorage)
if (error) {
if constexpr (std::is_same_v<DtoType, Dto::DashboardInfoDto>) {
// Suppress logging error on unauthorized dashboard fetch
- if (!dtoStorage->credential && error->type == "UnauthenticatedException")
+ if (!dtoStorage->credential && error->type == "UnauthenticatedException") {
+ dtoStorage->url = reply->url();
return DoneResult::Success;
+ }
}
errorString = Error(DashboardError(reply->url(), statusCode,
@@ -530,13 +541,11 @@ static void handleCredentialError(const CredentialQuery &credential)
static Group authorizationRecipe()
{
+ const Storage<QUrl> serverUrlStorage;
const Storage<GetDtoStorage<Dto::DashboardInfoDto>> unauthorizedDashboardStorage;
- const auto onUnauthorizedGroupSetup = [unauthorizedDashboardStorage] {
- if (isServerAccessEstablished())
- return SetupResult::StopWithSuccess;
-
- unauthorizedDashboardStorage->url = QUrl(settings().server.dashboard);
- return SetupResult::Continue;
+ const auto onUnauthorizedGroupSetup = [serverUrlStorage, unauthorizedDashboardStorage] {
+ unauthorizedDashboardStorage->url = *serverUrlStorage;
+ return isServerAccessEstablished() ? SetupResult::StopWithSuccess : SetupResult::Continue;
};
const auto onUnauthorizedDashboard = [unauthorizedDashboardStorage] {
if (unauthorizedDashboardStorage->dtoData) {
@@ -575,7 +584,7 @@ static Group authorizationRecipe()
const Storage<QString> passwordStorage;
const Storage<GetDtoStorage<Dto::DashboardInfoDto>> dashboardStorage;
- const auto onPasswordGroupSetup = [passwordStorage, dashboardStorage] {
+ const auto onPasswordGroupSetup = [serverUrlStorage, passwordStorage, dashboardStorage] {
if (dd->m_apiToken)
return SetupResult::StopWithSuccess;
@@ -589,7 +598,7 @@ static Group authorizationRecipe()
const QString credential = settings().server.username + ':' + *passwordStorage;
dashboardStorage->credential = "Basic " + credential.toUtf8().toBase64();
- dashboardStorage->url = QUrl(settings().server.dashboard);
+ dashboardStorage->url = *serverUrlStorage;
return SetupResult::Continue;
};
@@ -632,13 +641,13 @@ static Group authorizationRecipe()
return DoneResult::Success;
};
- const auto onDashboardGroupSetup = [dashboardStorage] {
+ const auto onDashboardGroupSetup = [serverUrlStorage, dashboardStorage] {
if (dd->m_dashboardInfo || dd->m_serverAccess != ServerAccess::WithAuthorization
|| !dd->m_apiToken) {
return SetupResult::StopWithSuccess; // Unauthorized access should have collect dashboard before
}
dashboardStorage->credential = "AxToken " + *dd->m_apiToken;
- dashboardStorage->url = QUrl(settings().server.dashboard);
+ dashboardStorage->url = *serverUrlStorage;
return SetupResult::Continue;
};
const auto onDeleteCredentialSetup = [dashboardStorage](CredentialQuery &credential) {
@@ -656,11 +665,16 @@ static Group authorizationRecipe()
};
return {
+ serverUrlStorage,
+ onGroupSetup([serverUrlStorage] { *serverUrlStorage = QUrl(settings().server.dashboard); }),
Group {
unauthorizedDashboardStorage,
onGroupSetup(onUnauthorizedGroupSetup),
dtoRecipe(unauthorizedDashboardStorage),
- Sync(onUnauthorizedDashboard)
+ Sync(onUnauthorizedDashboard),
+ onGroupDone([serverUrlStorage, unauthorizedDashboardStorage] {
+ *serverUrlStorage = unauthorizedDashboardStorage->url;
+ }),
},
Group {
LoopUntil(onCredentialLoopCondition),
@@ -956,7 +970,7 @@ void AxivionPluginPrivate::handleAnchorClicked(const QUrl &url)
return;
Link link;
if (const QString path = query.queryItemValue("filename", QUrl::FullyDecoded); !path.isEmpty())
- link.targetFilePath = m_project->projectDirectory().pathAppended(path);
+ link.targetFilePath = findFileForIssuePath(FilePath::fromUserInput(path));
if (const QString line = query.queryItemValue("line"); !line.isEmpty())
link.targetLine = line.toInt();
// column entry is wrong - so, ignore it
@@ -1035,6 +1049,15 @@ const std::optional<DashboardInfo> currentDashboardInfo()
return dd->m_dashboardInfo;
}
+Utils::FilePath findFileForIssuePath(const Utils::FilePath &issuePath)
+{
+ QTC_ASSERT(dd, return {});
+ const FilePaths result = dd->m_fileFinder.findFile(QUrl::fromLocalFile(issuePath.toString()));
+ if (result.size() == 1)
+ return dd->m_project->projectDirectory().resolvePath(result.first());
+ return {};
+}
+
} // Axivion::Internal
#include "axivionplugin.moc"
diff --git a/src/plugins/axivion/axivionplugin.h b/src/plugins/axivion/axivionplugin.h
index db2f8494cb..059e950ecc 100644
--- a/src/plugins/axivion/axivionplugin.h
+++ b/src/plugins/axivion/axivionplugin.h
@@ -79,5 +79,7 @@ void fetchIssueInfo(const QString &id);
const std::optional<DashboardInfo> currentDashboardInfo();
+Utils::FilePath findFileForIssuePath(const Utils::FilePath &issuePath);
+
} // Axivion::Internal
diff --git a/src/plugins/axivion/axivionprojectsettings.cpp b/src/plugins/axivion/axivionprojectsettings.cpp
index 8cd63ba7ac..023c251ea4 100644
--- a/src/plugins/axivion/axivionprojectsettings.cpp
+++ b/src/plugins/axivion/axivionprojectsettings.cpp
@@ -7,6 +7,8 @@
#include "axivionsettings.h"
#include "axiviontr.h"
+#include <coreplugin/find/itemviewfind.h>
+
#include <projectexplorer/project.h>
#include <projectexplorer/projectpanelfactory.h>
#include <projectexplorer/projectsettingswidget.h>
@@ -141,7 +143,7 @@ AxivionProjectSettingsWidget::AxivionProjectSettingsWidget(Project *project)
noMargin,
m_linkedProject,
Tr::tr("Dashboard projects:"),
- m_dashboardProjects,
+ Core::ItemViewFind::createSearchableWrapper(m_dashboardProjects),
m_infoLabel,
Row { m_fetchProjects, m_link, m_unlink, st }
}.attachTo(this);
diff --git a/src/plugins/axivion/axivionsettings.cpp b/src/plugins/axivion/axivionsettings.cpp
index 9b24fa51f0..2af22e7cb9 100644
--- a/src/plugins/axivion/axivionsettings.cpp
+++ b/src/plugins/axivion/axivionsettings.cpp
@@ -261,6 +261,7 @@ AxivionSettingsWidget::AxivionSettingsWidget()
void AxivionSettingsWidget::apply()
{
settings().server = m_dashboardDisplay->dashboardServer();
+ emit settings().changed(); // ugly but needed
settings().toSettings();
}
diff --git a/src/plugins/bazaar/bazaarplugin.cpp b/src/plugins/bazaar/bazaarplugin.cpp
index 9a75fbf3b3..590cfd2327 100644
--- a/src/plugins/bazaar/bazaarplugin.cpp
+++ b/src/plugins/bazaar/bazaarplugin.cpp
@@ -953,7 +953,7 @@ VcsCommand *BazaarPluginPrivate::createInitialCheckoutCommand(const QString &url
Environment env = m_client.processEnvironment(baseDirectory);
env.set("BZR_PROGRESS_BAR", "text");
- auto command = VcsBaseClient::createVcsCommand(baseDirectory, env);
+ auto command = VcsBaseClient::createVcsCommand(this, baseDirectory, env);
command->addJob({m_client.vcsBinary(baseDirectory), args}, -1);
return command;
}
diff --git a/src/plugins/clangcodemodel/clangdfindreferences.cpp b/src/plugins/clangcodemodel/clangdfindreferences.cpp
index b7e62d6e05..13968801e7 100644
--- a/src/plugins/clangcodemodel/clangdfindreferences.cpp
+++ b/src/plugins/clangcodemodel/clangdfindreferences.cpp
@@ -291,12 +291,17 @@ void ClangdFindReferences::Private::handleFindUsagesResult(const QList<Location>
for (const Location &loc : locations)
fileData[loc.uri()].rangesAndLineText.push_back({loc.range(), {}});
+ QSet<FilePath> canonicalFilePaths;
for (auto it = fileData.begin(); it != fileData.end();) {
const Utils::FilePath filePath = client()->serverUriToHostPath(it.key());
if (!filePath.exists()) { // https://github.com/clangd/clangd/issues/935
it = fileData.erase(it);
continue;
}
+ if (!Utils::insert(canonicalFilePaths, filePath.canonicalPath())) { // QTCREATORBUG-30546
+ it = fileData.erase(it);
+ continue;
+ }
const QStringList lines = SymbolSupport::getFileContents(filePath);
it->fileContent = lines.join('\n');
for (auto &rangeWithText : it.value().rangesAndLineText) {
diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp
index 855a76681b..6df1e7452d 100644
--- a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp
@@ -245,6 +245,8 @@ static CMakeConfig configurationFromPresetProbe(
cmakeListTxt.writeFileContents(QByteArray("cmake_minimum_required(VERSION 3.15)\n"
"\n"
"project(preset-probe)\n"
+ "set(CMAKE_C_COMPILER \"${CMAKE_C_COMPILER}\" CACHE FILEPATH \"\" FORCE)\n"
+ "set(CMAKE_CXX_COMPILER \"${CMAKE_CXX_COMPILER}\" CACHE FILEPATH \"\" FORCE)\n"
"\n"));
Process cmake;
diff --git a/src/plugins/coreplugin/dialogs/externaltoolconfig.cpp b/src/plugins/coreplugin/dialogs/externaltoolconfig.cpp
index dc434547de..76ff935975 100644
--- a/src/plugins/coreplugin/dialogs/externaltoolconfig.cpp
+++ b/src/plugins/coreplugin/dialogs/externaltoolconfig.cpp
@@ -174,19 +174,27 @@ bool ExternalToolModel::dropMimeData(const QMimeData *data,
return false;
QDataStream stream(&ba, QIODevice::ReadOnly);
QString category;
- int pos = -1;
+ qsizetype pos = -1;
stream >> category;
stream >> pos;
QList<ExternalTool *> &items = m_tools[category];
QTC_ASSERT(pos >= 0 && pos < items.count(), return false);
- beginRemoveRows(index(m_tools.keys().indexOf(category), 0), pos, pos);
+ const int sourceCategoryIndex = std::distance(m_tools.constBegin(), m_tools.constFind(category));
+ const int targetCategoryIndex
+ = std::distance(m_tools.constBegin(), m_tools.constFind(toCategory));
+ QTC_ASSERT(sourceCategoryIndex >= 0 && targetCategoryIndex >= 0, return false);
+ if (row < 0) // target row can be -1 when dropping onto the category itself
+ row = 0;
+ if (sourceCategoryIndex == targetCategoryIndex) {
+ if (row == pos || row == pos + 1) // would end at the same place, don't
+ return false;
+ }
+ beginMoveRows(index(sourceCategoryIndex, 0), pos, pos, index(targetCategoryIndex, 0), row);
ExternalTool *tool = items.takeAt(pos);
- endRemoveRows();
- if (row < 0)
- row = m_tools.value(toCategory).count();
- beginInsertRows(index(m_tools.keys().indexOf(toCategory), 0), row, row);
+ if (category == toCategory && pos < row) // adapt the target row for the removed item
+ --row;
m_tools[toCategory].insert(row, tool);
- endInsertRows();
+ endMoveRows();
return true;
}
diff --git a/src/plugins/coreplugin/systemsettings.cpp b/src/plugins/coreplugin/systemsettings.cpp
index a03eea24b8..d06d14f8da 100644
--- a/src/plugins/coreplugin/systemsettings.cpp
+++ b/src/plugins/coreplugin/systemsettings.cpp
@@ -161,7 +161,7 @@ class SystemSettingsWidget : public IOptionsPageWidget
{
public:
SystemSettingsWidget()
- : m_fileSystemCaseSensitivityChooser(new QComboBox)
+ : m_fileSystemCaseSensitivityChooser(HostOsInfo::isMacHost() ? new QComboBox : nullptr)
, m_externalFileBrowserEdit(new QLineEdit)
, m_terminalComboBox(new QComboBox)
, m_terminalOpenArgs(new QLineEdit)
@@ -188,9 +188,6 @@ public:
m_terminalOpenArgs->setToolTip(
Tr::tr("Command line arguments used for \"%1\".").arg(FileUtils::msgTerminalHereAction()));
- auto fileSystemCaseSensitivityLabel = new QLabel(Tr::tr("File system case sensitivity:"));
- fileSystemCaseSensitivityLabel->setToolTip(
- Tr::tr("Influences how file names are matched to decide if they are the same."));
auto resetFileBrowserButton = new QPushButton(Tr::tr("Reset"));
resetFileBrowserButton->setToolTip(Tr::tr("Reset to default."));
auto helpExternalFileBrowserButton = new QToolButton;
@@ -223,6 +220,9 @@ public:
}
grid.addRow({Span(4, s.patchCommand)});
if (HostOsInfo::isMacHost()) {
+ auto fileSystemCaseSensitivityLabel = new QLabel(Tr::tr("File system case sensitivity:"));
+ fileSystemCaseSensitivityLabel->setToolTip(
+ Tr::tr("Influences how file names are matched to decide if they are the same."));
grid.addRow({fileSystemCaseSensitivityLabel,
m_fileSystemCaseSensitivityChooser});
}
diff --git a/src/plugins/coreplugin/welcomepagehelper.cpp b/src/plugins/coreplugin/welcomepagehelper.cpp
index 9cad69cdf1..fe01944a6f 100644
--- a/src/plugins/coreplugin/welcomepagehelper.cpp
+++ b/src/plugins/coreplugin/welcomepagehelper.cpp
@@ -752,8 +752,8 @@ bool ListModelFilter::leaveFilterAcceptsRowBeforeFiltering(const ListItem *, boo
return false;
}
-constexpr TextFormat titleTF {Theme::Token_Text_Default, StyleHelper::UiElementIconActive};
-constexpr TextFormat descriptionTF {titleTF.themeColor, StyleHelper::UiElementCaption};
+constexpr TextFormat titleTF {Theme::Token_Text_Default, StyleHelper::UiElementH6};
+constexpr TextFormat descriptionTF {titleTF.themeColor, StyleHelper::UiElementCaptionStrong};
constexpr TextFormat tagsLabelTF {Theme::Token_Text_Muted, StyleHelper::UiElementCaptionStrong};
constexpr TextFormat tagsTF {Theme::Token_Text_Accent, tagsLabelTF.uiElement};
diff --git a/src/plugins/cvs/cvsplugin.cpp b/src/plugins/cvs/cvsplugin.cpp
index 2688def71e..01c47b1646 100644
--- a/src/plugins/cvs/cvsplugin.cpp
+++ b/src/plugins/cvs/cvsplugin.cpp
@@ -410,7 +410,8 @@ VcsCommand *CvsPluginPrivate::createInitialCheckoutCommand(const QString &url,
QStringList args;
args << QLatin1String("checkout") << url << extraArgs;
- auto command = VcsBaseClient::createVcsCommand(baseDirectory, Environment::systemEnvironment());
+ auto command = VcsBaseClient::createVcsCommand(this, baseDirectory,
+ Environment::systemEnvironment());
command->setDisplayName(Tr::tr("CVS Checkout"));
command->addJob({settings().binaryPath(), settings().addOptions(args)}, -1);
return command;
diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp
index 444d36777b..1aa77ae3ea 100644
--- a/src/plugins/debugger/debuggerengine.cpp
+++ b/src/plugins/debugger/debuggerengine.cpp
@@ -1765,6 +1765,10 @@ void DebuggerEngine::showMessage(const QString &msg, int channel, int timeout) c
d->m_logWindow->showInput(LogInput, msg);
d->m_logWindow->showOutput(LogInput, msg);
break;
+ case LogOutput:
+ case LogWarning:
+ d->m_logWindow->showOutput(channel, msg);
+ break;
case LogError:
d->m_logWindow->showInput(LogError, "ERROR: " + msg);
d->m_logWindow->showOutput(LogError, "ERROR: " + msg);
@@ -1779,7 +1783,7 @@ void DebuggerEngine::showMessage(const QString &msg, int channel, int timeout) c
emit appendMessageRequested(msg, StdErrFormat, false);
break;
default:
- d->m_logWindow->showOutput(channel, msg);
+ d->m_logWindow->showOutput(channel, QString("[%1] %2").arg(debuggerName(), msg));
break;
}
}
diff --git a/src/plugins/debugger/debuggerrunconfigurationaspect.cpp b/src/plugins/debugger/debuggerrunconfigurationaspect.cpp
index cff934e398..bef91c5992 100644
--- a/src/plugins/debugger/debuggerrunconfigurationaspect.cpp
+++ b/src/plugins/debugger/debuggerrunconfigurationaspect.cpp
@@ -77,10 +77,15 @@ DebuggerRunConfigurationAspect::DebuggerRunConfigurationAspect(Target *target)
const auto setSummaryText = [this, details] {
const auto describe = [](const TriStateAspect &aspect, const QString &name) {
- if (aspect() == TriState::Enabled)
+ if (aspect() == TriState::Enabled) {
+ //: %1 is C++, QML, or Python
return Tr::tr("Enable %1 debugger.").arg(name);
- if (aspect() == TriState::Disabled)
+ }
+ if (aspect() == TriState::Disabled) {
+ //: %1 is C++, QML, or Python
return Tr::tr("Disable %1 debugger.").arg(name);
+ }
+ //: %1 is C++, QML, or Python
return Tr::tr("Try to determine need for %1 debugger.").arg(name);
};
diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp
index 987122fcf2..0cc67f5416 100644
--- a/src/plugins/debugger/watchhandler.cpp
+++ b/src/plugins/debugger/watchhandler.cpp
@@ -959,8 +959,10 @@ static QString displayType(const WatchItem *item)
result += QString(":%1").arg(item->bitsize);
result.remove('\'');
result = watchModel(item)->removeNamespaces(result);
- if (item->valuelen > 0)
+ if (item->valuelen > 0) {
+ //: <type> of length <number>, e.g. for strings and byte arrays
result = Tr::tr("%1 of length %2").arg(result).arg(item->valuelen);
+ }
return result;
}
diff --git a/src/plugins/fossil/fossilplugin.cpp b/src/plugins/fossil/fossilplugin.cpp
index c4ea13b446..ff6fa0fa3f 100644
--- a/src/plugins/fossil/fossilplugin.cpp
+++ b/src/plugins/fossil/fossilplugin.cpp
@@ -927,7 +927,7 @@ VcsCommand *FossilPluginPrivate::createInitialCheckoutCommand(const QString &sou
checkoutPath.createDir();
// Setup the wizard page command job
- auto command = VcsBaseClient::createVcsCommand(checkoutPath,
+ auto command = VcsBaseClient::createVcsCommand(this, checkoutPath,
fossilClient().processEnvironment(checkoutPath));
if (!isLocalRepository
diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp
index 966abc40b8..af5b267101 100644
--- a/src/plugins/git/gitplugin.cpp
+++ b/src/plugins/git/gitplugin.cpp
@@ -1769,7 +1769,7 @@ VcsCommand *GitPluginPrivate::createInitialCheckoutCommand(const QString &url,
QStringList args = {"clone", "--progress"};
args << extraArgs << url << localName;
- auto command = VcsBaseClient::createVcsCommand(baseDirectory,
+ auto command = VcsBaseClient::createVcsCommand(this, baseDirectory,
gitClient().processEnvironment(baseDirectory));
command->addFlags(RunFlags::SuppressStdErr);
command->addJob({gitClient().vcsBinary(baseDirectory), args}, -1);
diff --git a/src/plugins/help/helpmanager.cpp b/src/plugins/help/helpmanager.cpp
index 7ec80e700d..a117afd916 100644
--- a/src/plugins/help/helpmanager.cpp
+++ b/src/plugins/help/helpmanager.cpp
@@ -8,6 +8,8 @@
#include <coreplugin/icore.h>
#include <coreplugin/progressmanager/progressmanager.h>
+#include <extensionsystem/pluginmanager.h>
+
#include <utils/algorithm.h>
#include <utils/async.h>
#include <utils/filesystemwatcher.h>
@@ -138,6 +140,7 @@ void HelpManager::registerDocumentation(const QStringList &files)
}
QFuture<bool> future = Utils::asyncRun(&registerDocumentationNow, collectionFilePath(), files);
+ ExtensionSystem::PluginManager::futureSynchronizer()->addFuture(future);
Utils::onResultReady(future, this, [](bool docsChanged){
if (docsChanged) {
d->m_helpEngine->setupData();
@@ -200,6 +203,7 @@ void HelpManager::unregisterDocumentation(const QStringList &files)
d->m_userRegisteredFiles.subtract(Utils::toSet(files));
QFuture<bool> future = Utils::asyncRun(&unregisterDocumentationNow, collectionFilePath(), files);
+ ExtensionSystem::PluginManager::futureSynchronizer()->addFuture(future);
Utils::onResultReady(future, this, [](bool docsChanged){
if (docsChanged) {
d->m_helpEngine->setupData();
diff --git a/src/plugins/languageclient/languageclientsettings.cpp b/src/plugins/languageclient/languageclientsettings.cpp
index 503e79e2b8..38c5a46159 100644
--- a/src/plugins/languageclient/languageclientsettings.cpp
+++ b/src/plugins/languageclient/languageclientsettings.cpp
@@ -184,7 +184,7 @@ LanguageClientSettingsPageWidget::LanguageClientSettingsPageWidget(LanguageClien
auto addMenu = new QMenu(this);
addMenu->clear();
for (const ClientType &type : clientTypes()) {
- auto action = new QAction(type.name);
+ auto action = new QAction(type.name, this);
connect(action, &QAction::triggered, this, [this, id = type.id]() { addItem(id); });
addMenu->addAction(action);
}
diff --git a/src/plugins/languageclient/languageclientsymbolsupport.cpp b/src/plugins/languageclient/languageclientsymbolsupport.cpp
index e9c4443eed..3a9a1b0970 100644
--- a/src/plugins/languageclient/languageclientsymbolsupport.cpp
+++ b/src/plugins/languageclient/languageclientsymbolsupport.cpp
@@ -274,6 +274,10 @@ struct ItemData
Utils::Text::Range range;
QVariant userData;
};
+bool operator==(const ItemData &id1, const ItemData &id2)
+{
+ return id1.range == id2.range && id1.userData == id2.userData;
+}
QStringList SymbolSupport::getFileContents(const Utils::FilePath &filePath)
{
@@ -342,15 +346,32 @@ Utils::SearchResultItems generateSearchResultItems(
return result;
}
+using ItemDataPerPath = QMap<Utils::FilePath, QList<ItemData>>;
+void filterFileAliases(ItemDataPerPath &itemDataPerPath)
+{
+ QSet<Utils::FilePath> canonicalPaths;
+ for (auto it = itemDataPerPath.begin(); it != itemDataPerPath.end(); ) {
+ const Utils::FilePath canonicalPath = it.key().canonicalPath();
+ if (!Utils::insert(canonicalPaths, canonicalPath)
+ && it.value() == itemDataPerPath.value(canonicalPath)) { // QTCREATORBUG-30546
+ it = itemDataPerPath.erase(it);
+ } else {
+ ++it;
+ }
+ }
+}
+
Utils::SearchResultItems generateSearchResultItems(
const LanguageClientArray<Location> &locations, const DocumentUri::PathMapper &pathMapper)
{
if (locations.isNull())
return {};
- QMap<Utils::FilePath, QList<ItemData>> rangesInDocument;
- for (const Location &location : locations.toList())
+ ItemDataPerPath rangesInDocument;
+ for (const Location &location : locations.toList()) {
rangesInDocument[location.uri().toFilePath(pathMapper)]
<< ItemData{SymbolSupport::convertRange(location.range()), {}};
+ }
+ filterFileAliases(rangesInDocument);
return generateSearchResultItems(rangesInDocument);
}
@@ -552,7 +573,7 @@ Utils::SearchResultItems generateReplaceItems(const WorkspaceEdit &edits,
return ItemData{SymbolSupport::convertRange(edit.range()), QVariant(edit)};
});
};
- QMap<Utils::FilePath, QList<ItemData>> rangesInDocument;
+ ItemDataPerPath rangesInDocument;
auto documentChanges = edits.documentChanges().value_or(QList<DocumentChange>());
if (!documentChanges.isEmpty()) {
for (const DocumentChange &documentChange : std::as_const(documentChanges)) {
@@ -588,6 +609,7 @@ Utils::SearchResultItems generateReplaceItems(const WorkspaceEdit &edits,
for (auto it = changes.begin(), end = changes.end(); it != end; ++it)
rangesInDocument[it.key().toFilePath(pathMapper)] = convertEdits(it.value());
}
+ filterFileAliases(rangesInDocument);
items += generateSearchResultItems(rangesInDocument, search, limitToProjects);
return items;
}
diff --git a/src/plugins/mercurial/mercurialplugin.cpp b/src/plugins/mercurial/mercurialplugin.cpp
index a9ab891c02..f87d181da4 100644
--- a/src/plugins/mercurial/mercurialplugin.cpp
+++ b/src/plugins/mercurial/mercurialplugin.cpp
@@ -736,9 +736,8 @@ VcsCommand *MercurialPluginPrivate::createInitialCheckoutCommand(const QString &
{
QStringList args;
args << QLatin1String("clone") << extraArgs << url << localName;
- auto command = VcsBaseClient::createVcsCommand(baseDirectory,
- mercurialClient().processEnvironment(
- baseDirectory));
+ auto command = VcsBaseClient::createVcsCommand(this, baseDirectory,
+ mercurialClient().processEnvironment(baseDirectory));
command->addJob({settings().binaryPath(), args}, -1);
return command;
}
diff --git a/src/plugins/projectexplorer/projectwelcomepage.cpp b/src/plugins/projectexplorer/projectwelcomepage.cpp
index e51800575d..2974225644 100644
--- a/src/plugins/projectexplorer/projectwelcomepage.cpp
+++ b/src/plugins/projectexplorer/projectwelcomepage.cpp
@@ -47,10 +47,11 @@ const char PROJECT_BASE_ID[] = "Welcome.OpenRecentProject";
namespace ProjectExplorer {
namespace Internal {
-constexpr TextFormat projectNameTF {Theme::Token_Text_Accent, StyleHelper::UiElementH5};
-constexpr TextFormat projectPathTF {Theme::Token_Text_Muted, StyleHelper::UiElementIconActive};
-constexpr TextFormat sessionNameTF {projectNameTF.themeColor, projectNameTF.uiElement};
-constexpr TextFormat sessionProjetNameTF {Theme::Token_Text_Default, projectNameTF.uiElement};
+constexpr TextFormat projectNameTF {Theme::Token_Text_Accent, StyleHelper::UiElementH6};
+constexpr TextFormat projectPathTF {Theme::Token_Text_Muted, StyleHelper::UiElementCaptionStrong};
+constexpr TextFormat sessionNameTF = {projectNameTF.themeColor, projectNameTF.uiElement,
+ Qt::AlignVCenter | Qt::TextDontClip};
+constexpr TextFormat sessionProjectNameTF {Theme::Token_Text_Default, projectNameTF.uiElement};
constexpr TextFormat shortcutNumberTF {Theme::Token_Text_Default,
StyleHelper::UiElementCaptionStrong,
Qt::AlignCenter | Qt::TextDontClip};
@@ -315,36 +316,36 @@ public:
void paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &idx) const final
{
- // visible on withIcon() Gap + arrow visible on hover Extra margin right of project item
- // | | |
- // +----------+----------+ +--------+-------+ +----------+----------+
- // | | | | | |
+ // visible on withIcon() Gap + arrow visible on hover Extra margin right of project item
+ // | | |
+ // +-----------+----------+ +--------+-------+ +----------+----------+
+ // | | | | | |
//
- // +------------+--------+--------+------------+--------+-------------+--------+-------+------------+---------------------+ --+
- // | | | |(VPaddingXs)| |(VPaddingXs) | | | | | |
- // | | | +------------+ +-------------+ | | | | |
- // |(HPaddingXs)|<number>|(HGapXs)| <icon> |(HGapXs)|<sessionName>|(HGapXs)|<arrow>| | | +-- Header
- // | |(16x16) | +------------+ +-------------+ | | | | |
- // | | | |(VPaddingXs)| |(VPaddingXs) | | | | | |
- // |------------+--------+--------+------------+--------+-------------+--------+-------+ | | --+
- // | +-- | (VPaddingXs) | | | |
- // | | +------------------------------+(HPaddingXs)| | |
- // | | | <projectName> | | | |
- // | | +------------------------------+ | | |
- // | Per project in session --+ | (EXSPaddingGapS) | |(sessionScrollBarGap)| |
- // | | +------------------------------+ | | |
- // | | | <projectPath> | | | |
- // | | +------------------------------+ | | +-- Expansion
- // | +-- | (VPaddingXs) | | | |
- // +----------------------------------------------+------------------------------------+------------+ | |
- // | (VPaddingXs) | | |
- // +----------------------------------------+--------------+----------------------------------------+ | |
- // +-- | <cloneButton>|<renameButton>|<deleteButton> | | |
- // | +----------------------------------------+--------------+----------------------------------------+ | |
- // | | (VPaddingXs) | | |
- // | +------------------------------------------------------------------------------------------------+---------------------+ --+
- // | | (VGapL) | +-- Gap between session items
- // | +----------------------------------------------------------------------------------------------------------------------+ --+
+ // +------------+--------+---------+------------+---------+-------------+--------+-------+------------+---------------------+ --+
+ // | | | |(VPaddingXs)| |(VPaddingXs) | | | | | |
+ // | | | +------------+ +-------------+ | | | | |
+ // |(HPaddingXs)|<number>|(HGapXxs)| <icon> |(HGapXxs)|<sessionName>|(HGapXs)|<arrow>| | | +-- Header
+ // | |(16x16) | +------------+ +-------------+ | | | | |
+ // | | | |(VPaddingXs)| |(VPaddingXs) | | | | | |
+ // |------------+--------+---------+------------+---------+-------------+--------+-------+ | | --+
+ // | +-- | (VPaddingXxs) | | | |
+ // | | +------------------------------+(HPaddingXs)| | |
+ // | | | <projectName> | | | |
+ // | | +------------------------------+ | | |
+ // | Per project in session --+ | (ExPaddingGapS) | |(sessionScrollBarGap)| |
+ // | | +------------------------------+ | | |
+ // | | | <projectPath> | | | |
+ // | | +------------------------------+ | | +-- Expansion
+ // | +-- | (VPaddingXxs) | | | |
+ // +------------------------------------------------------+------------------------------+------------+ | |
+ // | (VPaddingXs) | | |
+ // +-----------------------------------------+--------------+-----------------------------------------+ | |
+ // +-- | <cloneButton>|<renameButton>|<deleteButton> | | |
+ // | +-----------------------------------------+--------------+-----------------------------------------+ | |
+ // | | (VPaddingXs) | | |
+ // | +--------------------------------------------------------------------------------------------------+---------------------+ --+
+ // | | (VGapL) | +-- Gap between session items
+ // | +------------------------------------------------------------------------------------------------------------------------+ --+
// |
// \ session action "buttons" and dividers
// +-----------------------------------------------+--------+---------+--------+
@@ -380,11 +381,11 @@ public:
const int y = bgR.y();
const int numberX = x + s(HPaddingXs);
- const int iconX = numberX + shortcutNumberWidth + s(HGapXs);
+ const int iconX = numberX + shortcutNumberWidth + s(HGapXxs);
const int arrowX = bgR.right() - s(HPaddingXs) - arrowS.width();
const QRect arrowHoverR(arrowX - s(HGapXs) + 1, y,
s(HGapXs) + arrowS.width() + s(HPaddingXs), hdR.height());
- const int textX = withIcon() ? iconX + iconS.width() + s(HGapXs) : iconX;
+ const int textX = withIcon() ? iconX + iconS.width() + s(HGapXxs) : iconX;
const int iconY = y + (hdR.height() - iconS.height()) / 2;
const int arrowY = y + (hdR.height() - arrowS.height()) / 2;
@@ -419,8 +420,7 @@ public:
fullSessionName = Tr::tr("%1 (last session)").arg(fullSessionName);
if (isActiveSession && !isDefaultVirgin)
fullSessionName = Tr::tr("%1 (current session)").arg(fullSessionName);
- const QRect switchR(x, y, hdR.width() - arrowHoverR.width(),
- hdR.height() + s(VGapL));
+ const QRect switchR(x, y, hdR.width() - arrowHoverR.width(), arrowHoverR.height());
const bool switchActive = switchR.contains(mousePos);
painter->setPen(sessionNameTF.color());
painter->setFont(sessionNameTF.font(switchActive));
@@ -432,7 +432,7 @@ public:
m_activeSwitchToRect = switchR;
}
if (arrowVisible) {
- if (arrowHoverR.adjusted(0, 0, 0, s(VGapL)).contains(mousePos)) {
+ if (arrowHoverR.adjusted(0, 0, 0, expanded ? 0 : s(VGapL)).contains(mousePos)) {
m_activeExpandRect = arrowHoverR;
} else {
painter->save();
@@ -447,9 +447,9 @@ public:
int yy = hdR.bottom();
if (expanded) {
- const QFont projectNameFont = sessionProjetNameTF.font();
+ const QFont projectNameFont = sessionProjectNameTF.font();
const QFontMetrics projectNameFm(projectNameFont);
- const int projectNameLineHeight = sessionProjetNameTF.lineHeight();
+ const int projectNameLineHeight = sessionProjectNameTF.lineHeight();
const QFont projectPathFont = projectPathTF.font();
const QFontMetrics projectPathFm(projectPathFont);
const int projectPathLineHeight = projectPathTF.lineHeight();
@@ -457,15 +457,15 @@ public:
const FilePaths projects = ProjectManager::projectsForSessionName(sessionName);
for (const FilePath &projectPath : projects) {
- yy += s(VPaddingXs);
+ yy += s(VPaddingXxs);
{
painter->setFont(projectNameFont);
- painter->setPen(sessionProjetNameTF.color());
+ painter->setPen(sessionProjectNameTF.color());
const QRect projectNameR(textX, yy, textWidth, projectNameLineHeight);
const QString projectNameElided =
projectNameFm.elidedText(projectPath.completeBaseName(), Qt::ElideMiddle,
textWidth);
- painter->drawText(projectNameR, sessionProjetNameTF.drawTextFlags,
+ painter->drawText(projectNameR, sessionProjectNameTF.drawTextFlags,
projectNameElided);
yy += projectNameLineHeight;
yy += s(ExPaddingGapS);
@@ -483,7 +483,7 @@ public:
projectPathElided);
yy += projectPathLineHeight;
}
- yy += s(VPaddingXs);
+ yy += s(VPaddingXxs);
}
yy += s(VGapXs);
@@ -551,11 +551,11 @@ public:
const QString sessionName = idx.data(Qt::DisplayRole).toString();
const FilePaths projects = ProjectManager::projectsForSessionName(sessionName);
const int projectEntryHeight =
- s(VPaddingXs)
+ s(VPaddingXxs)
+ projectNameTF.lineHeight()
+ s(ExPaddingGapS)
+ projectPathTF.lineHeight()
- + s(VPaddingXs);
+ + s(VPaddingXxs);
h += projects.size() * projectEntryHeight
+ s(VGapXs)
+ actionButtonHeight()
@@ -622,24 +622,24 @@ class ProjectDelegate : public BaseDelegate
public:
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &idx) const final
{
- // visible on withIcon() Extra margin right of project item
- // | |
- // +-------+-------+ +------+-----+
- // | | | |
+ // visible on with Icon() Extra margin right of project item
+ // | |
+ // +--------+-------+ +------+-----+
+ // | | | |
//
- // +------------+--------+--------+------+--------+-------------+------------+------------+
- // | | | | | | (VPaddingXs)| | |
- // | | | | | +-------------+ | |
- // | | | | | |<projectName>| | |
- // | | | | | +-------------+ | |
- // |(HPaddingXs)|<number>|(HGapXs)|<icon>|(HGapXs)| (VGapXs) |(HPaddingXs)|(HPaddingXs)|
- // | |(16x16) | | | +-------------+ | |
- // | | | | | |<projectPath>| | |
- // | | | | | +-------------+ | |
- // | | | | | | (VPaddingXs)| | |
- // +------------+--------+--------+------+--------+-------------+------------+------------+ --+
- // | (VGapL) | +-- Gap between project items
- // +--------------------------------------------------------------------------------------+ --+
+ // +------------+--------+---------+------+---------+-------------+------------+------------+
+ // | | | | | | (VPaddingXs)| | |
+ // | | | | | +-------------+ | |
+ // | | | | | |<projectName>| | |
+ // | | | | | +-------------+ | |
+ // |(HPaddingXs)|<number>|(HGapXxs)|<icon>|(HGapXxs)| (VGapXs) |(HPaddingXs)|(HPaddingXs)|
+ // | |(16x16) | | | +-------------+ | |
+ // | | | | | |<projectPath>| | |
+ // | | | | | +-------------+ | |
+ // | | | | | | (VPaddingXs)| | |
+ // +------------+--------+---------+------+---------+-------------+------------+------------+ --+
+ // | (VGapL) | +-- Gap between project items
+ // +----------------------------------------------------------------------------------------+ --+
const bool hovered = option.widget->isActiveWindow()
&& option.state & QStyle::State_MouseOver;
@@ -651,9 +651,9 @@ public:
const int x = bgR.x();
const int numberX = x + s(HPaddingXs);
- const int iconX = numberX + shortcutNumberWidth + s(HGapXs);
+ const int iconX = numberX + shortcutNumberWidth + s(HGapXxs);
const int iconWidth = iconS.width();
- const int textX = withIcon() ? iconX + iconWidth + s(HGapXs) : iconX;
+ const int textX = withIcon() ? iconX + iconWidth + s(HGapXxs) : iconX;
const int textWidth = bgR.width() - s(HPaddingXs) - textX;
const int y = bgR.y();
diff --git a/src/plugins/projectexplorer/toolchainoptionspage.cpp b/src/plugins/projectexplorer/toolchainoptionspage.cpp
index 470e64cf19..53b5267719 100644
--- a/src/plugins/projectexplorer/toolchainoptionspage.cpp
+++ b/src/plugins/projectexplorer/toolchainoptionspage.cpp
@@ -193,7 +193,7 @@ public:
m_toolChainView->expandAll();
m_addButton = new QPushButton(Tr::tr("Add"), this);
- auto addMenu = new QMenu;
+ auto addMenu = new QMenu(this);
for (ToolchainFactory *factory : std::as_const(m_factories)) {
QList<Utils::Id> languages = factory->supportedLanguages();
if (languages.isEmpty())
diff --git a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp
index fb82f839d8..541e848c1f 100644
--- a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp
@@ -372,7 +372,8 @@ QString QmakeBuildConfiguration::unalignedBuildDirWarning()
bool QmakeBuildConfiguration::isBuildDirAtSafeLocation(const FilePath &sourceDir,
const FilePath &buildDir)
{
- return buildDir.path().count('/') == sourceDir.path().count('/');
+ return buildDir.path().count('/') == sourceDir.path().count('/')
+ || buildDir.isChildOf(sourceDir);
}
bool QmakeBuildConfiguration::isBuildDirAtSafeLocation() const
diff --git a/src/plugins/qtsupport/qtbuildaspects.cpp b/src/plugins/qtsupport/qtbuildaspects.cpp
index e941dcb187..2f6ee19220 100644
--- a/src/plugins/qtsupport/qtbuildaspects.cpp
+++ b/src/plugins/qtsupport/qtbuildaspects.cpp
@@ -35,7 +35,6 @@ void QmlDebuggingAspect::addToLayout(Layouting::LayoutItem &parent)
SelectionAspect::addToLayout(parent);
const auto warningLabel = createSubWidget<InfoLabel>(QString(), InfoLabel::Warning);
warningLabel->setElideMode(Qt::ElideNone);
- warningLabel->setVisible(false);
parent.addRow({{}, warningLabel});
const auto changeHandler = [this, warningLabel] {
QString warningText;
@@ -51,7 +50,9 @@ void QmlDebuggingAspect::addToLayout(Layouting::LayoutItem &parent)
warningLabel->setText(warningText);
setVisible(supported);
const bool warningLabelsVisible = supported && !warningText.isEmpty();
- if (warningLabel->parentWidget())
+ // avoid explicitly showing the widget when it doesn't have a parent, but always
+ // explicitly hide it when necessary
+ if (warningLabel->parentWidget() || !warningLabelsVisible)
warningLabel->setVisible(warningLabelsVisible);
};
connect(KitManager::instance(), &KitManager::kitsChanged, warningLabel, changeHandler);
diff --git a/src/plugins/qtsupport/qtoptionspage.cpp b/src/plugins/qtsupport/qtoptionspage.cpp
index 7eb349d1da..7b08db2351 100644
--- a/src/plugins/qtsupport/qtoptionspage.cpp
+++ b/src/plugins/qtsupport/qtoptionspage.cpp
@@ -309,7 +309,7 @@ QtSettingsPageWidget::QtSettingsPageWidget()
{ProjectExplorer::Constants::msgAutoDetectedToolTip()});
m_manualItem = new StaticTreeItem(ProjectExplorer::Constants::msgManual());
- m_model = new TreeModel<TreeItem, TreeItem, QtVersionItem>();
+ m_model = new TreeModel<TreeItem, TreeItem, QtVersionItem>(this);
m_model->setHeader({Tr::tr("Name"), Tr::tr("qmake Path")});
m_model->rootItem()->appendChild(m_autoItem);
m_model->rootItem()->appendChild(m_manualItem);
diff --git a/src/plugins/qtsupport/qtsupportplugin.cpp b/src/plugins/qtsupport/qtsupportplugin.cpp
index 72c2ac4ae9..96f1e2a7b8 100644
--- a/src/plugins/qtsupport/qtsupportplugin.cpp
+++ b/src/plugins/qtsupport/qtsupportplugin.cpp
@@ -83,6 +83,8 @@ void QtSupportPlugin::initialize()
addTestCreator(createQtProjectImporterTest);
#endif
+ setupQtVersionManager(this);
+
setupDesktopQtVersion();
setupEmbeddedLinuxQtVersion();
setupGettingStartedWelcomePage();
diff --git a/src/plugins/qtsupport/qtversionmanager.cpp b/src/plugins/qtsupport/qtversionmanager.cpp
index 48edcca8c8..c269eca3cc 100644
--- a/src/plugins/qtsupport/qtversionmanager.cpp
+++ b/src/plugins/qtsupport/qtversionmanager.cpp
@@ -89,7 +89,8 @@ static PersistentSettingsWriter *m_writer = nullptr;
class QtVersionManagerImpl : public QObject
{
public:
- QtVersionManagerImpl()
+ QtVersionManagerImpl(QObject *parent)
+ : QObject(parent)
{
qRegisterMetaType<FilePath>();
@@ -135,10 +136,18 @@ public:
QTimer m_fileWatcherTimer;
};
+static QObject *s_guard = nullptr;
+
+void Internal::setupQtVersionManager(QObject *guard)
+{
+ s_guard = guard;
+}
+
QtVersionManagerImpl &qtVersionManagerImpl()
{
- static QtVersionManagerImpl theQtVersionManager;
- return theQtVersionManager;
+ QTC_CHECK(s_guard);
+ static auto theQtVersionManager = new QtVersionManagerImpl(s_guard);
+ return *theQtVersionManager;
}
void QtVersionManagerImpl::triggerQtVersionRestore()
diff --git a/src/plugins/qtsupport/qtversionmanager.h b/src/plugins/qtsupport/qtversionmanager.h
index 9fa2cfb5b1..9eb17a4d8c 100644
--- a/src/plugins/qtsupport/qtversionmanager.h
+++ b/src/plugins/qtsupport/qtversionmanager.h
@@ -70,4 +70,6 @@ private:
static int getUniqueId();
};
+namespace Internal { void setupQtVersionManager(QObject *guard); }
+
} // namespace QtSupport
diff --git a/src/plugins/remotelinux/linuxdevice.cpp b/src/plugins/remotelinux/linuxdevice.cpp
index e327a4c914..31195e8cfa 100644
--- a/src/plugins/remotelinux/linuxdevice.cpp
+++ b/src/plugins/remotelinux/linuxdevice.cpp
@@ -24,7 +24,6 @@
#include <projectexplorer/projectexplorerconstants.h>
#include <utils/algorithm.h>
-#include <utils/async.h>
#include <utils/devicefileaccess.h>
#include <utils/deviceshell.h>
#include <utils/environment.h>
@@ -1674,12 +1673,10 @@ void LinuxDevice::setDisconnected(bool disconnected)
d->setDisconnected(disconnected);
}
-QFuture<bool> LinuxDevice::tryToConnect()
+bool LinuxDevice::tryToConnect()
{
- return Utils::asyncRun([this] {
- QMutexLocker locker(&d->m_shellMutex);
- return d->setupShell(sshParameters(), false);
- });
+ QMutexLocker locker(&d->m_shellMutex);
+ return d->setupShell(sshParameters(), false);
}
namespace Internal {
diff --git a/src/plugins/remotelinux/linuxdevice.h b/src/plugins/remotelinux/linuxdevice.h
index 0bb2468eac..06e0da3f2a 100644
--- a/src/plugins/remotelinux/linuxdevice.h
+++ b/src/plugins/remotelinux/linuxdevice.h
@@ -50,7 +50,7 @@ public:
bool isDisconnected() const;
void setDisconnected(bool disconnected);
- QFuture<bool> tryToConnect();
+ bool tryToConnect();
protected:
LinuxDevice();
diff --git a/src/plugins/remotelinux/linuxdevicetester.cpp b/src/plugins/remotelinux/linuxdevicetester.cpp
index 7380f01868..aa79244c73 100644
--- a/src/plugins/remotelinux/linuxdevicetester.cpp
+++ b/src/plugins/remotelinux/linuxdevicetester.cpp
@@ -5,6 +5,9 @@
#include "linuxdevice.h"
#include "remotelinuxtr.h"
+#include "utils/async.h"
+
+#include <extensionsystem/pluginmanager.h>
#include <projectexplorer/devicesupport/deviceusedportsgatherer.h>
#include <projectexplorer/devicesupport/filetransfer.h>
@@ -18,8 +21,6 @@
#include <utils/qtcassert.h>
#include <utils/stringutils.h>
-#include <QFutureWatcher>
-
using namespace ProjectExplorer;
using namespace Tasking;
using namespace Utils;
@@ -39,6 +40,7 @@ public:
QStringList commandsToTest() const;
+ GroupItem connectionTask() const;
GroupItem echoTask(const QString &contents) const;
GroupItem unameTask() const;
GroupItem gathererTask() const;
@@ -46,13 +48,9 @@ public:
const Storage<TransferStorage> &storage) const;
GroupItem transferTasks() const;
GroupItem commandTasks() const;
- void runCommandTests();
-
- bool isRunning() const { return m_connectionTest || m_taskTreeRunner.isRunning(); }
GenericLinuxDeviceTester *q = nullptr;
LinuxDevice::Ptr m_device;
- QFutureWatcher<bool> *m_connectionTest = nullptr;
TaskTreeRunner m_taskTreeRunner;
QStringList m_extraCommands;
QList<GroupItem> m_extraTests;
@@ -98,6 +96,27 @@ QStringList GenericLinuxDeviceTesterPrivate::commandsToTest() const
return commands;
}
+GroupItem GenericLinuxDeviceTesterPrivate::connectionTask() const
+{
+ const auto onSetup = [this](Async<bool> &task) {
+ emit q->progressMessage(Tr::tr("Connecting to device..."));
+ task.setConcurrentCallData([device = m_device] { return device->tryToConnect(); });
+ task.setFutureSynchronizer(ExtensionSystem::PluginManager::futureSynchronizer());
+ };
+ const auto onDone = [this](const Async<bool> &task) {
+ const bool success = task.isResultAvailable() && task.result();
+ if (success) {
+ // TODO: For master: move the '\n' outside of Tr().
+ emit q->progressMessage(Tr::tr("Connected. Now doing extended checks.\n"));
+ } else {
+ emit q->errorMessage(
+ Tr::tr("Basic connectivity test failed, device is considered unusable.") + '\n');
+ }
+ return toDoneResult(success);
+ };
+ return AsyncTask<bool>(onSetup, onDone);
+}
+
GroupItem GenericLinuxDeviceTesterPrivate::echoTask(const QString &contents) const
{
const auto onSetup = [this, contents](Process &process) {
@@ -283,20 +302,6 @@ GroupItem GenericLinuxDeviceTesterPrivate::commandTasks() const
return root;
}
-void GenericLinuxDeviceTesterPrivate::runCommandTests()
-{
- const Group root {
- echoTask("Hello"), // No quoting necessary
- echoTask("Hello Remote World!"), // Checks quoting, too.
- unameTask(),
- gathererTask(),
- transferTasks(),
- m_extraTests,
- commandTasks()
- };
- m_taskTreeRunner.start(root);
-}
-
} // namespace Internal
using namespace Internal;
@@ -323,39 +328,27 @@ void GenericLinuxDeviceTester::setExtraTests(const QList<GroupItem> &extraTests)
void GenericLinuxDeviceTester::testDevice(const IDevice::Ptr &deviceConfiguration)
{
- QTC_ASSERT(!d->isRunning(), return);
-
- emit progressMessage(Tr::tr("Connecting to device..."));
+ QTC_ASSERT(!d->m_taskTreeRunner.isRunning(), return);
d->m_device = std::static_pointer_cast<LinuxDevice>(deviceConfiguration);
- d->m_connectionTest = new QFutureWatcher<bool>(this);
- connect(d->m_connectionTest, &QFutureWatcher<bool>::finished, this, [this] {
- const bool success = d->m_connectionTest->result();
- d->m_connectionTest->deleteLater();
- d->m_connectionTest = nullptr;
- if (success) {
- emit progressMessage(Tr::tr("Connected. Now doing extended checks.\n"));
- d->runCommandTests();
- } else {
- emit errorMessage(
- Tr::tr("Basic connectivity test failed, device is considered unusable."));
- emit finished(TestFailure);
- }
- });
- d->m_connectionTest->setFuture(d->m_device->tryToConnect());
+ const Group root {
+ d->connectionTask(),
+ d->echoTask("Hello"), // No quoting necessary
+ d->echoTask("Hello Remote World!"), // Checks quoting, too.
+ d->unameTask(),
+ d->gathererTask(),
+ d->transferTasks(),
+ d->m_extraTests,
+ d->commandTasks()
+ };
+ d->m_taskTreeRunner.start(root);
}
void GenericLinuxDeviceTester::stopTest()
{
- QTC_ASSERT(d->isRunning(), return);
- if (d->m_connectionTest) {
- d->m_connectionTest->disconnect();
- d->m_connectionTest->cancel();
- d->m_connectionTest = nullptr;
- } else {
- d->m_taskTreeRunner.reset();
- }
+ QTC_ASSERT(d->m_taskTreeRunner.isRunning(), return);
+ d->m_taskTreeRunner.reset();
emit finished(TestFailure);
}
diff --git a/src/plugins/screenrecorder/screenrecorderplugin.cpp b/src/plugins/screenrecorder/screenrecorderplugin.cpp
index 662e8cc24c..a816a276bc 100644
--- a/src/plugins/screenrecorder/screenrecorderplugin.cpp
+++ b/src/plugins/screenrecorder/screenrecorderplugin.cpp
@@ -135,9 +135,11 @@ public:
private:
void showDialogOrSettings()
{
- if (!Internal::settings().toolsRegistered() &&
- !Core::ICore::showOptionsDialog(Constants::TOOLSSETTINGSPAGE_ID)) {
- return;
+ if (!Internal::settings().toolsRegistered()) {
+ // Show options if ffmpeg/ffprobe are neither autodetected nor manually set
+ Core::ICore::showOptionsDialog(Constants::TOOLSSETTINGSPAGE_ID);
+ if (!Internal::settings().toolsRegistered())
+ return; // User did not set ffmpeg/ffprobe
}
ScreenRecorderDialog::showDialog();
diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp
index 64f32a11ff..b28224a866 100644
--- a/src/plugins/subversion/subversionplugin.cpp
+++ b/src/plugins/subversion/subversionplugin.cpp
@@ -1135,9 +1135,8 @@ VcsCommand *SubversionPluginPrivate::createInitialCheckoutCommand(const QString
args << SubversionClient::AddAuthOptions();
args << Subversion::Constants::NON_INTERACTIVE_OPTION << extraArgs << url << localName;
- auto command = VcsBaseClient::createVcsCommand(baseDirectory,
- subversionClient().processEnvironment(
- baseDirectory));
+ auto command = VcsBaseClient::createVcsCommand(this, baseDirectory,
+ subversionClient().processEnvironment(baseDirectory));
command->addJob(args, -1);
return command;
}
diff --git a/src/plugins/terminal/terminalwidget.cpp b/src/plugins/terminal/terminalwidget.cpp
index 2bd0fa403d..756f1a11be 100644
--- a/src/plugins/terminal/terminalwidget.cpp
+++ b/src/plugins/terminal/terminalwidget.cpp
@@ -336,7 +336,7 @@ qint64 TerminalWidget::writeToPty(const QByteArray &data)
void TerminalWidget::resizePty(QSize newSize)
{
- if (m_process && m_process->ptyData())
+ if (m_process && m_process->ptyData() && m_process->isRunning())
m_process->ptyData()->resize(newSize);
}
diff --git a/src/plugins/vcsbase/vcsbaseclient.cpp b/src/plugins/vcsbase/vcsbaseclient.cpp
index 2327e75bc7..6a36d628bd 100644
--- a/src/plugins/vcsbase/vcsbaseclient.cpp
+++ b/src/plugins/vcsbase/vcsbaseclient.cpp
@@ -6,7 +6,6 @@
#include "vcsbaseclientsettings.h"
#include "vcsbaseeditor.h"
#include "vcsbaseeditorconfig.h"
-#include "vcsbaseplugin.h"
#include "vcsbasetr.h"
#include "vcscommand.h"
#include "vcsoutputwindow.h"
@@ -72,7 +71,8 @@ FilePath VcsBaseClientImpl::vcsBinary(const Utils::FilePath &forDirectory) const
VcsCommand *VcsBaseClientImpl::createCommand(const FilePath &workingDirectory,
VcsBaseEditorWidget *editor) const
{
- auto cmd = createVcsCommand(workingDirectory, processEnvironment(workingDirectory));
+ auto cmd = createVcsCommand(const_cast<VcsBaseClientImpl *>(this),
+ workingDirectory, processEnvironment(workingDirectory));
if (editor) {
editor->setCommand(cmd);
connect(cmd, &VcsCommand::done, editor, [editor, cmd] {
@@ -214,6 +214,14 @@ VcsCommand *VcsBaseClientImpl::createVcsCommand(const FilePath &defaultWorkingDi
return new VcsCommand(defaultWorkingDir, environment);
}
+VcsCommand *VcsBaseClientImpl::createVcsCommand(QObject *parent, const FilePath &defaultWorkingDir,
+ const Environment &environment)
+{
+ auto command = new VcsCommand(defaultWorkingDir, environment);
+ command->setParent(parent);
+ return command;
+}
+
VcsBaseEditorWidget *VcsBaseClientImpl::createVcsEditor(Id kind, QString title,
const FilePath &source, QTextCodec *codec,
const char *registerDynamicProperty,
diff --git a/src/plugins/vcsbase/vcsbaseclient.h b/src/plugins/vcsbase/vcsbaseclient.h
index 99b818b59b..6c07f74486 100644
--- a/src/plugins/vcsbase/vcsbaseclient.h
+++ b/src/plugins/vcsbase/vcsbaseclient.h
@@ -44,8 +44,11 @@ public:
virtual Utils::FilePath vcsBinary(const Utils::FilePath &forDirectory) const;
int vcsTimeoutS() const;
+ // TODO: For master: remove this overload.
static VcsCommand *createVcsCommand(const Utils::FilePath &defaultWorkingDir,
const Utils::Environment &environment);
+ static VcsCommand *createVcsCommand(QObject *parent, const Utils::FilePath &defaultWorkingDir,
+ const Utils::Environment &environment);
VcsBaseEditorWidget *createVcsEditor(Utils::Id kind, QString title,
const Utils::FilePath &source, QTextCodec *codec,
diff --git a/src/plugins/vcsbase/vcscommand.h b/src/plugins/vcsbase/vcscommand.h
index 6271139544..0556f25511 100644
--- a/src/plugins/vcsbase/vcscommand.h
+++ b/src/plugins/vcsbase/vcscommand.h
@@ -65,6 +65,7 @@ class VCSBASE_EXPORT VcsCommand final : public QObject
Q_OBJECT
public:
+ // TODO: For master, make c'tor private and make it a friend to VcsBaseClientImpl.
VcsCommand(const Utils::FilePath &workingDirectory, const Utils::Environment &environment);
~VcsCommand() override;
diff --git a/src/plugins/welcome/images/project.png b/src/plugins/welcome/images/project.png
index 30862beb28..522902a48f 100644
--- a/src/plugins/welcome/images/project.png
+++ b/src/plugins/welcome/images/project.png
Binary files differ
diff --git a/src/plugins/welcome/images/project@2x.png b/src/plugins/welcome/images/project@2x.png
index c5cc11155b..8be7cc7c87 100644
--- a/src/plugins/welcome/images/project@2x.png
+++ b/src/plugins/welcome/images/project@2x.png
Binary files differ
diff --git a/src/plugins/welcome/images/session.png b/src/plugins/welcome/images/session.png
index aa14f11de8..ae77dc51a8 100644
--- a/src/plugins/welcome/images/session.png
+++ b/src/plugins/welcome/images/session.png
Binary files differ
diff --git a/src/plugins/welcome/images/session@2x.png b/src/plugins/welcome/images/session@2x.png
index c53cf12bfa..5f0701b711 100644
--- a/src/plugins/welcome/images/session@2x.png
+++ b/src/plugins/welcome/images/session@2x.png
Binary files differ
diff --git a/src/shared/qbs b/src/shared/qbs
-Subproject 44d658cbf479a597ba22bb661c8ca68d7a98be6
+Subproject 5c88b6b11b762cf5861c9d1570df4f1f050c826
diff --git a/src/tools/icons/qtcreatoricons.svg b/src/tools/icons/qtcreatoricons.svg
index 9ced69d319..7d78434c75 100644
--- a/src/tools/icons/qtcreatoricons.svg
+++ b/src/tools/icons/qtcreatoricons.svg
@@ -7030,36 +7030,42 @@
style="fill:none;stroke:#000000;stroke-width:1.42;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
<g
- transform="translate(-209,274)"
+ transform="translate(-210,274)"
id="src/plugins/welcome/images/session">
<use
x="0"
y="0"
- xlink:href="#backgroundRect_24"
+ xlink:href="#backgroundRect"
id="use9"
- transform="translate(233,-210)" />
+ transform="translate(226,-226)"
+ width="100%"
+ height="100%" />
<path
id="path8101"
style="fill:none;stroke:#000000;stroke-width:2;stroke-linejoin:round"
- d="m 219,210 6,4 -6,4 z m -7,-5 h 18 v 18 h -18 z" />
+ d="m 216,215 5,3 -5,3 z m -4,-3 h 12 v 12 h -12 z"
+ sodipodi:nodetypes="ccccccccc" />
</g>
<g
- transform="translate(19,478)"
+ transform="translate(8,478)"
id="src/plugins/welcome/images/project">
<use
x="0"
y="0"
- xlink:href="#backgroundRect_24"
+ xlink:href="#backgroundRect"
id="use9-5"
- transform="translate(30,-414)" />
+ transform="translate(25,-430)"
+ width="100%"
+ height="100%" />
<path
- style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round"
- d="m 16,3 c 1,0 2,1 2,2 0,0 0,1 1,1 h 6 c 1,0 2,1 2,2 v 7 c 0,1 -1,2 -2,2 H 11 C 10,17 9,16 9,15 V 5 C 9,4 10,3 11,3 Z"
- id="path2761-3"
- sodipodi:nodetypes="cscccccccccc" />
+ d="m 13,9 h 2.5 c 1,0 1,2 2,2 H 21 c 1,0 2,1 2,2 v 4 c 0,1 -1,2 -2,2 h -8 c -1,0 -2,-1 -2,-2 v -6 c 0,-1 1,-2 2,-2 z"
+ stroke-width="2"
+ id="path4726"
+ sodipodi:nodetypes="sccssssssss"
+ style="fill:none;stroke:#000000;stroke-opacity:1" />
</g>
<g
- transform="translate(44,478)"
+ transform="translate(28,478)"
id="src/plugins/welcome/images/link">
<use
x="0"
@@ -7075,14 +7081,16 @@
d="m 22.5,5.5 -10,10 M 16,5 h 7 v 7" />
</g>
<g
- transform="translate(-81,276)"
+ transform="translate(-97,276)"
id="src/plugins/coreplugin/images/expandarrow">
<use
x="0"
y="0"
xlink:href="#backgroundRect"
id="use15-0"
- transform="translate(172,-228)" />
+ transform="translate(172,-228)"
+ width="100%"
+ height="100%" />
<path
style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
d="m 159,214.5 5,5 5,-5"
@@ -7090,14 +7098,16 @@
sodipodi:nodetypes="ccc" />
</g>
<g
- transform="translate(86,478)"
+ transform="translate(70,478)"
id="src/plugins/coreplugin/images/search">
<use
x="0"
y="0"
xlink:href="#backgroundRect"
id="use15"
- transform="translate(22,-430)" />
+ transform="translate(22,-430)"
+ width="100%"
+ height="100%" />
<path
id="path10"
style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round"