X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/8eb9b508ca87fb1d634d8b8ba62c054ed04466d2..fc56f8f2f92b98ccb9a1da0ffcbb57d723dc33bb:/src/filterbar/filterbar.cpp diff --git a/src/filterbar/filterbar.cpp b/src/filterbar/filterbar.cpp index 3f4b7c219..e4aea4b61 100644 --- a/src/filterbar/filterbar.cpp +++ b/src/filterbar/filterbar.cpp @@ -1,69 +1,73 @@ -/*************************************************************************** - * Copyright (C) 2006-2010 by Peter Penz * - * Copyright (C) 2006 by Gregor Kališnik * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * - ***************************************************************************/ +/* + * SPDX-FileCopyrightText: 2006-2010 Peter Penz + * SPDX-FileCopyrightText: 2006 Gregor Kališnik + * SPDX-FileCopyrightText: 2012 Stuart Citrin + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + #include "filterbar.h" -#include +#include + +#include +#include #include -#include +#include #include -#include -#include -#include -#include - -FilterBar::FilterBar(QWidget* parent) : - QWidget(parent) +FilterBar::FilterBar(QWidget *parent) + : AnimatedHeightWidget{parent} { - // Create close button - QToolButton *closeButton = new QToolButton(this); - closeButton->setAutoRaise(true); - closeButton->setIcon(KIcon("dialog-close")); - closeButton->setToolTip(i18nc("@info:tooltip", "Hide Filter Bar")); - connect(closeButton, SIGNAL(clicked()), this, SIGNAL(closeRequest())); + QWidget *contentsContainer = prepareContentsContainer(); - // Create label - QLabel* filterLabel = new QLabel(i18nc("@label:textbox", "Filter:"), this); + // Create button to lock text when changing folders + m_lockButton = new QToolButton(contentsContainer); + m_lockButton->setAutoRaise(true); + m_lockButton->setCheckable(true); + m_lockButton->setIcon(QIcon::fromTheme(QStringLiteral("object-unlocked"))); + m_lockButton->setToolTip(i18nc("@info:tooltip", "Keep Filter When Changing Folders")); + connect(m_lockButton, &QToolButton::toggled, this, &FilterBar::slotToggleLockButton); // Create filter editor - m_filterInput = new KLineEdit(this); + m_filterInput = new QLineEdit(contentsContainer); m_filterInput->setLayoutDirection(Qt::LeftToRight); - m_filterInput->setClearButtonShown(true); - connect(m_filterInput, SIGNAL(textChanged(const QString&)), - this, SIGNAL(filterChanged(const QString&))); + m_filterInput->setClearButtonEnabled(true); + m_filterInput->setPlaceholderText(i18n("Filter…")); + connect(m_filterInput, &QLineEdit::textChanged, this, &FilterBar::filterChanged); setFocusProxy(m_filterInput); + // Create close button + QToolButton *closeButton = new QToolButton(contentsContainer); + closeButton->setAutoRaise(true); + closeButton->setIcon(QIcon::fromTheme(QStringLiteral("dialog-close"))); + closeButton->setToolTip(i18nc("@info:tooltip", "Hide Filter Bar")); + connect(closeButton, &QToolButton::clicked, this, &FilterBar::closeRequest); + // Apply layout - QHBoxLayout* hLayout = new QHBoxLayout(this); - hLayout->setMargin(0); - hLayout->addWidget(closeButton); - hLayout->addWidget(filterLabel); + QHBoxLayout *hLayout = new QHBoxLayout(contentsContainer); + hLayout->setContentsMargins(0, 0, 0, 0); + hLayout->addWidget(m_lockButton); hLayout->addWidget(m_filterInput); + hLayout->addWidget(closeButton); - filterLabel->setBuddy(m_filterInput); + setTabOrder(m_lockButton, closeButton); + setTabOrder(closeButton, m_filterInput); } FilterBar::~FilterBar() { } +void FilterBar::closeFilterBar() +{ + setVisible(false, WithAnimation); + clear(); + if (m_lockButton) { + m_lockButton->setChecked(false); + } +} + void FilterBar::selectAll() { m_filterInput->selectAll(); @@ -74,23 +78,68 @@ void FilterBar::clear() m_filterInput->clear(); } -void FilterBar::showEvent(QShowEvent* event) +void FilterBar::clearIfUnlocked() +{ + if (!m_lockButton || !(m_lockButton->isChecked())) { + clear(); + } +} + +void FilterBar::slotToggleLockButton(bool checked) +{ + if (checked) { + m_lockButton->setIcon(QIcon::fromTheme(QStringLiteral("object-locked"))); + } else { + m_lockButton->setIcon(QIcon::fromTheme(QStringLiteral("object-unlocked"))); + clear(); + } +} + +void FilterBar::showEvent(QShowEvent *event) { if (!event->spontaneous()) { m_filterInput->setFocus(); } } -void FilterBar::keyReleaseEvent(QKeyEvent* event) +void FilterBar::keyPressEvent(QKeyEvent *event) { - QWidget::keyReleaseEvent(event); - if (event->key() == Qt::Key_Escape) { + switch (event->key()) { + case Qt::Key_Escape: if (m_filterInput->text().isEmpty()) { - emit closeRequest(); + Q_EMIT closeRequest(); } else { m_filterInput->clear(); } + return; + + case Qt::Key_Enter: + case Qt::Key_Return: + Q_EMIT focusViewRequest(); + return; + + case Qt::Key_Down: + case Qt::Key_PageDown: + case Qt::Key_Up: + case Qt::Key_PageUp: { + Q_EMIT focusViewRequest(); + QWidget *focusWidget = QApplication::focusWidget(); + if (focusWidget && focusWidget != this) { + QApplication::sendEvent(focusWidget, event); + } + return; + } + + default: + break; } + + QWidget::keyPressEvent(event); +} + +int FilterBar::preferredHeight() const +{ + return std::max(m_filterInput->sizeHint().height(), m_lockButton->sizeHint().height()); } -#include "filterbar.moc" +#include "moc_filterbar.cpp"