File indexing completed on 2024-04-28 17:02:52
0001 /* 0002 * SPDX-FileCopyrightText: 2006-2010 Peter Penz <peter.penz19@gmail.com> 0003 * SPDX-FileCopyrightText: 2006 Gregor Kališnik <gregor@podnapisi.net> 0004 * SPDX-FileCopyrightText: 2012 Stuart Citrin <ctrn3e8@gmail.com> 0005 * 0006 * SPDX-License-Identifier: GPL-2.0-or-later 0007 */ 0008 0009 #include "filterbar.h" 0010 0011 #include <KLocalizedString> 0012 0013 #include <QApplication> 0014 #include <QHBoxLayout> 0015 #include <QKeyEvent> 0016 #include <QLineEdit> 0017 #include <QToolButton> 0018 0019 FilterBar::FilterBar(QWidget *parent) 0020 : QWidget(parent) 0021 { 0022 // Create button to lock text when changing folders 0023 m_lockButton = new QToolButton(this); 0024 m_lockButton->setAutoRaise(true); 0025 m_lockButton->setCheckable(true); 0026 m_lockButton->setIcon(QIcon::fromTheme(QStringLiteral("object-unlocked"))); 0027 m_lockButton->setToolTip(i18nc("@info:tooltip", "Keep Filter When Changing Folders")); 0028 connect(m_lockButton, &QToolButton::toggled, this, &FilterBar::slotToggleLockButton); 0029 0030 // Create filter editor 0031 m_filterInput = new QLineEdit(this); 0032 m_filterInput->setLayoutDirection(Qt::LeftToRight); 0033 m_filterInput->setClearButtonEnabled(true); 0034 m_filterInput->setPlaceholderText(i18n("Filter…")); 0035 connect(m_filterInput, &QLineEdit::textChanged, this, &FilterBar::filterChanged); 0036 setFocusProxy(m_filterInput); 0037 0038 // Create close button 0039 QToolButton *closeButton = new QToolButton(this); 0040 closeButton->setAutoRaise(true); 0041 closeButton->setIcon(QIcon::fromTheme(QStringLiteral("dialog-close"))); 0042 closeButton->setToolTip(i18nc("@info:tooltip", "Hide Filter Bar")); 0043 connect(closeButton, &QToolButton::clicked, this, &FilterBar::closeRequest); 0044 0045 // Apply layout 0046 QHBoxLayout *hLayout = new QHBoxLayout(this); 0047 hLayout->setContentsMargins(0, 0, 0, 0); 0048 hLayout->addWidget(m_lockButton); 0049 hLayout->addWidget(m_filterInput); 0050 hLayout->addWidget(closeButton); 0051 0052 setTabOrder(m_lockButton, closeButton); 0053 setTabOrder(closeButton, m_filterInput); 0054 } 0055 0056 FilterBar::~FilterBar() 0057 { 0058 } 0059 0060 void FilterBar::closeFilterBar() 0061 { 0062 hide(); 0063 clear(); 0064 if (m_lockButton) { 0065 m_lockButton->setChecked(false); 0066 } 0067 } 0068 0069 void FilterBar::selectAll() 0070 { 0071 m_filterInput->selectAll(); 0072 } 0073 0074 void FilterBar::clear() 0075 { 0076 m_filterInput->clear(); 0077 } 0078 0079 void FilterBar::clearIfUnlocked() 0080 { 0081 if (!m_lockButton || !(m_lockButton->isChecked())) { 0082 clear(); 0083 } 0084 } 0085 0086 void FilterBar::slotToggleLockButton(bool checked) 0087 { 0088 if (checked) { 0089 m_lockButton->setIcon(QIcon::fromTheme(QStringLiteral("object-locked"))); 0090 } else { 0091 m_lockButton->setIcon(QIcon::fromTheme(QStringLiteral("object-unlocked"))); 0092 clear(); 0093 } 0094 } 0095 0096 void FilterBar::showEvent(QShowEvent *event) 0097 { 0098 if (!event->spontaneous()) { 0099 m_filterInput->setFocus(); 0100 } 0101 } 0102 0103 void FilterBar::keyPressEvent(QKeyEvent *event) 0104 { 0105 switch (event->key()) { 0106 case Qt::Key_Escape: 0107 if (m_filterInput->text().isEmpty()) { 0108 Q_EMIT closeRequest(); 0109 } else { 0110 m_filterInput->clear(); 0111 } 0112 return; 0113 0114 case Qt::Key_Enter: 0115 case Qt::Key_Return: 0116 Q_EMIT focusViewRequest(); 0117 return; 0118 0119 case Qt::Key_Down: 0120 case Qt::Key_PageDown: 0121 case Qt::Key_Up: 0122 case Qt::Key_PageUp: { 0123 Q_EMIT focusViewRequest(); 0124 QWidget *focusWidget = QApplication::focusWidget(); 0125 if (focusWidget && focusWidget != this) { 0126 QApplication::sendEvent(focusWidget, event); 0127 } 0128 return; 0129 } 0130 0131 default: 0132 break; 0133 } 0134 0135 QWidget::keyPressEvent(event); 0136 } 0137 0138 #include "moc_filterbar.cpp"