Unity 8
modelprinter.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 // self
21 #include "modelprinter.h"
22 
23 #include <unitymenumodel.h>
24 
25 // Qt
26 #include <QTextStream>
27 
28 ModelPrinter::ModelPrinter(QObject *parent)
29  : QObject(parent)
30  , m_model(nullptr)
31 {
32 }
33 
34 void ModelPrinter::setSourceModel(UnityMenuModel * sourceModel)
35 {
36  if (m_model != nullptr) {
37  disconnect(m_model);
38  }
39  if (m_model != sourceModel) {
40  m_model = sourceModel;
41  Q_EMIT modelChanged();
42  Q_EMIT textChanged();
43  }
44  if (m_model != nullptr) {
45  connect(m_model, &UnityMenuModel::rowsInserted, this, &ModelPrinter::textChanged);
46  connect(m_model, &UnityMenuModel::rowsRemoved, this, &ModelPrinter::textChanged);
47  connect(m_model, &UnityMenuModel::dataChanged, this, &ModelPrinter::textChanged);
48  }
49 }
50 
51 UnityMenuModel* ModelPrinter::sourceModel() const
52 {
53  return m_model;
54 }
55 
56 QString ModelPrinter::text()
57 {
58  return getModelDataString(m_model, 0);
59 }
60 
61 QString tabify(int level) { QString str;
62  for (int i = 0; i < level; i++) {
63  str += QLatin1String(" ");
64  }
65  return str;
66 }
67 
68 QString ModelPrinter::getModelDataString(UnityMenuModel* sourceModel, int level)
69 {
70  if (!sourceModel)
71  return QLatin1String("");
72 
73  QString str;
74  QTextStream stream(&str);
75 
76  int rowCount = sourceModel->rowCount();
77  for (int row = 0; row < rowCount; row++) {
78 
79  stream << getRowSring(sourceModel, row, level) << endl;
80 
81  UnityMenuModel* childMenuModel = qobject_cast<UnityMenuModel*>(sourceModel->submenu(row));
82  if (childMenuModel) {
83 
84  if (!m_children.contains(childMenuModel)) {
85  m_children << childMenuModel;
86  connect(childMenuModel, &UnityMenuModel::rowsInserted, this, &ModelPrinter::textChanged);
87  connect(childMenuModel, &UnityMenuModel::rowsRemoved, this, &ModelPrinter::textChanged);
88  connect(childMenuModel, &UnityMenuModel::dataChanged, this, &ModelPrinter::textChanged);
89  }
90  stream << getModelDataString(childMenuModel, level+1);
91  }
92  }
93  return str;
94 }
95 
96 QString ModelPrinter::getRowSring(UnityMenuModel* sourceModel, int row, int depth) const
97 {
98  QString str;
99  QTextStream stream(&str);
100 
101  // Print out this row
102  QHash<int, QByteArray> roleNames = sourceModel->roleNames();
103  QList<int> roles = roleNames.keys();
104  qSort(roles);
105 
106  Q_FOREACH(int role, roles) {
107  const QByteArray& roleName = roleNames[role];
108  stream << tabify(depth) << getVariantString(roleName, sourceModel->get(row, roleName));
109  }
110  return str;
111 }
112 
113 QString ModelPrinter::getVariantString(const QString& roleName, const QVariant &vData) const
114 {
115  QString str;
116  QTextStream stream(&str);
117 
118  if (vData.canConvert(QMetaType::QVariantMap)) {
119  QMapIterator<QString, QVariant> iter(vData.toMap());
120  while (iter.hasNext()) {
121  iter.next();
122  stream << roleName
123  << "."
124  << iter.key()
125  << ": "
126  << iter.value().toString()
127  << endl;
128  }
129  }
130  else {
131  stream << roleName
132  << ": "
133  << vData.toString()
134  << endl;
135  }
136  return str;
137 }