Summary: | Amarok crashed while playing track [@ CompoundProgressBar::endProgressOperation] | ||
---|---|---|---|
Product: | [Applications] amarok | Reporter: | Leonardo La Malfa <leonardo.la.malfa> |
Component: | Tools/Cover Manager | Assignee: | Amarok Developers <amarok-bugs-dist> |
Status: | RESOLVED FIXED | ||
Severity: | crash | CC: | jcchak, stuffcorpse |
Priority: | NOR | ||
Version: | 2.3.0 | ||
Target Milestone: | --- | ||
Platform: | Ubuntu | ||
OS: | Linux | ||
Latest Commit: | Version Fixed In: | 2.3.2 |
Description
Leonardo La Malfa
2010-04-30 11:41:46 UTC
That's somewhere in cover management, when using the statusbar. Can you reproduce the crash? Is it maybe solved in 2.3.1 beta 1? > --- Comment #1 from Sven Krohlas <sven asbest-online de> 2010-04-30
> 13:01:49 --- That's somewhere in cover management, when using the
> statusbar.
>
> Can you reproduce the crash? Is it maybe solved in 2.3.1 beta 1?
Hi, I cannot reproduce it. I've logged out, then back in, started Amarok,
which is playing fine so far. I mean, apart from switching it off, then back on,
I don't know what else to do. Anyway, I'll try your suggestion. If the issue
occurs again, then I'll report back here. Thanks!
*** Bug 237232 has been marked as a duplicate of this bug. *** Confirmed by duplicate. I can produce it. I'm working on it. commit dd056c21a44ca7b06cfe705d29cca6283d3c355d Author: Rick W. Chen <stuffcorpse@archlinux.us> Date: Mon May 10 00:20:51 2010 +1200 Fix cover manager crashing if closed shortly after opening and with lots of cleanups BUG:235796 diff --git a/src/covermanager/CoverManager.cpp b/src/covermanager/CoverManager.cpp index e864b8f..1322bf1 100644 --- a/src/covermanager/CoverManager.cpp +++ b/src/covermanager/CoverManager.cpp @@ -17,6 +17,8 @@ * this program. If not, see <http://www.gnu.org/licenses/>. * ****************************************************************************************/ +#define DEBUG_PREFIX "CoverManager" + #include "CoverManager.h" #include "CoverViewDialog.h" @@ -47,14 +49,13 @@ #include <QAction> #include <QDesktopWidget> #include <QProgressBar> +#include <QSplitter> #include <QStringList> #include <QTimer> //search filter timer #include <QToolButton> #include <QTreeWidget> #include <QTreeWidgetItem> -#define DEBUG_PREFIX "CoverManager" - static QString artistToSelectInInitFunction; CoverManager *CoverManager::s_instance = 0; @@ -82,14 +83,13 @@ class ArtistItem : public QTreeWidgetItem }; -CoverManager::CoverManager() - : QSplitter( 0 ) +CoverManager::CoverManager( QWidget *parent ) + : KDialog( parent ) , m_currentView( AllAlbums ) , m_timer( new QTimer( this ) ) //search filter timer , m_fetchingCovers( false ) , m_coversFetched( 0 ) , m_coverErrors( 0 ) - , m_isClosing( false ) , m_isLoadingCancelled( false ) { DEBUG_BLOCK @@ -100,12 +100,17 @@ CoverManager::CoverManager() // Sets caption and icon correctly (needed e.g. for GNOME) kapp->setTopWidget( this ); - setWindowTitle( KDialog::makeStandardCaption( i18n("Cover Manager") ) ); - setAttribute( Qt::WA_DeleteOnClose ); - setContentsMargins( 4, 4, 4, 4 ); + setButtons( 0 ); + setCaption( i18n("Cover Manager") ); + + connect( this, SIGNAL(hidden()), SLOT(delayedDestruct()) ); + connect( this, SIGNAL(closeClicked()), SLOT(delayedDestruct()) ); + + m_splitter = new QSplitter( this ); + setMainWidget( m_splitter ); //artist listview - m_artistView = new QTreeWidget( this ); + m_artistView = new QTreeWidget( m_splitter ); m_artistView->setHeaderLabel( i18n( "Albums By" ) ); m_artistView->setSortingEnabled( false ); m_artistView->setTextElideMode( Qt::ElideRight ); @@ -156,7 +161,7 @@ CoverManager::slotContinueConstruction() //SLOT } m_artistView->insertTopLevelItems( 0, m_items ); - KVBox *vbox = new KVBox( this ); + KVBox *vbox = new KVBox( m_splitter ); KHBox *hbox = new KHBox( vbox ); vbox->setSpacing( 4 ); @@ -219,37 +224,12 @@ CoverManager::slotContinueConstruction() //SLOT QSize sz = Amarok::config( "Cover Manager" ).readEntry( "Window Size", size ); resize( sz.width(), sz.height() ); - setStretchFactor( indexOf( m_artistView ), 1 ); - setStretchFactor( indexOf( vbox ), 4 ); - - show(); + m_splitter->setStretchFactor( m_splitter->indexOf( m_artistView ), 1 ); + m_splitter->setStretchFactor( m_splitter->indexOf( vbox ), 4 ); m_fetcher = The::coverFetcher(); - QTimer::singleShot( 0, this, SLOT(init()) ); -} - -CoverManager::~CoverManager() -{ - DEBUG_BLOCK - - Amarok::config( "Cover Manager" ).writeEntry( "Window Size", size() ); - s_instance = 0; - - m_isClosing = true; - m_isLoadingCancelled = true; - qDeleteAll( m_coverItems ); - delete m_coverView; - m_coverView = 0; -} - -void -CoverManager::init() -{ - DEBUG_BLOCK - QTreeWidgetItem *item = 0; - int i = 0; if ( !artistToSelectInInitFunction.isEmpty() ) { @@ -276,8 +256,17 @@ CoverManager::init() item = m_artistView->invisibleRootItem()->child( 0 ); item->setSelected( true ); + show(); } +CoverManager::~CoverManager() +{ + Amarok::config( "Cover Manager" ).writeEntry( "Window Size", size() ); + qDeleteAll( m_coverItems ); + delete m_coverView; + m_coverView = 0; + s_instance = 0; +} void CoverManager::viewCover( Meta::AlbumPtr album, QWidget *parent ) //static @@ -302,8 +291,6 @@ CoverManager::metadataChanged( Meta::AlbumPtr album ) void CoverManager::fetchMissingCovers() //SLOT { - DEBUG_BLOCK - m_fetchCovers.clear(); for( int i = 0, coverCount = m_coverView->count(); i < coverCount; ++i ) { @@ -313,6 +300,8 @@ CoverManager::fetchMissingCovers() //SLOT m_fetchCovers += coverItem->albumPtr(); } + debug() << QString( "Fetching %1 missing covers" ).arg( m_fetchCovers.size() ); + ProgressBar *fetchProgressBar = new ProgressBar( this ); fetchProgressBar->setDescription( i18n( "Fetching" ) ); fetchProgressBar->setMaximum( m_fetchCovers.size() ); @@ -325,7 +314,6 @@ CoverManager::fetchMissingCovers() //SLOT updateStatusBar(); m_fetchButton->setEnabled( false ); connect( m_fetcher, SIGNAL(finishedSingle(int)), SLOT(updateFetchingProgress(int)) ); - } void @@ -380,8 +368,6 @@ CoverManager::slotArtistSelected() //SLOT qm->excludeFilter( Meta::valAlbum, QString(), true, true ); qm->endAndOr(); - m_albumList.clear(); - connect( qm, SIGNAL( newResultReady( QString, Meta::AlbumList ) ), this, SLOT( slotAlbumQueryResult( QString, Meta::AlbumList ) ) ); @@ -393,12 +379,10 @@ CoverManager::slotArtistSelected() //SLOT void CoverManager::slotAlbumQueryResult( QString collectionId, Meta::AlbumList albums ) //SLOT { - DEBUG_BLOCK Q_UNUSED( collectionId ); - m_albumList += albums; + m_albumList = albums; } - void CoverManager::slotAlbumFilterTriggered( QAction *action ) //SLOT { @@ -423,15 +407,21 @@ CoverManager::slotArtistQueryDone() //SLOT m_progress->show(); uint x = 0; + debug() << "Loading covers for selected artist(s)"; //the process events calls below causes massive flickering in the m_albumList //so we hide this view and only show it when all items has been inserted. This //also provides quite a massive speed improvement when loading covers. m_coverView->hide(); m_coverViewSpacer->show(); - foreach( Meta::AlbumPtr album, m_albumList ) + foreach( const Meta::AlbumPtr &album, m_albumList ) { - kapp->processEvents(); + kapp->processEvents( QEventLoop::ExcludeSocketNotifiers ); + if( isHidden() ) + { + m_progress->endProgressOperation( m_coverView ); + return; + } /* * Loading is stopped if cancelled by the user, or the number of albums * has changed. The latter occurs when the artist selection changes. @@ -450,12 +440,8 @@ CoverManager::slotArtistQueryDone() //SLOT m_progress->setProgress( m_coverView, x ); } } - m_progress->endProgressOperation( m_coverView ); - if( m_isClosing ) - return; - // makes sure View is retained when artist selection changes changeView( m_currentView, true ); @@ -527,15 +513,13 @@ CoverManager::slotSetFilterTimeout() //SLOT void CoverManager::changeView( CoverManager::View id, bool force ) //SLOT { - DEBUG_BLOCK - if( !force && m_currentView == id ) return; //clear the iconview without deleting items m_coverView->clearSelection(); - - while ( m_coverView->count() > 0 ) + int itemsCount = m_coverView->count(); + while( itemsCount-- > 0 ) m_coverView->takeItem( 0 ); foreach( QListWidgetItem *item, m_coverItems ) diff --git a/src/covermanager/CoverManager.h b/src/covermanager/CoverManager.h index aeb7910..df2c634 100644 --- a/src/covermanager/CoverManager.h +++ b/src/covermanager/CoverManager.h @@ -20,7 +20,8 @@ #include "CoverFetcher.h" -#include <QSplitter> +#include <KDialog> + #include <QDropEvent> #include <QLabel> #include <QListWidget> @@ -42,8 +43,9 @@ class KHBox; class QProgressBar; class QHBoxLayout; class QColorGroup; +class QSplitter; -class CoverManager : public QSplitter, public Meta::Observer +class CoverManager : public KDialog, public Meta::Observer { Q_OBJECT @@ -51,7 +53,7 @@ class CoverManager : public QSplitter, public Meta::Observer static bool s_constructed; public: - CoverManager(); + CoverManager( QWidget *parent = 0 ); ~CoverManager(); static bool isConstructed() { return s_constructed; } @@ -75,7 +77,6 @@ class CoverManager : public QSplitter, public Meta::Observer private slots: void slotArtistQueryResult( QString collectionId, Meta::ArtistList artists ); void slotContinueConstruction(); - void init(); void slotArtistSelected(); void slotAlbumQueryResult( QString collectionId, Meta::AlbumList albums ); @@ -102,6 +103,7 @@ class CoverManager : public QSplitter, public Meta::Observer void loadCover( const QString &, const QString & ); QList<CoverViewItem*> selectedItems(); + QSplitter *m_splitter; QTreeWidget *m_artistView; CoverView *m_coverView; @@ -141,7 +143,6 @@ class CoverManager : public QSplitter, public Meta::Observer int m_coversFetched; int m_coverErrors; - bool m_isClosing; bool m_isLoadingCancelled; }; |