1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-03-20 15:59:42 +01:00

Merge branch 'autoupdate'

This commit is contained in:
Leo Franchi 2011-10-12 20:34:32 -04:00
commit ee1afc665f
25 changed files with 708 additions and 22 deletions

View File

@ -75,6 +75,7 @@ SET( tomahawkSourcesGui ${tomahawkSourcesGui}
settingslistdelegate.cpp
resolversmodel.cpp
tomahawkwindow.cpp
LoadXSPFDialog.cpp
)
SET( tomahawkHeaders ${tomahawkHeaders}
@ -124,6 +125,7 @@ SET( tomahawkHeadersGui ${tomahawkHeadersGui}
resolversmodel.h
delegateconfigwrapper.h
tomahawkwindow.h
LoadXSPFDialog.h
)
SET( tomahawkUI ${tomahawkUI}
@ -135,6 +137,7 @@ SET( tomahawkUI ${tomahawkUI}
audiocontrols.ui
GetNewStuffDialog.ui
LoadXSPFDialog.ui
)
INCLUDE_DIRECTORIES(

63
src/LoadXSPFDialog.cpp Normal file
View File

@ -0,0 +1,63 @@
/* === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===
*
* Copyright 2010-2011, Leo Franchi <lfranchi@kde.org>
*
* Tomahawk is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Tomahawk is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Tomahawk. If not, see <http://www.gnu.org/licenses/>.
*/
#include "LoadXSPFDialog.h"
#include "ui_LoadXSPFDialog.h"
#include <QFileDialog>
LoadXSPFDialog::LoadXSPFDialog( QWidget* parent, Qt::WindowFlags f )
: QDialog( parent, f )
, m_ui( new Ui_LoadXSPF )
{
m_ui->setupUi( this );
#ifdef Q_WS_MAC
m_ui->horizontalLayout->setContentsMargins( 0, 0, 0, 0 );
m_ui->horizontalLayout->setSpacing( 5 );
m_ui->verticalLayout->setContentsMargins( 0, 10, 0, 0 );
m_ui->verticalLayout->setSpacing( 0 );
#endif
connect( m_ui->buttonBox, SIGNAL( accepted() ), SLOT( accept() ) );
connect( m_ui->buttonBox, SIGNAL( rejected() ), SLOT( reject() ) );
connect( m_ui->navigateButton, SIGNAL( clicked( bool ) ), this, SLOT( getLocalFile() ) );
}
LoadXSPFDialog::~LoadXSPFDialog()
{
}
void
LoadXSPFDialog::getLocalFile()
{
QString url = QFileDialog::getOpenFileName( this, tr( "Load XSPF File" ), QDir::homePath(), ".xspf" );
m_ui->lineEdit->setText( url );
}
QString LoadXSPFDialog::xspfUrl() const
{
return m_ui->lineEdit->text();
}
bool
LoadXSPFDialog::autoUpdate() const
{
return m_ui->autoUpdate->isChecked();
}

43
src/LoadXSPFDialog.h Normal file
View File

@ -0,0 +1,43 @@
/* === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===
*
* Copyright 2010-2011, Leo Franchi <lfranchi@kde.org>
*
* Tomahawk is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Tomahawk is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Tomahawk. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef LOADXSPFDIALOG_H
#define LOADXSPFDIALOG_H
#include <QDialog>
class Ui_LoadXSPF;
class LoadXSPFDialog : public QDialog
{
Q_OBJECT
public:
explicit LoadXSPFDialog( QWidget* parent = 0, Qt::WindowFlags f = 0 );
virtual ~LoadXSPFDialog();
QString xspfUrl() const;
bool autoUpdate() const;
public slots:
void getLocalFile();
private:
Ui_LoadXSPF* m_ui;
};
#endif // LOADXSPFDIALOG_H

102
src/LoadXSPFDialog.ui Normal file
View File

@ -0,0 +1,102 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>LoadXSPF</class>
<widget class="QDialog" name="LoadXSPF">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>444</width>
<height>121</height>
</rect>
</property>
<property name="windowTitle">
<string>Load XSPF</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Playlist Url</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit">
<property name="placeholderText">
<string>Enter URL...</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="navigateButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QCheckBox" name="autoUpdate">
<property name="text">
<string>Automatically update</string>
</property>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>LoadXSPF</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>LoadXSPF</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -141,6 +141,8 @@ set( libSources
playlist/artistview.cpp
playlist/customplaylistview.cpp
playlist/ViewHeader.cpp
playlist/PlaylistUpdaterInterface.cpp
playlist/XspfUpdater.cpp
playlist/topbar/topbar.cpp
playlist/topbar/clearbutton.cpp
@ -377,6 +379,8 @@ set( libHeaders
playlist/artistview.h
playlist/customplaylistview.h
playlist/ViewHeader.h
playlist/PlaylistUpdaterInterface.h
playlist/XspfUpdater.h
playlist/topbar/topbar.h
playlist/topbar/clearbutton.h

View File

@ -24,6 +24,7 @@
#include "source.h"
#include "utils/logger.h"
#include <PlaylistUpdaterInterface.h>
using namespace Tomahawk;
@ -185,6 +186,8 @@ Collection::setPlaylists( const QList<Tomahawk::playlist_ptr>& plists )
{
// qDebug() << "Batch inserting playlist:" << p->guid();
m_playlists.insert( p->guid(), p );
if ( !m_source.isNull() && m_source->isLocal() )
PlaylistUpdaterInterface::loadForPlaylist( p );
}
emit playlistsAdded( plists );
}

View File

@ -26,6 +26,7 @@
#include "thirdparty/Qocoa/qsearchfield.h"
#include "utils/tomahawkutils.h"
#include "utils/logger.h"
#include <QCheckBox>
#define ANIMATION_TIME 400
#define IMAGE_HEIGHT 64
@ -70,6 +71,14 @@ InfoBar::InfoBar( QWidget* parent )
ui->longDescriptionLabel->setText( QString() );
ui->imageLabel->setText( QString() );
m_autoUpdate = new QCheckBox( this );
m_autoUpdate->setText( tr( "Automatically update" ) );
m_autoUpdate->setLayoutDirection( Qt::RightToLeft );
m_autoUpdate->setPalette( whitePal );
connect( m_autoUpdate, SIGNAL( stateChanged( int ) ), this, SIGNAL( autoUpdateChanged( int ) ) );
ui->horizontalLayout->addWidget( m_autoUpdate );
m_searchWidget = new QSearchField( this );
m_searchWidget->setPlaceholderText( tr( "Filter..." ) );
m_searchWidget->setMinimumWidth( 180 );
@ -87,6 +96,7 @@ InfoBar::InfoBar( QWidget* parent )
setAutoFillBackground( true );
connect( ViewManager::instance(), SIGNAL( filterAvailable( bool ) ), SLOT( setFilterAvailable( bool ) ) );
connect( ViewManager::instance(), SIGNAL( autoUpdateAvailable( bool ) ), SLOT( setAutoUpdateAvailable( bool ) ) );
}
@ -147,6 +157,15 @@ InfoBar::setFilterAvailable( bool b )
m_searchWidget->setVisible( b );
}
void
InfoBar::setAutoUpdateAvailable( bool b )
{
if ( b )
m_autoUpdate->setChecked( ViewManager::instance()->currentPage()->autoUpdate() );
m_autoUpdate->setVisible( b );
}
void
InfoBar::onFilterEdited()
@ -154,7 +173,6 @@ InfoBar::onFilterEdited()
emit filterTextChanged( m_searchWidget->text() );
}
void
InfoBar::changeEvent( QEvent* e )
{

View File

@ -23,6 +23,7 @@
#include "dllmacro.h"
class QCheckBox;
class QTimeLine;
class QSearchField;
class ContextWidget;
@ -49,8 +50,10 @@ public slots:
void setFilter( const QString& filter );
void setFilterAvailable( bool b );
void setAutoUpdateAvailable( bool b );
signals:
void filterTextChanged( const QString& filter );
void autoUpdateChanged( int state );
protected:
void changeEvent( QEvent* e );
@ -62,6 +65,7 @@ private:
Ui::InfoBar* ui;
QSearchField* m_searchWidget;
QCheckBox* m_autoUpdate;
};
#endif // INFOBAR_H

View File

@ -34,6 +34,7 @@
#include "sourcelist.h"
#include "utils/logger.h"
#include "PlaylistUpdaterInterface.h"
using namespace Tomahawk;
@ -116,6 +117,7 @@ Playlist::Playlist( const source_ptr& src,
, m_lastmodified( lastmod )
, m_createdOn( createdOn )
, m_shared( shared )
, m_updater( 0 )
{
init();
}
@ -138,6 +140,7 @@ Playlist::Playlist( const source_ptr& author,
, m_createdOn( 0 ) // will be set by db command
, m_shared( shared )
, m_initEntries( entries )
, m_updater( 0 )
{
init();
}
@ -252,6 +255,9 @@ Playlist::reportDeleted( const Tomahawk::playlist_ptr& self )
m_deleted = true;
m_source->collection()->deletePlaylist( self );
if ( m_updater )
m_updater->remove();
emit deleted( self );
}
@ -503,7 +509,7 @@ Playlist::addEntry( const query_ptr& query, const QString& oldrev )
void
Playlist::addEntries( const QList<query_ptr>& queries, const QString& oldrev )
{
QList<plentry_ptr> el = addEntriesInternal( queries );
QList<plentry_ptr> el = entriesFromQueries( queries );
QString newrev = uuid();
createNewRevision( newrev, oldrev, el );
@ -511,9 +517,12 @@ Playlist::addEntries( const QList<query_ptr>& queries, const QString& oldrev )
QList<plentry_ptr>
Playlist::addEntriesInternal( const QList<Tomahawk::query_ptr>& queries )
Playlist::entriesFromQueries( const QList<Tomahawk::query_ptr>& queries, bool clearFirst )
{
QList<plentry_ptr> el = entries();
QList<plentry_ptr> el;
if ( !clearFirst )
el = entries();
foreach( const query_ptr& query, queries )
{
plentry_ptr e( new PlaylistEntry() );

View File

@ -36,10 +36,11 @@ class DatabaseCommand_LoadAllPlaylists;
class DatabaseCommand_LoadAllSortedPlaylists;
class DatabaseCommand_SetPlaylistRevision;
class DatabaseCommand_CreatePlaylist;
namespace Tomahawk
{
class PlaylistUpdaterInterface;
class DLLEXPORT PlaylistEntry : public QObject
{
Q_OBJECT
@ -196,6 +197,10 @@ public:
virtual void setFilter( const QString& /*pattern*/ ) {}
QList<plentry_ptr> entriesFromQueries( const QList<Tomahawk::query_ptr>& queries, bool clearFirst = false );
void setUpdater( PlaylistUpdaterInterface* interface ) { m_updater = interface; }
PlaylistUpdaterInterface* updater() const { return m_updater; }
signals:
/// emitted when the playlist revision changes (whenever the playlist changes)
void revisionLoaded( Tomahawk::PlaylistRevision );
@ -222,7 +227,6 @@ signals:
void sourceTrackCountChanged( unsigned int tracks );
void nextTrackReady();
public slots:
// want to update the playlist from the model?
// generate a newrev using uuid() and call this:
@ -267,7 +271,6 @@ protected:
bool is_newest_rev,
const QMap< QString, Tomahawk::plentry_ptr >& addedmap );
QList<plentry_ptr> addEntriesInternal( const QList<Tomahawk::query_ptr>& queries );
private slots:
void onResultsFound( const QList<Tomahawk::result_ptr>& results );
@ -294,6 +297,8 @@ private:
QQueue<RevisionQueueItem> m_revisionQueue;
PlaylistUpdaterInterface* m_updater;
bool m_locallyChanged;
bool m_deleted;
bool m_busy;

View File

@ -0,0 +1,120 @@
/* === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===
*
* Copyright 2010-2011, Leo Franchi <lfranchi@kde.org>
*
* Tomahawk is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Tomahawk is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Tomahawk. If not, see <http://www.gnu.org/licenses/>.
*/
#include "PlaylistUpdaterInterface.h"
#include "tomahawksettings.h"
#include "XspfUpdater.h"
using namespace Tomahawk;
PlaylistUpdaterInterface*
PlaylistUpdaterInterface::loadForPlaylist( const playlist_ptr& pl )
{
TomahawkSettings* s = TomahawkSettings::instance();
const QString key = QString( "playlistupdaters/%1" ).arg( pl->guid() );
if ( s->contains( QString( "%1/type" ).arg( key ) ) )
{
// Ok, we have one we can try to load
const QString type = s->value( QString( "%1/type" ).arg( key ) ).toString();
PlaylistUpdaterInterface* updater = 0;
if ( type == "xspf" )
updater = new XspfUpdater( pl );
// You forgot to register your new updater type with the factory above. 00ps.
if ( !updater )
{
Q_ASSERT( false );
return 0;
}
updater->setAutoUpdate( s->value( QString( "%1/autoupdate" ).arg( key ) ).toBool() );
updater->setInterval( s->value( QString( "%1/interval" ).arg( key ) ).toInt() );
updater->loadFromSettings( key );
return updater;
}
return 0;
}
PlaylistUpdaterInterface::PlaylistUpdaterInterface( const playlist_ptr& pl )
: QObject( 0 )
, m_timer( new QTimer( this ) )
, m_autoUpdate( true )
, m_playlist( pl )
{
Q_ASSERT( !m_playlist.isNull() );
m_playlist->setUpdater( this );
connect( m_timer, SIGNAL( timeout() ), this, SLOT( updateNow() ) );
QTimer::singleShot( 0, this, SLOT( doSave() ) );
}
void
PlaylistUpdaterInterface::doSave()
{
TomahawkSettings* s = TomahawkSettings::instance();
const QString key = QString( "playlistupdaters/%1" ).arg( m_playlist->guid() );
if ( !s->contains( QString( "%1/type" ).arg( key ) ) )
{
s->setValue( QString( "%1/type" ).arg( key ), type() );
s->setValue( QString( "%1/autoupdate" ).arg( key ), m_autoUpdate );
s->setValue( QString( "%1/interval" ).arg( key ), m_timer->interval() );
saveToSettings( key );
}
}
void
PlaylistUpdaterInterface::remove()
{
TomahawkSettings* s = TomahawkSettings::instance();
const QString key = QString( "playlistupdaters/%1" ).arg( m_playlist->guid() );
removeFromSettings( key );
s->remove( QString( "%1/type" ).arg( key ) );
s->remove( QString( "%1/autoupdate" ).arg( key ) );
s->remove( QString( "%1/interval" ).arg( key ) );
}
void
PlaylistUpdaterInterface::setAutoUpdate( bool autoUpdate )
{
m_autoUpdate = autoUpdate;
if ( m_autoUpdate )
m_timer->start();
else
m_timer->stop();
const QString key = QString( "playlistupdaters/%1/autoupdate" ).arg( m_playlist->guid() );
TomahawkSettings::instance()->setValue( key, m_autoUpdate );
// Update immediately as well
if ( m_autoUpdate )
QTimer::singleShot( 0, this, SLOT( updateNow() ) );
}
void
PlaylistUpdaterInterface::setInterval( int intervalMsecs )
{
const QString key = QString( "playlistupdaters/%1/interval" ).arg( m_playlist->guid() );
TomahawkSettings::instance()->setValue( key, intervalMsecs );
m_timer->setInterval( intervalMsecs );
}

View File

@ -0,0 +1,79 @@
/* === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===
*
* Copyright 2010-2011, Leo Franchi <lfranchi@kde.org>
*
* Tomahawk is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Tomahawk is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Tomahawk. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef PLAYLISTUPDATERINTERFACE_H
#define PLAYLISTUPDATERINTERFACE_H
#include "dllmacro.h"
#include "typedefs.h"
#include "playlist.h"
#include <QTimer>
namespace Tomahawk
{
/**
* If a playlist needs periodic updating, implement a updater interface.
*
* Default is auto-updating.
*/
class DLLEXPORT PlaylistUpdaterInterface : public QObject
{
Q_OBJECT
public:
PlaylistUpdaterInterface( const playlist_ptr& pl );
virtual ~PlaylistUpdaterInterface(){}
// What type you are. If you add a new updater, add the creation code as well.
virtual QString type() const = 0;
bool autoUpdate() const { return m_autoUpdate; }
void setAutoUpdate( bool autoUpdate );
void setInterval( int intervalMsecs ) ;
int intervalMsecs() const { return m_timer->interval(); }
void remove();
playlist_ptr playlist() const { return m_playlist; }
/// If you want to try to load a updater from the settings. Returns a valid
/// updater if one was saved
static PlaylistUpdaterInterface* loadForPlaylist( const playlist_ptr& pl );
public slots:
virtual void updateNow() {}
private slots:
void doSave();
protected:
virtual void loadFromSettings( const QString& group ) = 0;
virtual void saveToSettings( const QString& group ) const = 0;
virtual void removeFromSettings( const QString& group ) const = 0;
private:
QTimer* m_timer;
bool m_autoUpdate;
playlist_ptr m_playlist;
};
}
#endif // PLAYLISTUPDATERINTERFACE_H

View File

@ -0,0 +1,90 @@
/* === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===
*
* Copyright 2010-2011, Leo Franchi <lfranchi@kde.org>
*
* Tomahawk is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Tomahawk is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Tomahawk. If not, see <http://www.gnu.org/licenses/>.
*/
#include "XspfUpdater.h"
#include "playlist.h"
#include "utils/xspfloader.h"
#include <QTimer>
#include <tomahawksettings.h>
using namespace Tomahawk;
XspfUpdater::XspfUpdater( const playlist_ptr& pl, const QString& xUrl )
: PlaylistUpdaterInterface( pl )
, m_url( xUrl )
{
}
XspfUpdater::XspfUpdater( const playlist_ptr& pl )
: PlaylistUpdaterInterface( pl )
{
}
XspfUpdater::~XspfUpdater()
{}
void
XspfUpdater::updateNow()
{
XSPFLoader* l = new XSPFLoader( false, false );
l->load( m_url );
connect( l, SIGNAL( ok ( Tomahawk::playlist_ptr ) ), this, SLOT( playlistLoaded() ) );
}
void
XspfUpdater::playlistLoaded()
{
XSPFLoader* loader = qobject_cast<XSPFLoader*>( sender() );
Q_ASSERT( loader );
QList< query_ptr > queries = loader->entries();
QList<plentry_ptr> el = playlist()->entriesFromQueries( queries, true );
playlist()->createNewRevision( uuid(), playlist()->currentrevision(), el );
// // if there are any different from the current playlist, clear and use the new one, update
// bool changed = ( queries.size() == playlist()->entries().count() );
// if ( !changed )
// {
// foreach( const query_ptr& newSong, queries )
// {
// if ( !playlist()->entries.contains() )
// }
// }
}
void
XspfUpdater::saveToSettings( const QString& group ) const
{
TomahawkSettings::instance()->setValue( QString( "%1/xspfurl" ).arg( group ), m_url );
}
void
XspfUpdater::loadFromSettings( const QString& group )
{
m_url = TomahawkSettings::instance()->value( QString( "%1/xspfurl" ).arg( group ) ).toString();
}
void
XspfUpdater::removeFromSettings( const QString& group ) const
{
TomahawkSettings::instance()->remove( QString( "%1/xspfurl" ).arg( group ) );
}

View File

@ -0,0 +1,56 @@
/* === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===
*
* Copyright 2010-2011, Leo Franchi <lfranchi@kde.org>
*
* Tomahawk is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Tomahawk is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Tomahawk. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef XSPFUPDATER_H
#define XSPFUPDATER_H
#include "PlaylistUpdaterInterface.h"
class QTimer;
namespace Tomahawk
{
class XspfUpdater : public PlaylistUpdaterInterface
{
Q_OBJECT
public:
XspfUpdater( const playlist_ptr& pl, const QString& xspfUrl );
explicit XspfUpdater( const playlist_ptr& pl ); // used by factory
virtual ~XspfUpdater();
virtual QString type() const { return "xspf"; }
public slots:
void updateNow();
protected:
void loadFromSettings( const QString& group );
void saveToSettings( const QString& group ) const;
virtual void removeFromSettings(const QString& group) const;
private slots:
void playlistLoaded();
private:
QString m_url;
};
}
#endif // XSPFUPDATER_H

View File

@ -1,6 +1,6 @@
/* === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===
*
* Copyright 2010-2011, Christian Muehlhaeuser <muesli@tomahawk-player.org>
* Copyright 2010-2011, Leo Franchi <lfranchi@kde.org>
*
* Tomahawk is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -347,7 +347,7 @@ DynamicPlaylist::addEntries(const QList< query_ptr >& queries, const QString& ol
{
Q_ASSERT( m_generator->mode() == Static );
QList<plentry_ptr> el = addEntriesInternal( queries );
QList<plentry_ptr> el = entriesFromQueries( queries );
QString newrev = uuid();
createNewRevision( newrev, oldrev, m_generator->type(), m_generator->controls(), el );

View File

@ -1,6 +1,6 @@
/* === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===
*
* Copyright 2010-2011, Christian Muehlhaeuser <muesli@tomahawk-player.org>
* Copyright 2010-2011, Leo Franchi <lfranchi@kde.org>
*
* Tomahawk is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

View File

@ -25,6 +25,7 @@
#include "widgets/overlaywidget.h"
#include "viewmanager.h"
#include "utils/logger.h"
#include "PlaylistUpdaterInterface.h"
using namespace Tomahawk;
@ -104,6 +105,34 @@ PlaylistView::deleteItems()
proxyModel()->removeIndexes( selectedIndexes() );
}
bool
PlaylistView::canAutoUpdate() const
{
if ( !m_model->playlist().isNull() && m_model->playlist()->updater() )
return true;
return false;
}
bool
PlaylistView::autoUpdate() const
{
if ( canAutoUpdate() )
return m_model->playlist()->updater()->autoUpdate();
return false;
}
void
PlaylistView::setAutoUpdate( bool autoUpdate )
{
if ( !canAutoUpdate() )
return;
m_model->playlist()->updater()->setAutoUpdate( autoUpdate );
}
void
PlaylistView::onTrackCountChanged( unsigned int tracks )

View File

@ -42,6 +42,10 @@ public:
virtual bool showFilter() const { return true; }
virtual bool canAutoUpdate() const;
virtual void setAutoUpdate( bool autoUpdate );
virtual bool autoUpdate() const;
virtual QString title() const { return playlistModel()->title(); }
virtual QString description() const { return m_model->description(); }
virtual QPixmap pixmap() const { return QPixmap( RESPATH "images/playlist-icon.png" ); }

View File

@ -26,12 +26,14 @@
#include "sourcelist.h"
#include "playlist.h"
#include <XspfUpdater.h>
using namespace Tomahawk;
XSPFLoader::XSPFLoader( bool autoCreate, QObject *parent )
XSPFLoader::XSPFLoader( bool autoCreate, bool autoUpdate, QObject *parent )
: QObject( parent )
, m_autoCreate( autoCreate )
, m_autoUpdate( autoUpdate )
, m_NS("http://xspf.org/ns/0/")
{
qRegisterMetaType< XSPFErrorCode >("XSPFErrorCode");
@ -60,10 +62,11 @@ void
XSPFLoader::load( const QUrl& url )
{
QNetworkRequest request( url );
m_url = url;
Q_ASSERT( TomahawkUtils::nam() != 0 );
QNetworkReply* reply = TomahawkUtils::nam()->get( request );
// isn't there a race condition here? something could happen before we connect()
connect( reply, SIGNAL( finished() ),
SLOT( networkLoadFinished() ) );
@ -219,6 +222,9 @@ XSPFLoader::gotBody()
false,
m_entries );
Tomahawk::XspfUpdater* updater = new Tomahawk::XspfUpdater( m_playlist, m_url.toString() );
updater->setInterval( 1200000 ); // 20 minute default for now, no way to change it
updater->setAutoUpdate( m_autoUpdate );
deleteLater();
}

View File

@ -40,7 +40,7 @@ Q_OBJECT
public:
enum XSPFErrorCode { ParseError, InvalidTrackError, FetchError };
explicit XSPFLoader( bool autoCreate = true, QObject* parent = 0 );
explicit XSPFLoader( bool autoCreate = true, bool autoUpdate = false, QObject* parent = 0 );
virtual ~XSPFLoader();
QList< Tomahawk::query_ptr > entries() const;
@ -63,11 +63,12 @@ private:
void reportError();
void gotBody();
bool m_autoCreate;
bool m_autoCreate, m_autoUpdate;
QString m_NS,m_overrideTitle;
QList< Tomahawk::query_ptr > m_entries;
QString m_title, m_info, m_creator;
QUrl m_url;
QByteArray m_body;
Tomahawk::playlist_ptr m_playlist;
};

View File

@ -109,6 +109,7 @@ ViewManager::ViewManager( QObject* parent )
connect( &m_filterTimer, SIGNAL( timeout() ), SLOT( applyFilter() ) );
connect( m_infobar, SIGNAL( filterTextChanged( QString ) ), SLOT( setFilter( QString ) ) );
connect( m_infobar, SIGNAL( autoUpdateChanged( int ) ), SLOT( autoUpdateChanged( int ) ) );
/* connect( m_infobar, SIGNAL( flatMode() ), SLOT( setTableMode() ) );
connect( m_infobar, SIGNAL( artistMode() ), SLOT( setTreeMode() ) );
connect( m_infobar, SIGNAL( albumMode() ), SLOT( setAlbumMode() ) );*/
@ -506,6 +507,13 @@ ViewManager::applyFilter()
}
void
ViewManager::autoUpdateChanged( int state )
{
currentPage()->setAutoUpdate( state == Qt::Checked );
}
void
ViewManager::setPage( ViewPage* page, bool trackHistory )
{
@ -656,6 +664,8 @@ ViewManager::updateView()
emit modesAvailable( currentPage()->showModes() );
emit filterAvailable( currentPage()->showFilter() );
emit autoUpdateAvailable( currentPage()->canAutoUpdate() );
/* if ( !currentPage()->showStatsBar() && !currentPage()->showModes() && !currentPage()->showFilter() )
m_topbar->setVisible( false );
else

View File

@ -117,6 +117,7 @@ signals:
void statsAvailable( bool b );
void modesAvailable( bool b );
void filterAvailable( bool b );
void autoUpdateAvailable( bool b );
void modeChanged( Tomahawk::PlaylistInterface::ViewMode mode );
void playClicked();
@ -165,6 +166,8 @@ private slots:
void setFilter( const QString& filter );
void applyFilter();
void autoUpdateChanged( int );
void onWidgetDestroyed( QWidget* widget );
private:

View File

@ -54,6 +54,10 @@ public:
virtual bool isTemporaryPage() const { return false; }
virtual bool canAutoUpdate() const { return false; }
virtual void setAutoUpdate( bool ) {}
virtual bool autoUpdate() const { return false; }
/** subclasses implementing ViewPage can emit the following signals:
* nameChanged( const QString& )
* descriptionChanged( const QString& )
@ -63,7 +67,6 @@ public:
*
* See DynamicWidget for an example
*/
private:
};
}; // ns

View File

@ -68,6 +68,7 @@
#include "utils/logger.h"
#include "jobview/JobStatusModel.h"
#include "LoadXSPFDialog.h"
using namespace Tomahawk;
@ -488,16 +489,44 @@ TomahawkWindow::showOfflineSources()
void
TomahawkWindow::loadSpiff()
{
bool ok;
QString urlstr = QInputDialog::getText( this, tr( "Load XSPF" ), tr( "Path:" ), QLineEdit::Normal, "http://ws.audioscrobbler.com/1.0/tag/metal/toptracks.xspf", &ok );
if ( !ok || urlstr.isEmpty() )
return;
LoadXSPFDialog* diag = new LoadXSPFDialog( this, Qt::Sheet );
#ifdef Q_WS_MAC
connect( diag, SIGNAL( finished( int ) ), this, SLOT( loadXspfFinished( int ) ) );
diag->show();
#else
QWeakPointer< LoadXSPFDialog > safe( diag );
XSPFLoader* loader = new XSPFLoader;
connect( loader, SIGNAL( error( XSPFLoader::XSPFErrorCode ) ), SLOT( onXSPFError( XSPFLoader::XSPFErrorCode ) ) );
loader->load( QUrl::fromUserInput( urlstr ) );
int ret = diag->exec();
if ( !safe.isNull() && ret == QDialog::Accepted )
{
QUrl url = QUrl::fromUserInput( safe.data()->xspfUrl() );
bool autoUpdate = safe.data()->autoUpdate();
XSPFLoader* loader = new XSPFLoader( true, autoUpdate );
connect( loader, SIGNAL( error( XSPFLoader::XSPFErrorCode ) ), SLOT( onXSPFError( XSPFLoader::XSPFErrorCode ) ) );
loader->load( url );
}
#endif
}
void
TomahawkWindow::loadXspfFinished( int ret )
{
LoadXSPFDialog* d = qobject_cast< LoadXSPFDialog* >( sender() );
Q_ASSERT( d );
if ( ret == QDialog::Accepted )
{
QUrl url = QUrl::fromUserInput( d->xspfUrl() );
bool autoUpdate = d->autoUpdate();
XSPFLoader* loader = new XSPFLoader( true, autoUpdate );
connect( loader, SIGNAL( error( XSPFLoader::XSPFErrorCode ) ), SLOT( onXSPFError( XSPFLoader::XSPFErrorCode ) ) );
loader->load( url );
}
d->deleteLater();
}
void
TomahawkWindow::onXSPFError( XSPFLoader::XSPFErrorCode error )

View File

@ -102,6 +102,8 @@ private slots:
void onSearch( const QString& search );
void onFilterEdited();
void loadXspfFinished( int );
void showQueue();
void hideQueue();