Qt Utilities  6.0.2
Common Qt related C++ classes and routines used by my applications such as dialogs, widgets and models
buttonoverlay.cpp
Go to the documentation of this file.
1 #include "./buttonoverlay.h"
2 #include "./iconbutton.h"
3 
4 #include <QCursor>
5 #include <QHBoxLayout>
6 #include <QStyle>
7 #include <QStyleOption>
8 #include <QToolTip>
9 #include <QWidget>
10 
11 #include <functional>
12 
13 namespace QtUtilities {
14 
34  : m_widget(widget)
35  , m_buttonWidget(new QWidget(widget))
36  , m_buttonLayout(new QHBoxLayout(m_buttonWidget))
37  , m_clearButton(nullptr)
38  , m_infoButton(nullptr)
39 {
40  // setup button widget and layout
41  const QMargins margins = widget->contentsMargins();
42  QStyleOption opt;
43  opt.initFrom(m_widget);
44  const int frameWidth = widget->style()->pixelMetric(QStyle::PM_DefaultFrameWidth, &opt, m_widget);
45  const int pad = 2;
46  m_buttonLayout->setContentsMargins(
47  margins.left() + frameWidth + pad, margins.top() + frameWidth, margins.right() + frameWidth + pad, margins.bottom() + frameWidth);
48  m_buttonLayout->setAlignment(Qt::AlignCenter | Qt::AlignRight);
49  widget->setLayout(m_buttonLayout);
50 }
51 
56 {
57 }
58 
63 {
64  if (isClearButtonEnabled() && !enabled) {
65  // disable clear button
66  m_buttonLayout->removeWidget(m_clearButton);
67  delete m_clearButton;
68  m_clearButton = nullptr;
69  } else if (!isClearButtonEnabled() && enabled) {
70  // enable clear button
71  m_clearButton = new IconButton;
72  m_clearButton->setHidden(isCleared());
73  m_clearButton->setPixmap(QIcon::fromTheme(QStringLiteral("edit-clear")).pixmap(16));
74  m_clearButton->setGeometry(0, 0, 16, 16);
75  m_clearButton->setToolTip(QObject::tr("Clear"));
76  QObject::connect(m_clearButton, &IconButton::clicked, std::bind(&ButtonOverlay::handleClearButtonClicked, this));
77  m_buttonLayout->addWidget(m_clearButton);
78  }
79 }
80 
89 void ButtonOverlay::enableInfoButton(const QPixmap &pixmap, const QString &infoText)
90 {
91  if (!m_infoButton) {
92  m_infoButton = new IconButton;
93  m_infoButton->setGeometry(0, 0, 16, 16);
94  QObject::connect(m_infoButton, &IconButton::clicked, std::bind(&ButtonOverlay::showInfo, this));
95  if (m_clearButton) {
96  m_buttonLayout->insertWidget(m_buttonLayout->count() - 2, m_infoButton);
97  } else {
98  m_buttonLayout->addWidget(m_infoButton);
99  }
100  }
101  m_infoButton->setPixmap(pixmap);
102  m_infoButton->setToolTip(infoText);
103 }
104 
110 {
111  if (m_infoButton) {
112  m_buttonLayout->removeWidget(m_infoButton);
113  delete m_infoButton;
114  m_infoButton = nullptr;
115  }
116 }
117 
123 void ButtonOverlay::addCustomButton(QWidget *button)
124 {
125  m_buttonLayout->addWidget(button);
126 }
127 
133 void ButtonOverlay::insertCustomButton(int index, QWidget *button)
134 {
135  m_buttonLayout->insertWidget(index, button);
136 }
137 
144 {
145  m_buttonLayout->removeWidget(button);
146 }
147 
154 {
155  if (m_clearButton) {
156  m_clearButton->setVisible(visible);
157  }
158 }
159 
166 {
167 }
168 
175 {
176  return false;
177 }
178 
184 void ButtonOverlay::showInfo()
185 {
186  if (m_infoButton) {
187  QToolTip::showText(QCursor::pos(), m_infoButton->toolTip(), m_infoButton);
188  }
189 }
190 } // namespace QtUtilities
QtUtilities::ButtonOverlay::isClearButtonEnabled
bool isClearButtonEnabled() const
Returns whether the clear button is enabled.
Definition: buttonoverlay.h:58
QtUtilities::ButtonOverlay::enableInfoButton
void enableInfoButton(const QPixmap &pixmap, const QString &infoText)
Shows an info button with the specified pixmap and infoText.
Definition: buttonoverlay.cpp:89
QtUtilities::ButtonOverlay::removeCustomButton
void removeCustomButton(QWidget *button)
Removes the specified custom button.
Definition: buttonoverlay.cpp:143
iconbutton.h
QtUtilities::IconButton
A simple QAbstractButton implementation displaying a QPixmap.
Definition: iconbutton.h:11
QtUtilities::ButtonOverlay::ButtonOverlay
ButtonOverlay(QWidget *widget)
Constructs a button overlay for the specified widget.
Definition: buttonoverlay.cpp:33
QtUtilities::ButtonOverlay::addCustomButton
void addCustomButton(QWidget *button)
Adds a custom button.
Definition: buttonoverlay.cpp:123
QtUtilities
!
Definition: trylocker.h:8
QtUtilities::ButtonOverlay::insertCustomButton
void insertCustomButton(int index, QWidget *button)
Inserts a custom button at the specified index.
Definition: buttonoverlay.cpp:133
QtUtilities::ButtonOverlay::disableInfoButton
void disableInfoButton()
Hides an info button if one is shown.
Definition: buttonoverlay.cpp:109
QtUtilities::ButtonOverlay::isCleared
virtual bool isCleared() const
Returns whether the related widget is cleared.
Definition: buttonoverlay.cpp:174
QtUtilities::IconButton::setPixmap
void setPixmap(const QPixmap &pixmap)
Sets the pixmap.
Definition: iconbutton.h:43
buttonoverlay.h
QtUtilities::ButtonOverlay::updateClearButtonVisibility
void updateClearButtonVisibility(bool visible)
Updates the visibility of the clear button.
Definition: buttonoverlay.cpp:153
QtUtilities::ButtonOverlay::handleClearButtonClicked
virtual void handleClearButtonClicked()
Clears the related widget.
Definition: buttonoverlay.cpp:165
QtUtilities::ButtonOverlay::setClearButtonEnabled
void setClearButtonEnabled(bool enabled)
Sets whether the clear button is enabled.
Definition: buttonoverlay.cpp:62
QtUtilities::ButtonOverlay::~ButtonOverlay
virtual ~ButtonOverlay()
Destroys the button overlay.
Definition: buttonoverlay.cpp:55