forked from qt-creator/qt-creator
Environment: Wrap path lists at separator for tooltips
Therefore move the list detection code to the model. Reason: The HTML wrapping mechanism used before created hard to read tooltips like: /opt/Qt/5.15.2/gcc_64/bin:/ usr/bin:/home/user/bin:/ usr/local/sbin:/usr/local/ bin:/usr/sbin:/usr/bin:/sbin:/ bin:/usr/games:/usr/local/ games:/snap/bin which changes to the list below now: /opt/Qt/5.15.2/gcc_64/bin /usr/bin /home/user/bin /usr/local/sbin /usr/local/bin ... Task-number: QTCREATORBUG-7993 Change-Id: I08acc2cad0d12cb4309ee50d837c50dc9ccba2d9 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
committed by
André Hartmann
parent
6ceb2244d8
commit
e31af51958
@@ -167,11 +167,17 @@ QVariant NameValueModel::data(const QModelIndex &index, int role) const
|
|||||||
}
|
}
|
||||||
QString value = d->m_resultNameValueDictionary.value(resultIterator);
|
QString value = d->m_resultNameValueDictionary.value(resultIterator);
|
||||||
if (role == Qt::ToolTipRole && value.length() > 80) {
|
if (role == Qt::ToolTipRole && value.length() > 80) {
|
||||||
|
if (currentEntryIsPathList(index)) {
|
||||||
|
// For path lists, display one entry per line without separator
|
||||||
|
const QChar sep = Utils::HostOsInfo::pathListSeparator();
|
||||||
|
value = value.replace(sep, '\n');
|
||||||
|
} else {
|
||||||
// Use html to enable text wrapping
|
// Use html to enable text wrapping
|
||||||
value = value.toHtmlEscaped();
|
value = value.toHtmlEscaped();
|
||||||
value.prepend(QLatin1String("<html><body>"));
|
value.prepend(QLatin1String("<html><body>"));
|
||||||
value.append(QLatin1String("</body></html>"));
|
value.append(QLatin1String("</body></html>"));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -437,4 +443,36 @@ void NameValueModel::setUserChanges(const NameValueItems &items)
|
|||||||
emit userChangesChanged();
|
emit userChangesChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool NameValueModel::currentEntryIsPathList(const QModelIndex ¤t) const
|
||||||
|
{
|
||||||
|
if (!current.isValid())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Look at the name first and check it against some well-known path variables. Extend as needed.
|
||||||
|
const QString varName = indexToVariable(current);
|
||||||
|
if (varName.compare("PATH", Utils::HostOsInfo::fileNameCaseSensitivity()) == 0)
|
||||||
|
return true;
|
||||||
|
if (Utils::HostOsInfo::isMacHost() && varName == "DYLD_LIBRARY_PATH")
|
||||||
|
return true;
|
||||||
|
if (Utils::HostOsInfo::isAnyUnixHost() && varName == "LD_LIBRARY_PATH")
|
||||||
|
return true;
|
||||||
|
if (varName == "PKG_CONFIG_DIR")
|
||||||
|
return true;
|
||||||
|
if (Utils::HostOsInfo::isWindowsHost()
|
||||||
|
&& QStringList{"INCLUDE", "LIB", "LIBPATH"}.contains(varName)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now check the value: If it's a list of strings separated by the platform's path separator
|
||||||
|
// and at least one of the strings is an existing directory, then that's enough proof for us.
|
||||||
|
QModelIndex valueIndex = current;
|
||||||
|
if (valueIndex.column() == 0)
|
||||||
|
valueIndex = valueIndex.siblingAtColumn(1);
|
||||||
|
const QStringList entries = data(valueIndex).toString()
|
||||||
|
.split(Utils::HostOsInfo::pathListSeparator(), Qt::SkipEmptyParts);
|
||||||
|
if (entries.length() < 2)
|
||||||
|
return false;
|
||||||
|
return Utils::anyOf(entries, [](const QString &d) { return QFileInfo(d).isDir(); });
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Utils
|
} // namespace Utils
|
||||||
|
@@ -70,6 +70,7 @@ public:
|
|||||||
void setBaseNameValueDictionary(const NameValueDictionary &dictionary);
|
void setBaseNameValueDictionary(const NameValueDictionary &dictionary);
|
||||||
NameValueItems userChanges() const;
|
NameValueItems userChanges() const;
|
||||||
void setUserChanges(const NameValueItems &items);
|
void setUserChanges(const NameValueItems &items);
|
||||||
|
bool currentEntryIsPathList(const QModelIndex ¤t) const;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void userChangesChanged();
|
void userChangesChanged();
|
||||||
|
@@ -437,38 +437,6 @@ void EnvironmentWidget::linkActivated(const QString &link)
|
|||||||
focusIndex(idx);
|
focusIndex(idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EnvironmentWidget::currentEntryIsPathList(const QModelIndex ¤t) const
|
|
||||||
{
|
|
||||||
if (!current.isValid())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Look at the name first and check it against some well-known path variables. Extend as needed.
|
|
||||||
const QString varName = d->m_model->indexToVariable(current);
|
|
||||||
if (varName.compare("PATH", Utils::HostOsInfo::fileNameCaseSensitivity()) == 0)
|
|
||||||
return true;
|
|
||||||
if (Utils::HostOsInfo::isMacHost() && varName == "DYLD_LIBRARY_PATH")
|
|
||||||
return true;
|
|
||||||
if (Utils::HostOsInfo::isAnyUnixHost() && varName == "LD_LIBRARY_PATH")
|
|
||||||
return true;
|
|
||||||
if (varName == "PKG_CONFIG_DIR")
|
|
||||||
return true;
|
|
||||||
if (Utils::HostOsInfo::isWindowsHost()
|
|
||||||
&& QStringList{"INCLUDE", "LIB", "LIBPATH"}.contains(varName)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now check the value: If it's a list of strings separated by the platform's path separator
|
|
||||||
// and at least one of the strings is an existing directory, then that's enough proof for us.
|
|
||||||
QModelIndex valueIndex = current;
|
|
||||||
if (valueIndex.column() == 0)
|
|
||||||
valueIndex = valueIndex.siblingAtColumn(1);
|
|
||||||
const QStringList entries = d->m_model->data(valueIndex).toString()
|
|
||||||
.split(Utils::HostOsInfo::pathListSeparator(), Qt::SkipEmptyParts);
|
|
||||||
if (entries.length() < 2)
|
|
||||||
return false;
|
|
||||||
return Utils::anyOf(entries, [](const QString &d) { return QFileInfo(d).isDir(); });
|
|
||||||
}
|
|
||||||
|
|
||||||
void EnvironmentWidget::updateButtons()
|
void EnvironmentWidget::updateButtons()
|
||||||
{
|
{
|
||||||
environmentCurrentIndexChanged(d->m_environmentView->currentIndex());
|
environmentCurrentIndexChanged(d->m_environmentView->currentIndex());
|
||||||
@@ -477,7 +445,9 @@ void EnvironmentWidget::updateButtons()
|
|||||||
void EnvironmentWidget::editEnvironmentButtonClicked()
|
void EnvironmentWidget::editEnvironmentButtonClicked()
|
||||||
{
|
{
|
||||||
const QModelIndex current = d->m_environmentView->currentIndex();
|
const QModelIndex current = d->m_environmentView->currentIndex();
|
||||||
if (current.column() == 1 && d->m_type == TypeLocal && currentEntryIsPathList(current)) {
|
if (current.column() == 1
|
||||||
|
&& d->m_type == TypeLocal
|
||||||
|
&& d->m_model->currentEntryIsPathList(current)) {
|
||||||
PathListDialog dlg(d->m_model->indexToVariable(current),
|
PathListDialog dlg(d->m_model->indexToVariable(current),
|
||||||
d->m_model->data(current).toString(), this);
|
d->m_model->data(current).toString(), this);
|
||||||
if (dlg.exec() == QDialog::Accepted)
|
if (dlg.exec() == QDialog::Accepted)
|
||||||
@@ -562,8 +532,9 @@ void EnvironmentWidget::environmentCurrentIndexChanged(const QModelIndex ¤
|
|||||||
d->m_toggleButton->setText(tr("Disable"));
|
d->m_toggleButton->setText(tr("Disable"));
|
||||||
}
|
}
|
||||||
if (d->m_appendPathButton) {
|
if (d->m_appendPathButton) {
|
||||||
d->m_appendPathButton->setEnabled(currentEntryIsPathList(current));
|
const bool isPathList = d->m_model->currentEntryIsPathList(current);
|
||||||
d->m_prependPathButton->setEnabled(currentEntryIsPathList(current));
|
d->m_appendPathButton->setEnabled(isPathList);
|
||||||
|
d->m_prependPathButton->setEnabled(isPathList);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -80,7 +80,6 @@ private:
|
|||||||
void focusIndex(const QModelIndex &index);
|
void focusIndex(const QModelIndex &index);
|
||||||
void updateButtons();
|
void updateButtons();
|
||||||
void linkActivated(const QString &link);
|
void linkActivated(const QString &link);
|
||||||
bool currentEntryIsPathList(const QModelIndex ¤t) const;
|
|
||||||
|
|
||||||
using PathListModifier = std::function<QString(const QString &oldList, const QString &newDir)>;
|
using PathListModifier = std::function<QString(const QString &oldList, const QString &newDir)>;
|
||||||
void amendPathList(Utils::NameValueItem::Operation op);
|
void amendPathList(Utils::NameValueItem::Operation op);
|
||||||
|
Reference in New Issue
Block a user