File indexing completed on 2024-04-14 03:53:14
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 void KUrlNavigatorButtonBase::enterEvent(QEnterEvent *event) 0076 { 0077 QPushButton::enterEvent(event); 0078 setDisplayHintEnabled(EnteredHint, true); 0079 update(); 0080 } 0081 0082 void KUrlNavigatorButtonBase::leaveEvent(QEvent *event) 0083 { 0084 QPushButton::leaveEvent(event); 0085 setDisplayHintEnabled(EnteredHint, false); 0086 update(); 0087 } 0088 0089 void KUrlNavigatorButtonBase::drawHoverBackground(QPainter *painter) 0090 { 0091 const bool isHighlighted = isDisplayHintEnabled(EnteredHint) || isDisplayHintEnabled(DraggedHint) || isDisplayHintEnabled(PopupActiveHint); 0092 0093 QColor backgroundColor = isHighlighted ? palette().color(QPalette::Highlight) : Qt::transparent; 0094 if (!m_active && isHighlighted) { 0095 backgroundColor.setAlpha(128); 0096 } 0097 0098 if (backgroundColor != Qt::transparent) { 0099 // TODO: the backgroundColor should be applied to the style 0100 QStyleOptionViewItem option; 0101 option.initFrom(this); 0102 option.state = QStyle::State_Enabled | QStyle::State_MouseOver; 0103 option.viewItemPosition = QStyleOptionViewItem::OnlyOne; 0104 style()->drawPrimitive(QStyle::PE_PanelItemViewItem, &option, painter, this); 0105 } 0106 } 0107 0108 QColor KUrlNavigatorButtonBase::foregroundColor() const 0109 { 0110 const bool isHighlighted = isDisplayHintEnabled(EnteredHint) || isDisplayHintEnabled(DraggedHint) || isDisplayHintEnabled(PopupActiveHint); 0111 0112 QColor foregroundColor = palette().color(foregroundRole()); 0113 0114 int alpha = m_active ? 255 : 128; 0115 if (!m_active && !isHighlighted) { 0116 alpha -= alpha / 4; 0117 } 0118 foregroundColor.setAlpha(alpha); 0119 0120 return foregroundColor; 0121 } 0122 0123 void KUrlNavigatorButtonBase::activate() 0124 { 0125 setActive(true); 0126 } 0127 0128 } // namespace KDEPrivate 0129 0130 #include "moc_kurlnavigatorbuttonbase_p.cpp"