RedPanda-CPP/RedPandaIDE/widgets/searchresultview.h

136 lines
4.0 KiB
C
Raw Normal View History

#ifndef SEARCHRESULTVIEW_H
#define SEARCHRESULTVIEW_H
#include <QTreeView>
#include <QMap>
2021-08-05 12:31:53 +08:00
#include <QStyledItemDelegate>
#include "../qsynedit/SearchBase.h"
#include "utils.h"
#define MAX_SEARCH_RESULTS 20
2021-08-05 12:31:53 +08:00
struct SearchResultTreeItem;
using PSearchResultTreeItem = std::shared_ptr<SearchResultTreeItem>;
using SearchResultTreeItemList = QList<PSearchResultTreeItem>;
using PSearchResultTreeItemList = std::shared_ptr<SearchResultTreeItemList>;
2021-09-03 11:50:04 +08:00
enum class SearchType {
Search,
FindOccurences
};
2021-08-05 12:31:53 +08:00
struct SearchResultTreeItem {
QString filename;
int line;
int start;
int len;
2021-08-05 12:31:53 +08:00
QString text;
SearchResultTreeItem* parent;
SearchResultTreeItemList results;
bool selected;
};
struct SearchResults{
SynSearchOptions options;
QString keyword;
QString statementFullname;
SearchFileScope scope;
2021-09-03 11:50:04 +08:00
SearchType searchType;
QString filename;
2021-08-05 12:31:53 +08:00
QList<PSearchResultTreeItem> results;
};
using PSearchResults = std::shared_ptr<SearchResults>;
2021-08-05 12:31:53 +08:00
class SearchResultModel : public QObject {
Q_OBJECT
public:
explicit SearchResultModel(QObject* parent=nullptr);
PSearchResults addSearchResults(const QString& keyword,SynSearchOptions options,
SearchFileScope scope);
2021-09-03 11:50:04 +08:00
PSearchResults addSearchResults(
const QString& keyword,
const QString& symbolFullname,
SearchFileScope scope);
PSearchResults results(int index);
2021-08-05 12:31:53 +08:00
void notifySearchResultsUpdated();
int currentIndex() const;
int resultsCount() const;
PSearchResults currentResults();
void setCurrentIndex(int index);
void clear();
void removeSearchResults(int index);
signals:
void modelChanged();
void currentChanged(int index);
private:
QList<PSearchResults> mSearchResults;
int mCurrentIndex;
};
class SearchResultListModel: public QAbstractListModel {
Q_OBJECT
// QAbstractItemModel interface
public:
explicit SearchResultListModel(SearchResultModel* model,QObject* parent=nullptr);
int rowCount(const QModelIndex &parent) const override;
QVariant data(const QModelIndex &index, int role) const override;
public slots:
void onResultModelChanged();
private:
SearchResultModel *mSearchResultModel;
};
2021-08-05 12:31:53 +08:00
using PSearchResultListModel = std::shared_ptr<SearchResultListModel>;
class SearchResultTreeModel : public QAbstractItemModel {
Q_OBJECT
// QAbstractItemModel interface
public:
explicit SearchResultTreeModel(SearchResultModel* model,QObject* parent=nullptr);
QModelIndex index(int row, int column, const QModelIndex &parent) const override;
QModelIndex parent(const QModelIndex &child) const override;
int rowCount(const QModelIndex &parent) const override;
int columnCount(const QModelIndex &parent) const override;
QVariant data(const QModelIndex &index, int role) const override;
2021-08-05 12:31:53 +08:00
SearchResultModel *searchResultModel() const;
bool getItemFileAndLineChar(
const QModelIndex&index,
QString& filename,
int& line,
int& startChar);
bool selectable() const;
void setSelectable(bool newSelectable);
2021-08-05 12:31:53 +08:00
public slots:
void onResultModelChanged();
private:
SearchResultModel *mSearchResultModel;
bool mSelectable;
// QAbstractItemModel interface
public:
Qt::ItemFlags flags(const QModelIndex &index) const override;
// QAbstractItemModel interface
public:
bool setData(const QModelIndex &index, const QVariant &value, int role) override;
};
2021-08-05 12:31:53 +08:00
using PSearchResultTreeModel = std::shared_ptr<SearchResultTreeModel>;
class SearchResultTreeViewDelegate: public QStyledItemDelegate{
Q_OBJECT
// QAbstractItemDelegate interface
public:
2021-08-05 12:31:53 +08:00
explicit SearchResultTreeViewDelegate(PSearchResultTreeModel model,
QObject* parent=nullptr);
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
private:
PSearchResultTreeModel mModel;
};
2021-08-05 12:31:53 +08:00
using PSearchResultTreeViewDelegate = std::shared_ptr<SearchResultTreeViewDelegate>;
#endif // SEARCHRESULTVIEW_H