Unity 8
 All Classes Functions
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  connect(model, &QObject::destroyed, this, [this] {
50  QMutableHashIterator<QByteArray, QWeakPointer<UnityMenuModel>> iter(m_registry);
51  while(iter.hasNext()) {
52  auto keyVal = iter.next();
53  if (keyVal.value().isNull()) {
54  iter.remove();
55  break;
56  }
57  }
58  });
59  m_registry[path] = menuModel.toWeakRef();
60 
61  menuModel->setMenuObjectPath(path);
62  return menuModel;
63 }
64 
65 bool UnityMenuModelCache::contains(const QByteArray& path)
66 {
67  return m_registry.contains(path);
68 }