File indexing completed on 2024-05-19 12:37:35
0001 /* 0002 This file is part of Choqok, the KDE micro-blogging client 0003 0004 SPDX-FileCopyrightText: 2008-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 "twitterapisearchtimelinewidget.h" 0010 0011 #include <QCheckBox> 0012 #include <QHBoxLayout> 0013 #include <QIntValidator> 0014 #include <QLabel> 0015 #include <QLineEdit> 0016 #include <QPointer> 0017 #include <QPushButton> 0018 0019 #include <KLocalizedString> 0020 #include <KSeparator> 0021 0022 #include "account.h" 0023 #include "choqokbehaviorsettings.h" 0024 #include "choqoktypes.h" 0025 #include "postwidget.h" 0026 0027 #include "twitterapidebug.h" 0028 #include "twitterapimicroblog.h" 0029 0030 class TwitterApiSearchTimelineWidget::Private 0031 { 0032 public: 0033 Private(const SearchInfo &info) 0034 : currentPage(1), searchInfo(info), loadingAnotherPage(false) 0035 {} 0036 QPointer<QPushButton> close; 0037 QPointer<QPushButton> next; 0038 QPointer<QPushButton> previous; 0039 QPointer<QLineEdit> pageNumber; 0040 QPointer<QCheckBox> autoUpdate; 0041 uint currentPage; 0042 SearchInfo searchInfo; 0043 QPointer<TwitterApiSearch> searchBackend; 0044 bool loadingAnotherPage; 0045 }; 0046 0047 TwitterApiSearchTimelineWidget::TwitterApiSearchTimelineWidget(Choqok::Account *account, 0048 const QString &timelineName, 0049 const SearchInfo &info, 0050 QWidget *parent) 0051 : TimelineWidget(account, timelineName, parent), d(new Private(info)) 0052 { 0053 setAttribute(Qt::WA_DeleteOnClose); 0054 d->searchBackend = qobject_cast<TwitterApiMicroBlog *>(currentAccount()->microblog())->searchBackend(); 0055 connect(Choqok::UI::Global::mainWindow(), &Choqok::UI::MainWindow::updateTimelines, 0056 this, &TwitterApiSearchTimelineWidget::slotUpdateSearchResults); 0057 addFooter(); 0058 timelineDescription()->setText(i18nc("%1 is the name of a timeline", "Search results for %1", timelineName)); 0059 setClosable(); 0060 } 0061 0062 TwitterApiSearchTimelineWidget::~TwitterApiSearchTimelineWidget() 0063 { 0064 delete d; 0065 } 0066 0067 void TwitterApiSearchTimelineWidget::saveTimeline() 0068 { 0069 qCDebug(CHOQOK); 0070 //There's no implementation because we don't want to have it in Search Timelines :) 0071 // Choqok::UI::TimelineWidget::saveTimeline(); 0072 } 0073 0074 void TwitterApiSearchTimelineWidget::loadTimeline() 0075 { 0076 qCDebug(CHOQOK); 0077 //There's no implementation because we don't want to have it in Search Timelines :) 0078 // Choqok::UI::TimelineWidget::loadTimeline(); 0079 } 0080 0081 void TwitterApiSearchTimelineWidget::addFooter() 0082 { 0083 QHBoxLayout *footer = titleBarLayout(); 0084 0085 d->close = new QPushButton(QIcon::fromTheme(QLatin1String("dialog-close")), QString(), this); 0086 d->close->setFixedSize(28, 28); 0087 d->close->setToolTip(i18n("Close Search")); 0088 0089 if (d->searchInfo.isBrowsable) { 0090 d->previous = new QPushButton(this); 0091 d->previous->setIcon(QIcon::fromTheme(QLatin1String("go-previous"))); 0092 d->previous->setMaximumSize(28, 28); 0093 d->previous->setToolTip(i18n("Previous")); 0094 0095 d->next = new QPushButton(this); 0096 d->next->setIcon(QIcon::fromTheme(QLatin1String("go-next"))); 0097 d->next->setMaximumSize(28, 28); 0098 d->next->setToolTip(i18n("Next")); 0099 0100 d->pageNumber = new QLineEdit(this); 0101 d->pageNumber->setValidator(new QIntValidator); 0102 d->pageNumber->setMaxLength(2); 0103 d->pageNumber->setMaximumWidth(40); 0104 d->pageNumber->setAlignment(Qt::AlignCenter); 0105 d->pageNumber->setToolTip(i18n("Page Number")); 0106 0107 footer->addWidget(d->previous); 0108 footer->addWidget(d->pageNumber); 0109 footer->addWidget(d->next); 0110 footer->addWidget(new KSeparator(Qt::Vertical, this)); 0111 connect(d->next, &QPushButton::clicked, this, &TwitterApiSearchTimelineWidget::loadNextPage); 0112 connect(d->previous, &QPushButton::clicked, this, &TwitterApiSearchTimelineWidget::loadPreviousPage); 0113 connect(d->pageNumber, &QLineEdit::returnPressed, this, 0114 (void (TwitterApiSearchTimelineWidget::*)())&TwitterApiSearchTimelineWidget::loadCustomPage); 0115 } 0116 footer->addWidget(d->close); 0117 connect(d->close, &QPushButton::clicked, this, &TwitterApiSearchTimelineWidget::closeMe); 0118 } 0119 0120 void TwitterApiSearchTimelineWidget::addNewPosts(QList< Choqok::Post * > &postList) 0121 { 0122 if (d->loadingAnotherPage) { 0123 removeAllPosts(); 0124 d->loadingAnotherPage = false; 0125 } 0126 /*bool markRead = false; 0127 if( posts().count() < 1 ) 0128 markRead = true;*/ 0129 int m = postList.count() - Choqok::BehaviorSettings::countOfPosts(); 0130 // qCDebug(CHOQOK)<<m<<postList.count(); 0131 while (m > 0) { 0132 postList.removeFirst(); 0133 --m; 0134 } 0135 Choqok::UI::TimelineWidget::addNewPosts(postList); 0136 // if(markRead) 0137 // markAllAsRead(); 0138 if (d->pageNumber) { 0139 d->pageNumber->setText(QString::number(d->currentPage)); 0140 } 0141 } 0142 0143 void TwitterApiSearchTimelineWidget::reloadList() 0144 { 0145 loadCustomPage(QString::number(d->currentPage)); 0146 } 0147 0148 void TwitterApiSearchTimelineWidget::loadCustomPage() 0149 { 0150 loadCustomPage(d->pageNumber->text()); 0151 } 0152 0153 void TwitterApiSearchTimelineWidget::loadCustomPage(const QString &pageNumber) 0154 { 0155 int page = pageNumber.toUInt(); 0156 if (page == 0) { 0157 page = 1; 0158 } 0159 d->loadingAnotherPage = true; 0160 d->currentPage = page; 0161 d->searchBackend->requestSearchResults(d->searchInfo, QString(), 0, page); 0162 } 0163 0164 void TwitterApiSearchTimelineWidget::loadNextPage() 0165 { 0166 loadCustomPage(QString::number(++d->currentPage)); 0167 } 0168 0169 void TwitterApiSearchTimelineWidget::loadPreviousPage() 0170 { 0171 loadCustomPage(QString::number(--d->currentPage)); 0172 } 0173 0174 void TwitterApiSearchTimelineWidget::removeAllPosts() 0175 { 0176 for (Choqok::UI::PostWidget *wd: posts().values()) { 0177 wd->close(); 0178 } 0179 posts().clear(); 0180 } 0181 0182 void TwitterApiSearchTimelineWidget::slotUpdateSearchResults() 0183 { 0184 if (d->currentPage == 1) { 0185 QString lastId; 0186 if (!postWidgets().isEmpty()) { 0187 lastId = postWidgets().last()->currentPost()->postId; 0188 } 0189 d->searchBackend->requestSearchResults(d->searchInfo, lastId); 0190 } 0191 } 0192 0193 SearchInfo TwitterApiSearchTimelineWidget::searchInfo() const 0194 { 0195 return d->searchInfo; 0196 } 0197 0198 #include "moc_twitterapisearchtimelinewidget.cpp"