1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-04-14 04:51:53 +02:00

move dynamic control code to the new DynamicModel

This commit is contained in:
Leo Franchi 2011-02-03 22:15:22 -05:00
parent e4d763089f
commit 63820ac196
5 changed files with 176 additions and 66 deletions

View File

@ -101,6 +101,7 @@ set( libSources
playlist/dynamic/GeneratorFactory.cpp
playlist/dynamic/GeneratorInterface.cpp
playlist/dynamic/DynamicView.cpp
playlist/dynamic/DynamicModel.cpp
playlist/dynamic/echonest/EchonestGenerator.cpp
playlist/dynamic/echonest/EchonestControl.cpp
playlist/dynamic/echonest/EchonestSteerer.cpp
@ -240,6 +241,7 @@ set( libHeaders
playlist/dynamic/GeneratorFactory.h
playlist/dynamic/GeneratorInterface.h
playlist/dynamic/DynamicView.h
playlist/dynamic/DynamicModel.h
playlist/dynamic/echonest/EchonestGenerator.h
playlist/dynamic/echonest/EchonestControl.h
playlist/dynamic/echonest/EchonestSteerer.h

View File

@ -0,0 +1,105 @@
/****************************************************************************************
* Copyright (c) 2011 Leo Franchi <lfranchi@kde.org> *
* *
* This program 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 2 of the License, or (at your option) any later *
* version. *
* *
* This program 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 *
* this program. If not, see <http://www.gnu.org/licenses/>. *
****************************************************************************************/
#include "playlist/dynamic/DynamicModel.h"
#include "GeneratorInterface.h"
#include "StationModelItem.h"
#include "audio/audioengine.h"
using namespace Tomahawk;
DynamicModel::DynamicModel( QObject* parent )
: PlaylistModel( parent )
, m_startOnResolved( false )
, m_onDemandRunning( false )
, m_currentAttempts( 0 )
{
}
DynamicModel::~DynamicModel()
{
}
void
DynamicModel::loadPlaylist( const Tomahawk::dynplaylist_ptr& playlist )
{
m_playlist = playlist;
connect( m_playlist->generator().data(), SIGNAL( nextTrackGenerated( Tomahawk::query_ptr ) ), this, SLOT( newTrackGenerated( Tomahawk::query_ptr ) ) );
PlaylistModel::loadPlaylist( m_playlist );
}
void
DynamicModel::startOnDemand()
{
m_playlist->generator()->startOnDemand();
m_onDemandRunning = true;
m_startOnResolved = true;
}
void
DynamicModel::newTrackGenerated( const Tomahawk::query_ptr& query )
{
if( m_onDemandRunning ) {
connect( query.data(), SIGNAL( resolvingFinished( bool ) ), this, SLOT( trackResolveFinished( bool ) ) );
connect( query.data(), SIGNAL( resultsAdded( QList<Tomahawk::result_ptr> ) ), this, SLOT( trackResolved() ) );
append( query );
}
}
void
DynamicModel::stopOnDemand()
{
m_onDemandRunning = false;
AudioEngine::instance()->stop();
}
void
DynamicModel::trackResolved()
{
m_currentAttempts = 0;
if( m_startOnResolved ) { // on first start
m_startOnResolved = false;
AudioEngine::instance()->play();
}
}
void
DynamicModel::trackResolveFinished( bool success )
{
if( !success ) { // if it was successful, we've already gotten a trackResolved() signal
m_currentAttempts++;
if( m_currentAttempts < 100 ) {
m_playlist->generator()->fetchNext();
}
}
}
void
DynamicModel::newTrackLoading()
{
if( m_onDemandRunning && m_currentAttempts == 0 ) { // if we're in dynamic mode and we're also currently idle
m_playlist->generator()->fetchNext();
}
}

View File

@ -0,0 +1,60 @@
/****************************************************************************************
* Copyright (c) 2011 Leo Franchi <lfranchi@kde.org> *
* *
* This program 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 2 of the License, or (at your option) any later *
* version. *
* *
* This program 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 *
* this program. If not, see <http://www.gnu.org/licenses/>. *
****************************************************************************************/
#ifndef DYNAMIC_MODEL_H
#define DYNAMIC_MODEL_H
#include "playlistmodel.h"
#include "query.h"
namespace Tomahawk
{
class StationModelItem;
/**
* Extends PlaylistModel with support for handling StationModelItems
*/
class DynamicModel : public PlaylistModel
{
Q_OBJECT
public:
DynamicModel( QObject* parent = 0 );
virtual ~DynamicModel();
void startOnDemand();
void stopOnDemand();
void loadPlaylist( const dynplaylist_ptr& playlist );
private slots:
void newTrackGenerated( const Tomahawk::query_ptr& query );
void trackResolveFinished( bool );
void trackResolved();
void newTrackLoading();
private:
dynplaylist_ptr m_playlist;
bool m_startOnResolved;
bool m_onDemandRunning;
int m_currentAttempts;
};
};
#endif

View File

@ -23,8 +23,7 @@
#include <QSpinBox>
#include "DynamicControlList.h"
#include "playlistview.h"
#include "playlistmodel.h"
#include "dynamic/DynamicModel.h"
#include "trackproxymodel.h"
#include "dynamic/GeneratorInterface.h"
#include "dynamic/GeneratorFactory.h"
@ -43,8 +42,6 @@ DynamicWidget::DynamicWidget( const Tomahawk::dynplaylist_ptr& playlist, QWidget
, m_resolveOnNextLoad( false )
, m_seqRevLaunched( 0 )
, m_runningOnDemand( false )
, m_startOnResolved( false )
, m_songsSinceLastResolved( 0 )
, m_steering( 0 )
, m_headerText( 0 )
, m_headerLayout( 0 )
@ -88,7 +85,7 @@ DynamicWidget::DynamicWidget( const Tomahawk::dynplaylist_ptr& playlist, QWidget
m_controls = new CollapsibleControls( this );
m_layout->addWidget( m_controls );
m_model = new PlaylistModel( this );
m_model = new DynamicModel( this );
m_view = new DynamicView( this );
m_view->setModel( m_model );
m_view->setContentsMargins( 0, 0, 0, 0 );
@ -140,7 +137,6 @@ DynamicWidget::loadDynamicPlaylist( const Tomahawk::dynplaylist_ptr& playlist )
if( !m_playlist.isNull() ) {
disconnect( m_playlist->generator().data(), SIGNAL( generated( QList<Tomahawk::query_ptr> ) ), this, SLOT( tracksGenerated( QList<Tomahawk::query_ptr> ) ) );
disconnect( m_playlist.data(), SIGNAL( dynamicRevisionLoaded( Tomahawk::DynamicPlaylistRevision) ), this, SLOT(onRevisionLoaded( Tomahawk::DynamicPlaylistRevision) ) );
disconnect( m_playlist->generator().data(), SIGNAL( nextTrackGenerated( Tomahawk::query_ptr ) ), this, SLOT( onDemandFetched( Tomahawk::query_ptr ) ) );
disconnect( m_playlist->generator().data(), SIGNAL( error( QString, QString ) ), m_view, SLOT( showMessageTimeout( QString, QString ) ) );
}
@ -157,7 +153,6 @@ DynamicWidget::loadDynamicPlaylist( const Tomahawk::dynplaylist_ptr& playlist )
applyModeChange( m_playlist->mode() );
connect( m_playlist->generator().data(), SIGNAL( generated( QList<Tomahawk::query_ptr> ) ), this, SLOT( tracksGenerated( QList<Tomahawk::query_ptr> ) ) );
connect( m_playlist.data(), SIGNAL( dynamicRevisionLoaded( Tomahawk::DynamicPlaylistRevision ) ), this, SLOT( onRevisionLoaded( Tomahawk::DynamicPlaylistRevision ) ) );
connect( m_playlist->generator().data(), SIGNAL( nextTrackGenerated( Tomahawk::query_ptr ) ), this, SLOT( onDemandFetched( Tomahawk::query_ptr ) ) );
connect( m_playlist->generator().data(), SIGNAL( error( QString, QString ) ), m_view, SLOT( showMessageTimeout( QString, QString ) ) );
}
@ -211,11 +206,11 @@ DynamicWidget::generateOrStart()
} else if( m_playlist->mode() == OnDemand ) {
if( m_runningOnDemand == false ) {
m_runningOnDemand = true;
m_startOnResolved = true;
m_playlist->generator()->startOnDemand();
m_model->startOnDemand();
m_generateButton->setText( tr( "Stop" ) );
// show the steering controls
if( m_playlist->generator()->onDemandSteerable() ) {
// position it horizontally centered, above the botton.
@ -230,8 +225,8 @@ DynamicWidget::generateOrStart()
m_steering->show();
}
} else { // stop
m_model->stopOnDemand();
m_runningOnDemand = false;
m_startOnResolved = false;
m_steering = 0;
m_generateButton->setText( tr( "Start" ) );
}
@ -271,52 +266,6 @@ DynamicWidget::tracksGenerated( const QList< query_ptr >& queries )
}
}
void
DynamicWidget::onDemandFetched( const Tomahawk::query_ptr& track )
{
connect( track.data(), SIGNAL( resolvingFinished( bool ) ), this, SLOT( trackResolveFinished( bool ) ) );
connect( track.data(), SIGNAL( resultsAdded( QList<Tomahawk::result_ptr> ) ), this, SLOT( trackResolved() ) );
m_model->append( track );
}
void
DynamicWidget::trackResolved()
{
m_songsSinceLastResolved = 0;
if( m_startOnResolved ) {
m_startOnResolved = false;
AudioEngine::instance()->play();
}
}
void
DynamicWidget::trackResolveFinished( bool success )
{
if( !success ) { // if it was successful, we've already gotten a trackResolved() signal
m_songsSinceLastResolved++;
if( m_songsSinceLastResolved < 100 ) {
m_playlist->generator()->fetchNext();
}
}
}
void
DynamicWidget::newTrackLoading()
{
if( m_runningOnDemand && m_songsSinceLastResolved == 0 ) { // if we're in dynamic mode and we're also currently idle
m_playlist->generator()->fetchNext();
}
}
void DynamicWidget::onDemandFailed()
{
if( m_runningOnDemand )
generateOrStart();
}
void
DynamicWidget::controlsChanged()

View File

@ -38,6 +38,9 @@ class ReadOrWriteWidget;
namespace Tomahawk
{
class DynamicModel;
class DynamicView;
@ -68,13 +71,6 @@ private slots:
void generateOrStart();
void tracksGenerated( const QList< Tomahawk::query_ptr>& queries );
// used by on demand mode
void onDemandFailed();
void newTrackLoading();
void onDemandFetched( const Tomahawk::query_ptr& track );
void trackResolveFinished( bool );
void trackResolved();
void controlsChanged();
void controlChanged( const Tomahawk::dyncontrol_ptr& control );
@ -88,8 +84,6 @@ private:
// used in OnDemand mode
bool m_runningOnDemand;
bool m_startOnResolved;
int m_songsSinceLastResolved;
QWidget* m_steering;
// layout and stuff
@ -103,7 +97,7 @@ private:
CollapsibleControls* m_controls;
DynamicView* m_view;
PlaylistModel* m_model;
DynamicModel* m_model;
};
};