Purpose

menu.cpp
1/*
2 SPDX-FileCopyrightText: 2015 Aleix Pol Gonzalez <aleixpol@blue-systems.com>
3
4 SPDX-License-Identifier: LGPL-2.1-or-later
5*/
6
7#include "menu.h"
8#include <KLocalizedContext>
9#include <QDebug>
10#include <QPointer>
11#include <QQmlApplicationEngine>
12#include <QQmlContext>
13#include <purpose/alternativesmodel.h>
14#include <purpose/configuration.h>
15
16using namespace Purpose;
17
18class Purpose::MenuPrivate : public QObject
19{
21public:
22 MenuPrivate(Menu *qq)
23 : QObject(qq)
24 , m_model(new AlternativesModel(qq))
25 , q(qq)
26 {
27 }
28
29 ~MenuPrivate() override
30 {
31 if (m_engine) {
32 m_engine->deleteLater();
33 }
34 }
35
36 void trigger(int row)
37 {
38 if (!m_engine) {
39 m_engine = new QQmlApplicationEngine;
40 m_engine->rootContext()->setContextObject(new KLocalizedContext(this));
41 m_engine->load(QUrl(QStringLiteral("qrc:/JobDialog.qml")));
42 }
43
44 Q_ASSERT(!m_engine->rootObjects().isEmpty());
45 QObject *o = m_engine->rootObjects().at(0);
46
47 if (!o) {
48 qWarning() << Q_FUNC_INFO << "object is NULL at m_engine" << m_engine << "rootObjects=" << m_engine->rootObjects();
49 return;
50 }
51
52 o->setProperty("model", QVariant::fromValue(m_model.data()));
53 o->setProperty("index", row);
54 o->setProperty("visible", true);
55 o->setProperty("q", QVariant::fromValue<QObject *>(q));
56 o->setParent(q);
57
58 QMetaObject::invokeMethod(o, "start");
59 }
60
61public:
62 QQmlApplicationEngine *m_engine = nullptr;
64 Purpose::Menu *q;
65};
66
67Menu::Menu(QWidget *parent)
68 : QMenu(parent)
69 , d_ptr(new MenuPrivate(this))
70{
71 connect(d_ptr->m_model.data(), &AlternativesModel::inputDataChanged, this, &Menu::reload);
72 connect(this, &QMenu::triggered, this, [this](QAction *action) {
73 Q_D(Menu);
74 d->trigger(action->property("row").toInt());
75 });
76}
77
78void Menu::reload()
79{
80 Q_D(Menu);
81 clear();
82 for (int i = 0, c = d->m_model->rowCount(); i != c; ++i) {
83 QModelIndex idx = d->m_model->index(i);
84 QAction *a = addAction(idx.data(AlternativesModel::ActionDisplayRole).toString());
87 a->setProperty("pluginId", idx.data(AlternativesModel::PluginIdRole));
88 a->setProperty("row", i);
89 }
90
91 setEnabled(!isEmpty());
92}
93
94AlternativesModel *Menu::model() const
95{
96 Q_D(const Menu);
97 return d->m_model.data();
98}
99
100#include "menu.moc"
101#include "moc_menu.cpp"
Interface for client applications to share data.
KGuiItem clear()
void setIcon(const QIcon &icon)
void setToolTip(const QString &tip)
void triggered(QAction *action)
bool invokeMethod(QObject *context, Functor &&function, FunctorReturnType *ret)
QVariant data(int role) const const
Q_OBJECTQ_OBJECT
void deleteLater()
QVariant property(const char *name) const const
void setParent(QObject *parent)
bool setProperty(const char *name, QVariant &&value)
void load(const QString &filePath)
QList< QObject * > rootObjects() const const
void setContextObject(QObject *object)
QQmlContext * rootContext() const const
ToolTipRole
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)
QVariant fromValue(T &&value)
int toInt(bool *ok) const const
QString toString() const const
T value() const const
Q_D(Todo)
This file is part of the KDE documentation.
Documentation copyright © 1996-2024 The KDE developers.
Generated on Tue Mar 26 2024 11:14:05 by doxygen 1.10.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.