]> git.sur5r.net Git - minitube/blob - src/standardfeedsview.cpp
New upstream version 3.5
[minitube] / src / standardfeedsview.cpp
1 /* $BEGIN_LICENSE
2
3 This file is part of Minitube.
4 Copyright 2009, Flavio Tordini <flavio.tordini@gmail.com>
5
6 Minitube is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
10
11 Minitube is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with Minitube.  If not, see <http://www.gnu.org/licenses/>.
18
19 $END_LICENSE */
20
21 #include "standardfeedsview.h"
22 #include "mainwindow.h"
23 #include "painterutils.h"
24 #include "videosourcewidget.h"
25 #include "ytcategories.h"
26 #include "ytregions.h"
27 #include "ytstandardfeed.h"
28
29 #include "ivvideolist.h"
30 #include "videoapi.h"
31
32 StandardFeedsView::StandardFeedsView(QWidget *parent) : View(parent), layout(0) {
33     setBackgroundRole(QPalette::Base);
34     setAutoFillBackground(true);
35
36     connect(MainWindow::instance()->getAction("worldwideRegion"), SIGNAL(triggered()),
37             SLOT(selectWorldwideRegion()));
38
39     connect(MainWindow::instance()->getAction("localRegion"), SIGNAL(triggered()),
40             SLOT(selectLocalRegion()));
41 }
42
43 void StandardFeedsView::load() {
44     setUpdatesEnabled(false);
45     resetLayout();
46
47     YTRegion region = YTRegions::currentRegion();
48
49     if (VideoAPI::impl() == VideoAPI::YT3) {
50         YTCategories *youTubeCategories = new YTCategories(this);
51         connect(youTubeCategories, SIGNAL(categoriesLoaded(const QVector<YTCategory> &)),
52                 SLOT(layoutCategories(const QVector<YTCategory> &)));
53         youTubeCategories->loadCategories();
54         addVideoSourceWidget(buildStandardFeed("most_popular", tr("Most Popular")));
55     } else if (VideoAPI::impl() == VideoAPI::IV) {
56         QString regionParam = "region=" + region.id;
57         addVideoSourceWidget(new IVVideoList("popular?" + regionParam, tr("Most Popular")));
58         addVideoSourceWidget(new IVVideoList("trending?" + regionParam, tr("Trending")));
59         addVideoSourceWidget(new IVVideoList("trending?type=music&" + regionParam, tr("Music")));
60         addVideoSourceWidget(new IVVideoList("trending?type=news&" + regionParam, tr("News")));
61         addVideoSourceWidget(new IVVideoList("trending?type=movies&" + regionParam, tr("Movies")));
62         addVideoSourceWidget(new IVVideoList("trending?type=gaming&" + regionParam, tr("Gaming")));
63         setUpdatesEnabled(true);
64     }
65
66     QAction *regionAction = MainWindow::instance()->getRegionAction();
67     regionAction->setText(region.name);
68     regionAction->setIcon(YTRegions::iconForRegionId(region.id));
69 }
70
71 void StandardFeedsView::layoutCategories(const QVector<YTCategory> &categories) {
72     QString regionId = YTRegions::currentRegionId();
73     for (const YTCategory &category : categories) {
74         // assign a parent to this VideoSource  so it won't be deleted by MediaView
75         YTStandardFeed *feed = new YTStandardFeed(this);
76         feed->setCategory(category.term);
77         feed->setLabel(category.label);
78         feed->setRegionId(regionId);
79         feed->setFeedId("most_popular");
80         addVideoSourceWidget(feed);
81     }
82     if (categories.size() > 1) setUpdatesEnabled(true);
83 }
84
85 void StandardFeedsView::addVideoSourceWidget(VideoSource *videoSource) {
86     VideoSourceWidget *w = new VideoSourceWidget(videoSource);
87     connect(w, SIGNAL(activated(VideoSource *)), SIGNAL(activated(VideoSource *)));
88     connect(w, SIGNAL(unavailable(VideoSourceWidget *)),
89             SLOT(removeVideoSourceWidget(VideoSourceWidget *)));
90     int i = layout->count();
91     const int cols = VideoAPI::impl() == VideoAPI::YT3 ? 5 : 3;
92     layout->addWidget(w, i / cols, i % cols);
93 }
94
95 void StandardFeedsView::removeVideoSourceWidget(VideoSourceWidget *videoSourceWidget) {
96     qDebug() << videoSourceWidget->getVideoSource()->getName();
97     layout->removeWidget(videoSourceWidget);
98     videoSourceWidget->deleteLater();
99
100     const int layoutCount = layout->count();
101     QVector<QLayoutItem *> items;
102     items.reserve(layoutCount);
103
104     for (int i = layoutCount - 1; i >= 0; i--) {
105         QLayoutItem *item = layout->takeAt(i);
106         if (item && item->widget()) items.append(item);
107     }
108
109     const int itemCount = items.size();
110     const int cols = 4; // itemCount / 3;
111     for (int i = itemCount - 1; i >= 0; i--) {
112         QLayoutItem *item = items.at(i);
113         int index = itemCount - 1 - i;
114         layout->addItem(item, index / cols, index % cols);
115     }
116 }
117
118 void StandardFeedsView::resetLayout() {
119     if (layout) {
120         while (QLayoutItem *item = layout->takeAt(0)) {
121             delete item->widget();
122             delete item;
123         }
124         delete layout;
125     }
126
127     layout = new QGridLayout(this);
128     layout->setMargin(0);
129     layout->setSpacing(0);
130 }
131
132 YTStandardFeed *
133 StandardFeedsView::buildStandardFeed(const QString &feedId, const QString &label, QString time) {
134     YTStandardFeed *feed = new YTStandardFeed(this);
135     feed->setFeedId(feedId);
136     feed->setLabel(label);
137     if (!time.isEmpty()) feed->setTime(time);
138     feed->setRegionId(YTRegions::currentRegionId());
139     return feed;
140 }
141
142 void StandardFeedsView::appear() {
143     if (!layout) {
144         update();
145         qApp->processEvents();
146         load();
147     }
148     QAction *regionAction = MainWindow::instance()->getRegionAction();
149     MainWindow::instance()->showActionsInStatusBar({regionAction}, true);
150 }
151
152 void StandardFeedsView::disappear() {
153     QAction *regionAction = MainWindow::instance()->getRegionAction();
154     MainWindow::instance()->showActionsInStatusBar({regionAction}, false);
155 }
156
157 void StandardFeedsView::selectWorldwideRegion() {
158     YTRegions::setRegion(YTRegions::worldwideRegion().id);
159     load();
160 }
161
162 void StandardFeedsView::selectLocalRegion() {
163     YTRegions::setRegion(YTRegions::localRegion().id);
164     load();
165 }
166
167 void StandardFeedsView::paintEvent(QPaintEvent *event) {
168     QWidget::paintEvent(event);
169 }