File indexing completed on 2024-04-14 04:56:33

0001 /*
0002     This class provides the network search toolbar.
0003 
0004     SPDX-FileCopyrightText: 2018-2023 Alexander Reinholdt <alexander.reinholdt@kdemail.net>
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 // application specific includes
0009 #include "smb4knetworksearchtoolbar.h"
0010 #include "core/smb4kshare.h"
0011 
0012 // Qt includes
0013 #include <QDebug>
0014 #include <QtGlobal>
0015 
0016 // KDE includes
0017 
0018 #include <KIconLoader>
0019 #include <KLineEdit>
0020 #include <KLocalizedString>
0021 
0022 Smb4KNetworkSearchToolBar::Smb4KNetworkSearchToolBar(QWidget *parent)
0023     : QToolBar(parent)
0024     , m_iterator(QStringList())
0025 {
0026     // Set up tool bar:
0027     // Use the settings suggested by the note provided in the 'Detailed Description'
0028     // section of KToolBar (https://api.kde.org/frameworks/kxmlgui/html/classKToolBar.html)
0029     setToolButtonStyle(Qt::ToolButtonFollowStyle);
0030     setProperty("otherToolbar", true);
0031 
0032     QAction *closeAction = new QAction(this);
0033     closeAction->setIcon(KDE::icon(QStringLiteral("window-close")));
0034     closeAction->setText(i18n("Close"));
0035 
0036     connect(closeAction, &QAction::triggered, this, &Smb4KNetworkSearchToolBar::slotCloseButtonPressed);
0037 
0038     addAction(closeAction);
0039 
0040     m_searchComboBox = new KComboBox(true, this);
0041     m_searchComboBox->lineEdit()->setPlaceholderText(i18n("Search string"));
0042     m_searchComboBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
0043     m_searchComboBox->setCompletionMode(KCompletion::CompletionPopupAuto);
0044 
0045     connect(m_searchComboBox, QOverload<const QString &>::of(&KComboBox::returnPressed), this, &Smb4KNetworkSearchToolBar::slotReturnKeyPressed);
0046     // FIXME: Add a connection to the clearSearch() slot
0047 
0048     addWidget(m_searchComboBox);
0049 
0050     m_searchAction = new KDualAction(this);
0051     m_searchAction->setInactiveIcon(KDE::icon(QStringLiteral("search")));
0052     m_searchAction->setInactiveText(i18n("Search"));
0053     m_searchAction->setActiveIcon(KDE::icon(QStringLiteral("process-stop")));
0054     m_searchAction->setActiveText(i18n("Stop"));
0055     m_searchAction->setAutoToggle(false);
0056 
0057     connect(m_searchAction, &KDualAction::triggered, this, &Smb4KNetworkSearchToolBar::slotSearchActionTriggered);
0058 
0059     addAction(m_searchAction);
0060 
0061     m_downAction = new QAction(this);
0062     m_downAction->setIcon(KDE::icon(QStringLiteral("go-down-search")));
0063     m_downAction->setText(i18n("Item Down"));
0064     m_downAction->setEnabled(false);
0065 
0066     connect(m_downAction, &QAction::triggered, this, &Smb4KNetworkSearchToolBar::slotDownActionTriggered);
0067 
0068     addAction(m_downAction);
0069 
0070     m_upAction = new QAction(this);
0071     m_upAction->setIcon(KDE::icon(QStringLiteral("go-up-search")));
0072     m_upAction->setText(i18n("Item Up"));
0073     m_upAction->setEnabled(false);
0074 
0075     connect(m_upAction, &QAction::triggered, this, &Smb4KNetworkSearchToolBar::slotUpActionTriggered);
0076 
0077     addAction(m_upAction);
0078 
0079     m_clearAction = new QAction(this);
0080     m_clearAction->setIcon(KDE::icon(QStringLiteral("edit-clear-all")));
0081     m_clearAction->setText(i18n("Clear"));
0082     m_clearAction->setEnabled(false);
0083 
0084     connect(m_clearAction, &QAction::triggered, this, &Smb4KNetworkSearchToolBar::slotClearSearch);
0085 
0086     addAction(m_clearAction);
0087 }
0088 
0089 Smb4KNetworkSearchToolBar::~Smb4KNetworkSearchToolBar()
0090 {
0091 }
0092 
0093 void Smb4KNetworkSearchToolBar::prepareInput()
0094 {
0095     m_searchComboBox->lineEdit()->setFocus();
0096 }
0097 
0098 void Smb4KNetworkSearchToolBar::setActiveState(bool active)
0099 {
0100     m_searchAction->setActive(active);
0101     m_searchComboBox->setEnabled(!active);
0102 }
0103 
0104 void Smb4KNetworkSearchToolBar::clearSearch()
0105 {
0106     m_searchResults.clear();
0107 
0108     m_searchComboBox->clear();
0109     m_searchComboBox->clearEditText();
0110 
0111     m_downAction->setEnabled(!m_searchResults.isEmpty());
0112     m_upAction->setEnabled(!m_searchResults.isEmpty());
0113     m_clearAction->setEnabled(!m_searchResults.isEmpty());
0114 
0115     Q_EMIT clearSearchResults();
0116 }
0117 
0118 void Smb4KNetworkSearchToolBar::setSearchResults(const QList<SharePtr> &list)
0119 {
0120     for (const SharePtr &share : list) {
0121         m_searchResults << share->url().toString();
0122     }
0123 
0124     m_searchResults.sort();
0125 
0126     m_iterator = m_searchResults;
0127 
0128     m_downAction->setEnabled(!m_searchResults.isEmpty());
0129     m_upAction->setEnabled(!m_searchResults.isEmpty());
0130     m_clearAction->setEnabled(!m_searchResults.isEmpty());
0131 }
0132 
0133 void Smb4KNetworkSearchToolBar::setCompletionItems(const QStringList &items)
0134 {
0135     m_searchComboBox->completionObject()->setItems(items);
0136 }
0137 
0138 QStringList Smb4KNetworkSearchToolBar::completionItems() const
0139 {
0140     return m_searchComboBox->completionObject()->items();
0141 }
0142 
0143 void Smb4KNetworkSearchToolBar::slotReturnKeyPressed(const QString &text)
0144 {
0145     if (!text.isEmpty()) {
0146         m_searchComboBox->completionObject()->addItem(text);
0147         Q_EMIT search(text);
0148     }
0149 }
0150 
0151 void Smb4KNetworkSearchToolBar::slotSearchActionTriggered()
0152 {
0153     if (!m_searchAction->isActive()) {
0154         if (!m_searchComboBox->currentText().isEmpty()) {
0155             m_searchComboBox->completionObject()->addItem(m_searchComboBox->currentText());
0156             Q_EMIT search(m_searchComboBox->currentText());
0157         }
0158     } else {
0159         Q_EMIT abort();
0160     }
0161 }
0162 
0163 void Smb4KNetworkSearchToolBar::slotCloseButtonPressed()
0164 {
0165     clearSearch();
0166 
0167     Q_EMIT abort();
0168     Q_EMIT closeSearchBar();
0169 }
0170 
0171 void Smb4KNetworkSearchToolBar::slotDownActionTriggered()
0172 {
0173     if (m_iterator.hasNext()) {
0174         QString url = m_iterator.next();
0175         Q_EMIT jumpToResult(url);
0176     }
0177 }
0178 
0179 void Smb4KNetworkSearchToolBar::slotUpActionTriggered()
0180 {
0181     if (m_iterator.hasPrevious()) {
0182         QString url = m_iterator.previous();
0183         Q_EMIT jumpToResult(url);
0184     }
0185 }
0186 
0187 void Smb4KNetworkSearchToolBar::slotClearSearch()
0188 {
0189     clearSearch();
0190 }