File indexing completed on 2024-04-28 04:00:33

0001 /*
0002     SPDX-FileCopyrightText: 2015 Aleix Pol Gonzalez <aleixpol@blue-systems.com>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-or-later
0005 */
0006 
0007 #include "menu.h"
0008 #include <KLocalizedContext>
0009 #include <QDebug>
0010 #include <QPointer>
0011 #include <QQmlApplicationEngine>
0012 #include <QQmlContext>
0013 #include <purpose/alternativesmodel.h>
0014 #include <purpose/configuration.h>
0015 
0016 using namespace Purpose;
0017 
0018 class Purpose::MenuPrivate : public QObject
0019 {
0020     Q_OBJECT
0021 public:
0022     MenuPrivate(Menu *qq)
0023         : QObject(qq)
0024         , m_model(new AlternativesModel(qq))
0025         , q(qq)
0026     {
0027     }
0028 
0029     ~MenuPrivate() override
0030     {
0031         if (m_engine) {
0032             m_engine->deleteLater();
0033         }
0034     }
0035 
0036     void trigger(int row)
0037     {
0038         if (!m_engine) {
0039             m_engine = new QQmlApplicationEngine;
0040             m_engine->rootContext()->setContextObject(new KLocalizedContext(this));
0041             m_engine->load(QUrl(QStringLiteral("qrc:/JobDialog.qml")));
0042         }
0043 
0044         Q_ASSERT(!m_engine->rootObjects().isEmpty());
0045         QObject *o = m_engine->rootObjects().at(0);
0046 
0047         if (!o) {
0048             qWarning() << Q_FUNC_INFO << "object is NULL at m_engine" << m_engine << "rootObjects=" << m_engine->rootObjects();
0049             return;
0050         }
0051 
0052         o->setProperty("model", QVariant::fromValue(m_model.data()));
0053         o->setProperty("index", row);
0054         o->setProperty("visible", true);
0055         o->setProperty("q", QVariant::fromValue<QObject *>(q));
0056         o->setParent(q);
0057 
0058         QMetaObject::invokeMethod(o, "start");
0059     }
0060 
0061 public:
0062     QQmlApplicationEngine *m_engine = nullptr;
0063     QPointer<AlternativesModel> m_model;
0064     Purpose::Menu *q;
0065 };
0066 
0067 Menu::Menu(QWidget *parent)
0068     : QMenu(parent)
0069     , d_ptr(new MenuPrivate(this))
0070 {
0071     connect(d_ptr->m_model.data(), &AlternativesModel::inputDataChanged, this, &Menu::reload);
0072     connect(this, &QMenu::triggered, this, [this](QAction *action) {
0073         Q_D(Menu);
0074         d->trigger(action->property("row").toInt());
0075     });
0076 }
0077 
0078 void Menu::reload()
0079 {
0080     Q_D(Menu);
0081     clear();
0082     for (int i = 0, c = d->m_model->rowCount(); i != c; ++i) {
0083         QModelIndex idx = d->m_model->index(i);
0084         QAction *a = addAction(idx.data(AlternativesModel::ActionDisplayRole).toString());
0085         a->setToolTip(idx.data(Qt::ToolTipRole).toString());
0086         a->setIcon(idx.data(Qt::DecorationRole).value<QIcon>());
0087         a->setProperty("pluginId", idx.data(AlternativesModel::PluginIdRole));
0088         a->setProperty("row", i);
0089     }
0090 
0091     setEnabled(!isEmpty());
0092 }
0093 
0094 AlternativesModel *Menu::model() const
0095 {
0096     Q_D(const Menu);
0097     return d->m_model.data();
0098 }
0099 
0100 #include "menu.moc"
0101 #include "moc_menu.cpp"