/* SearchableView.h */ /* Copyright (C) 2011-2020 Michael Lugmair (Lucio Carreras) * * This file is part of sayonara player * * 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 3 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, see . */ #ifndef SEARCHABLEVIEW_H #define SEARCHABLEVIEW_H #include "Gui/Utils/Widgets/WidgetTemplate.h" #include "Gui/Utils/SearchableWidget/SelectionView.h" #include "Gui/Utils/SearchableWidget/SearchableModel.h" #include "Utils/Pimpl.h" #include #include #include #include class QAbstractItemView; class QItemSelectionModel; class ExtraTriggerMap; class SearchableViewInterface; /** * @brief The MiniSearcherViewConnector class * @ingrou Searchable */ class MiniSearcherViewConnector : public QObject { Q_OBJECT PIMPL(MiniSearcherViewConnector) public: MiniSearcherViewConnector(SearchableViewInterface* parent); ~MiniSearcherViewConnector(); void init(); bool isActive() const; void setExtraTriggers(const QMap& map); bool handleKeyPress(QKeyEvent* e); private slots: void lineEditChanged(const QString& str); void selectNext(); void selectPrevious(); }; /** * @brief The SearchViewInterface class * @ingroup Searchable */ class SearchableViewInterface : public SelectionViewInterface { PIMPL(SearchableViewInterface) protected: enum class SearchDirection : unsigned char { First, Next, Prev }; public: explicit SearchableViewInterface(QAbstractItemView* view); virtual ~SearchableViewInterface() override; QAbstractItemView* view() const; virtual int viewportHeight() const; virtual int viewportWidth() const; int setSearchstring(const QString& str); void selectNextMatch(const QString& str); void selectPreviousMatch(const QString& str); bool isMinisearcherActive() const; protected: virtual void setSearchModel(SearchableModelInterface* model); virtual QModelIndex matchIndex(const QString& str, SearchDirection direction) const; virtual void selectMatch(const QString& str, SearchDirection direction); bool handleKeyPress(QKeyEvent* e) override; }; template class SearchableView : public View, public SearchableViewInterface { private: using View::setModel; using SearchableViewInterface::setSearchModel; public: SearchableView(QWidget* parent=nullptr) : View(parent), SearchableViewInterface(this) {} virtual ~SearchableView() = default; virtual void setSearchableModel(Model* model) { View::setModel(model); SearchableViewInterface::setSearchModel(model); } int rowCount() const { return (View::model() == nullptr) ? 0 : View::model()->rowCount(); } protected: void keyPressEvent(QKeyEvent* e) override { bool processed = handleKeyPress(e); if(processed){ return; } View::keyPressEvent(e); } }; using SearchableTableView=Gui::WidgetTemplate>; using SearchableListView=Gui::WidgetTemplate>; #endif // SEARCHABLEVIEW_H