File indexing completed on 2024-04-28 04:55:38

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"