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"