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"