From 2f6f9d2d33aa1ecac6f527282e29641368a86e6c Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Mon, 3 Jul 2023 14:33:21 +0300 Subject: [PATCH] Terminal: Add icons to tabs Change-Id: Id219366de16944daf83c3eb154d6b087c79b7fd9 Reviewed-by: Marcus Tillmanns --- src/libs/utils/terminalhooks.h | 3 +++ src/plugins/terminal/shellmodel.cpp | 31 +++++++++++++++------------ src/plugins/terminal/shellmodel.h | 1 - src/plugins/terminal/terminalpane.cpp | 16 ++++++++++++-- 4 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/libs/utils/terminalhooks.h b/src/libs/utils/terminalhooks.h index dbc42dea511..02e37e84972 100644 --- a/src/libs/utils/terminalhooks.h +++ b/src/libs/utils/terminalhooks.h @@ -8,6 +8,8 @@ #include "filepath.h" #include "id.h" +#include + #include #include @@ -58,6 +60,7 @@ struct OpenTerminalParameters std::optional shellCommand; std::optional workingDirectory; std::optional environment; + QIcon icon; ExitBehavior m_exitBehavior{ExitBehavior::Close}; std::optional identifier{std::nullopt}; }; diff --git a/src/plugins/terminal/shellmodel.cpp b/src/plugins/terminal/shellmodel.cpp index d5caa415dd3..0cc58f1fe6c 100644 --- a/src/plugins/terminal/shellmodel.cpp +++ b/src/plugins/terminal/shellmodel.cpp @@ -16,11 +16,13 @@ using namespace Utils; struct ShellItemBuilder { - explicit ShellItemBuilder(const CommandLine &value) + explicit ShellItemBuilder(const QFileIconProvider &iconProvider, const CommandLine &value) : + iconProvider(iconProvider) { m_item.openParameters.shellCommand = value; } - explicit ShellItemBuilder(const FilePath &value) + explicit ShellItemBuilder(const QFileIconProvider &iconProvider, const FilePath &value) : + iconProvider(iconProvider) { m_item.openParameters.shellCommand = CommandLine(value); } @@ -31,8 +33,7 @@ struct ShellItemBuilder } ShellItemBuilder &icon(const FilePath &value) { - static QFileIconProvider iconProvider; - m_item.icon = iconProvider.icon(value.toFileInfo()); + m_item.openParameters.icon = iconProvider.icon(value.toFileInfo()); return *this; } @@ -41,13 +42,14 @@ struct ShellItemBuilder { if (m_item.name.isEmpty()) m_item.name = m_item.openParameters.shellCommand->executable().toUserOutput(); - if (m_item.icon.isNull()) + if (m_item.openParameters.icon.isNull()) icon(m_item.openParameters.shellCommand->executable()); return m_item; } private: ShellModelItem m_item; + const QFileIconProvider &iconProvider; }; static QSet msysPaths() @@ -74,31 +76,32 @@ struct ShellModelPrivate ShellModelPrivate::ShellModelPrivate() { + QFileIconProvider iconProvider; if (Utils::HostOsInfo::isWindowsHost()) { const FilePath comspec = FilePath::fromUserInput(qtcEnvironmentVariable("COMSPEC")); - localShells << ShellItemBuilder(comspec); + localShells << ShellItemBuilder(iconProvider, comspec); if (comspec.fileName() != "cmd.exe") { FilePath cmd = FilePath::fromUserInput(QStandardPaths::findExecutable("cmd.exe")); - localShells << ShellItemBuilder(cmd); + localShells << ShellItemBuilder(iconProvider, cmd); } const FilePath powershell = FilePath::fromUserInput( QStandardPaths::findExecutable("powershell.exe")); if (powershell.exists()) - localShells << ShellItemBuilder(powershell); + localShells << ShellItemBuilder(iconProvider, powershell); const FilePath sys_bash = FilePath::fromUserInput(QStandardPaths::findExecutable("bash.exe")); if (sys_bash.exists()) - localShells << ShellItemBuilder({sys_bash, {"--login"}}); + localShells << ShellItemBuilder(iconProvider, {sys_bash, {"--login"}}); const FilePath git_exe = FilePath::fromUserInput(QStandardPaths::findExecutable("git.exe")); if (git_exe.exists()) { FilePath git_bash = git_exe.parentDir().parentDir().pathAppended("bin/bash.exe"); if (git_bash.exists()) { - localShells << ShellItemBuilder({git_bash, {"--login"}}) + localShells << ShellItemBuilder(iconProvider, {git_bash, {"--login"}}) .icon(git_bash.parentDir().parentDir().pathAppended("git-bash.exe")); } } @@ -111,7 +114,7 @@ ShellModelPrivate::ShellModelPrivate() QDirIterator it(type.path().replace(".ico", "/bin"), QDir::Files); if (!it.hasNext()) continue; - localShells << ShellItemBuilder( + localShells << ShellItemBuilder(iconProvider, {msys2_cmd, msys2_args + QStringList{"-" + type.baseName()}}) .icon(type) .name(type.toUserOutput().replace(".ico", ".exe")); @@ -137,8 +140,8 @@ ShellModelPrivate::ShellModelPrivate() // ... and filter out non-existing shells. localShells = Utils::transform( Utils::filtered(shells, [](const FilePath &shell) {return shell.exists(); }), - [](const FilePath &shell) { - return ShellItemBuilder(shell).item(); + [&iconProvider](const FilePath &shell) { + return ShellItemBuilder(iconProvider, shell).item(); }); } } @@ -162,7 +165,7 @@ QList ShellModel::remote() const const QList deviceItems = Utils::transform( deviceCmds, [](const Utils::Terminal::NameAndCommandLine &item) -> ShellModelItem { - return ShellModelItem{item.name, {}, {item.commandLine}}; + return ShellModelItem{item.name, {item.commandLine}}; }); return deviceItems; diff --git a/src/plugins/terminal/shellmodel.h b/src/plugins/terminal/shellmodel.h index 272f3fcd394..8b1b1c8e656 100644 --- a/src/plugins/terminal/shellmodel.h +++ b/src/plugins/terminal/shellmodel.h @@ -17,7 +17,6 @@ struct ShellModelPrivate; struct ShellModelItem { QString name; - QIcon icon; Utils::Terminal::OpenTerminalParameters openParameters; }; diff --git a/src/plugins/terminal/terminalpane.cpp b/src/plugins/terminal/terminalpane.cpp index 196a9acd3da..279786cac85 100644 --- a/src/plugins/terminal/terminalpane.cpp +++ b/src/plugins/terminal/terminalpane.cpp @@ -25,6 +25,7 @@ #include #include +#include #include #include #include @@ -134,7 +135,18 @@ void TerminalPane::openTerminal(const OpenTerminalParameters ¶meters) terminalWidget->unlockGlobalAction(NEXTTERMINAL); terminalWidget->unlockGlobalAction(PREVTERMINAL); - m_tabWidget.setCurrentIndex(m_tabWidget.addTab(terminalWidget, Tr::tr("Terminal"))); + QIcon icon; + if (HostOsInfo::isWindowsHost()) { + icon = parametersCopy.icon; + if (icon.isNull()) { + QFileIconProvider iconProvider; + const FilePath command = parametersCopy.shellCommand + ? parametersCopy.shellCommand->executable() + : TerminalSettings::instance().shell.filePath(); + icon = iconProvider.icon(command.toFileInfo()); + } + } + m_tabWidget.setCurrentIndex(m_tabWidget.addTab(terminalWidget, icon, Tr::tr("Terminal"))); setupTerminalWidget(terminalWidget); if (!m_isVisible) @@ -306,7 +318,7 @@ void TerminalPane::createShellMenu() const auto addItems = [this](const QList &items) { for (const Internal::ShellModelItem &item : items) { - QAction *action = new QAction(item.icon, item.name, &m_shellMenu); + QAction *action = new QAction(item.openParameters.icon, item.name, &m_shellMenu); connect(action, &QAction::triggered, action, [item, this]() { openTerminal(item.openParameters);