1
/****************************************************************************
2
* Copyright (C) 2013-2014 by Savoir-Faire Linux *
3
* Author : Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> *
5
* This library is free software; you can redistribute it and/or *
6
* modify it under the terms of the GNU Lesser General Public *
7
* License as published by the Free Software Foundation; either *
8
* version 2.1 of the License, or (at your option) any later version. *
10
* This library is distributed in the hope that it will be useful, *
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
13
* Lesser General Public License for more details. *
15
* You should have received a copy of the GNU General Public License *
16
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
17
***************************************************************************/
18
#include "numbercategorymodel.h"
19
#include "visitors/numbercategoryvisitor.h"
20
#include "phonenumber.h"
21
#include "numbercategory.h"
23
NumberCategoryModel* NumberCategoryModel::m_spInstance = nullptr;
24
NumberCategory* NumberCategoryModel::m_spOther = nullptr;
26
NumberCategoryModel::NumberCategoryModel(QObject* parent) : QAbstractListModel(parent),m_pVisitor(nullptr)
31
//Abstract model member
32
QVariant NumberCategoryModel::data(const QModelIndex& index, int role) const
34
if (!index.isValid()) return QVariant();
37
return m_lCategories[index.row()]->category->name();
38
case Qt::DecorationRole:
39
return m_lCategories[index.row()]->category->icon();//m_pVisitor->icon(m_lCategories[index.row()]->icon);
40
case Qt::CheckStateRole:
41
return m_lCategories[index.row()]->enabled?Qt::Checked:Qt::Unchecked;
43
return m_lCategories[index.row()]->index;
45
return 'x'+QString::number(m_lCategories[index.row()]->counter);
50
int NumberCategoryModel::rowCount(const QModelIndex& parent) const
52
if (parent.isValid()) return 0;
53
return m_lCategories.size();
56
Qt::ItemFlags NumberCategoryModel::flags(const QModelIndex& index) const
59
return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable;
62
bool NumberCategoryModel::setData(const QModelIndex& idx, const QVariant &value, int role)
64
if (idx.isValid() && role == Qt::CheckStateRole) {
65
m_lCategories[idx.row()]->enabled = value.toBool();
66
emit dataChanged(idx,idx);
72
NumberCategory* NumberCategoryModel::addCategory(const QString& name, QPixmap* icon, int index, bool enabled)
74
InternalTypeRepresentation* rep = m_hByName[name];
76
rep = new InternalTypeRepresentation();
79
NumberCategory* cat = new NumberCategory(this,name);
83
rep->enabled = enabled;
84
m_hByIdx[index] = rep ;
85
m_hByName[name] = rep ;
86
m_lCategories << rep ;
87
emit layoutChanged() ;
91
NumberCategoryModel* NumberCategoryModel::instance()
94
m_spInstance = new NumberCategoryModel();
98
void NumberCategoryModel::setIcon(int idx, QPixmap* icon)
100
InternalTypeRepresentation* rep = m_hByIdx[idx];
102
rep->category->setIcon(icon);
103
emit dataChanged(index(m_lCategories.indexOf(rep),0),index(m_lCategories.indexOf(rep),0));
107
void NumberCategoryModel::setVisitor(NumberCategoryVisitor* visitor)
109
m_pVisitor = visitor;
110
m_pVisitor->load(this);
113
NumberCategoryVisitor* NumberCategoryModel::visitor() const
118
void NumberCategoryModel::save()
121
m_pVisitor->serialize(this);
124
qDebug() << "Cannot save NumberCategoryModel as there is no defined backend";
127
QModelIndex NumberCategoryModel::nameToIndex(const QString& name) const
129
if (!m_hByName[name])
130
return QModelIndex();
132
return index(m_hByName[name]->index,0);
136
///Be sure the category exist, increment the counter
137
void NumberCategoryModel::registerNumber(PhoneNumber* number)
139
InternalTypeRepresentation* rep = m_hByName[number->category()->name()];
141
addCategory(number->category()->name(),nullptr,-1,true);
142
rep = m_hByName[number->category()->name()];
147
void NumberCategoryModel::unregisterNumber(PhoneNumber* number)
149
InternalTypeRepresentation* rep = m_hByName[number->category()->name()];
154
NumberCategory* NumberCategoryModel::getCategory(const QString& type)
156
InternalTypeRepresentation* internal = m_hByName[type];
158
return internal->category;
159
return addCategory(type,nullptr);
163
NumberCategory* NumberCategoryModel::other()
165
if (instance()->m_hByName["Other"])
166
return instance()->m_hByName["Other"]->category;
168
m_spOther = new NumberCategory(instance(),"Other");