1/*
2 This file is part of the KDE libraries
3 SPDX-FileCopyrightText: 2004 Felix Berger <felixberger@beldesign.de>
4
5 SPDX-License-Identifier: LGPL-2.0-only
6*/
7
8#include "ktoolbarlabelaction.h"
9
10#include <QApplication>
11#include <QLabel>
12#include <QPointer>
13#include <QToolBar>
14
15class KToolBarLabelActionPrivate
16{
17public:
18 QPointer<QAction> buddy;
19 QPointer<QLabel> label;
20};
21
22KToolBarLabelAction::KToolBarLabelAction(const QString &text, QObject *parent)
23 : QWidgetAction(parent)
24 , d(new KToolBarLabelActionPrivate)
25{
26 setText(text);
27 d->label = nullptr;
28}
29
30KToolBarLabelAction::KToolBarLabelAction(QAction *buddy, const QString &text, QObject *parent)
31 : QWidgetAction(parent)
32 , d(new KToolBarLabelActionPrivate)
33{
34 setBuddy(buddy);
35 setText(text);
36
37 d->label = nullptr;
38}
39
40KToolBarLabelAction::~KToolBarLabelAction() = default;
41
42void KToolBarLabelAction::setBuddy(QAction *buddy)
43{
44 d->buddy = buddy;
45
46 QList<QLabel *> labels;
47 const auto associatedWidgets = this->associatedObjects();
48 for (auto *widget : associatedWidgets) {
49 if (QToolBar *toolBar = qobject_cast<QToolBar *>(object: widget)) {
50 if (QLabel *label = qobject_cast<QLabel *>(object: toolBar->widgetForAction(action: this))) {
51 labels.append(t: label);
52 }
53 }
54 }
55 const auto buddysAssociatedWidgets = buddy->associatedObjects();
56 for (auto *widget : buddysAssociatedWidgets) {
57 if (QToolBar *toolBar = qobject_cast<QToolBar *>(object: widget)) {
58 QWidget *newBuddy = toolBar->widgetForAction(action: buddy);
59 for (QLabel *label : std::as_const(t&: labels)) {
60 label->setBuddy(newBuddy);
61 }
62 return;
63 }
64 }
65}
66
67QAction *KToolBarLabelAction::buddy() const
68{
69 return d->buddy;
70}
71
72bool KToolBarLabelAction::event(QEvent *event)
73{
74 if (event->type() == QEvent::ActionChanged) {
75 if (d->label && text() != d->label->text()) {
76 Q_EMIT textChanged(newText: text());
77 d->label->setText(text());
78 }
79 }
80
81 return QWidgetAction::event(event);
82}
83
84bool KToolBarLabelAction::eventFilter(QObject *watched, QEvent *event)
85{
86 if (d->label && d->buddy && event->type() == QEvent::PolishRequest && watched == d->label) {
87 const auto buddysAssociatedWidgets = d->buddy->associatedObjects();
88 for (auto *widget : buddysAssociatedWidgets) {
89 if (QToolBar *toolBar = qobject_cast<QToolBar *>(object: widget)) {
90 QWidget *newBuddy = toolBar->widgetForAction(action: d->buddy);
91 d->label->setBuddy(newBuddy);
92 }
93 }
94 }
95
96 return QWidgetAction::eventFilter(watched, event);
97}
98
99QWidget *KToolBarLabelAction::createWidget(QWidget *_parent)
100{
101 QToolBar *parent = qobject_cast<QToolBar *>(object: _parent);
102 if (!parent) {
103 return QWidgetAction::createWidget(parent: _parent);
104 }
105 if (!d->label) {
106 d->label = new QLabel(parent);
107
108 // These lines were copied from Konqueror's KonqDraggableLabel class in
109 // konq_misc.cc
110 d->label->setBackgroundRole(QPalette::Button);
111 d->label->setAlignment((QApplication::isRightToLeft() ? Qt::AlignRight : Qt::AlignLeft) | Qt::AlignVCenter);
112 d->label->adjustSize();
113 d->label->setText(text());
114 d->label->installEventFilter(filterObj: this);
115 }
116
117 return d->label;
118}
119
120#include "moc_ktoolbarlabelaction.cpp"
121

source code of kwidgetsaddons/src/ktoolbarlabelaction.cpp