File indexing completed on 2024-12-01 13:10:52
0001 // SPDX-FileCopyrightText: 2022 Carl Schwan <carlschwan@kde.org> 0002 // SPDX-License-Identifier: LGPL-2.0-or-later 0003 0004 #pragma once 0005 0006 #include "timeline/abstracttimelinemodel.h" 0007 0008 class Identity; 0009 class Post; 0010 0011 /// Represents a search hashtag result, which only stores the name (and skips other information like occurences) for now 0012 /// \see SearchModel 0013 class SearchHashtag 0014 { 0015 public: 0016 explicit SearchHashtag(const QJsonObject &object); 0017 0018 QString getName() const; 0019 0020 private: 0021 QString m_name; 0022 }; 0023 0024 /// Model used to fetch search results 0025 /// \see AbstractTimelineModel 0026 class SearchModel : public AbstractTimelineModel 0027 { 0028 Q_OBJECT 0029 Q_PROPERTY(bool loaded READ loaded NOTIFY loadedChanged) 0030 0031 public: 0032 /// The search result type 0033 enum ResultType { 0034 Status, ///< A status (for full-text search) 0035 Account, ///< An account 0036 Hashtag, ///< A hashtag 0037 }; 0038 Q_ENUM(ResultType); 0039 0040 explicit SearchModel(QObject *parent = nullptr); 0041 ~SearchModel() override; 0042 0043 /// Check if the search has finished loading 0044 /// \see setLoaded 0045 bool loaded() const; 0046 0047 /// Sets the search loading status 0048 /// \see laoded 0049 void setLoaded(bool loaded); 0050 0051 /// Start searching for \p queryString 0052 Q_INVOKABLE void search(const QString &queryString); 0053 0054 /// Get a localized label for a result type 0055 Q_INVOKABLE QString labelForType(SearchModel::ResultType sectionType); 0056 0057 /// Clear the fetched search results 0058 Q_INVOKABLE void clear(); 0059 0060 int rowCount(const QModelIndex &parent) const override; 0061 QVariant data(const QModelIndex &index, int role) const override; 0062 0063 Q_SIGNALS: 0064 /// Emitted if the loading status has changed 0065 /// \see setLoaded 0066 void loadedChanged(); 0067 0068 private: 0069 QList<std::shared_ptr<Identity>> m_accounts; 0070 QList<Post *> m_statuses; 0071 QList<SearchHashtag> m_hashtags; 0072 bool m_loaded = false; 0073 };