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"