1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-08-16 02:54:33 +02:00

lots of work on dynamic playlists. loading, saving, updating, working, etc.

crashes on loading still
This commit is contained in:
Leo Franchi
2011-01-09 21:48:53 -05:00
parent 4a22e436ac
commit fbd9265d31
21 changed files with 295 additions and 84 deletions

View File

@@ -82,6 +82,10 @@ DynamicControlList::init()
void
DynamicControlList::setControls( const geninterface_ptr& generator, const QList< dyncontrol_ptr >& controls)
{
if( !m_controls.isEmpty() ) {
qDeleteAll( m_controls );
m_controls.clear();
}
m_generator = generator;
if( controls.isEmpty() ) {
m_controls << new DynamicControlWidget( generator->createControl(), false, false, false, this );
@@ -138,10 +142,14 @@ void DynamicControlList::addNewControl()
m_controls.last()->setShowCollapseButton( false );
m_controls.last()->setShowPlusButton( false );
m_controls.last()->setShowMinusButton( true );
m_controls.append( new DynamicControlWidget( m_generator->createControl(), true, false, true, this ) );
dyncontrol_ptr control = m_generator->createControl();
m_controls.append( new DynamicControlWidget( control, true, false, true, this ) );
m_layout->addWidget( m_controls.last() );
connect( m_controls.last(), SIGNAL( addNewControl() ), this, SLOT( addNewControl() ) );
connect( m_controls.last(), SIGNAL( removeControl() ), this, SLOT( removeControl() ) );
connect( m_controls.last(), SIGNAL( changed() ), this, SLOT( controlChanged() ) );
emit controlsChanged();
}
void DynamicControlList::removeControl()
@@ -153,8 +161,18 @@ void DynamicControlList::removeControl()
m_controls.last()->setShowCollapseButton( true );
m_controls.last()->setShowPlusButton( true );
m_controls.last()->setShowMinusButton( false );
emit controlsChanged();
}
void DynamicControlList::controlChanged()
{
Q_ASSERT( sender() && qobject_cast<DynamicControlWidget*>(sender()) );
emit controlChanged( qobject_cast<DynamicControlWidget*>(sender())->control() );
}
void DynamicControlList::paintEvent(QPaintEvent* )
{
}

View File

@@ -46,11 +46,16 @@ public:
virtual void paintEvent(QPaintEvent* );
signals:
void controlsChanged();
void controlChanged( const dyncontrol_ptr& control );
public slots:
virtual void onHidden(QWidget* );
virtual void onShown(QWidget* );
void addNewControl();
void removeControl();
void controlChanged();
private:
void init();

View File

@@ -74,8 +74,8 @@ DynamicControlWidget::DynamicControlWidget( const Tomahawk::dyncontrol_ptr& cont
m_collapseL->setCurrentIndex( 0 );
connect( m_collapseButton, SIGNAL( clicked( bool ) ), this, SIGNAL( collapse() ) );
connect( m_typeSelector, SIGNAL( currentIndexChanged( QString ) ), SLOT( typeSelectorChanged( QString ) ) );
connect( m_typeSelector, SIGNAL( currentIndexChanged( QString ) ), SLOT( typeSelectorChanged( QString ) ) );
connect( m_control.data(), SIGNAL( changed() ), this, SIGNAL( changed() ) );
m_layout->addWidget( m_typeSelector, 0, Qt::AlignLeft );
@@ -149,6 +149,7 @@ DynamicControlWidget::typeSelectorChanged( QString type )
m_control->inputField()->show();
}
emit changed();
}
void

View File

@@ -55,6 +55,7 @@ signals:
void addNewControl();
void collapse();
void removeControl();
void changed();
private slots:
void typeSelectorChanged( QString );

View File

@@ -81,8 +81,11 @@ DynamicWidget::DynamicWidget( const Tomahawk::dynplaylist_ptr& playlist, QWidget
m_splitter->show( 0, false );
loadDynamicPlaylist( playlist );
setLayout( m_layout );
connect( m_controls, SIGNAL( controlChanged( dyncontrol_ptr ) ), this, SLOT( controlChanged( dyncontrol_ptr ) ), Qt::QueuedConnection );
connect( m_controls, SIGNAL( controlsChanged() ), this, SLOT( controlsChanged() ), Qt::QueuedConnection );
}
DynamicWidget::~DynamicWidget()
@@ -141,3 +144,15 @@ DynamicWidget::tracksGenerated( const QList< query_ptr >& queries )
m_playlist->addEntries( queries, m_playlist->currentrevision() );
m_playlist->resolve();
}
void DynamicWidget::controlsChanged()
{
// save the current playlist
m_playlist->createNewRevision();
}
void DynamicWidget::controlChanged(const Tomahawk::dyncontrol_ptr& control)
{
}

View File

@@ -18,8 +18,10 @@
#define DYNAMIC_WIDGET_H
#include <QWidget>
#include <typedefs.h>
#include <dynamic/DynamicPlaylist.h>
#include "typedefs.h"
#include "dynamic/DynamicPlaylist.h"
#include "dynamic/DynamicControl.h"
class QVBoxLayout;
class QHBoxLayout;
@@ -57,6 +59,9 @@ private slots:
void generate();
void tracksGenerated( const QList< Tomahawk::query_ptr>& queries );
void controlsChanged();
void controlChanged( const dyncontrol_ptr& control );
private:
dynplaylist_ptr m_playlist;
QVBoxLayout* m_layout;

View File

@@ -7,6 +7,7 @@
#include "tomahawksqlquery.h"
#include "dynamic/DynamicControl.h"
#include "dynamic/GeneratorInterface.h"
#include <dynamic/GeneratorFactory.h>
using namespace Tomahawk;
@@ -27,12 +28,29 @@ DatabaseCommand_LoadDynamicPlaylist::exec( DatabaseImpl* dbi )
controlsQuery.addBindValue( revisionGuid() );
controlsQuery.exec();
QList< dyncontrol_ptr > controls;
QString type;
GeneratorMode mode;
QList< QVariantMap > controls;
QString playlist_guid;
if( controlsQuery.next() )
qDebug() << "Loading controls..." << revisionGuid();
qDebug() << "SELECT playlist_revision.playlist, controls, plmode, pltype "
"FROM dynamic_playlist_revision, playlist_revision "
"WHERE dynamic_playlist_revision.guid = "<< revisionGuid() << " AND playlist_revision.guid = dynamic_playlist_revision.guid";
if( controlsQuery.first() )
{
playlist_guid = controlsQuery.value( 0 ).toString();
QStringList controlIds = controlsQuery.value( 1 ).toStringList();
QJson::Parser parser;
bool ok;
QVariant v = parser.parse( controlsQuery.value(1).toByteArray(), &ok );
Q_ASSERT( ok && v.type() == QVariant::List ); //TODO
type = controlsQuery.value( 3 ).toString();
GeneratorMode mode = static_cast<GeneratorMode>( controlsQuery.value( 2 ).toInt() );
QStringList controlIds = v.toStringList();
qDebug() << "Got controls in dynamic playlist, loading:" << controlIds << controlsQuery.value(1);
foreach( const QString& controlId, controlIds )
{
TomahawkSqlQuery controlQuery = dbi->newquery();
@@ -43,27 +61,30 @@ DatabaseCommand_LoadDynamicPlaylist::exec( DatabaseImpl* dbi )
controlQuery.exec();
if( controlQuery.next() )
{
dyncontrol_ptr c = dyncontrol_ptr( new DynamicControl );
c->setId( controlId );
c->setSelectedType( controlQuery.value( 0 ).toString() );
c->setMatch( controlQuery.value( 1 ).toString() );
c->setInput( controlQuery.value( 2 ).toString() );
QVariantMap c;
c[ "type" ] = type;
c[ "id" ] = controlId;
c[ "selectedType" ] = controlQuery.value( 0 ).toString();
c["match" ] = controlQuery.value( 1 ).toString();
c[ "input" ] = controlQuery.value( 2 ).toString();
controls << c;
}
}
} else {
// No controls, lets load the info we need directly from the playlist table
TomahawkSqlQuery info = dbi->newquery();
info.prepare( QString( "SELECT dynamic_playlist.pltype, dynamic_playlist.plmode FROM playlist, dynamic_playlist WHERE playlist.guid = \"%1\" AND playlist.guid = dynamic_playlist.guid" ).arg( playlist_guid ) );
if( !info.exec() ) {
qWarning() << "Failed to load dynplaylist info..";
return;
} else if( !info.first() ) {
qWarning() << "Noo results for queryL:" << info.lastQuery();
return;
}
type = info.value( 0 ).toString();
mode = static_cast<GeneratorMode>( info.value( 1 ).toInt() );
}
TomahawkSqlQuery info = dbi->newquery();
info.prepare( QString( "SELECT dynamic_playlist.pltype, dynamic_playlist.plmode FROM playlist, dynamic_playlist WHERE playlist.guid = \"%1\" AND playlist.guid = dynamic_playlist.guid" ).arg( playlist_guid ) );
if( !info.exec() ) {
qWarning() << "Failed to load dynplaylist info..";
return;
} else if( !info.first() ) {
qWarning() << "Noo results for queryL:" << info.lastQuery();
return;
}
QString type = info.value( 0 ).toString();
GeneratorMode mode = static_cast<GeneratorMode>( info.value( 1 ).toInt() );
if( mode == OnDemand ) {
Q_ASSERT( m_entrymap.isEmpty() ); // ondemand should have no entry

View File

@@ -29,14 +29,14 @@ signals:
void done( QString,
bool,
QString,
QList< Tomahawk::dyncontrol_ptr>,
QList< QVariantMap>,
bool );
// used when loading a static playlist
void done( QString,
QList< QString >,
QList< QString >,
QString,
QList< Tomahawk::dyncontrol_ptr>,
QList< QVariantMap>,
bool,
QMap< QString, Tomahawk::plentry_ptr >,
bool );

View File

@@ -73,16 +73,7 @@ DatabaseCommand_SetDynamicPlaylistRevision::postCommitHook()
Q_ASSERT( !playlist.isNull() );
return;
}
if( m_controls.isEmpty() && !m_controlsV.isEmpty() ) // we were creatd from JSON, not programmatically. construct the controls fromthe playlist now
{
foreach( const QVariant& contrl, m_controlsV ) {
dyncontrol_ptr control = playlist->generator()->createControl( m_type );
QJson::QObjectHelper::qvariant2qobject( contrl.toMap(), control.data( ));
m_controls << control;
}
}
if( m_mode == OnDemand )
playlist->setRevision( newrev(),
true, // this *is* the newest revision so far
@@ -140,6 +131,7 @@ DatabaseCommand_SetDynamicPlaylistRevision::exec( DatabaseImpl* lib )
"VALUES( ?, ?, ?, ?, ? )" );
foreach( const dyncontrol_ptr& control, m_controls )
{
qDebug() << "inserting dynamic control:" << control->id() << m_playlistguid << control->selectedType() << control->match() << control->input();
controlsQuery.addBindValue( control->id() );
controlsQuery.addBindValue( m_playlistguid );
controlsQuery.addBindValue( control->selectedType() );

View File

@@ -167,7 +167,7 @@ DatabaseWorker::logOp( DatabaseCommandLoggable* command )
QVariantMap variant = QJson::QObjectHelper::qobject2qvariant( command );
QByteArray ba = m_serializer.serialize( variant );
qDebug() << "OP JSON:" << ba.isNull() << ba << "from:" << variant; // debug
// qDebug() << "OP JSON:" << ba.isNull() << ba << "from:" << variant; // debug
bool compressed = false;
if( ba.length() >= 512 )

View File

@@ -39,6 +39,7 @@ namespace Tomahawk
class DynamicControl : public QObject
{
Q_OBJECT
Q_PROPERTY( QString type READ type WRITE setType ) // the generator type associated with this control
Q_PROPERTY( QString id READ id WRITE setId )
Q_PROPERTY( QString selectedType READ selectedType WRITE setSelectedType )
Q_PROPERTY( QString match READ match WRITE setMatch )
@@ -83,6 +84,12 @@ public:
};
void setId( const QString& id ) { m_id = id; }
void setType( const QString& type ) { m_type = type; }
QString type() const { return m_type; }
signals:
void changed();
public slots:
/**
* Sets the type to the newly specified one. Note that this will update the matchSelector
@@ -98,6 +105,7 @@ protected:
QString m_input;
private:
QString m_type;
QString m_selectedType;
QStringList m_typeSelectors;
QString m_id;

View File

@@ -125,6 +125,19 @@ DynamicPlaylist::create( const Tomahawk::source_ptr& author,
}
void
DynamicPlaylist::createNewRevision( const QString& newUuid )
{
if( mode() == Static )
{
createNewRevision( newUuid.isEmpty() ? uuid() : newUuid, currentrevision(), type(), generator()->controls(), entries() );
} else if( mode() == OnDemand )
{
createNewRevision( newUuid.isEmpty() ? uuid() : newUuid, currentrevision(), type(), generator()->controls());
}
}
// create a new revision that will be a static playlist, as it has entries
void
DynamicPlaylist::createNewRevision( const QString& newrev,
@@ -190,19 +203,19 @@ DynamicPlaylist::loadRevision( const QString& rev )
connect( cmd, SIGNAL( done( QString,
bool,
QString,
QList< Tomahawk::dyncontrol_ptr>,
QList< QVariantMap >,
bool ) ),
SLOT( setRevision( QString,
bool,
QString,
QList< Tomahawk::dyncontrol_ptr>,
QList< QVariantMap >,
bool) ) );
} else if( m_generator->mode() == Static ) {
connect( cmd, SIGNAL( done( QString,
QList< QString >,
QList< QString >,
QString,
QList< Tomahawk::dyncontrol_ptr>,
QList< QVariantMap >,
bool,
QMap< QString, Tomahawk::plentry_ptr >,
bool ) ),
@@ -210,7 +223,7 @@ DynamicPlaylist::loadRevision( const QString& rev )
QList< QString >,
QList< QString >,
QString,
QList< Tomahawk::dyncontrol_ptr>,
QList< QVariantMap >,
bool,
QMap< QString, Tomahawk::plentry_ptr >,
bool ) ) );
@@ -264,16 +277,14 @@ void DynamicPlaylist::addEntry(const Tomahawk::query_ptr& query, const QString&
addEntries( queries, oldrev );
}
// static version
void
DynamicPlaylist::setRevision( const QString& rev,
const QList< QString >& neworderedguids,
const QList< QString >& oldorderedguids,
const QString& type,
const QList< Tomahawk::dyncontrol_ptr>& controls,
bool is_newest_rev,
const QMap< QString, Tomahawk::plentry_ptr >& addedmap,
bool applied )
void DynamicPlaylist::setRevision( const QString& rev,
const QList< QString >& neworderedguids,
const QList< QString >& oldorderedguids,
const QString& type,
const QList< dyncontrol_ptr >& controls,
bool is_newest_rev,
const QMap< QString, plentry_ptr >& addedmap,
bool applied)
{
// we're probably being called by a database worker thread
if( QThread::currentThread() != thread() )
@@ -307,17 +318,46 @@ DynamicPlaylist::setRevision( const QString& rev,
if( applied )
setCurrentrevision( rev );
// qDebug() << "EMITTING REVISION LOADED 1!";
emit dynamicRevisionLoaded( dpr );
// qDebug() << "EMITTING REVISION LOADED 1!";
emit dynamicRevisionLoaded( dpr );
}
// ondemand version
void
DynamicPlaylist::setRevision( const QString& rev,
bool is_newest_rev,
const QList< QString >& neworderedguids,
const QList< QString >& oldorderedguids,
const QString& type,
const QList< Tomahawk::dyncontrol_ptr>& controls,
const QList< QVariantMap>& controlsV,
bool is_newest_rev,
const QMap< QString, Tomahawk::plentry_ptr >& addedmap,
bool applied )
{
if( QThread::currentThread() != thread() )
{
QMetaObject::invokeMethod( this,
"setRevision",
Qt::BlockingQueuedConnection,
Q_ARG( QString, rev ),
Q_ARG( QList<QString> , neworderedguids ),
Q_ARG( QList<QString> , oldorderedguids ),
Q_ARG( QString , type ),
QGenericArgument( "QList< QVariantMap > " , (const void*)&controlsV ),
Q_ARG( bool, is_newest_rev ),
QGenericArgument( "QMap< QString,Tomahawk::plentry_ptr > " , (const void*)&addedmap ),
Q_ARG( bool, applied ) );
}
QList<dyncontrol_ptr> controls = variantsToControl( controlsV );
setRevision( rev, neworderedguids, oldorderedguids, type, controls, is_newest_rev, addedmap, applied );
}
void DynamicPlaylist::setRevision( const QString& rev,
bool is_newest_rev,
const QString& type,
const QList< dyncontrol_ptr >& controls,
bool applied )
{
if( QThread::currentThread() != thread() )
{
@@ -334,7 +374,7 @@ DynamicPlaylist::setRevision( const QString& rev,
if( m_generator->type() != type ) { // new generator needed
m_generator = geninterface_ptr( GeneratorFactory::create( type ) );
}
m_generator->setControls( controls );
m_generator->setMode( OnDemand );
@@ -345,7 +385,43 @@ DynamicPlaylist::setRevision( const QString& rev,
dpr.type = type;
dpr.mode = OnDemand;
// qDebug() << "EMITTING REVISION LOADED 2!";
emit dynamicRevisionLoaded( dpr );
// qDebug() << "EMITTING REVISION LOADED 2!";
emit dynamicRevisionLoaded( dpr );
}
void
DynamicPlaylist::setRevision( const QString& rev,
bool is_newest_rev,
const QString& type,
const QList< QVariantMap>& controlsV,
bool applied )
{
if( QThread::currentThread() != thread() )
{
QMetaObject::invokeMethod( this,
"setRevision",
Qt::BlockingQueuedConnection,
Q_ARG( QString, rev ),
Q_ARG( bool, is_newest_rev ),
Q_ARG( QString, type ),
QGenericArgument( "QList< QVariantMap >" , (const void*)&controlsV ),
Q_ARG( bool, applied ) );
return;
}
QList<dyncontrol_ptr> controls = variantsToControl( controlsV );
setRevision( rev, is_newest_rev, type, controls, applied );
}
QList< dyncontrol_ptr > DynamicPlaylist::variantsToControl( const QList< QVariantMap >& controlsV )
{
QList<dyncontrol_ptr> realControls;
foreach( QVariantMap controlV, controlsV ) {
dyncontrol_ptr control = GeneratorFactory::createControl( controlV.value( "type" ).toString(), controlV.value( "selectedType" ).toString() );
QJson::QObjectHelper::qvariant2qobject( controlV, control.data() );
realControls << control;
}
return realControls;
}

View File

@@ -87,6 +87,10 @@ public:
QString type() const;
geninterface_ptr generator() const;
// Creates a new revision from the playlist in memory. Use this is you change the controls or
// mode of a playlist and want to save it to db/others.
void createNewRevision( const QString& uuid = QString() );
virtual void addEntries( const QList< query_ptr >& queries, const QString& oldrev );
virtual void addEntry( const Tomahawk::query_ptr& query, const QString& oldrev );
@@ -116,21 +120,37 @@ public slots:
void reportDeleted( const Tomahawk::dynplaylist_ptr& self );
// called from setdynamicplaylistrevision db cmd
// static version
// 4 options, because dbcmds can't create qwidgets:
// static version, qvariant controls
// static version, dyncontrol_ptr controls
// ondemand version, qvariant controls
// ondemand version, dyncontrol_ptr controls
void setRevision( const QString& rev,
const QList<QString>& neworderedguids,
const QList<QString>& oldorderedguids,
const QString& type,
const QList< Tomahawk::dyncontrol_ptr>& controls,
const QList< QVariantMap >& controls,
bool is_newest_rev,
const QMap< QString, Tomahawk::plentry_ptr >& addedmap,
bool applied );
void setRevision( const QString& rev,
const QList<QString>& neworderedguids,
const QList<QString>& oldorderedguids,
const QString& type,
const QList< dyncontrol_ptr >& controls,
bool is_newest_rev,
const QMap< QString, Tomahawk::plentry_ptr >& addedmap,
bool applied );
// ondemand version
void setRevision( const QString& rev,
bool is_newest_rev,
const QString& type,
const QList< Tomahawk::dyncontrol_ptr>& controls,
const QList< QVariantMap>& controls,
bool applied );
void setRevision( const QString& rev,
bool is_newest_rev,
const QString& type,
const QList< dyncontrol_ptr>& controls,
bool applied );
private:
// called from loadAllPlaylists DB cmd:
@@ -155,6 +175,7 @@ private:
bool shared );
private:
QList< dyncontrol_ptr > variantsToControl( const QList< QVariantMap >& controlsV );
geninterface_ptr m_generator;
};

View File

@@ -5,7 +5,8 @@ using namespace Tomahawk;
QHash< QString, GeneratorFactoryInterface* > GeneratorFactory::s_factories = QHash< QString, GeneratorFactoryInterface* >();
geninterface_ptr GeneratorFactory::create ( const QString& type )
geninterface_ptr
GeneratorFactory::create ( const QString& type )
{
if( type.isEmpty() && !s_factories.isEmpty() ) // default, return first
return geninterface_ptr( s_factories.begin().value()->create() );
@@ -16,12 +17,33 @@ geninterface_ptr GeneratorFactory::create ( const QString& type )
return geninterface_ptr( s_factories.value( type )->create() );
}
void GeneratorFactory::registerFactory ( const QString& type, GeneratorFactoryInterface* interface )
dyncontrol_ptr
GeneratorFactory::createControl(const QString& generatorType, const QString& controlType)
{
if( generatorType.isEmpty() || !s_factories.contains( generatorType ) )
return dyncontrol_ptr();
return s_factories.value( generatorType )->createControl( controlType );
}
void
GeneratorFactory::registerFactory ( const QString& type, GeneratorFactoryInterface* interface )
{
s_factories.insert( type, interface );
}
QStringList GeneratorFactory::types()
QStringList
GeneratorFactory::types()
{
return s_factories.keys();
}
QStringList
GeneratorFactory::typeSelectors(const QString& type)
{
if( !s_factories.contains( type ) )
return QStringList();
return s_factories.value( type )->typeSelectors();
}

View File

@@ -5,6 +5,7 @@
#include <QString>
#include "dynamic/GeneratorInterface.h"
#include "typedefs.h"
namespace Tomahawk {
@@ -17,6 +18,13 @@ public:
GeneratorFactoryInterface() {}
virtual GeneratorInterface* create() = 0;
/**
* Create a control for this generator, not tied to this generator itself. Used when loading dynamic
* playlists from a dbcmd.
*/
virtual dyncontrol_ptr createControl( const QString& controlType = QString() ) = 0;
virtual QStringList typeSelectors() const = 0;
};
/**
@@ -26,8 +34,12 @@ class GeneratorFactory
{
public:
static geninterface_ptr create( const QString& type );
// only used when loading from dbcmd
static dyncontrol_ptr createControl( const QString& generatorType, const QString& controlType = QString() );
static void registerFactory( const QString& type, GeneratorFactoryInterface* interface );
static QStringList types();
static QStringList typeSelectors( const QString& type );
private:
static QHash<QString, GeneratorFactoryInterface*> s_factories;

View File

@@ -60,8 +60,9 @@ Tomahawk::GeneratorInterface::setControls( const QList< Tomahawk::dyncontrol_ptr
m_controls = controls;
}
Tomahawk::dyncontrol_ptr Tomahawk::GeneratorInterface::createControl(const QString& type)
Tomahawk::dyncontrol_ptr
Tomahawk::GeneratorInterface::createControl(const QString& type)
{
Q_ASSERT( false );
return dyncontrol_ptr();
}

View File

@@ -75,9 +75,7 @@ public:
void addControl( const dyncontrol_ptr& control );
void clearControls();
void setControls( const QList< dyncontrol_ptr>& controls );
QStringList typeSelectors() const { return m_typeSelectors; }
signals:
void generated( const QList< Tomahawk::query_ptr>& queries );
@@ -85,7 +83,6 @@ protected:
QString m_type;
GeneratorMode m_mode;
QList< dyncontrol_ptr > m_controls;
QStringList m_typeSelectors;
};
typedef QSharedPointer<GeneratorInterface> geninterface_ptr;

View File

@@ -22,9 +22,10 @@
#include <QLineEdit>
Tomahawk::EchonestControl::EchonestControl( const QString& type, const QStringList& typeSelectors, QObject* parent )
: DynamicControl ( type.isEmpty() ? "Artist" : type, typeSelectors, parent )
Tomahawk::EchonestControl::EchonestControl( const QString& selectedType, const QStringList& typeSelectors, QObject* parent )
: DynamicControl ( selectedType.isEmpty() ? "Artist" : selectedType, typeSelectors, parent )
{
setType( "echonest" );
updateWidgets();
}
@@ -80,7 +81,9 @@ Tomahawk::EchonestControl::updateWidgets()
input->setSizePolicy( QSizePolicy::Ignored, QSizePolicy::Fixed );
connect( match, SIGNAL( currentIndexChanged(int) ), this, SLOT( updateData() ) );
connect( match, SIGNAL( currentIndexChanged(int) ), this, SIGNAL( changed() ) );
connect( input, SIGNAL( textChanged(QString) ), this, SLOT( updateData() ) );
connect( input, SIGNAL( editingFinished() ), this, SIGNAL( changed() ) );
match->hide();
input->hide();

View File

@@ -34,15 +34,15 @@ public:
/// Converts this to an echonest suitable parameter
Echonest::DynamicPlaylist::PlaylistParamData toENParam() const;
/// DO NOT USE IF YOU ARE NOT A DBCMD
explicit EchonestControl( const QString& type, const QStringList& typeSelectors, QObject* parent = 0 );
public slots:
virtual void setSelectedType ( const QString& type );
private slots:
void updateData();
protected:
explicit EchonestControl( const QString& type, const QStringList& typeSelectors, QObject* parent = 0 );
private:
void updateWidgets();

View File

@@ -30,12 +30,24 @@ EchonestFactory::create()
return new EchonestGenerator();
}
dyncontrol_ptr
EchonestFactory::createControl( const QString& controlType )
{
return dyncontrol_ptr( new EchonestControl( controlType, typeSelectors() ) );
}
QStringList
EchonestFactory::typeSelectors() const
{
return QStringList() << "Artist" << "Variety" << "Description" << "Tempo" << "Duration" << "Loudness"
<< "Danceability" << "Energy" << "Artist Familiarity" << "Artist Hotttnesss" << "Song Familiarity"
<< "Longitude" << "Latitude" << "Mode" << "Key" << "Sorting";
}
EchonestGenerator::EchonestGenerator ( QObject* parent )
: GeneratorInterface ( parent )
{
m_typeSelectors << "Artist" << "Variety" << "Description" << "Tempo" << "Duration" << "Loudness"
<< "Danceability" << "Energy" << "Artist Familiarity" << "Artist Hotttnesss" << "Song Familiarity"
<< "Longitude" << "Latitude" << "Mode" << "Key" << "Sorting";
m_type = "echonest";
m_mode = OnDemand;
@@ -49,7 +61,7 @@ EchonestGenerator::~EchonestGenerator()
dyncontrol_ptr
EchonestGenerator::createControl( const QString& type )
{
m_controls << dyncontrol_ptr( new EchonestControl( type, m_typeSelectors ) );
m_controls << dyncontrol_ptr( new EchonestControl( type, GeneratorFactory::typeSelectors( m_type ) ) );
return m_controls.last();
}

View File

@@ -32,7 +32,8 @@ public:
EchonestFactory();
virtual GeneratorInterface* create();
virtual dyncontrol_ptr createControl( const QString& controlType = QString() );
virtual QStringList typeSelectors() const;
};
class EchonestGenerator : public GeneratorInterface