Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgslocatormodel.h 3 : : ------------------ 4 : : begin : May 2017 5 : : copyright : (C) 2017 by Nyall Dawson 6 : : email : nyall dot dawson at gmail dot com 7 : : ***************************************************************************/ 8 : : 9 : : /*************************************************************************** 10 : : * * 11 : : * This program is free software; you can redistribute it and/or modify * 12 : : * it under the terms of the GNU General Public License as published by * 13 : : * the Free Software Foundation; either version 2 of the License, or * 14 : : * (at your option) any later version. * 15 : : * * 16 : : ***************************************************************************/ 17 : : 18 : : #ifndef QGSLOCATORMODEL_H 19 : : #define QGSLOCATORMODEL_H 20 : : 21 : : #include "qgis_core.h" 22 : : #include "qgslocatorfilter.h" 23 : : #include <QAbstractListModel> 24 : : #include <QTimer> 25 : : #include <QSet> 26 : : #include <QSortFilterProxyModel> 27 : : 28 : : class QgsLocator; 29 : : class QgsLocatorModel; 30 : : class QgsLocatorProxyModel; 31 : : 32 : : /** 33 : : * \class QgsLocatorModel 34 : : * \ingroup core 35 : : * \brief An abstract list model for displaying the results of locator searches. 36 : : * 37 : : * Note that this class should generally be used with a QgsLocatorProxyModel 38 : : * in order to ensure correct sorting of results by priority and match level. 39 : : * 40 : : * \since QGIS 3.0 41 : : */ 42 : 0 : class CORE_EXPORT QgsLocatorModel : public QAbstractTableModel 43 : : { 44 : : Q_OBJECT 45 : : 46 : : public: 47 : : 48 : : static const int NoGroup = 9999; 49 : : 50 : : //! Custom model roles 51 : : enum Role 52 : : { 53 : : ResultDataRole = Qt::UserRole + 1, //!< QgsLocatorResult data 54 : : ResultTypeRole, //!< Result type 55 : : ResultFilterPriorityRole, //!< Result priority, used by QgsLocatorProxyModel for sorting roles. 56 : : ResultScoreRole, //!< Result match score, used by QgsLocatorProxyModel for sorting roles. 57 : : ResultFilterNameRole, //!< Associated filter name which created the result 58 : : ResultFilterGroupSortingRole, //!< Group results within the same filter results 59 : : ResultActionsRole, //!< The actions to be shown for the given result in a context menu 60 : : }; 61 : : 62 : : /** 63 : : * Constructor for QgsLocatorModel. 64 : : */ 65 : : QgsLocatorModel( QObject *parent SIP_TRANSFERTHIS = nullptr ); 66 : : 67 : : /** 68 : : * Resets the model and clears all existing results. 69 : : * \see deferredClear() 70 : : */ 71 : : void clear(); 72 : : 73 : : /** 74 : : * Resets the model and clears all existing results after a short delay, or whenever the next result is added to the model 75 : : * (whichever occurs first). Using deferredClear() instead of clear() can avoid the visually distracting frequent clears 76 : : * which may occur if the model is being updated quickly multiple times as a result of users typing in a search query. 77 : : * \see deferredClear() 78 : : */ 79 : : void deferredClear(); 80 : : 81 : : int rowCount( const QModelIndex &parent = QModelIndex() ) const override; 82 : : int columnCount( const QModelIndex &parent = QModelIndex() ) const override; 83 : : QVariant data( const QModelIndex &index, int role = Qt::DisplayRole ) const override; 84 : : Qt::ItemFlags flags( const QModelIndex &index ) const override; 85 : : QHash<int, QByteArray> roleNames() const override; 86 : : 87 : : public slots: 88 : : 89 : : /** 90 : : * Adds a new \a result to the model. 91 : : */ 92 : : void addResult( const QgsLocatorResult &result ); 93 : : 94 : : private: 95 : : 96 : : enum ColumnCount 97 : : { 98 : : Name = 0, 99 : : Description 100 : : }; 101 : : 102 : 0 : struct Entry 103 : : { 104 : : QgsLocatorResult result; 105 : : QString filterTitle; 106 : 0 : QgsLocatorFilter *filter = nullptr; 107 : 0 : QString groupTitle = QString(); 108 : 0 : int groupSorting = 0; 109 : : }; 110 : : 111 : : QList<Entry> mResults; 112 : : QSet<QString> mFoundResultsFromFilterNames; 113 : : QMap<QgsLocatorFilter *, QStringList> mFoundResultsFilterGroups; 114 : : bool mDeferredClear = false; 115 : : QTimer mDeferredClearTimer; 116 : : }; 117 : : 118 : : /** 119 : : * \class QgsLocatorAutomaticModel 120 : : * \ingroup core 121 : : * \brief A QgsLocatorModel which has is associated directly with a 122 : : * QgsLocator, and is automatically populated with results 123 : : * from locator searches. 124 : : * 125 : : * Use this QgsLocatorModel subclass when you want the connections 126 : : * between a QgsLocator and the model to be automatically created 127 : : * for you. If more flexibility in model behavior is required, 128 : : * use the base QgsLocatorModel class instead and setup the 129 : : * connections manually. 130 : : * 131 : : * Note that this class should generally be used with a QgsLocatorProxyModel 132 : : * in order to ensure correct sorting of results by priority and match level. 133 : : * 134 : : * \since QGIS 3.0 135 : : */ 136 : : class CORE_EXPORT QgsLocatorAutomaticModel : public QgsLocatorModel 137 : : { 138 : : Q_OBJECT 139 : : 140 : : public: 141 : : 142 : : /** 143 : : * Constructor for QgsLocatorAutomaticModel, linked with the specified \a locator. 144 : : * 145 : : * The \a locator is used as the model's parent. 146 : : */ 147 : : explicit QgsLocatorAutomaticModel( QgsLocator *locator SIP_TRANSFERTHIS ); 148 : : 149 : : /** 150 : : * Returns a pointer to the locator utilized by this model. 151 : : */ 152 : : QgsLocator *locator(); 153 : : 154 : : /** 155 : : * Enqueues a search for a specified \a string within the model. 156 : : * 157 : : * Note that the search may not begin immediately if an existing search request 158 : : * is still running. In this case the existing search must be completely 159 : : * terminated before the new search can begin. The model handles this 160 : : * situation automatically, and will trigger a search for the new 161 : : * search string as soon as possible. 162 : : */ 163 : : void search( const QString &string ); 164 : : 165 : : /** 166 : : * Returns a new locator context for searches. The default implementation 167 : : * returns a default constructed QgsLocatorContext. Subclasses can override 168 : : * this method to implement custom context creation logic. 169 : : */ 170 : : virtual QgsLocatorContext createContext(); 171 : : 172 : : private slots: 173 : : 174 : : void searchFinished(); 175 : : 176 : : private: 177 : : 178 : : QgsLocator *mLocator = nullptr; 179 : : 180 : : QString mNextRequestedString; 181 : : bool mHasQueuedRequest = false; 182 : : }; 183 : : 184 : : /** 185 : : * \class QgsLocatorProxyModel 186 : : * \ingroup core 187 : : * \brief A sort proxy model for QgsLocatorModel, which automatically sorts 188 : : * results by precedence. 189 : : * \since QGIS 3.0 190 : : */ 191 : : class CORE_EXPORT QgsLocatorProxyModel : public QSortFilterProxyModel 192 : : { 193 : : Q_OBJECT 194 : : 195 : : public: 196 : : 197 : : /** 198 : : * Constructor for QgsLocatorProxyModel, with the specified \a parent object. 199 : : */ 200 : : explicit QgsLocatorProxyModel( QObject *parent SIP_TRANSFERTHIS = nullptr ); 201 : : bool lessThan( const QModelIndex &left, const QModelIndex &right ) const override; 202 : : }; 203 : : 204 : : #endif // QGSLOCATORMODEL_H 205 : : 206 : :