homescreenapp/stateplugins/hsapplibrarystateplugin/src/hssearchfilterproxymodel.cpp
author hgs
Mon, 20 Sep 2010 10:19:07 +0300
changeset 90 3ac3aaebaee5
child 98 e6f74eb7f69f
permissions -rw-r--r--
201037
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
90
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
 * All rights reserved.
hgs
parents:
diff changeset
     4
 * This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
 * under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
 * which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
 *
hgs
parents:
diff changeset
     9
 * Initial Contributors:
hgs
parents:
diff changeset
    10
 * Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
 *
hgs
parents:
diff changeset
    12
 * Contributors:
hgs
parents:
diff changeset
    13
 *
hgs
parents:
diff changeset
    14
 * Description: Proxy model for search and highlight items view.
hgs
parents:
diff changeset
    15
 *
hgs
parents:
diff changeset
    16
 */
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include <QObject>
hgs
parents:
diff changeset
    19
#include <hbcolorscheme.h>
hgs
parents:
diff changeset
    20
#include <caitemmodel.h>
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
#include "hssearchfilterproxymodel.h"
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
/*!
hgs
parents:
diff changeset
    25
 \class HsSearchFilterProxyModel
hgs
parents:
diff changeset
    26
 \ingroup group_hsmenustateplugin
hgs
parents:
diff changeset
    27
 \brief Proxy Model for highlight search string.
hgs
parents:
diff changeset
    28
 Highlight search string in model item title.
hgs
parents:
diff changeset
    29
 \lib ?library
hgs
parents:
diff changeset
    30
 \see QSortFilterProxyModel
hgs
parents:
diff changeset
    31
 */
hgs
parents:
diff changeset
    32
hgs
parents:
diff changeset
    33
/*!
hgs
parents:
diff changeset
    34
 Constructor.
hgs
parents:
diff changeset
    35
 \param parent parent for object.
hgs
parents:
diff changeset
    36
 */
hgs
parents:
diff changeset
    37
HsSearchFilterProxyModel::HsSearchFilterProxyModel(QObject *parent) :
hgs
parents:
diff changeset
    38
    QSortFilterProxyModel(parent),
hgs
parents:
diff changeset
    39
    mInSettingFilterString(false)
hgs
parents:
diff changeset
    40
{
hgs
parents:
diff changeset
    41
}
hgs
parents:
diff changeset
    42
hgs
parents:
diff changeset
    43
/*
hgs
parents:
diff changeset
    44
 Destructor.
hgs
parents:
diff changeset
    45
 */
hgs
parents:
diff changeset
    46
HsSearchFilterProxyModel::~HsSearchFilterProxyModel()
hgs
parents:
diff changeset
    47
{
hgs
parents:
diff changeset
    48
}
hgs
parents:
diff changeset
    49
hgs
parents:
diff changeset
    50
/*
hgs
parents:
diff changeset
    51
The data() method is overridden to have a place where the highlighting
hgs
parents:
diff changeset
    52
 is added to the item data. In this implementation HTML-tags for 
hgs
parents:
diff changeset
    53
 background color are added to the beginning and end of the match 
hgs
parents:
diff changeset
    54
 in the data method using HbColorScheme.
hgs
parents:
diff changeset
    55
 \param index source parent index.
hgs
parents:
diff changeset
    56
 \param role item role.
hgs
parents:
diff changeset
    57
 */
hgs
parents:
diff changeset
    58
QVariant HsSearchFilterProxyModel::data(const QModelIndex &index, 
hgs
parents:
diff changeset
    59
        int role) const
hgs
parents:
diff changeset
    60
{
hgs
parents:
diff changeset
    61
    QColor highlight = HbColorScheme::color("qtc_lineedit_marker_normal");
hgs
parents:
diff changeset
    62
    QColor color = HbColorScheme::color("qtc_lineedit_selected");
hgs
parents:
diff changeset
    63
    
hgs
parents:
diff changeset
    64
    if (role == Qt::DisplayRole && !mFilterCriteria.isEmpty()) {
hgs
parents:
diff changeset
    65
        QStringList textList = 
hgs
parents:
diff changeset
    66
                QSortFilterProxyModel::data(index, role).toStringList();
hgs
parents:
diff changeset
    67
        if(!textList[0].isEmpty())
hgs
parents:
diff changeset
    68
        {
hgs
parents:
diff changeset
    69
            QString start = QString(
hgs
parents:
diff changeset
    70
                    TAG_START).arg( highlight.name().toUpper() ).arg(color.name().toUpper());
hgs
parents:
diff changeset
    71
            int pos = textList[0].indexOf(mFilterCriteria, 0,Qt::CaseInsensitive);
hgs
parents:
diff changeset
    72
            textList[0].insert(pos, start);
hgs
parents:
diff changeset
    73
            textList[0].insert(pos + start.length() + mFilterCriteria.length(), TAG_END);
hgs
parents:
diff changeset
    74
        }
hgs
parents:
diff changeset
    75
        
hgs
parents:
diff changeset
    76
        return QVariant(textList);
hgs
parents:
diff changeset
    77
    }
hgs
parents:
diff changeset
    78
        return QSortFilterProxyModel::data(index, role);
hgs
parents:
diff changeset
    79
hgs
parents:
diff changeset
    80
}
hgs
parents:
diff changeset
    81
/*
hgs
parents:
diff changeset
    82
SetFilterString is the way to set the filtering criteria that is used
hgs
parents:
diff changeset
    83
 in highlight filtering. 
hgs
parents:
diff changeset
    84
 QSortFilterProxyModel does not allow overriding its own filtering 
hgs
parents:
diff changeset
    85
 criteria setting methods, so a separate method is added in the 
hgs
parents:
diff changeset
    86
 HighlightFilterProxyModel. 
hgs
parents:
diff changeset
    87
 This method stores the current filtering criteria and it can be 
hgs
parents:
diff changeset
    88
 used in the data() method in highlighting the matches. 
hgs
parents:
diff changeset
    89
 The method also calls the QSortFilterProxyModel method for setting 
hgs
parents:
diff changeset
    90
 the filterCriteria. This triggers the base class to do the actual 
hgs
parents:
diff changeset
    91
 filtering.
hgs
parents:
diff changeset
    92
 \param index source parent index.
hgs
parents:
diff changeset
    93
 \param role item role.
hgs
parents:
diff changeset
    94
 */
hgs
parents:
diff changeset
    95
void HsSearchFilterProxyModel::setFilterString(const QString &filterCriteria)
hgs
parents:
diff changeset
    96
{
hgs
parents:
diff changeset
    97
    mInSettingFilterString = true;
hgs
parents:
diff changeset
    98
    mFilterCriteria = filterCriteria;
hgs
parents:
diff changeset
    99
    setFilterRegExp(
hgs
parents:
diff changeset
   100
            QRegExp("(^|\\b)" + filterCriteria, Qt::CaseInsensitive));
hgs
parents:
diff changeset
   101
    mInSettingFilterString = false;
hgs
parents:
diff changeset
   102
}
hgs
parents:
diff changeset
   103
hgs
parents:
diff changeset
   104
QString HsSearchFilterProxyModel::filterString() const
hgs
parents:
diff changeset
   105
{
hgs
parents:
diff changeset
   106
    return mFilterCriteria;
hgs
parents:
diff changeset
   107
}
hgs
parents:
diff changeset
   108
hgs
parents:
diff changeset
   109
/*
hgs
parents:
diff changeset
   110
 Reimplementated from QSortFilterProxyModel.
hgs
parents:
diff changeset
   111
 The filterAcceptsRow method is overridden to send a dataChanged signal 
hgs
parents:
diff changeset
   112
 to the list view item
hgs
parents:
diff changeset
   113
 \param source_row row in source model.
hgs
parents:
diff changeset
   114
 \param source_parent source parent index.
hgs
parents:
diff changeset
   115
 */
hgs
parents:
diff changeset
   116
bool HsSearchFilterProxyModel::filterAcceptsRow (int source_row, 
hgs
parents:
diff changeset
   117
        const QModelIndex &source_parent) const
hgs
parents:
diff changeset
   118
{
hgs
parents:
diff changeset
   119
    bool retVal = QSortFilterProxyModel::filterAcceptsRow(source_row, 
hgs
parents:
diff changeset
   120
            source_parent);
hgs
parents:
diff changeset
   121
    if (mInSettingFilterString && retVal) {
hgs
parents:
diff changeset
   122
        QModelIndex mi = mapFromSource(sourceModel()->index(source_row, 0, 
hgs
parents:
diff changeset
   123
                source_parent));
hgs
parents:
diff changeset
   124
        emit const_cast<HsSearchFilterProxyModel*>(this)->dataChanged(mi, mi);
hgs
parents:
diff changeset
   125
    }
hgs
parents:
diff changeset
   126
    return retVal;
hgs
parents:
diff changeset
   127
}
hgs
parents:
diff changeset
   128
hgs
parents:
diff changeset
   129
hgs
parents:
diff changeset
   130