File indexing completed on 2024-12-08 12:23:25
0001 /* 0002 This file is part of the KDE libraries 0003 SPDX-FileCopyrightText: 2005 Olivier Goffart <ogoffart at kde.org> 0004 0005 SPDX-License-Identifier: LGPL-2.0-only 0006 */ 0007 0008 #include "knotifyconfigwidget.h" 0009 #include "knotifyconfigactionswidget.h" 0010 #include "knotifyconfigelement.h" 0011 #include "knotifyeventlist.h" 0012 0013 #include <QDBusConnectionInterface> 0014 #include <QDialog> 0015 #include <QDialogButtonBox> 0016 #include <QPushButton> 0017 #include <QVBoxLayout> 0018 0019 #include <KLocalizedString> 0020 0021 class KNotifyConfigWidgetPrivate 0022 { 0023 public: 0024 KNotifyEventList *eventList; 0025 KNotifyConfigActionsWidget *actionsconfig; 0026 KNotifyConfigElement *currentElement; 0027 QString application; 0028 QString contextName; 0029 QString contextValue; 0030 }; 0031 0032 KNotifyConfigWidget::KNotifyConfigWidget(QWidget *parent) 0033 : QWidget(parent) 0034 , d(new KNotifyConfigWidgetPrivate) 0035 { 0036 d->currentElement = nullptr; 0037 d->eventList = new KNotifyEventList(this); 0038 d->eventList->setFocus(); 0039 d->actionsconfig = new KNotifyConfigActionsWidget(this); 0040 d->actionsconfig->setEnabled(false); 0041 connect(d->eventList, SIGNAL(eventSelected(KNotifyConfigElement *)), this, SLOT(slotEventSelected(KNotifyConfigElement *))); 0042 connect(d->actionsconfig, SIGNAL(changed()), this, SLOT(slotActionChanged())); 0043 0044 QVBoxLayout *layout = new QVBoxLayout(this); 0045 layout->setContentsMargins(0, 0, 0, 0); 0046 layout->addWidget(d->eventList, 1); 0047 layout->addWidget(d->actionsconfig); 0048 } 0049 0050 KNotifyConfigWidget::~KNotifyConfigWidget() 0051 { 0052 delete d; 0053 } 0054 0055 void KNotifyConfigWidget::setApplication(const QString &app, const QString &context_name, const QString &context_value) 0056 { 0057 d->currentElement = nullptr; 0058 d->application = app.isEmpty() ? QCoreApplication::instance()->applicationName() : app; 0059 d->contextName = context_name; 0060 d->contextValue = context_value; 0061 d->eventList->fill(d->application, d->contextName, d->contextValue); 0062 } 0063 0064 void KNotifyConfigWidget::selectEvent(const QString &eventId) 0065 { 0066 d->eventList->selectEvent(eventId); 0067 } 0068 0069 void KNotifyConfigWidget::slotEventSelected(KNotifyConfigElement *e) 0070 { 0071 if (d->currentElement) { 0072 d->actionsconfig->save(d->currentElement); 0073 } 0074 d->currentElement = e; 0075 if (e) { 0076 d->actionsconfig->setConfigElement(e); 0077 d->actionsconfig->setEnabled(true); 0078 } else { 0079 d->actionsconfig->setEnabled(false); 0080 } 0081 } 0082 0083 void KNotifyConfigWidget::save() 0084 { 0085 if (d->currentElement) { 0086 d->actionsconfig->save(d->currentElement); 0087 } 0088 0089 d->eventList->save(); 0090 Q_EMIT changed(false); 0091 0092 // ask KNotification objects to reload their config 0093 QDBusMessage message = 0094 QDBusMessage::createSignal(QStringLiteral("/Config"), QStringLiteral("org.kde.knotification"), QStringLiteral("reparseConfiguration")); 0095 message.setArguments(QVariantList() << d->application); 0096 QDBusConnection::sessionBus().send(message); 0097 } 0098 0099 void KNotifyConfigWidget::revertToDefaults() 0100 { 0101 d->eventList->fill(d->application, d->contextName, d->contextValue, true); 0102 Q_EMIT changed(true); 0103 } 0104 0105 void KNotifyConfigWidget::disableAllSounds() 0106 { 0107 if (d->eventList->disableAllSounds()) { 0108 if (d->currentElement) { 0109 d->actionsconfig->setConfigElement(d->currentElement); 0110 } 0111 d->eventList->updateAllItems(); 0112 Q_EMIT changed(true); 0113 } 0114 } 0115 0116 KNotifyConfigWidget *KNotifyConfigWidget::configure(QWidget *parent, const QString &appname) 0117 { 0118 QDialog *dialog = new QDialog(parent); 0119 dialog->setWindowTitle(i18n("Configure Notifications")); 0120 0121 KNotifyConfigWidget *w = new KNotifyConfigWidget(dialog); 0122 0123 QDialogButtonBox *buttonBox = new QDialogButtonBox(dialog); 0124 buttonBox->setStandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Apply | QDialogButtonBox::Cancel); 0125 buttonBox->button(QDialogButtonBox::Apply)->setEnabled(false); 0126 0127 QVBoxLayout *layout = new QVBoxLayout(dialog); 0128 layout->addWidget(w); 0129 layout->addWidget(buttonBox); 0130 0131 connect(buttonBox->button(QDialogButtonBox::Apply), SIGNAL(clicked()), w, SLOT(save())); 0132 connect(buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()), w, SLOT(save())); 0133 connect(w, SIGNAL(changed(bool)), buttonBox->button(QDialogButtonBox::Apply), SLOT(setEnabled(bool))); 0134 0135 connect(buttonBox, SIGNAL(accepted()), dialog, SLOT(accept())); 0136 connect(buttonBox, SIGNAL(rejected()), dialog, SLOT(reject())); 0137 0138 w->setApplication(appname); 0139 dialog->setAttribute(Qt::WA_DeleteOnClose); 0140 dialog->show(); 0141 return w; 0142 } 0143 0144 void KNotifyConfigWidget::slotActionChanged() 0145 { 0146 Q_EMIT changed(true); // TODO 0147 if (d->currentElement) { 0148 d->actionsconfig->save(d->currentElement); 0149 d->eventList->updateCurrentItem(); 0150 } 0151 } 0152 0153 #include "moc_knotifyconfigwidget.cpp"