From 7f4d64d8dc8f61ce948897460b9d0381fe684cb4 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Thu, 21 Jul 2011 00:43:03 +0200 Subject: [PATCH 01/20] * Always apply ProxyStyle. --- src/tomahawkwindow.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/tomahawkwindow.cpp b/src/tomahawkwindow.cpp index 7fcbd08ca..39ecaab5e 100644 --- a/src/tomahawkwindow.cpp +++ b/src/tomahawkwindow.cpp @@ -160,13 +160,11 @@ TomahawkWindow::saveSettings() void TomahawkWindow::applyPlatformTweaks() { -#ifdef Q_WS_X11 // HACK QtCurve causes an infinite loop on startup. This is because setStyle calls setPalette, which calls ensureBaseStyle, // which loads QtCurve. QtCurve calls setPalette, which creates an infinite loop. The UI will look like CRAP with QtCurve, but // the user is asking for it explicitly... so he's gonna be stuck with an ugly UI. if ( !QString( qApp->style()->metaObject()->className() ).toLower().contains( "qtcurve" ) ) qApp->setStyle( new ProxyStyle() ); -#endif #ifdef Q_WS_MAC setUnifiedTitleAndToolBarOnMac( true ); From dbf31d704a883330cb82827163f55a49de48c52e Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Thu, 21 Jul 2011 00:59:26 +0200 Subject: [PATCH 02/20] * Cleaned up QtScriptResolver and added vital debug output. --- src/resolvers/qtscriptresolver.cpp | 26 ++++++++++++++++++++------ src/resolvers/qtscriptresolver.h | 5 ++--- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/resolvers/qtscriptresolver.cpp b/src/resolvers/qtscriptresolver.cpp index 0aa7dd90b..5c32fe3f1 100644 --- a/src/resolvers/qtscriptresolver.cpp +++ b/src/resolvers/qtscriptresolver.cpp @@ -68,14 +68,14 @@ QtScriptResolverHelper::compress( const QString& data ) QString -QtScriptResolverHelper::readCompressed(const QString& fileName) +QtScriptResolverHelper::readCompressed( const QString& fileName ) { return compress( readRaw( fileName ) ); } QString -QtScriptResolverHelper::readBase64(const QString& fileName) +QtScriptResolverHelper::readBase64( const QString& fileName ) { return readRaw( fileName ).toBase64(); } @@ -91,7 +91,8 @@ QtScriptResolverHelper::resolverData() } -void QtScriptResolverHelper::log(const QString& message) +void +QtScriptResolverHelper::log( const QString& message ) { qDebug() << m_scriptPath << ":" << message; } @@ -104,6 +105,14 @@ QtScriptResolverHelper::setResolverConfig( QVariantMap config ) } +void +ScriptEngine::javaScriptConsoleMessage( const QString& message, int lineNumber, const QString& sourceID ) +{ + qDebug() << "JAVASCRIPT:" << m_scriptPath << message << lineNumber << sourceID; + Q_ASSERT( false ); +} + + QtScriptResolver::QtScriptResolver( const QString& scriptPath ) : Tomahawk::ExternalResolver( scriptPath ) , m_ready( false ) @@ -118,7 +127,8 @@ QtScriptResolver::QtScriptResolver( const QString& scriptPath ) { qDebug() << Q_FUNC_INFO << "Failed loading JavaScript resolver:" << scriptPath; m_error = Tomahawk::ExternalResolver::FileNotFound; - } else + } + else { init(); } @@ -132,6 +142,7 @@ QtScriptResolver::~QtScriptResolver() delete m_engine; } + void QtScriptResolver::reload() { @@ -145,6 +156,7 @@ QtScriptResolver::reload() } } + void QtScriptResolver::init() { @@ -191,12 +203,14 @@ QtScriptResolver::init() Tomahawk::Pipeline::instance()->addResolver( this ); } + Tomahawk::ExternalResolver::ErrorState QtScriptResolver::error() const { return m_error; } + void QtScriptResolver::resolve( const Tomahawk::query_ptr& query ) { @@ -207,7 +221,7 @@ QtScriptResolver::resolve( const Tomahawk::query_ptr& query ) return; } -// qDebug() << Q_FUNC_INFO << query->toString(); + qDebug() << Q_FUNC_INFO << "Resolving now with" << m_name << "-" << query->toString(); QString eval; if ( !query->isFullTextQuery() ) @@ -225,7 +239,7 @@ QtScriptResolver::resolve( const Tomahawk::query_ptr& query ) "} else {" " resolve( '%1', '', '', '%2' );" "}" - ) + ) .arg( query->id().replace( "'", "\\'" ) ) .arg( query->fullTextQuery().replace( "'", "\\'" ) ); } diff --git a/src/resolvers/qtscriptresolver.h b/src/resolvers/qtscriptresolver.h index f9ec1a370..c337075e5 100644 --- a/src/resolvers/qtscriptresolver.h +++ b/src/resolvers/qtscriptresolver.h @@ -50,7 +50,7 @@ public slots: QString compress( const QString& data ); QVariantMap resolverData(); - void log( const QString& message); + void log( const QString& message ); bool fakeEnv() { return false; } private: @@ -86,8 +86,7 @@ public slots: } protected: - virtual void javaScriptConsoleMessage( const QString & message, int lineNumber, const QString & sourceID ) - { qDebug() << "JAVASCRIPT:" << m_scriptPath << message << lineNumber << sourceID; Q_ASSERT(false);} + virtual void javaScriptConsoleMessage( const QString& message, int lineNumber, const QString& sourceID ); private: QtScriptResolver* m_parent; From bcf7d9d6896a641637a0cac356179a6be546b0b3 Mon Sep 17 00:00:00 2001 From: Alejandro Wainzinger Date: Thu, 21 Jul 2011 01:57:41 -0700 Subject: [PATCH 03/20] * Fixed TWK-261 - Make "show offline sources" a checkable option, and save its value in settings. --- src/libtomahawk/tomahawksettings.cpp | 11 +++++++++++ src/libtomahawk/tomahawksettings.h | 4 ++++ src/sourcetree/sourcesproxymodel.cpp | 13 ++----------- src/sourcetree/sourcesproxymodel.h | 3 +-- src/sourcetree/sourcetreeview.cpp | 15 ++++----------- src/sourcetree/sourcetreeview.h | 3 +-- src/tomahawkwindow.cpp | 13 +++++++++++-- src/tomahawkwindow.h | 1 + src/tomahawkwindow.ui | 6 ++++-- 9 files changed, 39 insertions(+), 30 deletions(-) diff --git a/src/libtomahawk/tomahawksettings.cpp b/src/libtomahawk/tomahawksettings.cpp index 40fa85624..d05152b25 100644 --- a/src/libtomahawk/tomahawksettings.cpp +++ b/src/libtomahawk/tomahawksettings.cpp @@ -447,6 +447,17 @@ TomahawkSettings::setVerboseNotifications( bool notifications ) setValue( "ui/notifications/verbose", notifications ); } +bool +TomahawkSettings::showOfflineSources() const +{ + return value( "collection/sources/showoffline", false ).toBool(); +} + +void +TomahawkSettings::setShowOfflineSources( bool show ) +{ + setValue( "collection/sources/showoffline", show ); +} QByteArray TomahawkSettings::playlistColumnSizes( const QString& playlistid ) const diff --git a/src/libtomahawk/tomahawksettings.h b/src/libtomahawk/tomahawksettings.h index d3ffd1c3a..f22d530dc 100644 --- a/src/libtomahawk/tomahawksettings.h +++ b/src/libtomahawk/tomahawksettings.h @@ -71,6 +71,10 @@ public: bool verboseNotifications() const; void setVerboseNotifications( bool notifications ); + // Collection Stuff + bool showOfflineSources() const; + void setShowOfflineSources( bool show ); + /// Playlist stuff QByteArray playlistColumnSizes( const QString& playlistid ) const; void setPlaylistColumnSizes( const QString& playlistid, const QByteArray& state ); diff --git a/src/sourcetree/sourcesproxymodel.cpp b/src/sourcetree/sourcesproxymodel.cpp index 094238688..855ec1ef0 100644 --- a/src/sourcetree/sourcesproxymodel.cpp +++ b/src/sourcetree/sourcesproxymodel.cpp @@ -44,21 +44,12 @@ SourcesProxyModel::SourcesProxyModel( SourcesModel* model, QObject* parent ) void -SourcesProxyModel::showOfflineSources() +SourcesProxyModel::showOfflineSources( bool offlineSourcesShown ) { - m_filtered = false; + m_filtered = !offlineSourcesShown; invalidateFilter(); } - -void -SourcesProxyModel::hideOfflineSources() -{ - m_filtered = true; - invalidateFilter(); -} - - bool SourcesProxyModel::filterAcceptsRow( int sourceRow, const QModelIndex& sourceParent ) const { diff --git a/src/sourcetree/sourcesproxymodel.h b/src/sourcetree/sourcesproxymodel.h index cd4cfbf9c..4599d8c5c 100644 --- a/src/sourcetree/sourcesproxymodel.h +++ b/src/sourcetree/sourcesproxymodel.h @@ -31,8 +31,7 @@ public: explicit SourcesProxyModel( SourcesModel* model, QObject* parent = 0 ); public slots: - void showOfflineSources(); - void hideOfflineSources(); + void showOfflineSources( bool offlineSourcesShown ); void selectRequested( const QModelIndex& ); diff --git a/src/sourcetree/sourcetreeview.cpp b/src/sourcetree/sourcetreeview.cpp index fe5a9e66b..cd6139d91 100644 --- a/src/sourcetree/sourcetreeview.cpp +++ b/src/sourcetree/sourcetreeview.cpp @@ -26,6 +26,7 @@ #include "sourcetree/items/collectionitem.h" #include "audio/audioengine.h" #include "sourceplaylistinterface.h" +#include "tomahawksettings.h" #include #include @@ -110,7 +111,7 @@ SourceTreeView::SourceTreeView( QWidget* parent ) connect( this, SIGNAL( expanded( QModelIndex ) ), this, SLOT( onItemExpanded( QModelIndex ) ) ); // connect( selectionModel(), SIGNAL( selectionChanged( QItemSelection, QItemSelection ) ), SLOT( onSelectionChanged() ) ); - hideOfflineSources(); + showOfflineSources( TomahawkSettings::instance()->showOfflineSources() ); // Light-blue sourcetree on osx #ifdef Q_WS_MAC @@ -199,19 +200,11 @@ SourceTreeView::setupMenus() void -SourceTreeView::showOfflineSources() +SourceTreeView::showOfflineSources( bool offlineSourcesShown ) { - m_proxyModel->showOfflineSources(); + m_proxyModel->showOfflineSources( offlineSourcesShown ); } - -void -SourceTreeView::hideOfflineSources() -{ - m_proxyModel->hideOfflineSources(); -} - - void SourceTreeView::onItemActivated( const QModelIndex& index ) { diff --git a/src/sourcetree/sourcetreeview.h b/src/sourcetree/sourcetreeview.h index a33b3f7c5..54054732a 100644 --- a/src/sourcetree/sourcetreeview.h +++ b/src/sourcetree/sourcetreeview.h @@ -38,8 +38,7 @@ public: explicit SourceTreeView( QWidget* parent = 0 ); public slots: - void showOfflineSources(); - void hideOfflineSources(); + void showOfflineSources( bool offlineSourcesShown ); void renamePlaylist(); signals: diff --git a/src/tomahawkwindow.cpp b/src/tomahawkwindow.cpp index 39ecaab5e..d9f90074c 100644 --- a/src/tomahawkwindow.cpp +++ b/src/tomahawkwindow.cpp @@ -206,6 +206,9 @@ TomahawkWindow::setupSideBar() ui->splitter->setStretchFactor( 1, 3 ); ui->splitter->setCollapsible( 1, false ); ui->splitter->setHandleWidth( 1 ); + + ui->actionShowOfflineSources->setChecked( TomahawkSettings::instance()->showOfflineSources() ); + } @@ -298,8 +301,7 @@ TomahawkWindow::setupSignals() connect( ui->actionCreate_New_Station, SIGNAL( triggered() ), SLOT( createStation() )); connect( ui->actionAboutTomahawk, SIGNAL( triggered() ), SLOT( showAboutTomahawk() ) ); connect( ui->actionExit, SIGNAL( triggered() ), qApp, SLOT( quit() ) ); - connect( ui->actionHideOfflineSources, SIGNAL( triggered() ), m_sourcetree, SLOT( hideOfflineSources() ) ); - connect( ui->actionShowOfflineSources, SIGNAL( triggered() ), m_sourcetree, SLOT( showOfflineSources() ) ); + connect( ui->actionShowOfflineSources, SIGNAL( triggered() ), SLOT( showOfflineSources() ) ); connect( ui->actionPlay, SIGNAL( triggered() ), AudioEngine::instance(), SLOT( playPause() ) ); connect( ui->actionNext, SIGNAL( triggered() ), AudioEngine::instance(), SLOT( previous() ) ); @@ -474,6 +476,13 @@ TomahawkWindow::pluginMenuRemoved( QMenu* menu ) } } +void +TomahawkWindow::showOfflineSources() +{ + m_sourcetree->showOfflineSources( ui->actionShowOfflineSources->isChecked() ); + TomahawkSettings::instance()->setShowOfflineSources( ui->actionShowOfflineSources->isChecked() ); +} + void TomahawkWindow::loadSpiff() diff --git a/src/tomahawkwindow.h b/src/tomahawkwindow.h index ed529893d..49605a048 100644 --- a/src/tomahawkwindow.h +++ b/src/tomahawkwindow.h @@ -71,6 +71,7 @@ public slots: void rescanCollectionManually(); void pluginMenuAdded(QMenu*); void pluginMenuRemoved(QMenu*); + void showOfflineSources(); private slots: void onSipConnected(); diff --git a/src/tomahawkwindow.ui b/src/tomahawkwindow.ui index 0f506a40c..dad448a42 100644 --- a/src/tomahawkwindow.ui +++ b/src/tomahawkwindow.ui @@ -35,7 +35,7 @@ 0 0 1000 - 20 + 22 @@ -56,7 +56,6 @@ - @@ -164,6 +163,9 @@ + + true + Show Offline Sources From 00c122b05c82193594e99c484dad001a7f49e6ec Mon Sep 17 00:00:00 2001 From: Alejandro Wainzinger Date: Thu, 21 Jul 2011 05:14:31 -0700 Subject: [PATCH 04/20] * Fixed TWK-249 - Add a bit more widget spacing to fix clipping of search box. --- src/libtomahawk/playlist/topbar/searchlineedit.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/libtomahawk/playlist/topbar/searchlineedit.cpp b/src/libtomahawk/playlist/topbar/searchlineedit.cpp index 683e6e135..e7ed3fdca 100644 --- a/src/libtomahawk/playlist/topbar/searchlineedit.cpp +++ b/src/libtomahawk/playlist/topbar/searchlineedit.cpp @@ -52,6 +52,8 @@ void SearchLineEdit::init() addWidget(m_clearButton, RightSide); m_clearButton->hide(); + setWidgetSpacing(5); + updateTextMargins(); setInactiveText(tr("Search")); } From 4ac6c32a45739798afda53a4b4b81fba02f3d75a Mon Sep 17 00:00:00 2001 From: Alejandro Wainzinger Date: Thu, 21 Jul 2011 05:16:09 -0700 Subject: [PATCH 05/20] Use clear() to clear text, not a QString(). --- src/tomahawkwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tomahawkwindow.cpp b/src/tomahawkwindow.cpp index d9f90074c..fe4547b83 100644 --- a/src/tomahawkwindow.cpp +++ b/src/tomahawkwindow.cpp @@ -676,7 +676,7 @@ void TomahawkWindow::onSearch() { ViewManager::instance()->show( new SearchWidget( m_searchWidget->searchEdit->text(), this ) ); - m_searchWidget->searchEdit->setText( QString() ); + m_searchWidget->searchEdit->clear(); } From 57cdd0d960ef9ca0086604ef9ca8577bf47960b6 Mon Sep 17 00:00:00 2001 From: Leo Franchi Date: Thu, 21 Jul 2011 11:20:41 -0400 Subject: [PATCH 06/20] Bring to front on mac when a tomahawkurl is opened in Tomahawk. Will add linux and win-specific code as well. --- src/libtomahawk/CMakeLists.txt | 5 ++++- src/libtomahawk/utils/tomahawkutils.cpp | 6 ++++++ src/libtomahawk/utils/tomahawkutils.h | 3 +++ src/libtomahawk/utils/tomahawkutils_mac.mm | 14 ++++++++++++++ src/tomahawkapp.cpp | 3 ++- 5 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 src/libtomahawk/utils/tomahawkutils_mac.mm diff --git a/src/libtomahawk/CMakeLists.txt b/src/libtomahawk/CMakeLists.txt index 78d252976..b5fbd59f3 100644 --- a/src/libtomahawk/CMakeLists.txt +++ b/src/libtomahawk/CMakeLists.txt @@ -420,7 +420,8 @@ IF( APPLE ) SET( libSources ${libSources} infosystem/infoplugins/mac/adium.mm - infosystem/infoplugins/mac/adiumplugin.cpp ) + infosystem/infoplugins/mac/adiumplugin.cpp + utils/tomahawkutils_mac.mm ) SET( libHeaders ${libHeaders} infosystem/infoplugins/mac/adium.h @@ -433,6 +434,8 @@ IF( APPLE ) ${COREFOUNDATION_LIBRARY} ${FOUNDATION_LIBRARY} ${SCRIPTINGBRIDGE_LIBRARY} + + /System/Library/Frameworks/AppKit.framework ) ENDIF( APPLE ) diff --git a/src/libtomahawk/utils/tomahawkutils.cpp b/src/libtomahawk/utils/tomahawkutils.cpp index 4a371461c..0e310f6c5 100644 --- a/src/libtomahawk/utils/tomahawkutils.cpp +++ b/src/libtomahawk/utils/tomahawkutils.cpp @@ -460,5 +460,11 @@ setNam( QNetworkAccessManager* nam ) s_nam = QWeakPointer< QNetworkAccessManager >( nam ); } +#ifndef Q_OS_MAC +void +bringToFront() { + +} +#endif } // ns diff --git a/src/libtomahawk/utils/tomahawkutils.h b/src/libtomahawk/utils/tomahawkutils.h index d30658878..f3c1263c1 100644 --- a/src/libtomahawk/utils/tomahawkutils.h +++ b/src/libtomahawk/utils/tomahawkutils.h @@ -80,6 +80,9 @@ namespace TomahawkUtils DLLEXPORT void setProxyFactory( TomahawkUtils::NetworkProxyFactory* factory ); DLLEXPORT void setNam( QNetworkAccessManager* nam ); + + /// Platform-specific bringing tomahawk mainwindow to front, b/c qt's activate() and such don't seem to work well enough for us + DLLEXPORT void bringToFront(); } #endif // TOMAHAWKUTILS_H diff --git a/src/libtomahawk/utils/tomahawkutils_mac.mm b/src/libtomahawk/utils/tomahawkutils_mac.mm new file mode 100644 index 000000000..9a9079147 --- /dev/null +++ b/src/libtomahawk/utils/tomahawkutils_mac.mm @@ -0,0 +1,14 @@ +#include "tomahawkutils.h" + +#import + +namespace TomahawkUtils +{ + +void +bringToFront() { + qDebug() << "foo"; + [NSApp activateIgnoringOtherApps:YES]; +} + +} diff --git a/src/tomahawkapp.cpp b/src/tomahawkapp.cpp index fe9883838..1b8f3c61d 100644 --- a/src/tomahawkapp.cpp +++ b/src/tomahawkapp.cpp @@ -570,7 +570,7 @@ void TomahawkApp::activate() { #ifndef TOMAHAWK_HEADLESS - mainWindow()->show(); + TomahawkUtils::bringToFront(); #endif } @@ -578,6 +578,7 @@ TomahawkApp::activate() bool TomahawkApp::loadUrl( const QString& url ) { + activate(); if ( url.startsWith( "tomahawk://" ) ) return GlobalActionManager::instance()->parseTomahawkLink( url ); else From aa5fb8bc533c86b029e6c889a63512b8bd50208e Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Thu, 21 Jul 2011 18:49:04 +0200 Subject: [PATCH 07/20] * Fixed GStreamer pausing - even more. Sigh for Phonon's states. --- src/libtomahawk/audio/audioengine.cpp | 8 ++------ src/resolvers/qtscriptresolver.cpp | 23 ++++++++++------------- 2 files changed, 12 insertions(+), 19 deletions(-) diff --git a/src/libtomahawk/audio/audioengine.cpp b/src/libtomahawk/audio/audioengine.cpp index 2e43c13de..f2bdceb16 100644 --- a/src/libtomahawk/audio/audioengine.cpp +++ b/src/libtomahawk/audio/audioengine.cpp @@ -520,10 +520,6 @@ AudioEngine::onStateChanged( Phonon::State newState, Phonon::State oldState ) if ( newState == Phonon::PlayingState ) setState( Playing ); - if ( !m_expectStop ) - return; - m_expectStop = false; - if ( oldState == Phonon::PlayingState ) { qint64 duration = m_mediaObject->totalTime() > 0 ? m_mediaObject->totalTime() : m_currentTrack->duration() * 1000; @@ -533,7 +529,6 @@ AudioEngine::onStateChanged( Phonon::State newState, Phonon::State oldState ) case Phonon::PausedState: { stopped = ( duration - 1000 < m_mediaObject->currentTime() ); - if ( !stopped ) setState( Paused ); @@ -548,8 +543,9 @@ AudioEngine::onStateChanged( Phonon::State newState, Phonon::State oldState ) break; } - if ( stopped ) + if ( stopped && m_expectStop ) { + m_expectStop = false; qDebug() << "Loading next track."; loadNextTrack(); } diff --git a/src/resolvers/qtscriptresolver.cpp b/src/resolvers/qtscriptresolver.cpp index 5c32fe3f1..63b887b90 100644 --- a/src/resolvers/qtscriptresolver.cpp +++ b/src/resolvers/qtscriptresolver.cpp @@ -188,13 +188,13 @@ QtScriptResolver::init() resolverInit(); QVariantMap m = resolverSettings(); - m_name = m.value( "name" ).toString(); - m_weight = m.value( "weight", 0 ).toUInt(); - m_timeout = m.value( "timeout", 25 ).toUInt() * 1000; + m_name = m.value( "name" ).toString(); + m_weight = m.value( "weight", 0 ).toUInt(); + m_timeout = m.value( "timeout", 25 ).toUInt() * 1000; // load config widget and apply settings loadUi(); - QVariantMap config = resolverUserConfig(); + QVariantMap config = resolverUserConfig(); fillDataInWidgets( config ); qDebug() << Q_FUNC_INFO << m_name << m_weight << m_timeout; @@ -216,21 +216,18 @@ QtScriptResolver::resolve( const Tomahawk::query_ptr& query ) { if ( QThread::currentThread() != thread() ) { -// qDebug() << "Reinvoking in correct thread:" << Q_FUNC_INFO; QMetaObject::invokeMethod( this, "resolve", Qt::QueuedConnection, Q_ARG(Tomahawk::query_ptr, query) ); return; } - qDebug() << Q_FUNC_INFO << "Resolving now with" << m_name << "-" << query->toString(); QString eval; - if ( !query->isFullTextQuery() ) { eval = QString( RESOLVER_LEGACY_CODE2 "resolver.resolve( '%1', '%2', '%3', '%4' );" ) - .arg( query->id().replace( "'", "\\'" ) ) - .arg( query->artist().replace( "'", "\\'" ) ) - .arg( query->album().replace( "'", "\\'" ) ) - .arg( query->track().replace( "'", "\\'" ) ); + .arg( query->id().replace( "'", "\\'" ) ) + .arg( query->artist().replace( "'", "\\'" ) ) + .arg( query->album().replace( "'", "\\'" ) ) + .arg( query->track().replace( "'", "\\'" ) ); } else { @@ -240,8 +237,8 @@ QtScriptResolver::resolve( const Tomahawk::query_ptr& query ) " resolve( '%1', '', '', '%2' );" "}" ) - .arg( query->id().replace( "'", "\\'" ) ) - .arg( query->fullTextQuery().replace( "'", "\\'" ) ); + .arg( query->id().replace( "'", "\\'" ) ) + .arg( query->fullTextQuery().replace( "'", "\\'" ) ); } QList< Tomahawk::result_ptr > results; From c0ee4751a0f212bf7c718f0687f86eab9d37b765 Mon Sep 17 00:00:00 2001 From: Leo Franchi Date: Thu, 21 Jul 2011 13:34:20 -0400 Subject: [PATCH 08/20] make link manager adapt to pipeline reportresult changes --- src/libtomahawk/globalactionmanager.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/libtomahawk/globalactionmanager.cpp b/src/libtomahawk/globalactionmanager.cpp index ad85da31c..6169a40c7 100644 --- a/src/libtomahawk/globalactionmanager.cpp +++ b/src/libtomahawk/globalactionmanager.cpp @@ -668,12 +668,18 @@ GlobalActionManager::showPlaylist() void GlobalActionManager::waitingForResolved( bool success ) { + if( m_waitingToPlay.data() != sender() ) + { + m_waitingToPlay.clear(); + return; + } + if( success && !m_waitingToPlay.isNull() && !m_waitingToPlay->results().isEmpty() ) { // play it! // AudioEngine::instance()->playItem( AudioEngine::instance()->playlist(), m_waitingToPlay->results().first() ); AudioEngine::instance()->play(); - } - m_waitingToPlay.clear(); + m_waitingToPlay.clear(); + } } QString From 1da74e4d81de6fd27e9d8ff99e2fff8c66b96116 Mon Sep 17 00:00:00 2001 From: Leo Franchi Date: Thu, 21 Jul 2011 14:55:57 -0400 Subject: [PATCH 09/20] Add a stretch factor to the title of the playlist header, things like "My Collection" don't get elided to My...tion --- src/libtomahawk/playlist/infobar/infobar.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libtomahawk/playlist/infobar/infobar.ui b/src/libtomahawk/playlist/infobar/infobar.ui index 379101249..e7e81d7d8 100644 --- a/src/libtomahawk/playlist/infobar/infobar.ui +++ b/src/libtomahawk/playlist/infobar/infobar.ui @@ -25,7 +25,7 @@ InfoBar - + From f36b95fe6b85b20cc7cf914589e693bef49e1f58 Mon Sep 17 00:00:00 2001 From: Leo Franchi Date: Thu, 21 Jul 2011 16:21:45 -0400 Subject: [PATCH 10/20] OSX: Don't quit on window close, to conform to OSX expectations. Add Show/Hide action to tray icon. --- src/libtomahawk/utils/tomahawkutils_mac.mm | 1 - src/tomahawkapp.cpp | 2 ++ src/tomahawkapp.h | 2 +- src/tomahawktrayicon.cpp | 37 ++++++++++++++++++++++ src/tomahawktrayicon.h | 7 ++++ src/tomahawkwindow.cpp | 2 ++ 6 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/libtomahawk/utils/tomahawkutils_mac.mm b/src/libtomahawk/utils/tomahawkutils_mac.mm index 9a9079147..d7e710237 100644 --- a/src/libtomahawk/utils/tomahawkutils_mac.mm +++ b/src/libtomahawk/utils/tomahawkutils_mac.mm @@ -7,7 +7,6 @@ namespace TomahawkUtils void bringToFront() { - qDebug() << "foo"; [NSApp activateIgnoringOtherApps:YES]; } diff --git a/src/tomahawkapp.cpp b/src/tomahawkapp.cpp index 1b8f3c61d..88cb21e27 100644 --- a/src/tomahawkapp.cpp +++ b/src/tomahawkapp.cpp @@ -250,6 +250,8 @@ TomahawkApp::init() Tomahawk::setApplicationHandler( this ); increaseMaxFileDescriptors(); + + setQuitOnLastWindowClosed( false ); #endif // Connect up shortcuts diff --git a/src/tomahawkapp.h b/src/tomahawkapp.h index 69b78fe3e..ea13702e7 100644 --- a/src/tomahawkapp.h +++ b/src/tomahawkapp.h @@ -95,10 +95,10 @@ public: Tomahawk::ExternalResolver* resolverForPath( const QString& scriptPath ); // PlatformInterface - virtual void activate(); virtual bool loadUrl( const QString& url ); public slots: + virtual void activate(); void instanceStarted( KDSingleApplicationGuard::Instance ); private slots: diff --git a/src/tomahawktrayicon.cpp b/src/tomahawktrayicon.cpp index 88615f6c3..2b0405004 100644 --- a/src/tomahawktrayicon.cpp +++ b/src/tomahawktrayicon.cpp @@ -30,6 +30,7 @@ TomahawkTrayIcon::TomahawkTrayIcon( QObject* parent ) : QSystemTrayIcon( parent ) , m_currentAnimationFrame( 0 ) + , m_showWindowAction( 0 ) { QIcon icon( RESPATH "icons/tomahawk-icon-128x128.png" ); setIcon( icon ); @@ -45,6 +46,15 @@ TomahawkTrayIcon::TomahawkTrayIcon( QObject* parent ) m_contextMenu->addSeparator(); m_prevAction = m_contextMenu->addAction( tr( "Previous Track" ) ); m_nextAction = m_contextMenu->addAction( tr( "Next Track" ) ); + +#ifdef Q_OS_MAC + // On mac you can close the windows while leaving the app open. We then need a way to show the main window again + m_contextMenu->addSeparator(); + m_showWindowAction = m_contextMenu->addAction( tr( "Hide Tomahawk Window" ) ); + m_showWindowAction->setData( true ); + connect( m_showWindowAction, SIGNAL( triggered() ), this, SLOT( showWindow() ) ); +#endif + m_contextMenu->addSeparator(); m_quitAction = m_contextMenu->addAction( tr( "Quit" ) ); @@ -69,6 +79,33 @@ TomahawkTrayIcon::~TomahawkTrayIcon() delete m_contextMenu; } +void +TomahawkTrayIcon::setShowHideWindow( bool show ) +{ + if ( show ) + { + m_showWindowAction->setText( tr( "Hide Tomahawk Window" ) ); + m_showWindowAction->setData( show ); + } else { + m_showWindowAction->setText( tr( "Show Tomahawk Window" ) ); + } + m_showWindowAction->setData( show ); +} + +void +TomahawkTrayIcon::showWindow() +{ + if( !m_showWindowAction->data().toBool() ) + { + APP->mainWindow()->show(); + APP->mainWindow()->raise(); + + setShowHideWindow( true ); + } else { + APP->mainWindow()->hide(); + setShowHideWindow( false ); + } +} void TomahawkTrayIcon::setResult( const Tomahawk::result_ptr& result ) diff --git a/src/tomahawktrayicon.h b/src/tomahawktrayicon.h index 2cef11872..96859a5c9 100644 --- a/src/tomahawktrayicon.h +++ b/src/tomahawktrayicon.h @@ -33,12 +33,15 @@ public: TomahawkTrayIcon( QObject* parent ); virtual bool event( QEvent* e ); + void setShowHideWindow( bool show = true ); + public slots: void setResult( const Tomahawk::result_ptr& result ); private slots: void onAnimationTimer(); void onActivated( QSystemTrayIcon::ActivationReason reason ); + void showWindow(); private: void refreshToolTip(); @@ -57,6 +60,10 @@ private: QAction* m_prevAction; QAction* m_nextAction; QAction* m_quitAction; + +#ifdef Q_OS_MAC + QAction* m_showWindowAction; +#endif }; #endif // TOMAHAWK_TRAYICON_H diff --git a/src/tomahawkwindow.cpp b/src/tomahawkwindow.cpp index fe4547b83..07b2207e6 100644 --- a/src/tomahawkwindow.cpp +++ b/src/tomahawkwindow.cpp @@ -362,6 +362,8 @@ TomahawkWindow::closeEvent( QCloseEvent* e ) e->ignore(); return; } +#else + m_trayIcon->setShowHideWindow( false ); #endif e->accept(); From 0b9822d6898a504c4fbedbea63016c764d1a44c4 Mon Sep 17 00:00:00 2001 From: Leo Franchi Date: Thu, 21 Jul 2011 16:25:58 -0400 Subject: [PATCH 11/20] make compile on non-osx --- src/tomahawktrayicon.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/tomahawktrayicon.h b/src/tomahawktrayicon.h index 96859a5c9..c78a8b173 100644 --- a/src/tomahawktrayicon.h +++ b/src/tomahawktrayicon.h @@ -61,9 +61,7 @@ private: QAction* m_nextAction; QAction* m_quitAction; -#ifdef Q_OS_MAC QAction* m_showWindowAction; -#endif }; #endif // TOMAHAWK_TRAYICON_H From 36573c2342e735a27c70e63e71c65f2d00bfbfd0 Mon Sep 17 00:00:00 2001 From: Leo Franchi Date: Fri, 22 Jul 2011 11:11:13 -0400 Subject: [PATCH 12/20] Load album before adding to view to avoid flashing empty playlist message --- src/libtomahawk/viewmanager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libtomahawk/viewmanager.cpp b/src/libtomahawk/viewmanager.cpp index aa95667b5..e02441276 100644 --- a/src/libtomahawk/viewmanager.cpp +++ b/src/libtomahawk/viewmanager.cpp @@ -240,10 +240,10 @@ ViewManager::show( const Tomahawk::album_ptr& album ) { view = new PlaylistView(); PlaylistModel* model = new PlaylistModel(); + model->append( album ); view->setPlaylistModel( model ); view->setFrameShape( QFrame::NoFrame ); view->setAttribute( Qt::WA_MacShowFocusRect, 0 ); - model->append( album ); m_albumViews.insert( album, view ); } From 66b1e21f3143a5fcb4aaf346fc1a88b4bba5f396 Mon Sep 17 00:00:00 2001 From: Leo Franchi Date: Fri, 22 Jul 2011 11:11:29 -0400 Subject: [PATCH 13/20] Use QSplitter to get a 1px handle to avoid merging different alternate-color rows --- .../widgets/infowidgets/ArtistInfoWidget.ui | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/libtomahawk/widgets/infowidgets/ArtistInfoWidget.ui b/src/libtomahawk/widgets/infowidgets/ArtistInfoWidget.ui index 738ebffca..d9cd9ab3b 100644 --- a/src/libtomahawk/widgets/infowidgets/ArtistInfoWidget.ui +++ b/src/libtomahawk/widgets/infowidgets/ArtistInfoWidget.ui @@ -14,9 +14,18 @@ Form + + 4 + - - + + + Qt::Horizontal + + + 1 + + @@ -29,8 +38,8 @@ - - + + @@ -43,8 +52,8 @@ - - + + @@ -63,6 +72,11 @@ + + PlaylistView + QTreeView +
playlist/playlistview.h
+
HeaderLabel QLabel @@ -73,11 +87,6 @@ QTreeView
artistview.h
- - PlaylistView - QTreeView -
playlistview.h
-
From 4a5a8e5d15e2553815331fc348b1583d2a1ffe2c Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Fri, 22 Jul 2011 18:31:03 +0200 Subject: [PATCH 14/20] * Don't artificially slow down the Pipeline. --- src/libtomahawk/pipeline.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libtomahawk/pipeline.cpp b/src/libtomahawk/pipeline.cpp index 30ac98b1a..8a253ce3a 100644 --- a/src/libtomahawk/pipeline.cpp +++ b/src/libtomahawk/pipeline.cpp @@ -209,7 +209,7 @@ Pipeline::reportResults( QID qid, const QList< result_ptr >& results ) } else { - new FuncTimeout( 500, boost::bind( &Pipeline::timeoutShunt, this, q ), this ); + new FuncTimeout( 50, boost::bind( &Pipeline::timeoutShunt, this, q ), this ); } } @@ -246,7 +246,7 @@ Pipeline::shuntNext() } setQIDState( q, rc ); - new FuncTimeout( 500, boost::bind( &Pipeline::shunt, this, q ), this ); + new FuncTimeout( 50, boost::bind( &Pipeline::shunt, this, q ), this ); } From 7f890e571d0be9ffd2ebae2a04264b35f63f26ad Mon Sep 17 00:00:00 2001 From: Leo Franchi Date: Fri, 22 Jul 2011 12:02:06 -0400 Subject: [PATCH 15/20] Hide header as it's not needed --- .../widgets/infowidgets/ArtistInfoWidget.ui | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/libtomahawk/widgets/infowidgets/ArtistInfoWidget.ui b/src/libtomahawk/widgets/infowidgets/ArtistInfoWidget.ui index d9cd9ab3b..57fb41d8a 100644 --- a/src/libtomahawk/widgets/infowidgets/ArtistInfoWidget.ui +++ b/src/libtomahawk/widgets/infowidgets/ArtistInfoWidget.ui @@ -25,7 +25,7 @@ 1 - + @@ -39,7 +39,7 @@ - + @@ -49,7 +49,11 @@ - + + + true + + From a7308cddcc1ecca12b82ce6c36da4fec809a3ae8 Mon Sep 17 00:00:00 2001 From: Leo Franchi Date: Fri, 22 Jul 2011 12:44:17 -0400 Subject: [PATCH 16/20] Scale pixmaps smoothly to avoid horrible jagged edges --- src/libtomahawk/playlist/albumitemdelegate.cpp | 6 +++--- src/libtomahawk/playlist/playlistitemdelegate.cpp | 2 +- src/libtomahawk/playlist/treeitemdelegate.cpp | 5 ++--- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/libtomahawk/playlist/albumitemdelegate.cpp b/src/libtomahawk/playlist/albumitemdelegate.cpp index 7871a7bc9..d56cea319 100644 --- a/src/libtomahawk/playlist/albumitemdelegate.cpp +++ b/src/libtomahawk/playlist/albumitemdelegate.cpp @@ -38,8 +38,7 @@ AlbumItemDelegate::AlbumItemDelegate( QAbstractItemView* parent, AlbumProxyModel , m_model( proxy ) { m_shadowPixmap = QPixmap( RESPATH "images/cover-shadow.png" ); - m_defaultCover = QPixmap( RESPATH "images/no-album-art-placeholder.png" ) - .scaled( QSize( 120, 120 ), Qt::IgnoreAspectRatio, Qt::SmoothTransformation ); + m_defaultCover = QPixmap( RESPATH "images/no-album-art-placeholder.png" ); } @@ -73,7 +72,8 @@ AlbumItemDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option, // painter->drawPixmap( option.rect.adjusted( 4, 4, -4, -38 ), m_shadowPixmap ); QPixmap cover = item->cover.isNull() ? m_defaultCover : item->cover; - painter->drawPixmap( option.rect.adjusted( 6, 4, -6, -41 ), cover ); + QRect r = option.rect.adjusted( 6, 4, -6, -41 ); + painter->drawPixmap( r, cover.scaled( r.size(), Qt::KeepAspectRatio, Qt::SmoothTransformation ) ); painter->setPen( opt.palette.color( QPalette::Text ) ); QTextOption to; diff --git a/src/libtomahawk/playlist/playlistitemdelegate.cpp b/src/libtomahawk/playlist/playlistitemdelegate.cpp index dca3c7c92..85137a35c 100644 --- a/src/libtomahawk/playlist/playlistitemdelegate.cpp +++ b/src/libtomahawk/playlist/playlistitemdelegate.cpp @@ -198,7 +198,7 @@ PlaylistItemDelegate::paintShort( QPainter* painter, const QStyleOptionViewItem& painter->setPen( opt.palette.text().color() ); QRect ir = r.adjusted( 4, 0, -option.rect.width() + option.rect.height() - 8 + r.left(), 0 ); - painter->drawPixmap( ir, pixmap ); + painter->drawPixmap( ir, pixmap.scaled( ir.size(), Qt::KeepAspectRatio, Qt::SmoothTransformation ) ); //painter->drawPixmap( ir, item->cover ); QFont boldFont = opt.font; diff --git a/src/libtomahawk/playlist/treeitemdelegate.cpp b/src/libtomahawk/playlist/treeitemdelegate.cpp index 554f83c61..feb67ba38 100644 --- a/src/libtomahawk/playlist/treeitemdelegate.cpp +++ b/src/libtomahawk/playlist/treeitemdelegate.cpp @@ -40,8 +40,7 @@ TreeItemDelegate::TreeItemDelegate( ArtistView* parent, TreeProxyModel* proxy ) , m_model( proxy ) { m_nowPlayingIcon = QPixmap( RESPATH "images/now-playing-speaker.png" ); - m_defaultCover = QPixmap( RESPATH "images/no-album-art-placeholder.png" ) - .scaled( QSize( 120, 120 ), Qt::IgnoreAspectRatio, Qt::SmoothTransformation ); + m_defaultCover = QPixmap( RESPATH "images/no-album-art-placeholder.png" ); } @@ -135,7 +134,7 @@ TreeItemDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option, // painter->drawPixmap( r, QPixmap( RESPATH "images/cover-shadow.png" ) ); QPixmap cover = item->cover.isNull() ? m_defaultCover : item->cover; - painter->drawPixmap( r, cover ); + painter->drawPixmap( r, cover.scaled( r.size(), Qt::KeepAspectRatio, Qt::SmoothTransformation ) ); QTextOption to; to.setAlignment( Qt::AlignVCenter ); From b194d8c9cd970d157ab01b97d25ed7cc1309eeb6 Mon Sep 17 00:00:00 2001 From: Leo Franchi Date: Fri, 22 Jul 2011 12:44:47 -0400 Subject: [PATCH 17/20] Use new no-album-cover found image, nicer --- data/images/no-album-art-placeholder.png | Bin 1054090 -> 15033 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/data/images/no-album-art-placeholder.png b/data/images/no-album-art-placeholder.png index 009700a4a19754696cada802b6e93221aa273cd4..7255976498977c34514e7636ce3483479d405e9b 100644 GIT binary patch literal 15033 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 Jeardn{{iHfO7Q>y literal 1054090 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 N|4IGU^%=ML{{ZKoZ&CmN From ee3fb6b47ef4b6431065ee683430b1e209c8d820 Mon Sep 17 00:00:00 2001 From: Leo Franchi Date: Fri, 22 Jul 2011 13:13:00 -0400 Subject: [PATCH 18/20] Don't paint selected text as white on osx, there's no selection rect. --- src/libtomahawk/playlist/albumitemdelegate.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/libtomahawk/playlist/albumitemdelegate.cpp b/src/libtomahawk/playlist/albumitemdelegate.cpp index d56cea319..aac8c1777 100644 --- a/src/libtomahawk/playlist/albumitemdelegate.cpp +++ b/src/libtomahawk/playlist/albumitemdelegate.cpp @@ -61,11 +61,12 @@ AlbumItemDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option, initStyleOption( &opt, QModelIndex() ); qApp->style()->drawControl( QStyle::CE_ItemViewItem, &opt, painter ); +#ifndef Q_OS_MAC if ( option.state & QStyle::State_Selected ) { opt.palette.setColor( QPalette::Text, opt.palette.color( QPalette::HighlightedText ) ); } - +#endif painter->save(); // painter->setRenderHint( QPainter::Antialiasing ); From ea3171038b2b52eded820cb87614065a5723dd6c Mon Sep 17 00:00:00 2001 From: Leo Franchi Date: Fri, 22 Jul 2011 13:54:30 -0400 Subject: [PATCH 19/20] Make playlist album rows the same size as track album rows --- src/libtomahawk/playlist/playlistitemdelegate.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libtomahawk/playlist/playlistitemdelegate.cpp b/src/libtomahawk/playlist/playlistitemdelegate.cpp index 85137a35c..ac2336b3c 100644 --- a/src/libtomahawk/playlist/playlistitemdelegate.cpp +++ b/src/libtomahawk/playlist/playlistitemdelegate.cpp @@ -67,7 +67,7 @@ PlaylistItemDelegate::sizeHint( const QStyleOptionViewItem& option, const QModel { int style = index.data( TrackModel::StyleRole ).toInt(); if ( style == TrackModel::Short ) - size.setHeight( 48 ); + size.setHeight( 44 ); } return size; From 8f6a567bee150bab509afa2f46c9aae9b8621b0b Mon Sep 17 00:00:00 2001 From: Leo Franchi Date: Fri, 22 Jul 2011 14:35:38 -0400 Subject: [PATCH 20/20] Work harder to hide the header --- src/libtomahawk/widgets/infowidgets/ArtistInfoWidget.ui | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/libtomahawk/widgets/infowidgets/ArtistInfoWidget.ui b/src/libtomahawk/widgets/infowidgets/ArtistInfoWidget.ui index 57fb41d8a..d09c557f7 100644 --- a/src/libtomahawk/widgets/infowidgets/ArtistInfoWidget.ui +++ b/src/libtomahawk/widgets/infowidgets/ArtistInfoWidget.ui @@ -35,7 +35,11 @@
- + + + true + +