diff --git a/src/libs/utils/aspects.cpp b/src/libs/utils/aspects.cpp index a8d8f554403..427e9fc0cbc 100644 --- a/src/libs/utils/aspects.cpp +++ b/src/libs/utils/aspects.cpp @@ -77,7 +77,6 @@ public: QString m_labelText; QPixmap m_labelPixmap; QIcon m_icon; - QPointer m_label; // Owned by configuration widget QPointer m_action; // Owned by us. AspectContainer *m_container = nullptr; // Not owned by us. @@ -225,26 +224,33 @@ void BaseAspect::setVisible(bool visible) } } -void BaseAspect::setupLabel() +QLabel *BaseAspect::createLabel() { - QTC_ASSERT(!d->m_label, delete d->m_label); if (d->m_labelText.isEmpty() && d->m_labelPixmap.isNull()) - return; - d->m_label = new QLabel(d->m_labelText); - d->m_label->setTextInteractionFlags(d->m_label->textInteractionFlags() - | Qt::TextSelectableByMouse); - connect(d->m_label, &QLabel::linkActivated, this, [this](const QString &link) { + return nullptr; + + auto label = new QLabel(d->m_labelText); + label->setTextInteractionFlags(label->textInteractionFlags() | Qt::TextSelectableByMouse); + connect(label, &QLabel::linkActivated, this, [this](const QString &link) { emit labelLinkActivated(link); }); if (!d->m_labelPixmap.isNull()) - d->m_label->setPixmap(d->m_labelPixmap); - registerSubWidget(d->m_label); + label->setPixmap(d->m_labelPixmap); + registerSubWidget(label); + + connect(this, &BaseAspect::labelTextChanged, label, [label, this] { + label->setText(d->m_labelText); + }); + connect(this, &BaseAspect::labelPixmapChanged, label, [label, this] { + label->setPixmap(d->m_labelPixmap); + }); + + return label; } void BaseAspect::addLabeledItem(LayoutItem &parent, QWidget *widget) { - setupLabel(); - if (QLabel *l = label()) { + if (QLabel *l = createLabel()) { l->setBuddy(widget); parent.addItem(l); parent.addItem(Span(std::max(d->m_spanX - 1, 1), LayoutItem(widget))); @@ -260,8 +266,7 @@ void BaseAspect::addLabeledItem(LayoutItem &parent, QWidget *widget) void BaseAspect::setLabelText(const QString &labelText) { d->m_labelText = labelText; - if (d->m_label) - d->m_label->setText(labelText); + emit labelTextChanged(); } /*! @@ -271,8 +276,7 @@ void BaseAspect::setLabelText(const QString &labelText) void BaseAspect::setLabelPixmap(const QPixmap &labelPixmap) { d->m_labelPixmap = labelPixmap; - if (d->m_label) - d->m_label->setPixmap(labelPixmap); + emit labelPixmapChanged(); } void BaseAspect::setIcon(const QIcon &icon) @@ -291,11 +295,6 @@ QString BaseAspect::labelText() const return d->m_labelText; } -QLabel *BaseAspect::label() const -{ - return d->m_label.data(); -} - QString BaseAspect::toolTip() const { return d->m_tooltip; diff --git a/src/libs/utils/aspects.h b/src/libs/utils/aspects.h index c817ec34b48..9dd7e357c7c 100644 --- a/src/libs/utils/aspects.h +++ b/src/libs/utils/aspects.h @@ -207,6 +207,8 @@ signals: void labelLinkActivated(const QString &link); void checkedChanged(); void enabledChanged(); + void labelTextChanged(); + void labelPixmapChanged(); protected: virtual bool internalToBuffer(); @@ -216,8 +218,7 @@ protected: virtual void handleGuiChanged(); - QLabel *label() const; - void setupLabel(); + QLabel *createLabel(); void addLabeledItem(Layouting::LayoutItem &parent, QWidget *widget); void setDataCreatorHelper(const DataCreator &creator) const; diff --git a/src/plugins/projectexplorer/environmentaspect.h b/src/plugins/projectexplorer/environmentaspect.h index 6e36d7db63b..26dd43f6a41 100644 --- a/src/plugins/projectexplorer/environmentaspect.h +++ b/src/plugins/projectexplorer/environmentaspect.h @@ -62,8 +62,7 @@ public: Utils::Environment environment; }; - using Utils::BaseAspect::setupLabel; - using Utils::BaseAspect::label; + using Utils::BaseAspect::createLabel; signals: void baseEnvironmentChanged(); diff --git a/src/plugins/projectexplorer/environmentaspectwidget.cpp b/src/plugins/projectexplorer/environmentaspectwidget.cpp index c167cd4e52f..d47b4e82cc3 100644 --- a/src/plugins/projectexplorer/environmentaspectwidget.cpp +++ b/src/plugins/projectexplorer/environmentaspectwidget.cpp @@ -37,8 +37,7 @@ EnvironmentAspectWidget::EnvironmentAspectWidget(EnvironmentAspect *aspect) auto label = [aspect]() { if (aspect->labelText().isEmpty()) aspect->setLabelText(Tr::tr("Base environment for this run configuration:")); - aspect->setupLabel(); - return aspect->label(); + return aspect->createLabel(); }; m_baseLayout->addWidget(label());