File: MenuProxyModel.cpp

package info (click to toggle)
systemsettings 4%3A5.8.4-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 1,592 kB
  • ctags: 331
  • sloc: cpp: 2,634; makefile: 7; xml: 7; sh: 3
file content (111 lines) | stat: -rw-r--r-- 4,385 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/**************************************************************************
 * Copyright (C) 2009 Ben Cooksley <bcooksley@kde.org>                    *
 * Copyright (C) 2007 Will Stephenson <wstephenson@kde.org>               *
 *                                                                        *
 * This program is free software; you can redistribute it and/or          *
 * modify it under the terms of the GNU General Public License            *
 * as published by the Free Software Foundation; either version 2         *
 * of the License, or (at your option) any later version.                 *
 *                                                                        *
 * This program is distributed in the hope that it will be useful,        *
 * but WITHOUT ANY WARRANTY; without even the implied warranty of         *
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
 * GNU General Public License for more details.                           *
 *                                                                        *
 * You should have received a copy of the GNU General Public License      *
 * along with this program; if not, write to the Free Software            *
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA          *
 * 02110-1301, USA.                                                       *
***************************************************************************/

#include "MenuProxyModel.h"

#include "MenuItem.h"
#include "MenuModel.h"

MenuProxyModel::MenuProxyModel( QObject * parent )
    : KCategorizedSortFilterProxyModel( parent )
{
    setSortRole( MenuModel::UserSortRole );
    setFilterRole( MenuModel::UserFilterRole );
    setFilterCaseSensitivity( Qt::CaseInsensitive );
}

bool MenuProxyModel::lessThan( const QModelIndex &left, const QModelIndex &right ) const
{
    if( isCategorizedModel() ) {
        return KCategorizedSortFilterProxyModel::lessThan( left, right );
    }
    
    QVariant leftWeight = left.data( MenuModel::UserSortRole );
    QVariant rightWeight = right.data( MenuModel::UserSortRole );

    if ( leftWeight.toInt() == rightWeight.toInt() ) {
        return left.data().toString() < right.data().toString();
    }

    return leftWeight.toInt() < rightWeight.toInt();
}

bool MenuProxyModel::subSortLessThan( const QModelIndex &left, const QModelIndex &right ) const
{
    if( isCategorizedModel() ) {
        QVariant leftWeight = left.data( MenuModel::UserSortRole );
        QVariant rightWeight = right.data( MenuModel::UserSortRole );

        if ( !leftWeight.isValid() || !rightWeight.isValid() ) {
            return KCategorizedSortFilterProxyModel::subSortLessThan( left, right );
        } else {
            if ( leftWeight.toInt() == rightWeight.toInt() ) {
                return left.data().toString() < right.data().toString();
            } else {
                return leftWeight.toInt() < rightWeight.toInt();
            }
        }
     }
     return KCategorizedSortFilterProxyModel::subSortLessThan( left, right );
}


bool MenuProxyModel::filterAcceptsRow( int source_row, const QModelIndex &source_parent ) const
{
    QModelIndex index = sourceModel()->index( source_row, 0, source_parent );
    MenuItem * mItem = index.data( Qt::UserRole ).value<MenuItem*>();
    // accept only systemsettings categories that have children
    if ( mItem->children().isEmpty() && mItem->service()->serviceTypes().contains( "SystemSettingsCategory" ) ) {
        return false;
    } else {
        return true; // Items matching the regexp are disabled, not hidden
    }
}

Qt::ItemFlags MenuProxyModel::flags( const QModelIndex &index ) const
{
    if ( !index.isValid() ) {
        return Qt::NoItemFlags;
    }

    QString matchText = index.data( MenuModel::UserFilterRole ).toString();
    if( !matchText.contains( filterRegExp() ) ) {
        return Qt::NoItemFlags;
    } else {
        return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
    }
}

void MenuProxyModel::setFilterRegExp ( const QString & pattern )
{
    emit layoutAboutToBeChanged ();
    KCategorizedSortFilterProxyModel::setFilterRegExp( pattern );
    emit layoutChanged ();
}

void MenuProxyModel::setFilterRegExp ( const QRegExp & regExp )
{
    emit layoutAboutToBeChanged ();
    KCategorizedSortFilterProxyModel::setFilterRegExp( regExp );
    emit layoutChanged ();
}