#ifndef NOTIFICATIONPOPUP_H #define NOTIFICATIONPOPUP_H #pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include "widgets/scrolltext/scrolltext.h" #include #include class NotificationPopup : public QWidget { Q_OBJECT QLabel m_icon, m_title; ScrollText m_message; std::unique_ptr notification; QSettings settings; public: NotificationPopup(QWidget *parent) : QWidget(parent) { setWindowFlags(Qt::ToolTip); auto rootLayout = new QHBoxLayout(this); rootLayout->addWidget(&m_icon); auto bodyLayout = new QVBoxLayout; rootLayout->addLayout(bodyLayout); auto titleLayout = new QHBoxLayout; bodyLayout->addLayout(titleLayout); titleLayout->addWidget(&m_title); titleLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding)); auto close = new QPushButton(tr("Close")); titleLayout->addWidget(close); connect(close, &QPushButton::clicked, this, &NotificationPopup::onClosed); bodyLayout->addWidget(&m_message); adjustSize(); } void present(QString title,QString message,const QPixmap image) { m_title.setText("" + title + ""); m_message.setText(message); m_icon.setPixmap(image.scaledToHeight(m_icon.height(),Qt::SmoothTransformation)); this->adjustSize(); qApp->processEvents(); int x = QApplication::desktop()->geometry().width()-(this->width()+10); int y = 40; this->update(); QTimer::singleShot(settings.value("notificationTimeOut",9000).toInt(),this,[=](){ onClosed(); }); QPropertyAnimation *a = new QPropertyAnimation(this,"pos"); a->setDuration(200); a->setStartValue(QApplication::desktop()->mapToGlobal(QPoint(x+this->width(),y))); a->setEndValue(QApplication::desktop()->mapToGlobal(QPoint(x,y))); a->setEasingCurve(QEasingCurve::Linear); a->start(QPropertyAnimation::DeleteWhenStopped); this->show(); } void present(std::unique_ptr &newNotification) { if (notification) { notification->close(); notification.reset(); } notification.swap(newNotification); m_title.setText("" + notification->title() + ""); m_message.setText(notification->message()); m_icon.setPixmap(QPixmap::fromImage(notification->icon()).scaledToHeight(m_icon.height())); //show(); notification->show(); connect(notification.get(), &QWebEngineNotification::closed, this, &NotificationPopup::onClosed); QTimer::singleShot(settings.value("notificationTimeOut",9000).toInt(), notification.get(), [&] () { onClosed(); }); this->adjustSize(); qApp->processEvents(); int x = QApplication::desktop()->geometry().width()-(this->width()+10); int y = 40; this->update(); QPropertyAnimation *a = new QPropertyAnimation(this,"pos"); a->setDuration(200); a->setStartValue(QApplication::desktop()->mapToGlobal(QPoint(x+this->width(),y))); a->setEndValue(QApplication::desktop()->mapToGlobal(QPoint(x,y))); a->setEasingCurve(QEasingCurve::Linear); a->start(QPropertyAnimation::DeleteWhenStopped); this->show(); } protected slots: void onClosed() { hide(); if(notification){ notification->close(); notification.reset(); }else{ this->deleteLater(); } } protected: void mouseReleaseEvent(QMouseEvent *event) override { QWidget::mouseReleaseEvent(event); if (event->button() == Qt::LeftButton) { qDebug()<<"noti clicked"; emit notification_clicked(); if(notification ) notification->click(); onClosed(); } } signals: void notification_clicked(); }; #endif // NOTIFICATIONPOPUP_H