mirror of
https://github.com/tomahawk-player/tomahawk.git
synced 2025-08-05 21:57:41 +02:00
fix crashes, but deleting controls doesn't work of course :)
This commit is contained in:
@@ -156,6 +156,7 @@ void DynamicControlList::removeControl()
|
|||||||
{
|
{
|
||||||
DynamicControlWidget* w = qobject_cast<DynamicControlWidget*>( sender() );
|
DynamicControlWidget* w = qobject_cast<DynamicControlWidget*>( sender() );
|
||||||
m_layout->removeWidget( w );
|
m_layout->removeWidget( w );
|
||||||
|
m_controls.removeAll( w );
|
||||||
delete w;
|
delete w;
|
||||||
|
|
||||||
m_controls.last()->setShowCollapseButton( true );
|
m_controls.last()->setShowCollapseButton( true );
|
||||||
|
@@ -48,7 +48,7 @@ public:
|
|||||||
|
|
||||||
signals:
|
signals:
|
||||||
void controlsChanged();
|
void controlsChanged();
|
||||||
void controlChanged( const dyncontrol_ptr& control );
|
void controlChanged( const Tomahawk::dyncontrol_ptr& control );
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
virtual void onHidden(QWidget* );
|
virtual void onHidden(QWidget* );
|
||||||
|
@@ -74,7 +74,7 @@ DynamicControlWidget::DynamicControlWidget( const Tomahawk::dyncontrol_ptr& cont
|
|||||||
m_collapseL->setCurrentIndex( 0 );
|
m_collapseL->setCurrentIndex( 0 );
|
||||||
|
|
||||||
connect( m_collapseButton, SIGNAL( clicked( bool ) ), this, SIGNAL( collapse() ) );
|
connect( m_collapseButton, SIGNAL( clicked( bool ) ), this, SIGNAL( collapse() ) );
|
||||||
connect( m_typeSelector, SIGNAL( currentIndexChanged( QString ) ), SLOT( typeSelectorChanged( QString ) ) );
|
connect( m_typeSelector, SIGNAL( activated( QString) ), SLOT( typeSelectorChanged( QString ) ) );
|
||||||
connect( m_control.data(), SIGNAL( changed() ), this, SIGNAL( changed() ) );
|
connect( m_control.data(), SIGNAL( changed() ), this, SIGNAL( changed() ) );
|
||||||
|
|
||||||
m_layout->addWidget( m_typeSelector, 0, Qt::AlignLeft );
|
m_layout->addWidget( m_typeSelector, 0, Qt::AlignLeft );
|
||||||
@@ -84,7 +84,7 @@ DynamicControlWidget::DynamicControlWidget( const Tomahawk::dyncontrol_ptr& cont
|
|||||||
m_typeSelector->addItem( type );
|
m_typeSelector->addItem( type );
|
||||||
}
|
}
|
||||||
|
|
||||||
typeSelectorChanged( m_control.isNull() ? "" : m_control->selectedType() );
|
typeSelectorChanged( m_control.isNull() ? "" : m_control->selectedType(), true );
|
||||||
|
|
||||||
m_layout->addLayout( m_collapseL, 0 );
|
m_layout->addLayout( m_collapseL, 0 );
|
||||||
m_layout->addLayout( m_plusL, 0 );
|
m_layout->addLayout( m_plusL, 0 );
|
||||||
@@ -101,7 +101,13 @@ DynamicControlWidget::DynamicControlWidget( const Tomahawk::dyncontrol_ptr& cont
|
|||||||
|
|
||||||
DynamicControlWidget::~DynamicControlWidget()
|
DynamicControlWidget::~DynamicControlWidget()
|
||||||
{
|
{
|
||||||
|
// remove the controls widgets from our layout so they are not parented
|
||||||
|
// we don't want to auto-delete them since the control should own them
|
||||||
|
// if we delete them, then the control will be holding on to null ptrs
|
||||||
|
m_layout->removeWidget( m_control->inputField() );
|
||||||
|
m_control->inputField()->setParent( 0 );
|
||||||
|
m_layout->removeWidget( m_control->matchSelector() );
|
||||||
|
m_control->matchSelector()->setParent( 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
dyncontrol_ptr DynamicControlWidget::control() const
|
dyncontrol_ptr DynamicControlWidget::control() const
|
||||||
@@ -132,13 +138,14 @@ QWidget* DynamicControlWidget::createDummy( QWidget* fromW )
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
DynamicControlWidget::typeSelectorChanged( QString type )
|
DynamicControlWidget::typeSelectorChanged( const QString& type, bool firstLoad )
|
||||||
{
|
{
|
||||||
Q_ASSERT( m_layout );
|
Q_ASSERT( m_layout );
|
||||||
m_layout->removeWidget( m_control->matchSelector() );
|
m_layout->removeWidget( m_control->matchSelector() );
|
||||||
m_layout->removeWidget( m_control->inputField() );
|
m_layout->removeWidget( m_control->inputField() );
|
||||||
|
|
||||||
m_control->setSelectedType( type );
|
if( m_control->selectedType() == type && !firstLoad )
|
||||||
|
m_control->setSelectedType( type );
|
||||||
|
|
||||||
if( m_control->matchSelector() ) {
|
if( m_control->matchSelector() ) {
|
||||||
m_layout->insertWidget( 1, m_control->matchSelector(), 0 );
|
m_layout->insertWidget( 1, m_control->matchSelector(), 0 );
|
||||||
|
@@ -58,7 +58,7 @@ signals:
|
|||||||
void changed();
|
void changed();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void typeSelectorChanged( QString );
|
void typeSelectorChanged( const QString& selectedType, bool firstLoad = false );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QToolButton* initButton();
|
QToolButton* initButton();
|
||||||
|
@@ -84,7 +84,7 @@ DynamicWidget::DynamicWidget( const Tomahawk::dynplaylist_ptr& playlist, QWidget
|
|||||||
|
|
||||||
setLayout( m_layout );
|
setLayout( m_layout );
|
||||||
|
|
||||||
connect( m_controls, SIGNAL( controlChanged( dyncontrol_ptr ) ), this, SLOT( controlChanged( dyncontrol_ptr ) ), Qt::QueuedConnection );
|
connect( m_controls, SIGNAL( controlChanged( Tomahawk::dyncontrol_ptr ) ), this, SLOT( controlChanged( Tomahawk::dyncontrol_ptr ) ), Qt::QueuedConnection );
|
||||||
connect( m_controls, SIGNAL( controlsChanged() ), this, SLOT( controlsChanged() ), Qt::QueuedConnection );
|
connect( m_controls, SIGNAL( controlsChanged() ), this, SLOT( controlsChanged() ), Qt::QueuedConnection );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -101,6 +101,7 @@ void DynamicWidget::loadDynamicPlaylist(const Tomahawk::dynplaylist_ptr& playlis
|
|||||||
|
|
||||||
m_playlist = playlist;
|
m_playlist = playlist;
|
||||||
m_model->loadPlaylist( m_playlist );
|
m_model->loadPlaylist( m_playlist );
|
||||||
|
|
||||||
if( !m_playlist.isNull() )
|
if( !m_playlist.isNull() )
|
||||||
m_controls->setControls( m_playlist->generator(), m_playlist->generator()->controls() );
|
m_controls->setControls( m_playlist->generator(), m_playlist->generator()->controls() );
|
||||||
m_modeCombo->setCurrentIndex( static_cast<int>( playlist->mode() ) );
|
m_modeCombo->setCurrentIndex( static_cast<int>( playlist->mode() ) );
|
||||||
|
@@ -60,7 +60,7 @@ private slots:
|
|||||||
void tracksGenerated( const QList< Tomahawk::query_ptr>& queries );
|
void tracksGenerated( const QList< Tomahawk::query_ptr>& queries );
|
||||||
|
|
||||||
void controlsChanged();
|
void controlsChanged();
|
||||||
void controlChanged( const dyncontrol_ptr& control );
|
void controlChanged( const Tomahawk::dyncontrol_ptr& control );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
dynplaylist_ptr m_playlist;
|
dynplaylist_ptr m_playlist;
|
||||||
|
@@ -65,7 +65,7 @@ DatabaseCommand_LoadDynamicPlaylist::exec( DatabaseImpl* dbi )
|
|||||||
c[ "type" ] = type;
|
c[ "type" ] = type;
|
||||||
c[ "id" ] = controlId;
|
c[ "id" ] = controlId;
|
||||||
c[ "selectedType" ] = controlQuery.value( 0 ).toString();
|
c[ "selectedType" ] = controlQuery.value( 0 ).toString();
|
||||||
c["match" ] = controlQuery.value( 1 ).toString();
|
c[ "match" ] = controlQuery.value( 1 ).toString();
|
||||||
c[ "input" ] = controlQuery.value( 2 ).toString();
|
c[ "input" ] = controlQuery.value( 2 ).toString();
|
||||||
controls << c;
|
controls << c;
|
||||||
}
|
}
|
||||||
|
@@ -73,8 +73,7 @@ DatabaseCommand_SetDynamicPlaylistRevision::postCommitHook()
|
|||||||
qDebug() << playlistguid();
|
qDebug() << playlistguid();
|
||||||
Q_ASSERT( !playlist.isNull() );
|
Q_ASSERT( !playlist.isNull() );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( m_mode == OnDemand )
|
if( m_mode == OnDemand )
|
||||||
playlist->setRevision( newrev(),
|
playlist->setRevision( newrev(),
|
||||||
true, // this *is* the newest revision so far
|
true, // this *is* the newest revision so far
|
||||||
|
@@ -66,13 +66,13 @@ public:
|
|||||||
virtual QWidget* inputField() { Q_ASSERT( false ); return 0; }
|
virtual QWidget* inputField() { Q_ASSERT( false ); return 0; }
|
||||||
|
|
||||||
/// the serializable value of the match
|
/// the serializable value of the match
|
||||||
QString match() const { return m_match; }
|
virtual QString match() const { Q_ASSERT( false ); return QString(); }
|
||||||
/// the serializable value of the input
|
/// the serializable value of the input
|
||||||
QString input() const { return m_input; }
|
virtual QString input() const { Q_ASSERT( false ); return QString(); }
|
||||||
|
|
||||||
// used by JSON serialization
|
// used by JSON serialization
|
||||||
void setMatch( const QString& match ) { m_match = match; }
|
virtual void setMatch( const QString& match ) { Q_ASSERT( false ); }
|
||||||
void setInput( const QString& input ) { m_input = input; }
|
virtual void setInput( const QString& input ) { Q_ASSERT( false ); }
|
||||||
|
|
||||||
/// All the potential type selectors for this control
|
/// All the potential type selectors for this control
|
||||||
QStringList typeSelectors() const { return m_typeSelectors; }
|
QStringList typeSelectors() const { return m_typeSelectors; }
|
||||||
|
@@ -385,7 +385,7 @@ void DynamicPlaylist::setRevision( const QString& rev,
|
|||||||
dpr.controls = controls;
|
dpr.controls = controls;
|
||||||
dpr.type = type;
|
dpr.type = type;
|
||||||
dpr.mode = OnDemand;
|
dpr.mode = OnDemand;
|
||||||
|
|
||||||
// qDebug() << "EMITTING REVISION LOADED 2!";
|
// qDebug() << "EMITTING REVISION LOADED 2!";
|
||||||
emit dynamicRevisionLoaded( dpr );
|
emit dynamicRevisionLoaded( dpr );
|
||||||
}
|
}
|
||||||
@@ -395,7 +395,7 @@ void
|
|||||||
DynamicPlaylist::setRevision( const QString& rev,
|
DynamicPlaylist::setRevision( const QString& rev,
|
||||||
bool is_newest_rev,
|
bool is_newest_rev,
|
||||||
const QString& type,
|
const QString& type,
|
||||||
const QList< QVariantMap>& controlsV,
|
const QList< QVariantMap >& controlsV,
|
||||||
bool applied )
|
bool applied )
|
||||||
{
|
{
|
||||||
if( QThread::currentThread() != thread() )
|
if( QThread::currentThread() != thread() )
|
||||||
|
@@ -138,7 +138,7 @@ public slots:
|
|||||||
const QList<QString>& neworderedguids,
|
const QList<QString>& neworderedguids,
|
||||||
const QList<QString>& oldorderedguids,
|
const QList<QString>& oldorderedguids,
|
||||||
const QString& type,
|
const QString& type,
|
||||||
const QList< dyncontrol_ptr >& controls,
|
const QList< Tomahawk::dyncontrol_ptr >& controls,
|
||||||
bool is_newest_rev,
|
bool is_newest_rev,
|
||||||
const QMap< QString, Tomahawk::plentry_ptr >& addedmap,
|
const QMap< QString, Tomahawk::plentry_ptr >& addedmap,
|
||||||
bool applied );
|
bool applied );
|
||||||
@@ -151,7 +151,7 @@ public slots:
|
|||||||
void setRevision( const QString& rev,
|
void setRevision( const QString& rev,
|
||||||
bool is_newest_rev,
|
bool is_newest_rev,
|
||||||
const QString& type,
|
const QString& type,
|
||||||
const QList< dyncontrol_ptr>& controls,
|
const QList< Tomahawk::dyncontrol_ptr>& controls,
|
||||||
bool applied );
|
bool applied );
|
||||||
private:
|
private:
|
||||||
// called from loadAllPlaylists DB cmd via databasecollection (in GUI thread)
|
// called from loadAllPlaylists DB cmd via databasecollection (in GUI thread)
|
||||||
|
@@ -59,6 +59,31 @@ Tomahawk::EchonestControl::toENParam() const
|
|||||||
return m_data;
|
return m_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString Tomahawk::EchonestControl::input() const
|
||||||
|
{
|
||||||
|
return m_data.second.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
QString Tomahawk::EchonestControl::match() const
|
||||||
|
{
|
||||||
|
return m_matchString;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Tomahawk::EchonestControl::setInput(const QString& input)
|
||||||
|
{
|
||||||
|
// TODO generate widgets
|
||||||
|
m_data.second = input;
|
||||||
|
updateWidgetsFromData();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Tomahawk::EchonestControl::setMatch(const QString& match)
|
||||||
|
{
|
||||||
|
// TODO generate widgets
|
||||||
|
m_matchString = match;
|
||||||
|
updateWidgetsFromData();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
Tomahawk::EchonestControl::updateWidgets()
|
Tomahawk::EchonestControl::updateWidgets()
|
||||||
{
|
{
|
||||||
@@ -101,6 +126,7 @@ Tomahawk::EchonestControl::updateData()
|
|||||||
if( selectedType() == "Artist" ) {
|
if( selectedType() == "Artist" ) {
|
||||||
QComboBox* combo = qobject_cast<QComboBox*>( m_match.data() );
|
QComboBox* combo = qobject_cast<QComboBox*>( m_match.data() );
|
||||||
if( combo ) {
|
if( combo ) {
|
||||||
|
m_matchString = combo->itemData( combo->currentIndex() ).toString();
|
||||||
}
|
}
|
||||||
QLineEdit* edit = qobject_cast<QLineEdit*>( m_input.data() );
|
QLineEdit* edit = qobject_cast<QLineEdit*>( m_input.data() );
|
||||||
if( edit && !edit->text().isEmpty() ) {
|
if( edit && !edit->text().isEmpty() ) {
|
||||||
@@ -109,3 +135,17 @@ Tomahawk::EchonestControl::updateData()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// fills in the current widget with the data from json or dbcmd (m_data.second and m_matchString)
|
||||||
|
void Tomahawk::EchonestControl::updateWidgetsFromData()
|
||||||
|
{
|
||||||
|
if( selectedType() == "Artist" ) {
|
||||||
|
QComboBox* combo = qobject_cast<QComboBox*>( m_match.data() );
|
||||||
|
if( combo )
|
||||||
|
combo->setCurrentIndex( combo->findData( m_matchString ) );
|
||||||
|
QLineEdit* edit = qobject_cast<QLineEdit*>( m_input.data() );
|
||||||
|
if( edit )
|
||||||
|
edit->setText( m_data.second.toString() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -34,6 +34,12 @@ public:
|
|||||||
/// Converts this to an echonest suitable parameter
|
/// Converts this to an echonest suitable parameter
|
||||||
Echonest::DynamicPlaylist::PlaylistParamData toENParam() const;
|
Echonest::DynamicPlaylist::PlaylistParamData toENParam() const;
|
||||||
|
|
||||||
|
virtual QString input() const;
|
||||||
|
virtual QString match() const;
|
||||||
|
|
||||||
|
virtual void setInput(const QString& input);
|
||||||
|
virtual void setMatch(const QString& match);
|
||||||
|
|
||||||
/// DO NOT USE IF YOU ARE NOT A DBCMD
|
/// DO NOT USE IF YOU ARE NOT A DBCMD
|
||||||
explicit EchonestControl( const QString& type, const QStringList& typeSelectors, QObject* parent = 0 );
|
explicit EchonestControl( const QString& type, const QStringList& typeSelectors, QObject* parent = 0 );
|
||||||
|
|
||||||
@@ -45,11 +51,13 @@ private slots:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void updateWidgets();
|
void updateWidgets();
|
||||||
|
void updateWidgetsFromData();
|
||||||
|
|
||||||
Echonest::DynamicPlaylist::PlaylistParam m_currentType;
|
Echonest::DynamicPlaylist::PlaylistParam m_currentType;
|
||||||
|
|
||||||
QWeakPointer< QWidget > m_input;
|
QWeakPointer< QWidget > m_input;
|
||||||
QWeakPointer< QWidget > m_match;
|
QWeakPointer< QWidget > m_match;
|
||||||
|
QString m_matchString;
|
||||||
|
|
||||||
Echonest::DynamicPlaylist::PlaylistParamData m_data;
|
Echonest::DynamicPlaylist::PlaylistParamData m_data;
|
||||||
|
|
||||||
|
@@ -24,7 +24,6 @@ class DLLEXPORT PlaylistEntry : public QObject
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_PROPERTY( QString guid READ guid WRITE setGuid )
|
Q_PROPERTY( QString guid READ guid WRITE setGuid )
|
||||||
Q_PROPERTY( QString annotation READ annotation WRITE setAnnotation )
|
Q_PROPERTY( QString annotation READ annotation WRITE setAnnotation )
|
||||||
Q_PROPERTY( QString resulthint READ resultHint WRITE setResultHint )
|
|
||||||
Q_PROPERTY( unsigned int duration READ duration WRITE setDuration )
|
Q_PROPERTY( unsigned int duration READ duration WRITE setDuration )
|
||||||
Q_PROPERTY( unsigned int lastmodified READ lastmodified WRITE setLastmodified )
|
Q_PROPERTY( unsigned int lastmodified READ lastmodified WRITE setLastmodified )
|
||||||
Q_PROPERTY( QVariant query READ queryVariant WRITE setQueryVariant )
|
Q_PROPERTY( QVariant query READ queryVariant WRITE setQueryVariant )
|
||||||
|
@@ -273,6 +273,8 @@ TomahawkApp::registerMetaTypes()
|
|||||||
qRegisterMetaType< Tomahawk::result_ptr >("Tomahawk::result_ptr");
|
qRegisterMetaType< Tomahawk::result_ptr >("Tomahawk::result_ptr");
|
||||||
qRegisterMetaType< Tomahawk::query_ptr >("Tomahawk::query_ptr");
|
qRegisterMetaType< Tomahawk::query_ptr >("Tomahawk::query_ptr");
|
||||||
qRegisterMetaType< Tomahawk::source_ptr >("Tomahawk::source_ptr");
|
qRegisterMetaType< Tomahawk::source_ptr >("Tomahawk::source_ptr");
|
||||||
|
qRegisterMetaType< Tomahawk::dyncontrol_ptr >("Tomahawk::dyncontrol_ptr");
|
||||||
|
qRegisterMetaType< Tomahawk::geninterface_ptr >("Tomahawk::geninterface_ptr");
|
||||||
qRegisterMetaType< QList<Tomahawk::playlist_ptr> >("QList<Tomahawk::playlist_ptr>");
|
qRegisterMetaType< QList<Tomahawk::playlist_ptr> >("QList<Tomahawk::playlist_ptr>");
|
||||||
qRegisterMetaType< QList<Tomahawk::dynplaylist_ptr> >("QList<Tomahawk::dynplaylist_ptr>");
|
qRegisterMetaType< QList<Tomahawk::dynplaylist_ptr> >("QList<Tomahawk::dynplaylist_ptr>");
|
||||||
qRegisterMetaType< QList<Tomahawk::dyncontrol_ptr> >("QList<Tomahawk::dyncontrol_ptr>");
|
qRegisterMetaType< QList<Tomahawk::dyncontrol_ptr> >("QList<Tomahawk::dyncontrol_ptr>");
|
||||||
|
Reference in New Issue
Block a user