Warning, file /pim/kalarm/src/newalarmaction.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001 /* 0002 * newalarmaction.cpp - menu action to select a new alarm type 0003 * Program: kalarm 0004 * SPDX-FileCopyrightText: 2007-2021 David Jarvie <djarvie@kde.org> 0005 * 0006 * SPDX-License-Identifier: GPL-2.0-or-later 0007 */ 0008 0009 #include "newalarmaction.h" 0010 0011 #include "templatemenuaction.h" 0012 #include "resources/datamodel.h" 0013 #include "resources/resources.h" 0014 #include "resources/eventmodel.h" 0015 #include "lib/shellprocess.h" 0016 0017 #include <KActionCollection> 0018 #include <KGlobalAccel> 0019 #include <KLocalizedString> 0020 #include <KStandardShortcut> 0021 0022 #include <QMenu> 0023 0024 using namespace KAlarmCal; 0025 0026 #define DISP_ICON QStringLiteral("window-new") 0027 #define CMD_ICON QStringLiteral("new-command-alarm") 0028 #define MAIL_ICON QStringLiteral("mail-message-new") 0029 #define AUDIO_ICON QStringLiteral("new-audio-alarm") 0030 #define TEMPLATE_ICON QStringLiteral("document-new-from-template") 0031 #define DISP_KEY QKeySequence(Qt::CTRL | Qt::Key_D) 0032 #define CMD_KEY QKeySequence(Qt::CTRL | Qt::Key_C) 0033 #define MAIL_KEY QKeySequence(Qt::CTRL | Qt::Key_L) 0034 #define AUDIO_KEY QKeySequence(Qt::CTRL | Qt::Key_U) 0035 0036 0037 /****************************************************************************** 0038 * Create New Alarm actions as a menu containing each alarm type, and add to 0039 * the KActionCollection. 0040 */ 0041 NewAlarmAction::NewAlarmAction(bool templates, const QString& label, QObject* parent, KActionCollection* collection) 0042 : KActionMenu(QIcon::fromTheme(QStringLiteral("document-new")), label, parent) 0043 , mActionCollection(collection) 0044 { 0045 mDisplayAction = new QAction(QIcon::fromTheme(DISP_ICON), (templates ? i18nc("@item:inmenu", "Display Alarm Template") : i18nc("@action", "New Display Alarm")), parent); 0046 menu()->addAction(mDisplayAction); 0047 mTypes[mDisplayAction] = EditAlarmDlg::DISPLAY; 0048 mCommandAction = new QAction(QIcon::fromTheme(CMD_ICON), (templates ? i18nc("@item:inmenu", "Command Alarm Template") : i18nc("@action", "New Command Alarm")), parent); 0049 menu()->addAction(mCommandAction); 0050 mTypes[mCommandAction] = EditAlarmDlg::COMMAND; 0051 mEmailAction = new QAction(QIcon::fromTheme(MAIL_ICON), (templates ? i18nc("@item:inmenu", "Email Alarm Template") : i18nc("@action", "New Email Alarm")), parent); 0052 menu()->addAction(mEmailAction); 0053 mTypes[mEmailAction] = EditAlarmDlg::EMAIL; 0054 mAudioAction = new QAction(QIcon::fromTheme(AUDIO_ICON), (templates ? i18nc("@item:inmenu", "Audio Alarm Template") : i18nc("@action", "New Audio Alarm")), parent); 0055 menu()->addAction(mAudioAction); 0056 mTypes[mAudioAction] = EditAlarmDlg::AUDIO; 0057 if (!templates) 0058 { 0059 // Sub-menu is to create new alarms (not new alarm templates). 0060 if (!mActionCollection) 0061 { 0062 mDisplayAction->setShortcut(DISP_KEY); 0063 mCommandAction->setShortcut(CMD_KEY); 0064 mEmailAction->setShortcut(MAIL_KEY); 0065 mAudioAction->setShortcut(AUDIO_KEY); 0066 } 0067 0068 // Include New From Template only in non-template menu 0069 mTemplateAction = new TemplateMenuAction(QIcon::fromTheme(TEMPLATE_ICON), i18nc("@action", "New Alarm From Template"), parent); 0070 menu()->addAction(mTemplateAction); 0071 connect(mTemplateAction, &TemplateMenuAction::selected, this, &NewAlarmAction::selectedTemplate); 0072 connect(Resources::instance(), &Resources::settingsChanged, this, &NewAlarmAction::slotCalendarStatusChanged); 0073 connect(DataModel::allTemplateListModel(), &EventListModel::haveEventsStatus, this, &NewAlarmAction::slotCalendarStatusChanged); 0074 slotCalendarStatusChanged(); // initialise action states 0075 } 0076 setPopupMode(QToolButton::InstantPopup); 0077 connect(menu(), &QMenu::aboutToShow, this, &NewAlarmAction::slotInitMenu); 0078 connect(menu(), &QMenu::triggered, this, &NewAlarmAction::slotSelected); 0079 } 0080 0081 /****************************************************************************** 0082 */ 0083 void NewAlarmAction::setActionNames(const QString& displayName, const QString& commandName, 0084 const QString& emailName, const QString& audioName, 0085 const QString& templateName) 0086 { 0087 if (mActionCollection) 0088 { 0089 mActionCollection->addAction(displayName, mDisplayAction); 0090 mActionCollection->setDefaultShortcut(mDisplayAction, DISP_KEY); 0091 KGlobalAccel::setGlobalShortcut(mDisplayAction, QList<QKeySequence>()); // allow user to set a global shortcut 0092 0093 mActionCollection->addAction(commandName, mCommandAction); 0094 mActionCollection->setDefaultShortcut(mCommandAction, CMD_KEY); 0095 KGlobalAccel::setGlobalShortcut(mCommandAction, QList<QKeySequence>()); // allow user to set a global shortcut 0096 0097 mActionCollection->addAction(emailName, mEmailAction); 0098 mActionCollection->setDefaultShortcut(mEmailAction, MAIL_KEY); 0099 KGlobalAccel::setGlobalShortcut(mEmailAction, QList<QKeySequence>()); // allow user to set a global shortcut 0100 0101 mActionCollection->addAction(audioName, mAudioAction); 0102 mActionCollection->setDefaultShortcut(mAudioAction, AUDIO_KEY); 0103 KGlobalAccel::setGlobalShortcut(mAudioAction, QList<QKeySequence>()); // allow user to set a global shortcut 0104 0105 if (mTemplateAction) 0106 { 0107 Q_ASSERT(!templateName.isEmpty()); 0108 mActionCollection->addAction(templateName, mTemplateAction); 0109 } 0110 } 0111 } 0112 0113 /****************************************************************************** 0114 * Called when the action is clicked. 0115 */ 0116 void NewAlarmAction::slotInitMenu() 0117 { 0118 // Don't allow shell commands in kiosk mode 0119 mCommandAction->setEnabled(ShellProcess::authorised()); 0120 } 0121 0122 /****************************************************************************** 0123 * Called when an alarm type is selected from the New popup menu. 0124 */ 0125 void NewAlarmAction::slotSelected(QAction* action) 0126 { 0127 QMap<QAction*, EditAlarmDlg::Type>::ConstIterator it = mTypes.constFind(action); 0128 if (it != mTypes.constEnd()) 0129 Q_EMIT selected(it.value()); 0130 } 0131 0132 /****************************************************************************** 0133 * Called when the status of a calendar has changed. 0134 * Enable or disable the New From Template action appropriately. 0135 */ 0136 void NewAlarmAction::slotCalendarStatusChanged() 0137 { 0138 // Find whether there are any writable active alarm calendars 0139 bool active = !Resources::enabledResources(CalEvent::ACTIVE, true).isEmpty(); 0140 bool haveEvents = DataModel::allTemplateListModel()->haveEvents(); 0141 mTemplateAction->setEnabled(active && haveEvents); 0142 setEnabled(active); 0143 } 0144 0145 #include "moc_newalarmaction.cpp" 0146 0147 // vim: et sw=4: