/* * Copyright (C) by Klaas Freitag * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. */ #include "notificationwidget.h" #include "QProgressIndicator.h" #include "utility.h" #include "asserts.h" #include #include "ocsjob.h" namespace OCC { Q_LOGGING_CATEGORY(lcNotifications, "gui.notifications", QtInfoMsg) NotificationWidget::NotificationWidget(QWidget *parent) : QWidget(parent) { _ui.setupUi(this); _progressIndi = new QProgressIndicator(this); _ui.horizontalLayout->addWidget(_progressIndi); } void NotificationWidget::setActivity(const Activity& activity) { _myActivity = activity; _accountName = activity._accName; ASSERT(!_accountName.isEmpty()); // _ui._headerLabel->setText( ); _ui._subjectLabel->setVisible( !activity._subject.isEmpty() ); _ui._messageLabel->setVisible( !activity._message.isEmpty() ); _ui._subjectLabel->setText(activity._subject); _ui._messageLabel->setText(activity._message); _ui._notifIcon->setPixmap(QPixmap(":/client/resources/bell.png")); _ui._notifIcon->setMinimumWidth(64); _ui._notifIcon->setMinimumHeight(64); _ui._notifIcon->show(); QString tText = tr("Created at %1").arg(Utility::timeAgoInWords(activity._dateTime)); _ui._timeLabel->setText(tText); // always remove the buttons foreach( auto button, _ui._buttonBox->buttons() ) { _ui._buttonBox->removeButton(button); } _buttons.clear(); // display buttons for the links if( activity._links.isEmpty() ) { // in case there is no action defined, do a close button. QPushButton *b = _ui._buttonBox->addButton( QDialogButtonBox::Close ); b->setDefault(true); connect(b, SIGNAL(clicked()), this, SLOT(slotButtonClicked())); _buttons.append(b); } else { foreach( auto link, activity._links ) { QPushButton *b = _ui._buttonBox->addButton(link._label, QDialogButtonBox::AcceptRole); b->setDefault(link._isPrimary); connect(b, SIGNAL(clicked()), this, SLOT(slotButtonClicked())); _buttons.append(b); } } } Activity NotificationWidget::activity() const { return _myActivity; } void NotificationWidget::slotButtonClicked() { QObject *buttonWidget = QObject::sender(); int index = -1; if( buttonWidget ) { // find the button that was clicked, it has to be in the list // of buttons that were added to the button box before. for( int i = 0; i < _buttons.count(); i++ ) { if( _buttons.at(i) == buttonWidget ) { index = i; } _buttons.at(i)->setEnabled(false); } // if the button was found, the link must be called if( index > -1 && _myActivity._links.count() == 0 ) { // no links, that means it was the close button // empty link. Just close and remove the widget. QString doneText = tr("Closing in a few seconds..."); _ui._timeLabel->setText(doneText); emit requestCleanupAndBlacklist(_myActivity); return; } if( index > -1 && index < _myActivity._links.count() ) { ActivityLink triggeredLink = _myActivity._links.at(index); _actionLabel = triggeredLink._label; if( ! triggeredLink._link.isEmpty() ) { qCDebug(lcNotifications) << "Notification Link: "<< triggeredLink._verb << triggeredLink._link; _progressIndi->startAnimation(); emit sendNotificationRequest( _accountName, triggeredLink._link, triggeredLink._verb ); } } } } void NotificationWidget::slotNotificationRequestFinished(int statusCode) { int i = 0; QString doneText; QLocale locale; QString timeStr = locale.toString(QTime::currentTime()); // the ocs API returns stat code 100 if it succeeded. if( statusCode != OCS_SUCCESS_STATUS_CODE ) { qCDebug(lcNotifications) << "Notification Request to Server failed, leave button visible."; for( i = 0; i < _buttons.count(); i++ ) { _buttons.at(i)->setEnabled(true); } //: The second parameter is a time, such as 'failed at 09:58pm' doneText = tr("%1 request failed at %2").arg(_actionLabel, timeStr); } else { // the call to the ocs API succeeded. _ui._buttonBox->hide(); //: The second parameter is a time, such as 'selected at 09:58pm' doneText = tr("'%1' selected at %2").arg(_actionLabel, timeStr); } _ui._timeLabel->setText( doneText ); _progressIndi->stopAnimation(); } }