Unity 8
unitymenumodelcache.cpp
1 /*
2  * Copyright 2013 Canonical Ltd.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU Lesser General Public License as published by
6  * the Free Software Foundation; version 3.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU Lesser General Public License for more details.
12  *
13  * You should have received a copy of the GNU Lesser General Public License
14  * along with this program. If not, see <http://www.gnu.org/licenses/>.
15  *
16  * Authors:
17  * Nick Dedekind <nick.dedekind@canonical.com>
18  */
19 
20 #include "unitymenumodelcache.h"
21 #include <unitymenumodel.h>
22 
23 #include <QQmlEngine>
24 
25 QPointer<UnityMenuModelCache> UnityMenuModelCache::theCache = nullptr;
26 
27 UnityMenuModelCache* UnityMenuModelCache::singleton()
28 {
29  if (theCache.isNull()) {
30  theCache = new UnityMenuModelCache();
31  }
32  return theCache.data();
33 }
34 
35 UnityMenuModelCache::UnityMenuModelCache(QObject* parent)
36  : QObject(parent)
37 {
38 }
39 
40 QSharedPointer<UnityMenuModel> UnityMenuModelCache::model(const QByteArray& path)
41 {
42  if (m_registry.contains(path))
43  return m_registry[path];
44 
45  UnityMenuModel* model = new UnityMenuModel;
46  QQmlEngine::setObjectOwnership(model, QQmlEngine::CppOwnership);
47 
48  QSharedPointer<UnityMenuModel> menuModel(model);
49 
50  // Keep a shared pointer (rather than weak pointer which would cause the
51  // model to be deleted when all shared pointers we give out are deleted).
52  // We want to keep all models cached because when we switch indicator
53  // profiles, we will be switching paths often. And we want to keep the
54  // old model around, ready to be used. Otherwise the UI might momentarily
55  // wait as we populate the model from DBus yet again.
56  m_registry[path] = menuModel;
57 
58  menuModel->setMenuObjectPath(path);
59  return menuModel;
60 }
61 
62 bool UnityMenuModelCache::contains(const QByteArray& path)
63 {
64  return m_registry.contains(path);
65 }