[Amarok] Fix: Automatic playlist scrolling was broken in so

Seb Ruiz ruiz at kde.org
Wed Oct 7 14:01:21 CEST 2009


2009/10/7 Seb Ruiz <ruiz at kde.org>:
> 2009/10/7 Mark Kretschmann <kretschmann at kde.org>:
>> On Wed, Oct 7, 2009 at 1:22 PM, Seb Ruiz <ruiz at kde.org> wrote:
>>> 2009/10/7 Mark Kretschmann <kretschmann at kde.org>:
>>>> commit a9a46b6ceab835c646b89d744bfcc5a7176ef5c1
>>>> Author:     Mark Kretschmann <kretschmann at kde.org>
>>>> AuthorDate: Wed Oct 7 12:50:25 2009 +0200
>>>> Commit:     Mark Kretschmann <kretschmann at kde.org>
>>>> CommitDate: Wed Oct 7 12:50:25 2009 +0200
>>>>
>>>>    Fix: Automatic playlist scrolling was broken in some cases.
>>>>
>>>>    The actual bug was very very nasty. EngineObserver used QSet for storing
>>>>    observer pointers. This is what Qt docs say:
>>>>    "QSet is unordered, so an iterator's sequence cannot be assumed to be predictable."
>>>>    Now we're using QList, whose iteration order is predictable.
>>>>
>>>>    Thanks to Anthony Vital for pointing this out.
>>>>
>>>>    BUG: 193459
>>>>
>>>> diff --git a/ChangeLog b/ChangeLog
>>>> index 2518826..b89cadf 100644
>>>> --- a/ChangeLog
>>>> +++ b/ChangeLog
>>>> @@ -38,6 +38,7 @@ VERSION 2.2.1
>>>>       the lyrics applet.
>>>>
>>>>   BUGFIXES:
>>>> +    * Automatic playlist scrolling was broken in some cases. (BR 193459)
>>>>     * The On Screen Display now uses a sane font size with all display
>>>>       resolutions. (BR 195186)
>>>>     * Fix rare regression where inaccessible subfolders (due to permissions)
>>>> diff --git a/src/EngineObserver.cpp b/src/EngineObserver.cpp
>>>> index d62f40d..37b85fe 100644
>>>> --- a/src/EngineObserver.cpp
>>>> +++ b/src/EngineObserver.cpp
>>>> @@ -209,13 +209,13 @@ EngineSubject::attach( EngineObserver *observer )
>>>>     if( object )
>>>>         connect( object, SIGNAL( destroyed( QObject* ) ), this, SLOT( observerDestroyed( QObject* ) ) );
>>>>
>>>> -    Observers.insert( observer );
>>>> +    Observers.append( observer );
>>>>  }
>>>>
>>>>  void
>>>>  EngineSubject::detach( EngineObserver *observer )
>>>>  {
>>>> -    Observers.remove( observer );
>>>> +    Observers.removeAll( observer );
>>>>  }
>>>>
>>>>  void
>>>> @@ -224,7 +224,7 @@ EngineSubject::observerDestroyed( QObject* object ) //SLOT
>>>>     DEBUG_BLOCK
>>>>
>>>>     EngineObserver* observer = reinterpret_cast<EngineObserver*>( object ); // cast is OK, it's guaranteed to be an EngineObserver
>>>> -    Observers.remove( observer );
>>>> +    Observers.removeAll( observer );
>>>>
>>>>     debug() << "Removed EngineObserver: " << observer;
>>>>  }
>>>> diff --git a/src/EngineObserver.h b/src/EngineObserver.h
>>>> index c9f023c..92f15f6 100644
>>>> --- a/src/EngineObserver.h
>>>> +++ b/src/EngineObserver.h
>>>> @@ -24,7 +24,6 @@
>>>>  #include <Phonon/Global>
>>>>  #include <QHash>
>>>>  #include <QPointer>
>>>> -#include <QSet>
>>>>
>>>>  class EngineSubject;
>>>>  class QString;
>>>> @@ -187,7 +186,7 @@ private:
>>>>     bool isMetaDataSpam( QHash<qint64, QString> newMetaData );
>>>>
>>>>     QList<QHash<qint64, QString> > m_metaDataHistory;
>>>> -    QSet<EngineObserver*> Observers;
>>>> +    QList<EngineObserver*> Observers;
>>>>     Phonon::State m_realState; // To work around the buffering issue
>>>>  };
>>>>
>>>
>>> Curious - how does this solve the problem? Why should it matter what
>>> order the observers are in - I dislike that there is any code that
>>> relies on some deterministic order for iterating over them (each
>>> observer should be disjoint from the other)
>>
>> I agree that relying on the order is dangerous. So maybe the real
>> problem is in some other part of Amarok, design wise.
>
> Indeed - the bug report seems to indicate that the scrolling happens
> before the the new track is set. If this is the case, then we need to
> ensure we call ensureVisible after the track is reset.
>
> I think that we should revert this commit because a QSet is really the
> datastructure of choice here. It's important to fix the cause of the
> problem, not address the symptom here.

A quick squiz at the source tells me that we should be calling
View::scrollToActiveTrack() in
Playlist::Actions::engineNewTrackPlaying() and abolishing
engineNewTrackPlaying() from the view object -- the view should
respond to changes from the model, and the model can be controlled by
actions.



-- 
Seb Ruiz

http://www.sebruiz.net/
http://amarok.kde.org/


More information about the Amarok-devel mailing list