File indexing completed on 2023-10-01 04:05:52
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"