3 This file is part of Minitube.
4 Copyright 2009, Flavio Tordini <flavio.tordini@gmail.com>
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.
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.
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/>.
21 #include "channelmodel.h"
22 #include "ytchannel.h"
24 static const int channelOffset = 2;
26 ChannelModel::ChannelModel(QObject *parent) :
27 QAbstractListModel(parent),
31 int ChannelModel::rowCount(const QModelIndex &) const {
32 return channels.isEmpty() ? 0 : channelOffset + channels.size();
35 QVariant ChannelModel::data(const QModelIndex &index, int role) const {
38 case ChannelModel::ItemTypeRole:
39 return typeForIndex(index);
41 case ChannelModel::DataObjectRole:
42 if (typeForIndex(index) == ChannelModel::ItemChannel)
43 return QVariant::fromValue(QPointer<YTChannel>(channelForIndex(index)));
46 case ChannelModel::HoveredItemRole:
47 return hoveredRow == index.row();
49 case Qt::StatusTipRole:
50 if (typeForIndex(index) == ChannelModel::ItemChannel)
51 return channelForIndex(index)->getDescription();
58 YTChannel* ChannelModel::channelForIndex(const QModelIndex &index) const {
59 const int row = index.row();
60 if (row < channelOffset) return 0;
61 return channels.at(index.row() - channelOffset);
64 ChannelModel::ItemTypes ChannelModel::typeForIndex(const QModelIndex &index) const {
65 switch (index.row()) {
67 return ChannelModel::ItemAggregate;
69 return ChannelModel::ItemUnwatched;
71 return ChannelModel::ItemChannel;
75 void ChannelModel::setQuery(const QString &query, const QSqlDatabase &db) {
78 sqlError = QSqlError();
82 bool success = q.exec();
84 qWarning() << q.lastQuery() << q.lastError().text();
85 sqlError = q.lastError();
87 channels.reserve(q.size());
89 YTChannel *channel = YTChannel::forId(q.value(0).toString());
91 connect(channel, SIGNAL(thumbnailLoaded()), SLOT(updateSender()), Qt::UniqueConnection);
92 connect(channel, SIGNAL(notifyCountChanged()), SLOT(updateSender()),
93 Qt::UniqueConnection);
94 connect(channel, SIGNAL(destroyed(QObject *)), SLOT(removeChannel(QObject *)),
95 Qt::UniqueConnection);
103 QSqlError ChannelModel::lastError() const {
107 void ChannelModel::updateSender() {
108 YTChannel *channel = static_cast<YTChannel*>(sender());
110 qWarning() << "Cannot get sender" << __PRETTY_FUNCTION__;
113 updateChannel(channel);
116 void ChannelModel::updateChannel(YTChannel *channel) {
117 int row = channels.indexOf(channel);
118 if (row == -1) return;
119 row += channelOffset;
120 QModelIndex i = createIndex(row, 0);
121 emit dataChanged(i, i);
124 void ChannelModel::updateUnwatched() {
125 QModelIndex i = createIndex(1, 0);
126 emit dataChanged(i, i);
129 void ChannelModel::removeChannel(QObject *obj) {
130 YTChannel *channel = static_cast<YTChannel*>(obj);
131 // qWarning() << "channel" << channel << obj << obj->metaObject()->className();
132 if (!channel) return;
134 int row = channels.indexOf(channel);
135 if (row == -1) return;
137 int position = row + channelOffset;
138 beginRemoveRows(QModelIndex(), position, position+1);
139 channels.removeAt(row);
143 void ChannelModel::setHoveredRow(int row) {
144 int oldRow = hoveredRow;
146 emit dataChanged( createIndex( oldRow, 0 ), createIndex( oldRow, 0 ) );
147 emit dataChanged( createIndex( hoveredRow, 0 ), createIndex( hoveredRow, 0 ) );
150 void ChannelModel::clearHover() {
151 emit dataChanged( createIndex( hoveredRow, 0 ), createIndex( hoveredRow, 0 ) );