26#include <QAbstractItemView>
27#include <QAbstractItemModel>
30#include "klfitemviewsearchtarget_p.h"
33struct KLFItemViewSearchTargetPrivate {
38 klfdelegate =
new KLFSearchItemDelegate(K);
41 QAbstractItemView * view;
43 QAbstractItemDelegate * olddelegate;
44 KLFSearchItemDelegate * klfdelegate;
48 QList<int> columnlist;
49 QMap<int,int> nextcolumn;
50 QMap<int,int> prevcolumn;
52 int next_valid_column(
int c,
bool forward =
true)
54 if (columnlist.isEmpty())
57 while (c >= 0 && c < columnlist.last() && !columnlist.contains(c))
58 c = c + (forward ? +1 : -1);
59 if (c >= columnlist.last())
64 QModelIndex advance_iter_helper(
const QModelIndex& pos,
bool explorechildren =
true)
67 QAbstractItemModel *model = view->model();
70 if (columnlist.isEmpty())
73 if (explorechildren && model->hasChildren(pos)) {
75 return model->index(0, columnlist[0], pos);
78 int nextcol = nextcolumn.value(next_valid_column(pos.
column()), -1);
81 return model->index(pos.
row(), nextcol, pos.
parent());
84 if (pos.
row() < model->rowCount(pos.
parent())) {
85 return pos.
sibling(pos.
row()+1, columnlist[0]);
89 if (pos.
parent() != QModelIndex()) {
90 return advance_iter_helper(pos.
parent(),
false);
96 QModelIndex last_child_index(
const QModelIndex& pos)
99 QAbstractItemModel *model = view->model();
102 if (!model->hasChildren(pos))
106 return last_child_index(model->index(model->rowCount(pos)-1, columnlist.last(), pos));
109 QModelIndex advance_iter_back_helper(
const QModelIndex& pos)
112 QAbstractItemModel *model = view->model();
116 int prevcol = prevcolumn.value(next_valid_column(pos.
column(),
false), -1);
118 return last_child_index(pos.
sibling(pos.
row(), prevcol));
120 if (pos.
row() >= 1) {
122 return last_child_index(pos.
sibling(pos.
row()-1, columnlist.last()));
148 return d->columnlist;
157 return d->advance_iter_helper(pos);
159 return d->advance_iter_back_helper(pos);
174 = KLFSearchItemDelegate::matches(pos.
data().
toString(), queryString,
false);
182 Q_UNUSED(resultMatchPosition);
192 QAbstractItemDelegate *delegate = d->view->itemDelegate();
194 if (delegate != d->klfdelegate) {
195 d->olddelegate = delegate;
196 d->view->setItemDelegate(d->klfdelegate);
199 d->klfdelegate->setSearchString(queryString);
202void KLFItemViewSearchTargetPrivate::resetDelegate()
205 QAbstractItemDelegate *delegate = view->itemDelegate();
207 if (delegate == klfdelegate && olddelegate != NULL) {
208 view->setItemDelegate(olddelegate);
232 d->view->setCurrentIndex(pos);
233 d->view->selectionModel()->select(pos, QItemSelectionModel::ClearAndSelect);
242 if (d->columnlist.isEmpty()) {
257 d->columnlist = columnList.
toSet().toList();
258 qSort(d->columnlist);
259 d->nextcolumn.clear();
260 d->prevcolumn.clear();
261 if (d->columnlist.isEmpty()) {
265 if (d->columnlist.isEmpty())
269 for (k = 0; k < (d->columnlist.size()-1); ++k) {
270 d->nextcolumn[d->columnlist[k]] = d->columnlist[k+1];
271 d->prevcolumn[d->columnlist[k+1]] = d->columnlist[k];
273 d->nextcolumn[d->columnlist[k]] = -1;
274 d->prevcolumn[d->columnlist[0]] = -1;
QAbstractItemView * view()
virtual void searchMoveToIterPos(const QModelIndex &pos)
virtual void searchAborted()
virtual QModelIndex searchIterAdvance(const QModelIndex &pos, bool forward)
virtual bool searchIterMatches(const QModelIndex &pos, const QString &queryString)
void setSearchColumns(const QList< int > &columnList)
virtual QModelIndex searchIterEnd()
void setSearchView(QAbstractItemView *view)
virtual void searchReinitialized()
virtual ~KLFItemViewSearchTarget()
virtual QModelIndex searchIterBegin()
QList< int > searchColumns()
KLFItemViewSearchTarget(QAbstractItemView *view, QObject *parent=NULL)
virtual void searchPerformed(const QModelIndex &resultMatchPosition, bool found, const QString &queryString)
virtual void searchAborted()
virtual void searchReinitialized()
#define KLF_DEBUG_BLOCK(msg)
Utility to debug the execution of a block.
#define KLF_ASSERT_NOT_NULL(ptr, msg, failaction)
Asserting Non-NULL pointers (NON-FATAL)
#define KLF_PRIVATE_HEAD(ClassName)
#define KLF_DELETE_PRIVATE
#define KLF_INIT_PRIVATE(ClassName)
virtual int columnCount(const QModelIndex &parent) const=0
QVariant data(int role) const
QModelIndex parent() const
QModelIndex sibling(int row, int column) const