Fix availability of "Link with Qt" info bar

The info bar should never appear if the button is disabled,
for example because the Qt Creator directory is not accessible.

Fixes: QTCREATORBUG-23900
Change-Id: I819c87f5ca51f69f34bd462fca8e877be3544100
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Eike Ziller
2020-05-11 15:54:30 +02:00
parent 567b61eee5
commit 53cf4aa3c5
3 changed files with 33 additions and 8 deletions

View File

@@ -823,28 +823,41 @@ static QString linkingPurposeText()
"Linking with a Qt installation automatically registers Qt versions and kits."); "Linking with a Qt installation automatically registers Qt versions and kits.");
} }
void QtOptionsPageWidget::setupLinkWithQtButton() static bool canLinkWithQt(QString *toolTip)
{ {
bool canLink = true;
bool installSettingsExist; bool installSettingsExist;
const Utils::optional<QString> installSettingsValue = currentlyLinkedQtDir( const Utils::optional<QString> installSettingsValue = currentlyLinkedQtDir(
&installSettingsExist); &installSettingsExist);
QStringList tip; QStringList tip;
tip << linkingPurposeText(); tip << linkingPurposeText();
if (!FilePath::fromString(Core::ICore::resourcePath()).isWritablePath()) { if (!FilePath::fromString(Core::ICore::resourcePath()).isWritablePath()) {
m_ui.linkWithQtButton->setEnabled(false); canLink = false;
tip << tr("%1's resource directory is not writable.").arg(Core::Constants::IDE_DISPLAY_NAME); tip << QtOptionsPageWidget::tr("%1's resource directory is not writable.")
.arg(Core::Constants::IDE_DISPLAY_NAME);
} }
// guard against redirecting Qt Creator that is part of a Qt installations // guard against redirecting Qt Creator that is part of a Qt installations
// TODO this fails for pre-releases in the online installer // TODO this fails for pre-releases in the online installer
// TODO this will fail when make Qt Creator non-required in the Qt installers // TODO this will fail when make Qt Creator non-required in the Qt installers
if (installSettingsExist && !installSettingsValue) { if (installSettingsExist && !installSettingsValue) {
m_ui.linkWithQtButton->setEnabled(false); canLink = false;
tip << tr("%1 is part of a Qt installation.").arg(Core::Constants::IDE_DISPLAY_NAME); tip << QtOptionsPageWidget::tr("%1 is part of a Qt installation.")
.arg(Core::Constants::IDE_DISPLAY_NAME);
} }
const QString link = installSettingsValue ? *installSettingsValue : QString(); const QString link = installSettingsValue ? *installSettingsValue : QString();
if (!link.isEmpty()) if (!link.isEmpty())
tip << tr("%1 is currently linked to \"%2\".").arg(Core::Constants::IDE_DISPLAY_NAME, link); tip << QtOptionsPageWidget::tr("%1 is currently linked to \"%2\".")
m_ui.linkWithQtButton->setToolTip(tip.join("\n\n")); .arg(Core::Constants::IDE_DISPLAY_NAME, link);
if (toolTip)
*toolTip = tip.join("\n\n");
return canLink;
}
void QtOptionsPageWidget::setupLinkWithQtButton()
{
QString tip;
canLinkWithQt(&tip);
m_ui.linkWithQtButton->setToolTip(tip);
connect(m_ui.linkWithQtButton, &QPushButton::clicked, this, &QtOptionsPage::linkWithQt); connect(m_ui.linkWithQtButton, &QPushButton::clicked, this, &QtOptionsPage::linkWithQt);
} }
@@ -1018,6 +1031,16 @@ QtOptionsPage::QtOptionsPage()
setWidgetCreator([] { return new QtOptionsPageWidget; }); setWidgetCreator([] { return new QtOptionsPageWidget; });
} }
bool QtOptionsPage::canLinkWithQt()
{
return Internal::canLinkWithQt(nullptr);
}
bool QtOptionsPage::isLinkedWithQt()
{
return currentlyLinkedQtDir(nullptr).has_value();
}
void QtOptionsPage::linkWithQt() void QtOptionsPage::linkWithQt()
{ {
QtOptionsPageWidget::linkWithQt(); QtOptionsPageWidget::linkWithQt();

View File

@@ -35,6 +35,8 @@ class QtOptionsPage final : public Core::IOptionsPage
public: public:
QtOptionsPage(); QtOptionsPage();
static bool canLinkWithQt();
static bool isLinkedWithQt();
static void linkWithQt(); static void linkWithQt();
}; };

View File

@@ -122,7 +122,7 @@ static void askAboutQtInstallation()
{ {
// if the install settings exist, the Qt Creator installation is (probably) already linked to // if the install settings exist, the Qt Creator installation is (probably) already linked to
// a Qt installation, so don't ask // a Qt installation, so don't ask
if (QFile::exists(ICore::settings(QSettings::SystemScope)->fileName()) if (!QtOptionsPage::canLinkWithQt() || QtOptionsPage::isLinkedWithQt()
|| !ICore::infoBar()->canInfoBeAdded(kLinkWithQtInstallationSetting)) || !ICore::infoBar()->canInfoBeAdded(kLinkWithQtInstallationSetting))
return; return;