21#include "modelprinter.h"
23#include <ayatanamenumodel.h>
28ModelPrinter::ModelPrinter(QObject *parent)
34void ModelPrinter::setSourceModel(AyatanaMenuModel * sourceModel)
36 if (m_model !=
nullptr) {
39 if (m_model != sourceModel) {
40 m_model = sourceModel;
41 Q_EMIT modelChanged();
44 if (m_model !=
nullptr) {
45 connect(m_model, &AyatanaMenuModel::rowsInserted,
this, &ModelPrinter::textChanged);
46 connect(m_model, &AyatanaMenuModel::rowsRemoved,
this, &ModelPrinter::textChanged);
47 connect(m_model, &AyatanaMenuModel::dataChanged,
this, &ModelPrinter::textChanged);
51AyatanaMenuModel* ModelPrinter::sourceModel()
const
56QString ModelPrinter::text()
58 return getModelDataString(m_model, 0);
61QString tabify(
int level) { QString str;
62 for (
int i = 0; i < level; i++) {
63 str += QLatin1String(
" ");
68QString ModelPrinter::getModelDataString(AyatanaMenuModel* sourceModel,
int level)
71 return QLatin1String(
"");
74 QTextStream stream(&str);
76 int rowCount = sourceModel->rowCount();
77 for (
int row = 0; row < rowCount; row++) {
79#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)
80 stream << getRowSring(sourceModel, row, level) << Qt::endl;
82 stream << getRowSring(sourceModel, row, level) << endl;
85 AyatanaMenuModel* childMenuModel = qobject_cast<AyatanaMenuModel*>(sourceModel->submenu(row));
88 if (!m_children.contains(childMenuModel)) {
89 m_children << childMenuModel;
90 connect(childMenuModel, &AyatanaMenuModel::rowsInserted,
this, &ModelPrinter::textChanged);
91 connect(childMenuModel, &AyatanaMenuModel::rowsRemoved,
this, &ModelPrinter::textChanged);
92 connect(childMenuModel, &AyatanaMenuModel::dataChanged,
this, &ModelPrinter::textChanged);
94 stream << getModelDataString(childMenuModel, level+1);
100QString ModelPrinter::getRowSring(AyatanaMenuModel* sourceModel,
int row,
int depth)
const
103 QTextStream stream(&str);
106 QHash<int, QByteArray> roleNames = sourceModel->roleNames();
107 QList<int> roles = roleNames.keys();
108 std::sort(roles.begin(), roles.end());
110 Q_FOREACH(
int role, roles) {
111 const QByteArray& roleName = roleNames[role];
112 stream << getVariantString(roleName, sourceModel->get(row, roleName), depth);
117QString ModelPrinter::getVariantString(
const QVariant& vData)
const
119 if (vData.type() == QVariant::List) {
121 for (
const auto& v : vData.toList())
122 strList.append(getVariantString(v));
124 return '[' + strList.join(
", ") +
']';
127 return vData.toString();
130QString ModelPrinter::getVariantString(
const QString& roleName,
const QVariant &vData,
int depth)
const
133 QTextStream stream(&str);
135 if (vData.canConvert(QMetaType::QVariantMap)) {
136 QMapIterator<QString, QVariant> iter(vData.toMap());
137 while (iter.hasNext()) {
139 stream << tabify(depth);
144 << getVariantString(iter.value())
145#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)
153 stream << tabify(depth);
156 << getVariantString(vData)
157#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)