diff options
Diffstat (limited to 'src/selectionmode/actionwithwidget.cpp')
| -rw-r--r-- | src/selectionmode/actionwithwidget.cpp | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/selectionmode/actionwithwidget.cpp b/src/selectionmode/actionwithwidget.cpp new file mode 100644 index 000000000..8e82a37bf --- /dev/null +++ b/src/selectionmode/actionwithwidget.cpp @@ -0,0 +1,76 @@ +/* + This file is part of the KDE project + SPDX-FileCopyrightText: 2022 Felix Ernst <[email protected]> + + SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL +*/ + +#include "actionwithwidget.h" + +#include <QAbstractButton> +#include <QFrame> +#include <QPushButton> +#include <QToolButton> + +ActionWithWidget::ActionWithWidget(QAction *action) : + m_action{action} +{ } + +ActionWithWidget::ActionWithWidget(QAction *action, QAbstractButton *button) : + m_action{action}, + m_widget{button} +{ + copyActionDataToButton(button, action); +} + +QWidget *ActionWithWidget::newWidget(QWidget *parent) +{ + Q_CHECK_PTR(m_action); + Q_ASSERT(!m_widget); + + if (m_action->isSeparator()) { + auto line = new QFrame(parent); + line->setFrameShape(QFrame::VLine); + line->setFrameShadow(QFrame::Sunken); + + m_widget = line; + } else { + m_widget = newButtonForAction(m_action, parent); + } + return m_widget; +} + +QAbstractButton *newButtonForAction(QAction *action, QWidget *parent) +{ + Q_CHECK_PTR(action); + Q_ASSERT(!action->isSeparator()); + + if (action->priority() == QAction::LowPriority) { + // We don't want the low priority actions to be displayed icon-only so we need trickery. + auto button = new QPushButton(parent); + copyActionDataToButton(static_cast<QAbstractButton *>(button), action); + button->setMinimumWidth(0); + return button; + } + + auto *toolButton = new QToolButton(parent); + toolButton->setToolButtonStyle(Qt::ToolButtonStyle::ToolButtonTextBesideIcon); + toolButton->setDefaultAction(action); + toolButton->setPopupMode(QToolButton::ToolButtonPopupMode::InstantPopup); + toolButton->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); + toolButton->setMinimumWidth(0); + return toolButton; +} + +void copyActionDataToButton(QAbstractButton *button, QAction *action) +{ + button->setText(action->text()); + button->setIcon(action->icon()); + button->setToolTip(action->toolTip()); + button->setWhatsThis(action->whatsThis()); + + button->setVisible(action->isVisible()); + button->setEnabled(action->isEnabled()); + + QObject::connect(button, &QAbstractButton::clicked, action, &QAction::trigger); +} |
