@@ -17,8 +17,8 @@
1717// self
1818#include "visibleindicatorsmodel.h"
1919#include "rootactionstate.h"
20−#include "indicatorsmodel.h"
2120#include "indicators.h"
21+#include "cachedunitymenumodel.h"
2222
2323#include <unitymenumodel.h>
2424
@@ -26,8 +26,7 @@
2626#include <QDebug>
2727
2828VisibleIndicatorsModel::VisibleIndicatorsModel(QObject *parent)
29− : QIdentityProxyModel(parent),
30− m_model(NULL)
29+ : QIdentityProxyModel(parent)
3130{
3231 connect(this, SIGNAL(modelReset()), SIGNAL(countChanged()));
3332 connect(this, SIGNAL(rowsInserted(QModelIndex,int,int)), SIGNAL(countChanged()));
@@ -38,6 +37,10 @@ VisibleIndicatorsModel::~VisibleIndicatorsModel()
3837{
3938 qDeleteAll(m_rootActions);
4039 m_rootActions.clear();
40+
41+ qDeleteAll(m_cachedModels);
42+ m_cachedModels.clear();
43+
4144 m_visible.clear();
4245}
4346
@@ -46,12 +49,12 @@ QHash<int, QByteArray> VisibleIndicatorsModel::roleNames() const
4649 return sourceModel() ? sourceModel()->roleNames() : QHash<int, QByteArray>();
4750}
4851
49−QByteArray VisibleIndicatorsModel::profile() const
52+QString VisibleIndicatorsModel::profile() const
5053{
5154 return m_profile;
5255}
5356
54−void VisibleIndicatorsModel::setProfile(const QByteArray& profile)
57+void VisibleIndicatorsModel::setProfile(const QString& profile)
5558{
5659 if (m_profile != profile) {
5760 m_profile = profile;
@@ -59,15 +62,9 @@ void VisibleIndicatorsModel::setProfile(const QByteArray& profile)
5962 }
6063}
6164
62−IndicatorsModel* VisibleIndicatorsModel::model() const
63−{
64− return m_model;
65−}
66−
67−void VisibleIndicatorsModel::setModel(IndicatorsModel *itemModel)
65+void VisibleIndicatorsModel::setModel(QAbstractItemModel *itemModel)
6866{
69− if (itemModel != m_model) {
70− m_model = itemModel;
67+ if (itemModel != sourceModel()) {
7168 if (sourceModel() != NULL) {
7269 sourceModel()->disconnect(this);
7370 }
@@ -89,30 +86,20 @@ void VisibleIndicatorsModel::setModel(IndicatorsModel *itemModel)
8986
9087void VisibleIndicatorsModel::sourceRowsInserted(const QModelIndex&, int start, int end)
9188{
92− if (!m_model) {
93− return;
94− }
95−
9689 for (int row = start; row <= end; row++) {
97− const QModelIndex idx = sourceModel()->index(row, 0);
98− if (!idx.isValid()) {
99− continue;
100− }
101−
10290 RootActionState* actionState = new RootActionState();
10391 connect(actionState, SIGNAL(updated()), SLOT(onActionStateUpdated()));
10492 m_rootActions.insert(row, actionState);
10593 m_visible.insert(row, false);
10694
107− UnityMenuModel* unityModel = qobject_cast<UnityMenuModel*>(m_model->getMenuModelForIndexProfile(idx, profile()));
108− actionState->setMenu(unityModel);
95+ m_cachedModels.insert(row, new CachedUnityMenuModel);
96+ updateCachedModel(sourceModel()->index(row, 0));
10997 }
11098}
11199
112100void VisibleIndicatorsModel::sourceRowsAboutToBeRemoved(const QModelIndex&, int start, int end)
113101{
114102 for (int row = start; row <= end; row++) {
115−
116103 if (m_rootActions.count() > start) {
117104 delete m_rootActions[start];
118105 m_rootActions.removeAt(start);
@@ -120,23 +107,17 @@ void VisibleIndicatorsModel::sourceRowsAboutToBeRemoved(const QModelIndex&, int
120107 if (m_visible.count() > start) {
121108 m_visible.removeAt(start);
122109 }
110+ if (m_cachedModels.count() > start) {
111+ delete m_cachedModels[start];
112+ m_cachedModels.removeAt(start);
113+ }
123114 }
124115}
125116
126117void VisibleIndicatorsModel::sourceDataChanged(const QModelIndex& topRight, const QModelIndex& bottomRight)
127118{
128119 for (int row = topRight.row(); row <= bottomRight.row(); row++) {
129−
130− const QModelIndex idx = sourceModel()->index(row, 0);
131− if (!idx.isValid()) {
132− continue;
133− }
134− if (m_rootActions.count() <= row) {
135− break;
136− }
137−
138− UnityMenuModel* unityModel = qobject_cast<UnityMenuModel*>(m_model->getMenuModelForIndexProfile(idx, profile()));
139− m_rootActions[row]->setMenu(unityModel);
120+ updateCachedModel(sourceModel()->index(row, 0));
140121 }
141122}
142123
@@ -171,3 +152,40 @@ QVariant VisibleIndicatorsModel::data(const QModelIndex &index, int role) const
171152
172153 return m_visible[index.row()];
173154}
155+
156+void VisibleIndicatorsModel::updateCachedModel(const QModelIndex& index)
157+{
158+ if (!index.isValid()) {
159+ return;
160+ }
161+ QVariant data = sourceModel()->data(index, IndicatorsModelRole::IndicatorProperties);
162+ if (!data.isValid()) {
163+ return;
164+ }
165+ int row = index.row();
166+
167+ if (m_cachedModels.count() <= row) {
168+ return;
169+ }
170+ CachedUnityMenuModel* cachedModel = m_cachedModels[row];
171+
172+ QVariantMap properties = data.toMap();
173+
174+ QVariantMap menuObjectPaths = properties["menuObjectPaths"].toMap();
175+ if (!menuObjectPaths.contains(m_profile)) {
176+ return;
177+ }
178+
179+ QString menuObjectPath = menuObjectPaths[m_profile].toString();
180+ QString busName = properties["busName"].toString();
181+ QString actionsObjectPath = properties["actionsObjectPath"].toString();
182+
183+ cachedModel->setBusName(busName);
184+ cachedModel->setMenuObjectPath(menuObjectPath);
185+ QVariantMap actions; actions["indicator"] = actionsObjectPath;
186+ cachedModel->setActions(actions);
187+
188+ if (m_rootActions.count() > row) {
189+ m_rootActions[row]->setMenu(cachedModel->model());
190+ }
191+}