File indexing completed on 2024-05-05 04:57:29

0001 /*
0002     This file is part of Choqok, the KDE micro-blogging client
0003 
0004     SPDX-FileCopyrightText: 2011-2012 Mehrdad Momeny <mehrdad.momeny@gmail.com>
0005 
0006     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0007 */
0008 
0009 #include "notification.h"
0010 
0011 #include <QIcon>
0012 #include <QMouseEvent>
0013 #include <QVBoxLayout>
0014 
0015 #include <KLocalizedString>
0016 
0017 #include "choqokappearancesettings.h"
0018 #include "choqoktools.h"
0019 #include "mediamanager.h"
0020 
0021 #include "notifysettings.h"
0022 
0023 const QRegExp Notification::dirRegExp(QLatin1String("(RT|RD)|(@([^\\s\\W]+))|(#([^\\s\\W]+))|(!([^\\s\\W]+))"));
0024 
0025 Notification::Notification(Choqok::UI::PostWidget *postWidget)
0026     : QWidget(), post(postWidget), dir(QLatin1String("ltr"))
0027 {
0028     setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
0029 //     setAttribute(Qt::WA_TranslucentBackground);
0030     setWindowOpacity(0.8);
0031     setWindowFlags(Qt::ToolTip);
0032     setDirection();
0033     mainWidget.viewport()->setAutoFillBackground(false);
0034     mainWidget.setFrameShape(QFrame::NoFrame);
0035     mainWidget.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
0036     mainWidget.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
0037     mainWidget.setOpenExternalLinks(false);
0038     mainWidget.setOpenLinks(false);
0039     setMouseTracking(true);
0040     resize(NOTIFICATION_WIDTH, NOTIFICATION_HEIGHT);
0041 
0042     NotifySettings set(this);
0043     QFont fnt = set.font();
0044     QColor color = set.foregroundColor();
0045     QColor back = set.backgroundColor();
0046 
0047     QString fntStr = QLatin1String("font-family:\"") + fnt.family() + QLatin1String("\"; font-size:") + QString::number(fnt.pointSize()) + QLatin1String("pt;");
0048     fntStr += (fnt.bold() ? QLatin1String(" font-weight:bold;") : QString()) + (fnt.italic() ? QLatin1String(" font-style:italic;") : QString());
0049     QString style = Choqok::UI::PostWidget::getBaseStyle().arg(Choqok::getColorString(color), Choqok::getColorString(back), fntStr);
0050 
0051     setStyleSheet(style);
0052 
0053     init();
0054     connect(&mainWidget, &MyTextBrowser::anchorClicked, this, &Notification::slotProcessAnchor);
0055 }
0056 
0057 Notification::~Notification()
0058 {
0059 }
0060 
0061 QSize Notification::sizeHint() const
0062 {
0063     return QSize(NOTIFICATION_WIDTH, NOTIFICATION_HEIGHT);
0064 }
0065 
0066 void Notification::init()
0067 {
0068     QPixmap pix = Choqok::MediaManager::self()->fetchImage(post->currentPost()->author.profileImageUrl);
0069     if (!pix) {
0070         pix = QPixmap(Choqok::MediaManager::self()->defaultImage());
0071     }
0072     mainWidget.document()->addResource(QTextDocument::ImageResource, QUrl(QLatin1String("img://profileImage")), pix);
0073     mainWidget.document()->addResource(QTextDocument::ImageResource, QUrl(QLatin1String("icon://close")),
0074                                        QIcon::fromTheme(QLatin1String("dialog-close")).pixmap(16));
0075     mainWidget.setText(baseText.arg(post->currentPost()->author.userName)
0076                        .arg(post->currentPost()->content)
0077                        .arg(dir)
0078                        .arg(i18n("Ignore")));
0079 
0080     QVBoxLayout *l = new QVBoxLayout(this);
0081     l->setContentsMargins(0, 0, 0, 0);
0082     l->setSpacing(0);
0083     l->addWidget(&mainWidget);
0084 
0085     setHeight();
0086 
0087     connect(&mainWidget, &MyTextBrowser::clicked, this, &Notification::slotClicked);
0088     connect(&mainWidget, &MyTextBrowser::mouseEntered, this, &Notification::mouseEntered);
0089     connect(&mainWidget, &MyTextBrowser::mouseLeaved, this, &Notification::mouseLeaved);
0090 
0091     //TODO Show remaining post count to notify
0092 }
0093 
0094 void Notification::slotProcessAnchor(const QUrl &url)
0095 {
0096     if (url.scheme() == QLatin1String("choqok")) {
0097         if (url.host() == QLatin1String("close")) {
0098             Q_EMIT ignored();
0099         }
0100     }
0101 }
0102 
0103 void Notification::slotClicked()
0104 {
0105     post->setReadWithSignal();
0106     Q_EMIT postReaded();
0107 }
0108 
0109 void Notification::setHeight()
0110 {
0111     mainWidget.document()->setTextWidth(mainWidget.width() - 2);
0112     int h = mainWidget.document()->size().toSize().height() + 30;
0113     setMinimumHeight(h);
0114     setMaximumHeight(h);
0115 }
0116 
0117 void Notification::setDirection()
0118 {
0119     QString txt = post->currentPost()->content;
0120     txt.remove(dirRegExp);
0121     txt = txt.trimmed();
0122     if (txt.isRightToLeft()) {
0123         dir = QLatin1String("rtl");
0124     }
0125 }
0126 
0127 void Notification::mouseMoveEvent(QMouseEvent *e)
0128 {
0129     e->accept();
0130 }
0131 
0132 #include "moc_notification.cpp"