KXmlGui

khelpmenu.cpp
1/*
2 This file is part of the KDE Libraries
3 SPDX-FileCopyrightText: 1999-2000 Espen Sand <espen@kde.org>
4
5 SPDX-License-Identifier: LGPL-2.0-or-later
6*/
7
8// I (espen) prefer that header files are included alphabetically
9
10#include "khelpmenu.h"
11
12#include <QAction>
13#include <QApplication>
14#include <QDesktopServices>
15#include <QDialogButtonBox>
16#include <QLabel>
17#include <QMenu>
18#include <QStandardPaths>
19#include <QStyle>
20#include <QTimer>
21#include <QUrl>
22#include <QWhatsThis>
23#include <QWidget>
24
25#include "kaboutapplicationdialog.h"
26#include "kaboutkdedialog_p.h"
27#include "kbugreport.h"
28#include "kswitchlanguagedialog_p.h"
29
30#include <KAboutData>
31#include <KAuthorized>
32#include <KLocalizedString>
33#include <KStandardActions>
34
35using namespace KDEPrivate;
36
37class KHelpMenuPrivate
38{
39public:
40 KHelpMenuPrivate()
41 : mAboutData(KAboutData::applicationData())
42 {
43 }
44 ~KHelpMenuPrivate()
45 {
46 delete mMenu;
47 delete mAboutApp;
48 delete mAboutKDE;
49 delete mBugReport;
50 delete mSwitchApplicationLanguage;
51 }
52
53 void createActions(KHelpMenu *q);
54
55 QMenu *mMenu = nullptr;
56 QDialog *mAboutApp = nullptr;
57 KAboutKdeDialog *mAboutKDE = nullptr;
58 KBugReport *mBugReport = nullptr;
59 QAction *mDonateAction = nullptr;
60 KSwitchLanguageDialog *mSwitchApplicationLanguage = nullptr;
61
62 // TODO evaluate if we use static_cast<QWidget*>(parent()) instead of mParent to win that bit of memory
63 QWidget *mParent = nullptr;
64 QString mAboutAppText;
65
66 bool mShowWhatsThis = false;
67 bool mActionsCreated = false;
68
69 QAction *mHandBookAction = nullptr;
70 QAction *mWhatsThisAction = nullptr;
71 QAction *mReportBugAction = nullptr;
72 QAction *mSwitchApplicationLanguageAction = nullptr;
73 QAction *mAboutAppAction = nullptr;
74 QAction *mAboutKDEAction = nullptr;
75
76 KAboutData mAboutData;
77};
78
79KHelpMenu::KHelpMenu(QWidget *parent, const QString &aboutAppText, bool showWhatsThis)
80 : QObject(parent)
81 , d(new KHelpMenuPrivate)
82{
83 d->mAboutAppText = aboutAppText;
84 d->mShowWhatsThis = showWhatsThis;
85 d->mParent = parent;
86 d->createActions(this);
87}
88
89KHelpMenu::KHelpMenu(QWidget *parent, const KAboutData &aboutData, bool showWhatsThis)
90 : QObject(parent)
91 , d(new KHelpMenuPrivate)
92{
93 d->mShowWhatsThis = showWhatsThis;
94 d->mParent = parent;
95 d->mAboutData = aboutData;
96 d->createActions(this);
97}
98
100{
101 delete d;
102}
103
104void KHelpMenuPrivate::createActions(KHelpMenu *q)
105{
106 if (mActionsCreated) {
107 return;
108 }
109 mActionsCreated = true;
110
111 if (KAuthorized::authorizeAction(QStringLiteral("help_contents"))) {
112 mHandBookAction = KStandardActions::helpContents(q, &KHelpMenu::appHelpActivated, q);
113 }
114 if (mShowWhatsThis && KAuthorized::authorizeAction(QStringLiteral("help_whats_this"))) {
115 mWhatsThisAction = KStandardActions::whatsThis(q, &KHelpMenu::contextHelpActivated, q);
116 }
117
118 if (KAuthorized::authorizeAction(QStringLiteral("help_report_bug")) && !mAboutData.bugAddress().isEmpty()) {
119 mReportBugAction = KStandardActions::reportBug(q, &KHelpMenu::reportBug, q);
120 }
121
122 if (KAuthorized::authorizeAction(QStringLiteral("help_donate")) && mAboutData.bugAddress() == QLatin1String("submit@bugs.kde.org")) {
123 mDonateAction = KStandardActions::donate(q, &KHelpMenu::donate, q);
124 }
125
126 if (KAuthorized::authorizeAction(QStringLiteral("switch_application_language"))) {
127 mSwitchApplicationLanguageAction = KStandardActions::switchApplicationLanguage(q, &KHelpMenu::switchApplicationLanguage, q);
128 }
129
130 if (KAuthorized::authorizeAction(QStringLiteral("help_about_app"))) {
131 mAboutAppAction = KStandardActions::aboutApp(q, &KHelpMenu::aboutApplication, q);
132 }
133
134 if (KAuthorized::authorizeAction(QStringLiteral("help_about_kde"))) {
135 mAboutKDEAction = KStandardActions::aboutKDE(q, &KHelpMenu::aboutKDE, q);
136 }
137}
138
139// Used in the non-xml-gui case, like kfind or ksnapshot's help button.
141{
142 if (!d->mMenu) {
143 d->mMenu = new QMenu(d->mParent);
144 connect(d->mMenu, &QObject::destroyed, this, &KHelpMenu::menuDestroyed);
145
146 d->mMenu->setTitle(i18n("&Help"));
147
148 d->createActions(this);
149
150 bool need_separator = false;
151 if (d->mHandBookAction) {
152 d->mMenu->addAction(d->mHandBookAction);
153 need_separator = true;
154 }
155
156 if (d->mWhatsThisAction) {
157 d->mMenu->addAction(d->mWhatsThisAction);
158 need_separator = true;
159 }
160
161 if (d->mReportBugAction) {
162 if (need_separator) {
163 d->mMenu->addSeparator();
164 }
165 d->mMenu->addAction(d->mReportBugAction);
166 need_separator = true;
167 }
168
169 if (d->mDonateAction) {
170 if (need_separator) {
171 d->mMenu->addSeparator();
172 }
173 d->mMenu->addAction(d->mDonateAction);
174 need_separator = true;
175 }
176
177 if (d->mSwitchApplicationLanguageAction) {
178 if (need_separator) {
179 d->mMenu->addSeparator();
180 }
181 d->mMenu->addAction(d->mSwitchApplicationLanguageAction);
182 need_separator = true;
183 }
184
185 if (need_separator) {
186 d->mMenu->addSeparator();
187 }
188
189 if (d->mAboutAppAction) {
190 d->mMenu->addAction(d->mAboutAppAction);
191 }
192
193 if (d->mAboutKDEAction) {
194 d->mMenu->addAction(d->mAboutKDEAction);
195 }
196 }
197
198 return d->mMenu;
199}
200
202{
203 switch (id) {
204 case menuHelpContents:
205 return d->mHandBookAction;
206
207 case menuWhatsThis:
208 return d->mWhatsThisAction;
209
210 case menuReportBug:
211 return d->mReportBugAction;
212
213 case menuSwitchLanguage:
214 return d->mSwitchApplicationLanguageAction;
215
216 case menuAboutApp:
217 return d->mAboutAppAction;
218
219 case menuAboutKDE:
220 return d->mAboutKDEAction;
221
222 case menuDonate:
223 return d->mDonateAction;
224 }
225
226 return nullptr;
227}
228
230{
231 QDesktopServices::openUrl(QUrl(QStringLiteral("help:/")));
232}
233
235{
236 if (receivers(SIGNAL(showAboutApplication())) > 0) {
238 } else {
239 if (!d->mAboutApp) {
240 d->mAboutApp = new KAboutApplicationDialog(d->mAboutData, d->mParent);
241 connect(d->mAboutApp, &QDialog::finished, this, &KHelpMenu::dialogFinished);
242 }
243 d->mAboutApp->show();
244 }
245}
246
248{
249 if (!d->mAboutKDE) {
250 d->mAboutKDE = new KAboutKdeDialog(d->mParent);
251 connect(d->mAboutKDE, &QDialog::finished, this, &KHelpMenu::dialogFinished);
252 }
253 d->mAboutKDE->show();
254}
255
257{
258 if (!d->mBugReport) {
259 d->mBugReport = new KBugReport(d->mAboutData, d->mParent);
260 connect(d->mBugReport, &QDialog::finished, this, &KHelpMenu::dialogFinished);
261 }
262 d->mBugReport->show();
263}
264
266{
267 if (!d->mSwitchApplicationLanguage) {
268 d->mSwitchApplicationLanguage = new KSwitchLanguageDialog(d->mParent);
269 connect(d->mSwitchApplicationLanguage, &QDialog::finished, this, &KHelpMenu::dialogFinished);
270 }
271 d->mSwitchApplicationLanguage->show();
272}
273
275{
276 QDesktopServices::openUrl(QUrl(QLatin1String("https://www.kde.org/donate?app=") + d->mAboutData.componentName()));
277}
278
279void KHelpMenu::dialogFinished()
280{
281 QTimer::singleShot(0, this, &KHelpMenu::timerExpired);
282}
283
284void KHelpMenu::timerExpired()
285{
286 if (d->mAboutKDE && !d->mAboutKDE->isVisible()) {
287 delete d->mAboutKDE;
288 d->mAboutKDE = nullptr;
289 }
290
291 if (d->mBugReport && !d->mBugReport->isVisible()) {
292 delete d->mBugReport;
293 d->mBugReport = nullptr;
294 }
295
296 if (d->mSwitchApplicationLanguage && !d->mSwitchApplicationLanguage->isVisible()) {
297 delete d->mSwitchApplicationLanguage;
298 d->mSwitchApplicationLanguage = nullptr;
299 }
300
301 if (d->mAboutApp && !d->mAboutApp->isVisible()) {
302 delete d->mAboutApp;
303 d->mAboutApp = nullptr;
304 }
305}
306
307void KHelpMenu::menuDestroyed()
308{
309 d->mMenu = nullptr;
310}
311
316
317#include "moc_khelpmenu.cpp"
Standard "About Application" dialog box.
QString componentName() const
QString bugAddress() const
static Q_INVOKABLE bool authorizeAction(const QString &action)
A dialog box for sending bug reports.
Definition kbugreport.h:34
Standard KDE help menu with dialog boxes.
Definition khelpmenu.h:109
QAction * action(MenuId id) const
Returns the QAction * associated with the given parameter Will return a nullptr if menu() has not bee...
void showAboutApplication()
This signal is emitted from aboutApplication() if no "about application" string has been defined.
void appHelpActivated()
Opens the help page for the application.
void contextHelpActivated()
Activates What's This help for the application.
QMenu * menu()
Returns a popup menu you can use in the menu bar or where you need it.
void aboutKDE()
Opens the standard "About KDE" dialog box.
~KHelpMenu() override
Destructor.
Definition khelpmenu.cpp:99
void switchApplicationLanguage()
Opens the changing default application language dialog box.
void reportBug()
Opens the standard "Report Bugs" dialog box.
void aboutApplication()
Opens an application specific dialog box.
void donate()
Opens the donate url.
KHelpMenu(QWidget *parent=nullptr, const QString &aboutAppText=QString(), bool showWhatsThis=true)
Constructor.
Definition khelpmenu.cpp:79
QString i18n(const char *text, const TYPE &arg...)
bool openUrl(const QUrl &url)
void finished(int result)
QAction * addAction(const QIcon &icon, const QString &text, Functor functor, const QKeySequence &shortcut)
QAction * addSeparator()
void setTitle(const QString &title)
Q_EMITQ_EMIT
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
void destroyed(QObject *obj)
QObject * parent() const const
int receivers(const char *signal) const const
bool isEmpty() const const
void enterWhatsThisMode()
void show()
bool isVisible() const const
This file is part of the KDE documentation.
Documentation copyright © 1996-2024 The KDE developers.
Generated on Fri Oct 11 2024 12:16:15 by doxygen 1.12.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.