diff --git a/lib/utils/list-editor.cpp b/lib/utils/list-editor.cpp index e4a459e0..cb7b1353 100644 --- a/lib/utils/list-editor.cpp +++ b/lib/utils/list-editor.cpp @@ -1,13 +1,16 @@ #include "list-editor.hpp" #include "ui-helpers.hpp" +#include + namespace advss { ListEditor::ListEditor(QWidget *parent, bool reorder) : QWidget(parent), _list(new QListWidget()), _controls(new ListControls(this, reorder)), - _mainLayout(new QVBoxLayout()) + _mainLayout(new QVBoxLayout()), + _placeholder(new QLabel(_list->viewport())) { QWidget::connect(_controls, SIGNAL(Add()), this, SLOT(Add())); QWidget::connect(_controls, SIGNAL(Remove()), this, SLOT(Remove())); @@ -15,6 +18,19 @@ ListEditor::ListEditor(QWidget *parent, bool reorder) QWidget::connect(_controls, SIGNAL(Down()), this, SLOT(Down())); QWidget::connect(_list, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT(Clicked(QListWidgetItem *))); + QWidget::connect(_list->model(), + SIGNAL(rowsInserted(QModelIndex, int, int)), this, + SLOT(UpdatePlaceholder())); + QWidget::connect(_list->model(), + SIGNAL(rowsRemoved(QModelIndex, int, int)), this, + SLOT(UpdatePlaceholder())); + QWidget::connect(_list->model(), SIGNAL(modelReset()), this, + SLOT(UpdatePlaceholder())); + + _placeholder->setAlignment(Qt::AlignCenter); + _placeholder->setWordWrap(true); + _placeholder->hide(); + _list->viewport()->installEventFilter(this); _mainLayout->setContentsMargins(0, 0, 0, 0); _mainLayout->addWidget(_list); @@ -22,6 +38,30 @@ ListEditor::ListEditor(QWidget *parent, bool reorder) setLayout(_mainLayout); } +void ListEditor::SetPlaceholderText(const QString &text) +{ + _placeholder->setText(text); + UpdatePlaceholder(); +} + +void ListEditor::UpdatePlaceholder() +{ + bool visible = !_placeholder->text().isEmpty() && _list->count() == 0; + _placeholder->setVisible(visible); + if (visible) { + _placeholder->setGeometry(_list->viewport()->rect()); + } +} + +bool ListEditor::eventFilter(QObject *obj, QEvent *event) +{ + if (obj == _list->viewport() && event->type() == QEvent::Resize && + _placeholder->isVisible()) { + _placeholder->setGeometry(_list->viewport()->rect()); + } + return QWidget::eventFilter(obj, event); +} + void ListEditor::showEvent(QShowEvent *e) { QWidget::showEvent(e); @@ -64,6 +104,11 @@ int ListEditor::GetIndexOfSignal() const void ListEditor::UpdateListSize() { SetHeightToContentHeight(_list); + if (_list->count() == 0 && !_placeholder->text().isEmpty()) { + auto height = _list->fontMetrics().height() * 3; + _list->setMinimumHeight(height); + _list->setMaximumHeight(height); + } adjustSize(); updateGeometry(); } diff --git a/lib/utils/list-editor.hpp b/lib/utils/list-editor.hpp index 7bf9a507..49b87e9f 100644 --- a/lib/utils/list-editor.hpp +++ b/lib/utils/list-editor.hpp @@ -2,6 +2,7 @@ #include "export-symbol-helper.hpp" #include "list-controls.hpp" +#include #include #include @@ -13,9 +14,11 @@ class ADVSS_EXPORT ListEditor : public QWidget { public: ListEditor(QWidget *parent = nullptr, bool reorder = true); int count() const { return _list->count(); }; + void SetPlaceholderText(const QString &text); protected: void showEvent(QShowEvent *); + bool eventFilter(QObject *, QEvent *); private slots: virtual void Add() = 0; @@ -23,6 +26,7 @@ private slots: virtual void Up(){}; virtual void Down(){}; virtual void Clicked(QListWidgetItem *) {} + void UpdatePlaceholder(); protected: void UpdateListSize(); @@ -31,6 +35,9 @@ protected: QListWidget *_list; ListControls *_controls; QVBoxLayout *_mainLayout; + +private: + QLabel *_placeholder; }; } // namespace advss