ExtensionManager: Show a placeholder text for empty extension browser

If the extension list is empty, e.g. because of search text or filter
chooser, a place holder text is now shown.

It is in the same stack widget as the listview. The stack index is set
accordingly.

Fixes: QTCREATORBUG-31584
Change-Id: I4dedbe5914301e5d37fc3f93ed1ed5affaf96d6d
Reviewed-by: Marcus Tillmanns <marcus.tillmanns@qt.io>
This commit is contained in:
Alessandro Portale
2024-10-10 19:53:29 +02:00
parent 18dffbd7bf
commit 72cbd80ceb

View File

@@ -518,6 +518,25 @@ public:
SpinnerSolution::Spinner *m_spinner; SpinnerSolution::Spinner *m_spinner;
}; };
static QWidget *extensionViewPlaceHolder()
{
static const TextFormat tF {Theme::Token_Text_Muted, UiElementH4};
auto text = tfLabel(tF, false);
text->setAlignment(Qt::AlignCenter);
text->setText(Tr::tr("No extension found!"));
text->setWordWrap(true);
using namespace Layouting;
// clang-format off
return Column {
Space(SpacingTokens::ExVPaddingGapXl),
text,
st,
noMargin,
}.emerge();
// clang-format on
}
ExtensionsBrowser::ExtensionsBrowser(ExtensionsModel *model, QWidget *parent) ExtensionsBrowser::ExtensionsBrowser(ExtensionsModel *model, QWidget *parent)
: QWidget(parent) : QWidget(parent)
, d(new ExtensionsBrowserPrivate) , d(new ExtensionsBrowserPrivate)
@@ -566,6 +585,8 @@ ExtensionsBrowser::ExtensionsBrowser(ExtensionsModel *model, QWidget *parent)
d->extensionsView->setModel(d->sortFilterProxyModel); d->extensionsView->setModel(d->sortFilterProxyModel);
d->extensionsView->setMouseTracking(true); d->extensionsView->setMouseTracking(true);
QStackedWidget *extensionViewStack;
using namespace Layouting; using namespace Layouting;
Column { Column {
Column { Column {
@@ -585,7 +606,14 @@ ExtensionsBrowser::ExtensionsBrowser(ExtensionsModel *model, QWidget *parent)
spacing(HGapS), spacing(HGapS),
customMargins(0, 0, extraListViewWidth() + gapSize, 0), customMargins(0, 0, extraListViewWidth() + gapSize, 0),
}, },
d->extensionsView, Stack {
bindTo(&extensionViewStack),
d->extensionsView,
Row {
extensionViewPlaceHolder(),
customMargins(0, 0, extraListViewWidth() + gapSize, 0),
},
},
noMargin, spacing(0), noMargin, spacing(0),
}.attachTo(this); }.attachTo(this);
@@ -609,6 +637,10 @@ ExtensionsBrowser::ExtensionsBrowser(ExtensionsModel *model, QWidget *parent)
} }
}; };
auto updatePlaceHolderVisibility = [this, extensionViewStack] {
extensionViewStack->setCurrentIndex(d->sortFilterProxyModel->rowCount() == 0 ? 1 : 0);
};
connect(PluginManager::instance(), &PluginManager::pluginsChanged, this, updateModel); connect(PluginManager::instance(), &PluginManager::pluginsChanged, this, updateModel);
connect(d->searchBox, &QLineEdit::textChanged, connect(d->searchBox, &QLineEdit::textChanged,
d->searchProxyModel, &QSortFilterProxyModel::setFilterWildcard); d->searchProxyModel, &QSortFilterProxyModel::setFilterWildcard);
@@ -616,6 +648,10 @@ ExtensionsBrowser::ExtensionsBrowser(ExtensionsModel *model, QWidget *parent)
d->sortFilterProxyModel, &SortFilterProxyModel::setSortOption); d->sortFilterProxyModel, &SortFilterProxyModel::setSortOption);
connect(d->filterChooser, &OptionChooser::currentIndexChanged, connect(d->filterChooser, &OptionChooser::currentIndexChanged,
d->sortFilterProxyModel, &SortFilterProxyModel::setFilterOption); d->sortFilterProxyModel, &SortFilterProxyModel::setFilterOption);
connect(d->sortFilterProxyModel, &SortFilterProxyModel::rowsRemoved,
this, updatePlaceHolderVisibility);
connect(d->sortFilterProxyModel, &SortFilterProxyModel::rowsInserted,
this, updatePlaceHolderVisibility);
connect(settingsToolButton, &QAbstractButton::clicked, this, []() { connect(settingsToolButton, &QAbstractButton::clicked, this, []() {
ICore::showOptionsDialog(Constants::EXTENSIONMANAGER_SETTINGSPAGE_ID); ICore::showOptionsDialog(Constants::EXTENSIONMANAGER_SETTINGSPAGE_ID);
}); });