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: