File indexing completed on 2024-04-28 11:41:26

0001 /*
0002     SPDX-FileCopyrightText: 2006-2010 Peter Penz <peter.penz@gmx.at>
0003     SPDX-FileCopyrightText: 2006 Aaron J. Seigo <aseigo@kde.org>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include "kurlnavigatorbuttonbase_p.h"
0009 
0010 #include <KLocalizedString>
0011 #include <KUrlNavigator>
0012 
0013 #include <QStyle>
0014 #include <QStyleOptionViewItem>
0015 
0016 namespace KDEPrivate
0017 {
0018 KUrlNavigatorButtonBase::KUrlNavigatorButtonBase(KUrlNavigator *parent)
0019     : QPushButton(parent)
0020     , m_active(true)
0021     , m_displayHint(0)
0022 {
0023     setFocusPolicy(Qt::TabFocus);
0024     setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed);
0025     setMinimumHeight(parent->minimumHeight());
0026     setAttribute(Qt::WA_LayoutUsesWidgetRect);
0027 
0028     connect(this, &KUrlNavigatorButtonBase::pressed, parent, &KUrlNavigator::requestActivation);
0029 }
0030 
0031 KUrlNavigatorButtonBase::~KUrlNavigatorButtonBase()
0032 {
0033 }
0034 
0035 void KUrlNavigatorButtonBase::setActive(bool active)
0036 {
0037     if (m_active != active) {
0038         m_active = active;
0039         update();
0040     }
0041 }
0042 
0043 bool KUrlNavigatorButtonBase::isActive() const
0044 {
0045     return m_active;
0046 }
0047 
0048 void KUrlNavigatorButtonBase::setDisplayHintEnabled(DisplayHint hint, bool enable)
0049 {
0050     if (enable) {
0051         m_displayHint = m_displayHint | hint;
0052     } else {
0053         m_displayHint = m_displayHint & ~hint;
0054     }
0055     update();
0056 }
0057 
0058 bool KUrlNavigatorButtonBase::isDisplayHintEnabled(DisplayHint hint) const
0059 {
0060     return (m_displayHint & hint) > 0;
0061 }
0062 
0063 void KUrlNavigatorButtonBase::focusInEvent(QFocusEvent *event)
0064 {
0065     setDisplayHintEnabled(EnteredHint, true);
0066     QPushButton::focusInEvent(event);
0067 }
0068 
0069 void KUrlNavigatorButtonBase::focusOutEvent(QFocusEvent *event)
0070 {
0071     setDisplayHintEnabled(EnteredHint, false);
0072     QPushButton::focusOutEvent(event);
0073 }
0074 
0075 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
0076 void KUrlNavigatorButtonBase::enterEvent(QEnterEvent *event)
0077 #else
0078 void KUrlNavigatorButtonBase::enterEvent(QEvent *event)
0079 #endif
0080 {
0081     QPushButton::enterEvent(event);
0082     setDisplayHintEnabled(EnteredHint, true);
0083     update();
0084 }
0085 
0086 void KUrlNavigatorButtonBase::leaveEvent(QEvent *event)
0087 {
0088     QPushButton::leaveEvent(event);
0089     setDisplayHintEnabled(EnteredHint, false);
0090     update();
0091 }
0092 
0093 void KUrlNavigatorButtonBase::drawHoverBackground(QPainter *painter)
0094 {
0095     const bool isHighlighted = isDisplayHintEnabled(EnteredHint) || isDisplayHintEnabled(DraggedHint) || isDisplayHintEnabled(PopupActiveHint);
0096 
0097     QColor backgroundColor = isHighlighted ? palette().color(QPalette::Highlight) : Qt::transparent;
0098     if (!m_active && isHighlighted) {
0099         backgroundColor.setAlpha(128);
0100     }
0101 
0102     if (backgroundColor != Qt::transparent) {
0103         // TODO: the backgroundColor should be applied to the style
0104         QStyleOptionViewItem option;
0105         option.initFrom(this);
0106         option.state = QStyle::State_Enabled | QStyle::State_MouseOver;
0107         option.viewItemPosition = QStyleOptionViewItem::OnlyOne;
0108         style()->drawPrimitive(QStyle::PE_PanelItemViewItem, &option, painter, this);
0109     }
0110 }
0111 
0112 QColor KUrlNavigatorButtonBase::foregroundColor() const
0113 {
0114     const bool isHighlighted = isDisplayHintEnabled(EnteredHint) || isDisplayHintEnabled(DraggedHint) || isDisplayHintEnabled(PopupActiveHint);
0115 
0116     QColor foregroundColor = palette().color(foregroundRole());
0117 
0118     int alpha = m_active ? 255 : 128;
0119     if (!m_active && !isHighlighted) {
0120         alpha -= alpha / 4;
0121     }
0122     foregroundColor.setAlpha(alpha);
0123 
0124     return foregroundColor;
0125 }
0126 
0127 void KUrlNavigatorButtonBase::activate()
0128 {
0129     setActive(true);
0130 }
0131 
0132 } // namespace KDEPrivate
0133 
0134 #include "moc_kurlnavigatorbuttonbase_p.cpp"