1 /* ============================================================
2 * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader
3 * Copyright (C) 2011-2020 QuiteRSS Team <quiterssteam@gmail.com>
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
17 * ============================================================ */
18 #include "notificationsnewsitem.h"
19 
NewsItem(int idFeed,int idNews,int width,QWidget * parent)20 NewsItem::NewsItem(int idFeed, int idNews, int width, QWidget * parent)
21   : QWidget(parent)
22   , feedId_(idFeed)
23   , newsId_(idNews)
24   , read_(false)
25 {
26   setCursor(Qt::PointingHandCursor);
27 
28   iconLabel_ = new QLabel(this);
29   iconLabel_->setFixedWidth(19);
30 
31   textLabel_ = new QLabel(this);
32   textLabel_->setFixedWidth(width);
33   textLabel_->setStyleSheet("QLabel:hover {color: #1155CC;}");
34 
35   readButton_ = new ToolButton(this);
36   readButton_->setIcon(QIcon(":/images/bulletUnread"));
37   readButton_->setToolTip(tr("Mark Read/Unread"));
38   readButton_->setAutoRaise(true);
39 
40   openExternalBrowserButton_ = new ToolButton(this);
41   openExternalBrowserButton_->setIcon(QIcon(":/images/openBrowser"));
42   openExternalBrowserButton_->setAutoRaise(true);
43 
44   deleteButton_ = new ToolButton(this);
45   deleteButton_->setIcon(QIcon(":/images/editClear"));
46   deleteButton_->setToolTip(tr("Delete News"));
47   deleteButton_->setAutoRaise(true);
48 
49   QHBoxLayout *mainLayout = new QHBoxLayout();
50   mainLayout->setMargin(0);
51   mainLayout->setSpacing(1);
52   mainLayout->addWidget(readButton_);
53   mainLayout->addWidget(iconLabel_);
54   mainLayout->addWidget(textLabel_, 1);
55   mainLayout->addStretch(0);
56   mainLayout->addWidget(openExternalBrowserButton_);
57   mainLayout->addWidget(deleteButton_);
58   setLayout(mainLayout);
59 
60   connect(readButton_, SIGNAL(clicked()), this, SLOT(markRead()));
61   connect(openExternalBrowserButton_, SIGNAL(clicked()), this, SLOT(openExternalBrowser()));
62   connect(deleteButton_, SIGNAL(clicked()), this, SLOT(deleteNews()));
63 
64   installEventFilter(this);
65 }
66 
~NewsItem()67 NewsItem::~NewsItem()
68 {
69 
70 }
71 
setText(const QString & text)72 void NewsItem::setText(const QString &text)
73 {
74   QString titleStr = textLabel_->fontMetrics().elidedText(
75         text, Qt::ElideRight, textLabel_->sizeHint().width());
76   textLabel_->setText(titleStr);
77   textLabel_->setToolTip(text);
78 }
79 
setFontText(const QFont & font)80 void NewsItem::setFontText(const QFont & font)
81 {
82   textLabel_->setFont(font);
83 }
84 
setColorText(const QString & color,const QString & linkColor)85 void NewsItem::setColorText(const QString &color, const QString &linkColor)
86 {
87   textLabel_->setStyleSheet(QString(
88                               "QLabel {color: %1;}"
89                               "QLabel:hover {color: %2;}").
90                             arg(color).arg(linkColor));
91 }
92 
eventFilter(QObject * obj,QEvent * event)93 bool NewsItem::eventFilter(QObject *obj, QEvent *event)
94 {
95   if ((event->type() == QEvent::MouseButtonPress) && isEnabled()) {
96     read_ = 1;
97     readButton_->setIcon(QIcon(":/images/bulletRead"));
98     QFont font = textLabel_->font();
99     font.setBold(false);
100     textLabel_->setFont(font);
101     emit signalTitleClicked(feedId_, newsId_);
102     return true;
103   }
104   return QObject::eventFilter(obj, event);
105 }
106 
openExternalBrowser()107 void NewsItem::openExternalBrowser()
108 {
109   read_ = 1;
110   readButton_->setIcon(QIcon(":/images/bulletRead"));
111   QFont font = textLabel_->font();
112   font.setBold(false);
113   textLabel_->setFont(font);
114   emit signalMarkRead(feedId_, newsId_, read_);
115 
116   QString linkString;
117   QSqlQuery q;
118   q.exec(QString("SELECT link_href, link_alternate FROM news WHERE id=='%1'").arg(newsId_));
119   if (q.next()) {
120     linkString = q.value(0).toString();
121     if (linkString.isEmpty()) {
122       linkString = q.value(1).toString();
123     }
124   }
125   emit signalOpenExternalBrowser(linkString.simplified());
126 }
127 
markRead()128 void NewsItem::markRead()
129 {
130   QFont font = textLabel_->font();
131   read_ = !read_;
132   if (read_) {
133     readButton_->setIcon(QIcon(":/images/bulletRead"));
134     font.setBold(false);
135   }
136   else {
137     readButton_->setIcon(QIcon(":/images/bulletUnread"));
138     font.setBold(true);
139   }
140   textLabel_->setFont(font);
141   emit signalMarkRead(feedId_, newsId_, read_);
142 }
143 
deleteNews()144 void NewsItem::deleteNews()
145 {
146   QFont font = textLabel_->font();
147   font.setBold(false);
148   textLabel_->setFont(font);
149   setDisabled(true);
150   emit signalDeleteNews(feedId_, newsId_);
151 }
152