$END_LICENSE */
#include "channelview.h"
-#include "ytuser.h"
-#include "ytsearch.h"
-#include "searchparams.h"
-#include "channelmodel.h"
+#include "aggregatevideosource.h"
+#include "channelaggregator.h"
#include "channelitemdelegate.h"
+#include "channelmodel.h"
#include "database.h"
-#include "ytsearch.h"
-#include "channelaggregator.h"
-#include "aggregatevideosource.h"
-#include "painterutils.h"
+#include "iconutils.h"
#include "mainwindow.h"
-#include "utils.h"
+#include "searchparams.h"
+#include "ytchannel.h"
+#include "ytsearch.h"
#ifdef APP_EXTRA
#include "extra.h"
#endif
+#include "channellistview.h"
-static const char *sortByKey = "subscriptionsSortBy";
-static const char *showUpdatedKey = "subscriptionsShowUpdated";
+#include "videoapi.h"
+#include "ivchannelsource.h"
-ChannelView::ChannelView(QWidget *parent) : QListView(parent),
- showUpdated(false),
- sortBy(SortByName) {
+namespace {
+const QString sortByKey = "subscriptionsSortBy";
+const QString showUpdatedKey = "subscriptionsShowUpdated";
+} // namespace
- setItemDelegate(new ChannelItemDelegate(this));
- setSelectionMode(QAbstractItemView::NoSelection);
+ChannelView::ChannelView(QWidget *parent) : View(parent), showUpdated(false), sortBy(SortByName) {
+ QBoxLayout *layout = new QVBoxLayout(this);
+ layout->setMargin(0);
+ layout->setSpacing(0);
- // layout
- setSpacing(15);
- setFlow(QListView::LeftToRight);
- setWrapping(true);
- setResizeMode(QListView::Adjust);
- setMovement(QListView::Static);
- setUniformItemSizes(true);
+ listView = new ChannelListView();
+ listView->setItemDelegate(new ChannelItemDelegate(this));
- // cosmetics
- setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
- setFrameShape(QFrame::NoFrame);
- setAttribute(Qt::WA_MacShowFocusRect, false);
-
- QPalette p = palette();
- /*
- p.setColor(QPalette::Base, p.window().color());
- p.setColor(QPalette::Text, p.windowText().color());
- */
- p.setColor(QPalette::Disabled, QPalette::Base, p.base().color());
- p.setColor(QPalette::Disabled, QPalette::Text, p.text().color());
- setPalette(p);
-
- verticalScrollBar()->setPageStep(3);
- verticalScrollBar()->setSingleStep(1);
-
- setMouseTracking(true);
+ channelsModel = new ChannelModel(this);
+ listView->setModel(channelsModel);
- connect(this, SIGNAL(clicked(const QModelIndex &)),
+ connect(listView, SIGNAL(clicked(const QModelIndex &)),
SLOT(itemActivated(const QModelIndex &)));
- connect(this, SIGNAL(entered(const QModelIndex &)),
- SLOT(itemEntered(const QModelIndex &)));
+ connect(listView, SIGNAL(contextMenu(QPoint)), SLOT(showContextMenu(QPoint)));
+ connect(listView, SIGNAL(viewportEntered()), channelsModel, SLOT(clearHover()));
- channelsModel = new ChannelModel(this);
- setModel(channelsModel);
- connect(this, SIGNAL(viewportEntered()),
- channelsModel, SLOT(clearHover()));
+ layout->addWidget(listView);
setupActions();
- connect(ChannelAggregator::instance(), SIGNAL(channelChanged(YTUser*)),
- channelsModel, SLOT(updateChannel(YTUser*)));
+ connect(ChannelAggregator::instance(), SIGNAL(channelChanged(YTChannel *)), channelsModel,
+ SLOT(updateChannel(YTChannel *)));
connect(ChannelAggregator::instance(), SIGNAL(unwatchedCountChanged(int)),
SLOT(unwatchedCountChanged(int)));
void ChannelView::setupActions() {
QSettings settings;
- SortBy sortBy = static_cast<SortBy>(settings.value(sortByKey, SortByName).toInt());
+ sortBy = static_cast<SortBy>(settings.value(sortByKey, SortByName).toInt());
QMenu *sortMenu = new QMenu(this);
QActionGroup *sortGroup = new QActionGroup(this);
QToolButton *sortButton = new QToolButton(this);
sortButton->setText(tr("Sort by"));
- sortButton->setIcon(Utils::icon("sort"));
+ IconUtils::setIcon(sortButton, "sort");
sortButton->setIconSize(QSize(16, 16));
sortButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
sortButton->setPopupMode(QToolButton::InstantPopup);
widgetAction->setShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_O));
statusActions << widgetAction;
- markAsWatchedAction = new QAction(
- Utils::icon("mark-watched"), tr("Mark all as watched"), this);
+ markAsWatchedAction = new QAction(tr("Mark all as watched"), this);
+ IconUtils::setIcon(markAsWatchedAction, "mark-watched");
markAsWatchedAction->setEnabled(false);
markAsWatchedAction->setShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_W));
connect(markAsWatchedAction, SIGNAL(triggered()), SLOT(markAllAsWatched()));
statusActions << markAsWatchedAction;
showUpdated = settings.value(showUpdatedKey, false).toBool();
- QAction *showUpdatedAction = new QAction(
- Utils::icon("show-updated"), tr("Show Updated"), this);
+ QAction *showUpdatedAction = new QAction(tr("Show Updated"), this);
+ IconUtils::setIcon(showUpdatedAction, "show-updated");
showUpdatedAction->setCheckable(true);
showUpdatedAction->setChecked(showUpdated);
showUpdatedAction->setShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_U));
connect(showUpdatedAction, SIGNAL(toggled(bool)), SLOT(toggleShowUpdated(bool)));
statusActions << showUpdatedAction;
- foreach (QAction *action, statusActions) {
+ for (QAction *action : statusActions) {
window()->addAction(action);
- Utils::setupAction(action);
+ MainWindow::instance()->setupAction(action);
}
}
+QString ChannelView::noSubscriptionsMessage() {
+ return tr("You have no subscriptions. "
+ "Use the star symbol to subscribe to channels.");
+}
+
void ChannelView::appear() {
- updateQuery();
- foreach (QAction* action, statusActions)
- MainWindow::instance()->showActionInStatusBar(action, true);
+ updateQuery(true);
+ MainWindow::instance()->showActionsInStatusBar(statusActions, true);
setFocus();
- ChannelAggregator::instance()->run();
+ ChannelAggregator::instance()->start();
}
void ChannelView::disappear() {
- foreach (QAction* action, statusActions)
- MainWindow::instance()->showActionInStatusBar(action, false);
-}
-
-void ChannelView::mousePressEvent(QMouseEvent *event) {
- if (event->button() == Qt::RightButton)
- showContextMenu(event->pos());
- else
- QListView::mousePressEvent(event);
-}
-
-void ChannelView::mouseMoveEvent(QMouseEvent *event) {
- QListView::mouseMoveEvent(event);
- const QModelIndex index = indexAt(event->pos());
- if (index.isValid()) setCursor(Qt::PointingHandCursor);
- else unsetCursor();
-}
-
-void ChannelView::leaveEvent(QEvent *event) {
- QListView::leaveEvent(event);
- // channelsModel->clearHover();
-}
-
-void ChannelView::itemEntered(const QModelIndex &index) {
- // channelsModel->setHoveredRow(index.row());
+ MainWindow::instance()->showActionsInStatusBar(statusActions, false);
}
void ChannelView::itemActivated(const QModelIndex &index) {
ChannelModel::ItemTypes itemType = channelsModel->typeForIndex(index);
if (itemType == ChannelModel::ItemChannel) {
- YTUser *user = channelsModel->userForIndex(index);
+ YTChannel *channel = channelsModel->channelForIndex(index);
SearchParams *params = new SearchParams();
- params->setAuthor(user->getUserId());
+ params->setChannelId(channel->getChannelId());
params->setSortBy(SearchParams::SortByNewest);
params->setTransient(true);
- YTSearch *videoSource = new YTSearch(params, this);
- emit activated(videoSource);
- user->updateWatched();
+ VideoSource *vs = nullptr;
+ if (VideoAPI::impl() == VideoAPI::YT3) {
+ YTSearch *videoSource = new YTSearch(params);
+ videoSource->setAsyncDetails(true);
+ vs = videoSource;
+ } else if (VideoAPI::impl() == VideoAPI::IV) {
+ vs = new IVChannelSource(params);
+ }
+ emit activated(vs);
+ channel->updateWatched();
} else if (itemType == ChannelModel::ItemAggregate) {
- AggregateVideoSource *videoSource = new AggregateVideoSource(this);
+ AggregateVideoSource *videoSource = new AggregateVideoSource();
videoSource->setName(tr("All Videos"));
emit activated(videoSource);
} else if (itemType == ChannelModel::ItemUnwatched) {
- AggregateVideoSource *videoSource = new AggregateVideoSource(this);
+ AggregateVideoSource *videoSource = new AggregateVideoSource();
videoSource->setName(tr("Unwatched Videos"));
videoSource->setUnwatched(true);
emit activated(videoSource);
}
void ChannelView::showContextMenu(const QPoint &point) {
- const QModelIndex index = indexAt(point);
+ const QModelIndex index = listView->indexAt(point);
if (!index.isValid()) return;
- YTUser *user = channelsModel->userForIndex(index);
- if (!user) return;
+ YTChannel *channel = channelsModel->channelForIndex(index);
+ if (!channel) return;
unsetCursor();
QMenu menu;
- if (user->getNotifyCount() > 0) {
- QAction *markAsWatchedAction = menu.addAction(tr("Mark as Watched"), user, SLOT(updateWatched()));
- connect(markAsWatchedAction, SIGNAL(triggered()),
- ChannelAggregator::instance(), SLOT(updateUnwatchedCount()));
+ if (channel->getNotifyCount() > 0) {
+ QAction *markAsWatchedAction =
+ menu.addAction(tr("Mark as Watched"), channel, SLOT(updateWatched()));
+ connect(markAsWatchedAction, SIGNAL(triggered()), ChannelAggregator::instance(),
+ SLOT(updateUnwatchedCount()));
menu.addSeparator();
}
/*
// TODO
- QAction *notificationsAction = menu.addAction(tr("Receive Notifications"), user, SLOT(unsubscribe()));
- notificationsAction->setCheckable(true);
+ QAction *notificationsAction = menu.addAction(tr("Receive Notifications"), user,
+ SLOT(unsubscribe())); notificationsAction->setCheckable(true);
notificationsAction->setChecked(true);
*/
- QAction *unsubscribeAction = menu.addAction(tr("Unsubscribe"), user, SLOT(unsubscribe()));
- connect(unsubscribeAction, SIGNAL(triggered()),
- ChannelAggregator::instance(), SLOT(updateUnwatchedCount()));
+ QAction *unsubscribeAction = menu.addAction(tr("Unsubscribe"), channel, SLOT(unsubscribe()));
+ connect(unsubscribeAction, SIGNAL(triggered()), ChannelAggregator::instance(),
+ SLOT(updateUnwatchedCount()));
menu.exec(mapToGlobal(point));
}
-void ChannelView::paintEvent(QPaintEvent *event) {
- if (model()->rowCount() < 3) {
- QString msg;
- if (!errorMessage.isEmpty())
- msg = errorMessage;
- else if (showUpdated)
- msg = tr("There are no updated subscriptions at this time.");
- else
- msg = tr("You have no subscriptions. "
- "Use the star symbol to subscribe to channels.");
- PainterUtils::centeredMessage(msg, viewport());
- } else QListView::paintEvent(event);
- PainterUtils::topShadow(viewport());
-}
-
void ChannelView::toggleShowUpdated(bool enable) {
showUpdated = enable;
updateQuery(true);
}
void ChannelView::updateQuery(bool transition) {
- errorMessage.clear();
- if (!Database::exists()) return;
+ Q_UNUSED(transition);
+ listView->clearErrorMessage();
+
+ if (!Database::exists()) {
+ listView->setErrorMessage(noSubscriptionsMessage());
+ return;
+ }
QString sql = "select user_id from subscriptions";
- if (showUpdated)
- sql += " where notify_count>0";
+ if (showUpdated) sql += " where notify_count>0";
switch (sortBy) {
case SortByUpdated:
}
#ifdef APP_EXTRA
- if (transition)
- Extra::fadeInWidget(this, this);
+ if (transition) Extra::fadeInWidget(this, this);
#endif
channelsModel->setQuery(sql, Database::instance().getConnection());
if (channelsModel->lastError().isValid()) {
qWarning() << channelsModel->lastError().text();
- errorMessage = channelsModel->lastError().text();
+ listView->setErrorMessage(channelsModel->lastError().text());
+ } else if (channelsModel->rowCount() < 3) {
+ QString msg;
+ if (showUpdated)
+ msg = tr("There are no updated subscriptions at this time.");
+ else
+ msg = noSubscriptionsMessage();
+ listView->setErrorMessage(msg);
}
}