Hello community, here is the log from the commit of package orion for openSUSE:Factory checked in at 2017-05-31 12:18:11 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/orion (Old) and /work/SRC/openSUSE:Factory/.orion.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "orion" Wed May 31 12:18:11 2017 rev:5 rq:498619 version:1.5.1+git~20170519 Changes: -------- --- /work/SRC/openSUSE:Factory/orion/orion.changes 2017-05-20 10:14:34.376171570 +0200 +++ /work/SRC/openSUSE:Factory/.orion.new/orion.changes 2017-05-31 12:19:23.295398204 +0200 @@ -1,0 +2,6 @@ +Sat May 20 12:07:13 UTC 2017 - [email protected] + +- Update to version 1.5.1+git~20170519: + * ChannelListModel improvements (#162) + +------------------------------------------------------------------- Old: ---- orion-1.5.1+git~20170518.tar.xz New: ---- orion-1.5.1+git~20170519.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ orion.spec ++++++ --- /var/tmp/diff_new_pack.z6J8Lz/_old 2017-05-31 12:19:25.379104060 +0200 +++ /var/tmp/diff_new_pack.z6J8Lz/_new 2017-05-31 12:19:25.379104060 +0200 @@ -17,7 +17,7 @@ Name: orion -Version: 1.5.1+git~20170518 +Version: 1.5.1+git~20170519 Release: 0 Summary: Twitch stream client using Qt License: GPL-3.0 ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.z6J8Lz/_old 2017-05-31 12:19:25.431096720 +0200 +++ /var/tmp/diff_new_pack.z6J8Lz/_new 2017-05-31 12:19:25.435096156 +0200 @@ -1,4 +1,4 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/alamminsalo/orion.git</param> - <param name="changesrevision">f16fb3a246e777eb162dd66cff453959d606d905</param></service></servicedata> \ No newline at end of file + <param name="changesrevision">0f79a6bb5132c97ba1602b59596eeb669a4977f0</param></service></servicedata> \ No newline at end of file ++++++ orion-1.5.1+git~20170518.tar.xz -> orion-1.5.1+git~20170519.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/orion-1.5.1+git~20170518/src/model/channel.cpp new/orion-1.5.1+git~20170519/src/model/channel.cpp --- old/orion-1.5.1+git~20170518/src/model/channel.cpp 2017-05-18 07:55:24.000000000 +0200 +++ new/orion-1.5.1+git~20170519/src/model/channel.cpp 2017-05-19 14:24:40.000000000 +0200 @@ -146,7 +146,7 @@ timestamp = QDateTime::currentDateTime().toMSecsSinceEpoch(); } -qint64 Channel::getTime(){ +qint64 Channel::getTime() const{ return timestamp; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/orion-1.5.1+git~20170518/src/model/channel.h new/orion-1.5.1+git~20170519/src/model/channel.h --- old/orion-1.5.1+git~20170518/src/model/channel.h 2017-05-18 07:55:24.000000000 +0200 +++ new/orion-1.5.1+git~20170519/src/model/channel.h 2017-05-19 14:24:40.000000000 +0200 @@ -57,7 +57,7 @@ void setLastSeen(time_t); const QString lastOnline(); void updateTime(); - qint64 getTime(); + qint64 getTime() const; const QString getName() const; const QString getServiceName() const; const QString getFullUri() const; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/orion-1.5.1+git~20170518/src/model/channellistmodel.cpp new/orion-1.5.1+git~20170519/src/model/channellistmodel.cpp --- old/orion-1.5.1+git~20170518/src/model/channellistmodel.cpp 2017-05-18 07:55:24.000000000 +0200 +++ new/orion-1.5.1+git~20170519/src/model/channellistmodel.cpp 2017-05-19 14:24:40.000000000 +0200 @@ -94,23 +94,84 @@ return channels.size(); } +void debugChannel(const QString prefix, const Channel * c) { + qDebug() << prefix << ":" << c->getId() << c->getName() << "game" << c->getGame() << "serviceName" << c->getServiceName() << "time" << c->getTime() << "viewers" << c->getViewers(); +} + +void ChannelListModel::addChannelInternal(Channel *channel) { + channels.append(channel); + auto id = channel->getId(); + if (id == 0) { + qDebug() << "inserting new channel with 0 id"; + } + else { + channelIdIndex.insert(id, channel); + } +} + void ChannelListModel::addChannel(Channel *channel) { - beginInsertRows(QModelIndex(), channels.size(), channels.size()); - channels.append(channel); - endInsertRows(); + if (updateChannelIfExisting(channel)) { + qDebug() << "ChannelListModel::addChannel got existing channel" << channel->getId() << channel->getName(); + } + else { + beginInsertRows(QModelIndex(), channels.size(), channels.size()); + addChannelInternal(channel); + endInsertRows(); + } +} + +bool ChannelListModel::updateChannelIfExisting(const Channel * channel) { + const auto id = channel->getId(); + + const auto existingChannelEntry = channelIdIndex.find(id); + if (existingChannelEntry != channelIdIndex.end()) { + Channel * existingChannel = existingChannelEntry.value(); + debugChannel("existingChannel", existingChannel); + debugChannel("addedChannel", channel); + + if (channel->getTime() < existingChannel->getTime()) { + qDebug() << "added item was older; skipping update"; + } + else { + existingChannel->updateWith(*channel); + updateChannelForView(existingChannel); + } + return true; + } + else { + return false; + } + } -void ChannelListModel::addAll(const QList<Channel *> &list) +int ChannelListModel::addAll(const QList<Channel *> &list) { - if (!list.isEmpty()){ - beginInsertRows(QModelIndex(), channels.size(), channels.size() + list.size() - 1); - foreach (Channel* channel, list){ - channels.append(new Channel(*channel)); + // prefilter the list to catch duplicates and update them + QList<Channel *> filteredList; + filteredList.reserve(list.size()); + + for (Channel * channel : list) { + if (updateChannelIfExisting(channel)) { + qDebug() << "ChannelListModel::addAll got existing channel" << channel->getId() << channel->getName(); + } + else { + filteredList.append(channel); } + } + if (!filteredList.isEmpty()){ + int newSize = channels.size() + filteredList.size(); + channels.reserve(newSize); + channelIdIndex.reserve(newSize); + beginInsertRows(QModelIndex(), channels.size(), channels.size() + filteredList.size() - 1); + for (const Channel* channel : filteredList){ + addChannelInternal(new Channel(*channel)); + } endInsertRows(); } + + return filteredList.length(); } void ChannelListModel::mergeAll(const QList<Channel *> &list) @@ -132,27 +193,20 @@ int index = channels.indexOf(channel); if (index > -1){ beginRemoveRows(QModelIndex(), index, index); + auto indexEntry = channelIdIndex.find(channel->getId()); + if (indexEntry != channelIdIndex.end() && indexEntry.value() == channel) { + channelIdIndex.erase(indexEntry); + } delete channels.takeAt(index); endRemoveRows(); } } -Channel *ChannelListModel::find(const QString &q) -{ - foreach(Channel *channel, channels){ - if (channel->getServiceName() == q){ - return channel; - } - } - return nullptr; -} - Channel *ChannelListModel::find(const quint32 &id) { - foreach(Channel *channel, channels){ - if (channel->getId() == id){ - return channel; - } + auto indexEntry = channelIdIndex.find(id); + if (indexEntry != channelIdIndex.end()) { + return indexEntry.value(); } return nullptr; } @@ -170,6 +224,7 @@ beginRemoveRows(QModelIndex(), 0, channels.size()); qDeleteAll(channels); channels.clear(); + channelIdIndex.clear(); endRemoveRows(); } } @@ -214,9 +269,13 @@ void ChannelListModel::updateChannel(Channel *item) { - if (item && !item->getServiceName().isEmpty()){ + if (item){ + if (item->getId() == 0) { + qDebug() << "updateChannel with id==0 item"; + return; + } - if (Channel *channel = find(item->getServiceName())){ + if (Channel *channel = find(item->getId())){ channel->updateWith(*item); updateChannelForView(channel); } @@ -276,12 +335,15 @@ void ChannelListModel::setAllChannelsOffline() { + int i = 0; foreach(Channel *channel, channels) { if (channel->isOnline()) { channel->setOnline(false); - updateChannelForView(channel); + //updateChannelForView(channel); + emit dataChanged(index(i), index(i)); emit channelOnlineStateChanged(channel); } + i++; } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/orion-1.5.1+git~20170518/src/model/channellistmodel.h new/orion-1.5.1+git~20170519/src/model/channellistmodel.h --- old/orion-1.5.1+git~20170518/src/model/channellistmodel.h 2017-05-18 07:55:24.000000000 +0200 +++ new/orion-1.5.1+git~20170519/src/model/channellistmodel.h 2017-05-19 14:24:40.000000000 +0200 @@ -42,11 +42,10 @@ void setAllChannelsOffline(); void addChannel(Channel*); - void addAll(const QList<Channel*> &); + int addAll(const QList<Channel*> &); void mergeAll(const QList<Channel*> &); void removeChannel(Channel*); - Channel* find(const QString&); Channel* find(const quint32&); void clearView(); void clear(); @@ -77,7 +76,9 @@ private: Q_DISABLE_COPY(ChannelListModel) QList<Channel*> channels; - + QHash<quint32, Channel *> channelIdIndex; + void addChannelInternal(Channel *); + bool updateChannelIfExisting(const Channel *); }; #endif // CHANNELCOLLECTION_H diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/orion-1.5.1+git~20170518/src/model/channelmanager.cpp new/orion-1.5.1+git~20170519/src/model/channelmanager.cpp --- old/orion-1.5.1+git~20170518/src/model/channelmanager.cpp 2017-05-18 07:55:24.000000000 +0200 +++ new/orion-1.5.1+git~20170519/src/model/channelmanager.cpp 2017-05-19 14:24:40.000000000 +0200 @@ -498,10 +498,6 @@ } } -Channel* ChannelManager::findFavourite(const QString &q){ - return favouritesModel->find(q); -} - void ChannelManager::removeFromFavourites(const quint32 &id){ Channel *chan = favouritesModel->find(id); @@ -597,14 +593,14 @@ needsStreamCheck = true; } - resultsModel->addAll(list); + int numAdded = resultsModel->addAll(list); if (needsStreamCheck) checkStreams(list); qDeleteAll(list); - emit resultsUpdated(); + emit resultsUpdated(numAdded); } void ChannelManager::getFeatured() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/orion-1.5.1+git~20170518/src/model/channelmanager.h new/orion-1.5.1+git~20170519/src/model/channelmanager.h --- old/orion-1.5.1+git~20170518/src/model/channelmanager.h 2017-05-18 07:55:24.000000000 +0200 +++ new/orion-1.5.1+git~20170519/src/model/channelmanager.h 2017-05-19 14:24:40.000000000 +0200 @@ -132,7 +132,6 @@ void load(); void save(); - Channel *findFavourite(const QString&); Q_INVOKABLE bool containsFavourite(const quint32&); void checkStreams(const QList<Channel*>&); @@ -270,7 +269,7 @@ signals: void pushNotification(const QString &title, const QString &message, const QString &imgUrl); - void resultsUpdated(); + void resultsUpdated(int numAdded); void featuredUpdated(); void searchingStarted(); void foundPlaybackStream(const QVariantMap &streams); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/orion-1.5.1+git~20170518/src/qml/SearchView.qml new/orion-1.5.1+git~20170519/src/qml/SearchView.qml --- old/orion-1.5.1+git~20170518/src/qml/SearchView.qml 2017-05-18 07:55:24.000000000 +0200 +++ new/orion-1.5.1+git~20170519/src/qml/SearchView.qml 2017-05-19 14:24:40.000000000 +0200 @@ -61,6 +61,8 @@ Connections { target: g_cman onResultsUpdated: { + channels.adjustItemCount(numAdded); + _spinner.visible = false _button.visible = true channels.checkScrolled() @@ -196,6 +198,14 @@ } } + function adjustItemCount(numAdded) { + // we pre-increased itemCount by the expected size of the result but it's possible that + // some results were not included due to duplicates filtering + if (numAdded !== 25) { + itemCount += numAdded - 25; + } + } + onAtYEndChanged: { if (visible) checkScrolled()
