20 #include "indicatorsmodel.h"
21 #include "indicatorsmanager.h"
22 #include "indicator.h"
23 #include "indicators.h"
27 #include <QQmlContext>
53 IndicatorsModel::IndicatorsModel(QObject *parent)
54 : QAbstractListModel(parent)
56 m_manager =
new IndicatorsManager(
this);
57 QObject::connect(m_manager, SIGNAL(indicatorLoaded(
const QString&)),
this, SLOT(onIndicatorLoaded(
const QString&)));
58 QObject::connect(m_manager, SIGNAL(indicatorAboutToBeUnloaded(
const QString&)),
this, SLOT(onIndicatorAboutToBeUnloaded(
const QString&)));
60 QObject::connect(
this, SIGNAL(rowsInserted(
const QModelIndex &,
int,
int)),
this, SIGNAL(countChanged()));
61 QObject::connect(
this, SIGNAL(rowsRemoved(
const QModelIndex &,
int,
int)),
this, SIGNAL(countChanged()));
62 QObject::connect(
this, SIGNAL(modelReset()),
this, SIGNAL(countChanged()));
66 IndicatorsModel::~IndicatorsModel()
68 disconnect(m_manager, 0, 0, 0);
69 m_manager->deleteLater();
78 int IndicatorsModel::count()
const
88 void IndicatorsModel::load(
const QString& profile)
91 m_manager->load(profile);
99 void IndicatorsModel::unload()
105 void IndicatorsModel::onIndicatorLoaded(
const QString& indicator_name)
107 Indicator::Ptr indicator = m_manager->indicator(indicator_name);
113 if (m_indicators.indexOf(indicator) >= 0)
120 while (pos < count())
123 if (indicator->position() >= data(index(pos), IndicatorsModelRole::Position).toInt())
128 QObject::connect(indicator.data(), SIGNAL(identifierChanged(
const QString&)),
this, SLOT(onIdentifierChanged()));
129 QObject::connect(indicator.data(), SIGNAL(indicatorPropertiesChanged(
const QVariant&)),
this, SLOT(onIndicatorPropertiesChanged()));
131 beginInsertRows(QModelIndex(), pos, pos);
133 m_indicators.insert(pos, indicator);
138 void IndicatorsModel::onIndicatorAboutToBeUnloaded(
const QString& indicator_name)
140 Indicator::Ptr indicator = m_manager->indicator(indicator_name);
147 QMutableListIterator<Indicator::Ptr> iter(m_indicators);
148 while(iter.hasNext())
150 if (indicator == iter.next())
152 beginRemoveRows(QModelIndex(), i, i);
163 void IndicatorsModel::onIdentifierChanged()
165 notifyDataChanged(QObject::sender(), IndicatorsModelRole::Identifier);
169 void IndicatorsModel::onIndicatorPropertiesChanged()
171 notifyDataChanged(QObject::sender(), IndicatorsModelRole::IndicatorProperties);
175 void IndicatorsModel::notifyDataChanged(QObject *sender,
int role)
177 Indicator* indicator = qobject_cast<Indicator*>(sender);
184 QMutableListIterator<Indicator::Ptr> iter(m_indicators);
185 while(iter.hasNext())
187 if (indicator == iter.next())
189 QModelIndex changedIndex = this->index(index);
190 dataChanged(changedIndex, changedIndex, QVector<int>() << role);
198 QHash<int, QByteArray> IndicatorsModel::roleNames()
const
200 static QHash<int, QByteArray> roles;
203 roles[IndicatorsModelRole::Identifier] =
"identifier";
204 roles[IndicatorsModelRole::Position] =
"position";
205 roles[IndicatorsModelRole::WidgetSource] =
"widgetSource";
206 roles[IndicatorsModelRole::PageSource] =
"pageSource";
207 roles[IndicatorsModelRole::IndicatorProperties] =
"indicatorProperties";
213 int IndicatorsModel::columnCount(
const QModelIndex &)
const
218 Q_INVOKABLE QVariant IndicatorsModel::data(
int row,
int role)
const
220 return data(index(row, 0), role);
224 QVariant IndicatorsModel::data(
const QModelIndex &index,
int role)
const
226 if (!index.isValid() || index.row() >= m_indicators.size())
229 Indicator::Ptr indicator = m_indicators[index.row()];
233 case IndicatorsModelRole::Identifier:
236 return QVariant(indicator->identifier());
239 case IndicatorsModelRole::Position:
242 return QVariant(indicator->position());
245 case IndicatorsModelRole::IndicatorProperties:
248 return QVariant(indicator->indicatorProperties());
251 case IndicatorsModelRole::WidgetSource:
252 return qmlDirectory()+
"/Panel/Indicators/DefaultIndicatorWidget.qml";
253 case IndicatorsModelRole::PageSource:
254 return qmlDirectory()+
"/Panel/Indicators/DefaultIndicatorPage.qml";
262 QModelIndex IndicatorsModel::parent(
const QModelIndex&)
const
264 return QModelIndex();
268 int IndicatorsModel::rowCount(
const QModelIndex&)
const
270 return m_indicators.count();