mirror of
https://github.com/tomahawk-player/tomahawk.git
synced 2025-08-12 09:04:33 +02:00
more work the dropmenu for the audiocontrols
This commit is contained in:
@@ -47,6 +47,7 @@ AudioControls::AudioControls( QWidget* parent )
|
|||||||
, ui( new Ui::AudioControls )
|
, ui( new Ui::AudioControls )
|
||||||
, m_repeatMode( PlaylistInterface::NoRepeat )
|
, m_repeatMode( PlaylistInterface::NoRepeat )
|
||||||
, m_shuffled( false )
|
, m_shuffled( false )
|
||||||
|
, m_dropAreaExpanded( false )
|
||||||
{
|
{
|
||||||
ui->setupUi( this );
|
ui->setupUi( this );
|
||||||
setAcceptDrops( true );
|
setAcceptDrops( true );
|
||||||
@@ -151,57 +152,86 @@ AudioControls::AudioControls( QWidget* parent )
|
|||||||
|
|
||||||
|
|
||||||
m_dragAnimation = new QPropertyAnimation( this, "dropAreaSize", this );
|
m_dragAnimation = new QPropertyAnimation( this, "dropAreaSize", this );
|
||||||
|
m_dragAnimation->setStartValue( 0 );
|
||||||
m_dragAnimation->setDuration( 500 );
|
m_dragAnimation->setDuration( 500 );
|
||||||
m_dragAnimation->setEasingCurve( QEasingCurve::OutExpo );
|
m_dragAnimation->setEasingCurve( QEasingCurve::Linear );
|
||||||
connect( m_dragAnimation, SIGNAL( finished() ), SLOT(dragAnimationFinished()));
|
connect( m_dragAnimation, SIGNAL( finished() ), SLOT(dragAnimationFinished()));
|
||||||
|
|
||||||
QGridLayout *dropMenuLayout = new QGridLayout;
|
m_dropAreaCollapseTimer.setInterval( 500 );
|
||||||
ui->metaDataDropArea->setLayout( dropMenuLayout );
|
m_dropAreaCollapseTimer.setSingleShot( true );
|
||||||
|
connect( &m_dropAreaCollapseTimer, SIGNAL( timeout() ), this, SLOT( collapseDropMenu() ) );
|
||||||
|
|
||||||
QLabel* dropTrackImage = new QLabel;
|
connect( ui->metaDataDropArea, SIGNAL( dropReceived( QDropEvent* ) ), this, SLOT( dropReceived( QDropEvent* ) ) );
|
||||||
dropTrackImage->setAlignment( Qt::AlignHCenter );
|
|
||||||
dropTrackImage->setPixmap( QPixmap(":/data/images/drop-song.png" ).scaledToWidth( 32, Qt::SmoothTransformation ) );
|
|
||||||
dropMenuLayout->addWidget( dropTrackImage, 0, 0 );
|
|
||||||
|
|
||||||
QLabel* dropAlbumImage = new QLabel;
|
DropMenuEntry *trackEntry = new DropMenuEntry( QPixmap(":/data/images/drop-song.png" ).scaledToWidth( 32, Qt::SmoothTransformation ),
|
||||||
dropAlbumImage->setAlignment( Qt::AlignHCenter );
|
"Track",
|
||||||
dropAlbumImage->setPixmap( QPixmap( ":/data/images/drop-album.png" ).scaledToWidth( 32, Qt::SmoothTransformation ) );
|
DropJob::DropFlagTrack );
|
||||||
dropMenuLayout->addWidget( dropAlbumImage, 0, 1 );
|
ui->metaDataDropArea->addEntry( trackEntry, true );
|
||||||
|
|
||||||
QLabel* dropArtistImage = new QLabel;
|
DropMenuEntry *albumEntry = new DropMenuEntry( QPixmap(":/data/images/drop-album.png" ).scaledToWidth( 32, Qt::SmoothTransformation ),
|
||||||
dropArtistImage->setAlignment( Qt::AlignHCenter );
|
"Album",
|
||||||
dropArtistImage->setPixmap( QPixmap( ":/data/images/drop-all-songs.png" ).scaledToWidth( 32, Qt::SmoothTransformation ) );
|
DropJob::DropFlagAlbum );
|
||||||
dropMenuLayout->addWidget( dropArtistImage, 0, 2 );
|
ui->metaDataDropArea->addEntry( albumEntry );
|
||||||
|
|
||||||
QLabel* dropLocalImage = new QLabel;
|
DropMenuEntry *artistEntry = new DropMenuEntry( QPixmap(":/data/images/drop-all-songs.png" ).scaledToWidth( 32, Qt::SmoothTransformation ),
|
||||||
dropLocalImage->setAlignment( Qt::AlignHCenter );
|
"Artist",
|
||||||
dropLocalImage->setPixmap( QPixmap( ":/data/images/drop-local-songs.png" ).scaledToWidth( 32, Qt::SmoothTransformation ) );
|
DropJob::DropFlagArtist );
|
||||||
dropMenuLayout->addWidget( dropLocalImage, 0, 3 );
|
ui->metaDataDropArea->addEntry( artistEntry );
|
||||||
|
|
||||||
QLabel* dropTop10Image = new QLabel;
|
DropMenuEntry *localEntry = new DropMenuEntry( QPixmap(":/data/images/drop-local-songs.png" ).scaledToWidth( 32, Qt::SmoothTransformation ),
|
||||||
dropTop10Image->setAlignment( Qt::AlignHCenter );
|
"Local",
|
||||||
dropTop10Image->setPixmap( QPixmap( ":/data/images/drop-top-songs.png" ).scaledToWidth( 32, Qt::SmoothTransformation ) );
|
DropJob::DropFlagAlbum | DropJob::DropFlagLocal );
|
||||||
dropMenuLayout->addWidget( dropTop10Image, 0, 4 );
|
ui->metaDataDropArea->addEntry( localEntry );
|
||||||
|
|
||||||
QLabel* dropAllText = new QLabel( "Track" );
|
DropMenuEntry *top10Entry = new DropMenuEntry( QPixmap(":/data/images/drop-top-songs.png" ).scaledToWidth( 32, Qt::SmoothTransformation ),
|
||||||
dropAllText->setAlignment( Qt::AlignHCenter );
|
"Top 10",
|
||||||
dropMenuLayout->addWidget( dropAllText, 1, 0 );
|
DropJob::DropFlagArtist | DropJob::DropFlagTop10 );
|
||||||
|
ui->metaDataDropArea->addEntry( top10Entry );
|
||||||
|
|
||||||
QLabel* dropAlbumText = new QLabel( "Album" );
|
// QLabel* dropTrackImage = new QLabel;
|
||||||
dropAlbumText->setAlignment( Qt::AlignHCenter );
|
// dropTrackImage->setAlignment( Qt::AlignHCenter );
|
||||||
dropMenuLayout->addWidget( dropAlbumText, 1, 1 );
|
// dropTrackImage->setPixmap( QPixmap(":/data/images/drop-song.png" ).scaledToWidth( 32, Qt::SmoothTransformation ) );
|
||||||
|
// dropMenuLayout->addWidget( dropTrackImage, 0, 0 );
|
||||||
|
|
||||||
QLabel* dropArtistText = new QLabel( "Artist" );
|
// QLabel* dropAlbumImage = new QLabel;
|
||||||
dropArtistText->setAlignment( Qt::AlignHCenter );
|
// dropAlbumImage->setAlignment( Qt::AlignHCenter );
|
||||||
dropMenuLayout->addWidget( dropArtistText, 1, 2 );
|
// dropAlbumImage->setPixmap( QPixmap( ":/data/images/drop-album.png" ).scaledToWidth( 32, Qt::SmoothTransformation ) );
|
||||||
|
// dropMenuLayout->addWidget( dropAlbumImage, 0, 1 );
|
||||||
|
|
||||||
QLabel* dropLocalText = new QLabel( "Local" );
|
// QLabel* dropArtistImage = new QLabel;
|
||||||
dropLocalText->setAlignment( Qt::AlignHCenter );
|
// dropArtistImage->setAlignment( Qt::AlignHCenter );
|
||||||
dropMenuLayout->addWidget( dropLocalText, 1, 3 );
|
// dropArtistImage->setPixmap( QPixmap( ":/data/images/drop-all-songs.png" ).scaledToWidth( 32, Qt::SmoothTransformation ) );
|
||||||
|
// dropMenuLayout->addWidget( dropArtistImage, 0, 2 );
|
||||||
|
|
||||||
QLabel* dropTop10Text = new QLabel( "Top 10" );
|
// QLabel* dropLocalImage = new QLabel;
|
||||||
dropTop10Text->setAlignment( Qt::AlignHCenter );
|
// dropLocalImage->setAlignment( Qt::AlignHCenter );
|
||||||
dropMenuLayout->addWidget( dropTop10Text, 1, 4 );
|
// dropLocalImage->setPixmap( QPixmap( ":/data/images/drop-local-songs.png" ).scaledToWidth( 32, Qt::SmoothTransformation ) );
|
||||||
|
// dropMenuLayout->addWidget( dropLocalImage, 0, 3 );
|
||||||
|
|
||||||
|
// QLabel* dropTop10Image = new QLabel;
|
||||||
|
// dropTop10Image->setAlignment( Qt::AlignHCenter );
|
||||||
|
// dropTop10Image->setPixmap( QPixmap( ":/data/images/drop-top-songs.png" ).scaledToWidth( 32, Qt::SmoothTransformation ) );
|
||||||
|
// dropMenuLayout->addWidget( dropTop10Image, 0, 4 );
|
||||||
|
|
||||||
|
// QLabel* dropAllText = new QLabel( "Track" );
|
||||||
|
// dropAllText->setAlignment( Qt::AlignHCenter );
|
||||||
|
// dropMenuLayout->addWidget( dropAllText, 1, 0 );
|
||||||
|
|
||||||
|
// QLabel* dropAlbumText = new QLabel( "Album" );
|
||||||
|
// dropAlbumText->setAlignment( Qt::AlignHCenter );
|
||||||
|
// dropMenuLayout->addWidget( dropAlbumText, 1, 1 );
|
||||||
|
|
||||||
|
// QLabel* dropArtistText = new QLabel( "Artist" );
|
||||||
|
// dropArtistText->setAlignment( Qt::AlignHCenter );
|
||||||
|
// dropMenuLayout->addWidget( dropArtistText, 1, 2 );
|
||||||
|
|
||||||
|
// QLabel* dropLocalText = new QLabel( "Local" );
|
||||||
|
// dropLocalText->setAlignment( Qt::AlignHCenter );
|
||||||
|
// dropMenuLayout->addWidget( dropLocalText, 1, 3 );
|
||||||
|
|
||||||
|
// QLabel* dropTop10Text = new QLabel( "Top 10" );
|
||||||
|
// dropTop10Text->setAlignment( Qt::AlignHCenter );
|
||||||
|
// dropMenuLayout->addWidget( dropTop10Text, 1, 4 );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -579,10 +609,17 @@ AudioControls::dragEnterEvent( QDragEnterEvent* e )
|
|||||||
{
|
{
|
||||||
e->acceptProposedAction();
|
e->acceptProposedAction();
|
||||||
|
|
||||||
m_dragAnimation->setStartValue( 0 );
|
m_dropAreaCollapseTimer.stop();
|
||||||
m_dragAnimation->setEndValue( ui->metaDataArea->height() );
|
|
||||||
m_dragAnimation->setDirection( QAbstractAnimation::Forward );
|
if( !m_dropAreaExpanded )
|
||||||
m_dragAnimation->start();
|
{
|
||||||
|
m_dragAnimation->stop();
|
||||||
|
m_dragAnimation->setDirection( QAbstractAnimation::Forward );
|
||||||
|
m_dragAnimation->setStartValue( dropAreaSize() );
|
||||||
|
m_dragAnimation->setEndValue( ui->metaDataArea->height() );
|
||||||
|
m_dragAnimation->start();
|
||||||
|
m_dropAreaExpanded = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -598,12 +635,21 @@ AudioControls::dragMoveEvent( QDragMoveEvent* /* e */ )
|
|||||||
void
|
void
|
||||||
AudioControls::dragLeaveEvent( QDragLeaveEvent * )
|
AudioControls::dragLeaveEvent( QDragLeaveEvent * )
|
||||||
{
|
{
|
||||||
ui->metaDataInfoArea->setMaximumHeight( 1000 );
|
if( !ui->metaDataDropArea->hovered() )
|
||||||
ui->metaDataDropArea->setMaximumHeight( 0 );
|
m_dropAreaCollapseTimer.start();
|
||||||
|
}
|
||||||
|
|
||||||
m_dragAnimation->setDirection( QAbstractAnimation::Backward );
|
|
||||||
|
void
|
||||||
|
AudioControls::collapseDropMenu()
|
||||||
|
{
|
||||||
|
m_dropAreaExpanded = false;
|
||||||
|
|
||||||
|
m_dragAnimation->stop();
|
||||||
|
// m_dragAnimation->setDirection( QAbstractAnimation::Backward );
|
||||||
|
m_dragAnimation->setStartValue( dropAreaSize() );
|
||||||
|
m_dragAnimation->setEndValue( 0 );
|
||||||
m_dragAnimation->start();
|
m_dragAnimation->start();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -615,8 +661,11 @@ AudioControls::dropEvent( QDropEvent* e )
|
|||||||
{
|
{
|
||||||
DropJob *dj = new DropJob();
|
DropJob *dj = new DropJob();
|
||||||
connect( dj, SIGNAL( tracks( QList<Tomahawk::query_ptr> ) ), this, SLOT( droppedTracks( QList<Tomahawk::query_ptr> ) ) );
|
connect( dj, SIGNAL( tracks( QList<Tomahawk::query_ptr> ) ), this, SLOT( droppedTracks( QList<Tomahawk::query_ptr> ) ) );
|
||||||
|
dj->setDropFlags( ui->metaDataDropArea->activeEntry()->dropFlags() );
|
||||||
dj->tracksFromMimeData( e->mimeData() );
|
dj->tracksFromMimeData( e->mimeData() );
|
||||||
|
|
||||||
|
QTimer::singleShot( 0, this, SLOT( collapseDropMenu() ) );
|
||||||
|
|
||||||
e->accept();
|
e->accept();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -688,3 +737,9 @@ AudioControls::setDropAreaSize( int size )
|
|||||||
ui->metaDataDropArea->setMaximumHeight( size );
|
ui->metaDataDropArea->setMaximumHeight( size );
|
||||||
ui->metaDataInfoArea->setMaximumHeight( ui->metaDataArea->height() - size );
|
ui->metaDataInfoArea->setMaximumHeight( ui->metaDataArea->height() - size );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
AudioControls::dropReceived( QDropEvent *event )
|
||||||
|
{
|
||||||
|
dropEvent( event );
|
||||||
|
}
|
||||||
|
@@ -22,10 +22,12 @@
|
|||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
#include <QTimeLine>
|
#include <QTimeLine>
|
||||||
#include <QPropertyAnimation>
|
#include <QPropertyAnimation>
|
||||||
|
#include <QTimer>
|
||||||
|
|
||||||
#include "result.h"
|
#include "result.h"
|
||||||
#include "playlistinterface.h"
|
#include "playlistinterface.h"
|
||||||
#include "infosystem/infosystem.h"
|
#include "infosystem/infosystem.h"
|
||||||
|
#include "utils/dropmenu.h"
|
||||||
|
|
||||||
class QDropEvent;
|
class QDropEvent;
|
||||||
class QDragEnterEvent;
|
class QDragEnterEvent;
|
||||||
@@ -88,7 +90,9 @@ private slots:
|
|||||||
|
|
||||||
void socialActionsLoaded();
|
void socialActionsLoaded();
|
||||||
|
|
||||||
|
void collapseDropMenu();
|
||||||
void dragAnimationFinished();
|
void dragAnimationFinished();
|
||||||
|
void dropReceived( QDropEvent *event );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::AudioControls *ui;
|
Ui::AudioControls *ui;
|
||||||
@@ -103,6 +107,8 @@ private:
|
|||||||
qint64 m_seekMsecs;
|
qint64 m_seekMsecs;
|
||||||
|
|
||||||
QPropertyAnimation *m_dragAnimation;
|
QPropertyAnimation *m_dragAnimation;
|
||||||
|
bool m_dropAreaExpanded;
|
||||||
|
QTimer m_dropAreaCollapseTimer;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // AUDIOCONTROLS_H
|
#endif // AUDIOCONTROLS_H
|
||||||
|
@@ -130,7 +130,7 @@
|
|||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QWidget" name="metaDataDropArea" native="true">
|
<widget class="DropMenu" name="metaDataDropArea" native="true">
|
||||||
<property name="maximumSize">
|
<property name="maximumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>16777215</width>
|
<width>16777215</width>
|
||||||
@@ -565,6 +565,12 @@
|
|||||||
<extends>QLabel</extends>
|
<extends>QLabel</extends>
|
||||||
<header>utils/querylabel.h</header>
|
<header>utils/querylabel.h</header>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
|
<customwidget>
|
||||||
|
<class>DropMenu</class>
|
||||||
|
<extends>QWidget</extends>
|
||||||
|
<header>utils/dropmenu.h</header>
|
||||||
|
<container>1</container>
|
||||||
|
</customwidget>
|
||||||
</customwidgets>
|
</customwidgets>
|
||||||
<resources/>
|
<resources/>
|
||||||
<connections/>
|
<connections/>
|
||||||
|
@@ -183,6 +183,7 @@ set( libSources
|
|||||||
utils/rdioparser.cpp
|
utils/rdioparser.cpp
|
||||||
utils/shortenedlinkparser.cpp
|
utils/shortenedlinkparser.cpp
|
||||||
utils/stylehelper.cpp
|
utils/stylehelper.cpp
|
||||||
|
utils/dropmenu.cpp
|
||||||
|
|
||||||
widgets/newplaylistwidget.cpp
|
widgets/newplaylistwidget.cpp
|
||||||
widgets/searchwidget.cpp
|
widgets/searchwidget.cpp
|
||||||
@@ -381,6 +382,7 @@ set( libHeaders
|
|||||||
utils/rdioparser.h
|
utils/rdioparser.h
|
||||||
utils/shortenedlinkparser.h
|
utils/shortenedlinkparser.h
|
||||||
utils/stylehelper.h
|
utils/stylehelper.h
|
||||||
|
utils/dropmenu.h
|
||||||
|
|
||||||
widgets/newplaylistwidget.h
|
widgets/newplaylistwidget.h
|
||||||
widgets/searchwidget.h
|
widgets/searchwidget.h
|
||||||
|
@@ -34,6 +34,7 @@ using namespace Tomahawk;
|
|||||||
DropJob::DropJob( QObject *parent )
|
DropJob::DropJob( QObject *parent )
|
||||||
: QObject( parent )
|
: QObject( parent )
|
||||||
, m_queryCount( 0 )
|
, m_queryCount( 0 )
|
||||||
|
, m_dropFlags( DropFlagsNone )
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -98,31 +99,72 @@ DropJob::acceptsMimeData( const QMimeData* data, bool tracksOnly )
|
|||||||
void
|
void
|
||||||
DropJob::setGetWholeArtists( bool getWholeArtists )
|
DropJob::setGetWholeArtists( bool getWholeArtists )
|
||||||
{
|
{
|
||||||
m_getWholeArtists = getWholeArtists;
|
if( getWholeArtists )
|
||||||
|
m_dropFlags |= DropFlagArtist;
|
||||||
|
else
|
||||||
|
m_dropFlags &= !DropFlagArtist;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
DropJob::setGetWholeAlbums( bool getWholeAlbums )
|
DropJob::setGetWholeAlbums( bool getWholeAlbums )
|
||||||
{
|
{
|
||||||
m_getWholeAlbums = getWholeAlbums;
|
if ( getWholeAlbums )
|
||||||
|
m_dropFlags |= DropFlagAlbum;
|
||||||
|
else
|
||||||
|
m_dropFlags &= !DropFlagAlbum;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
DropJob::tracksFromMimeData( const QMimeData* data, bool allowDuplicates, bool onlyLocal, bool top10 )
|
DropJob::setGetTop10( bool top10 )
|
||||||
{
|
{
|
||||||
m_allowDuplicates = allowDuplicates;
|
if( top10 )
|
||||||
m_onlyLocal = onlyLocal;
|
m_dropFlags |= DropFlagTop10;
|
||||||
m_top10 = top10;
|
else
|
||||||
|
m_dropFlags &= !DropFlagTop10;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
DropJob::setOnlyLocal( bool onlyLocal )
|
||||||
|
{
|
||||||
|
if( onlyLocal )
|
||||||
|
m_dropFlags |= DropFlagLocal;
|
||||||
|
else
|
||||||
|
m_dropFlags &= !DropFlagLocal;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
DropJob::setAllowDuplicates( bool allowDuplicates )
|
||||||
|
{
|
||||||
|
if( allowDuplicates )
|
||||||
|
m_dropFlags |= DropFlagAllowDuplicates;
|
||||||
|
else
|
||||||
|
m_dropFlags &= !DropFlagAllowDuplicates;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
DropJob::setDropFlags( DropFlags flags )
|
||||||
|
{
|
||||||
|
m_dropFlags = flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
DropJob::tracksFromMimeData( const QMimeData* data )
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
parseMimeData( data );
|
parseMimeData( data );
|
||||||
|
|
||||||
if ( m_queryCount == 0 )
|
if ( m_queryCount == 0 )
|
||||||
{
|
{
|
||||||
if ( onlyLocal )
|
if ( m_dropFlags.testFlag( DropFlagLocal ) )
|
||||||
removeRemoteSources();
|
removeRemoteSources();
|
||||||
|
|
||||||
if ( !allowDuplicates )
|
if ( !m_dropFlags.testFlag( DropFlagAllowDuplicates ) )
|
||||||
removeDuplicates();
|
removeDuplicates();
|
||||||
|
|
||||||
emit tracks( m_resultList );
|
emit tracks( m_resultList );
|
||||||
@@ -171,15 +213,15 @@ DropJob::tracksFromQueryList( const QMimeData* data )
|
|||||||
{
|
{
|
||||||
tDebug() << "Dropped query item:" << query->data()->artist() << "-" << query->data()->track();
|
tDebug() << "Dropped query item:" << query->data()->artist() << "-" << query->data()->track();
|
||||||
|
|
||||||
if ( m_top10 )
|
if ( m_dropFlags.testFlag( DropFlagTop10 ) )
|
||||||
{
|
{
|
||||||
getTopTen( query->data()->artist() );
|
getTopTen( query->data()->artist() );
|
||||||
}
|
}
|
||||||
else if ( m_getWholeArtists )
|
else if ( m_dropFlags.testFlag( DropFlagArtist ) )
|
||||||
{
|
{
|
||||||
queries << getArtist( query->data()->artist() );
|
queries << getArtist( query->data()->artist() );
|
||||||
}
|
}
|
||||||
else if ( m_getWholeAlbums )
|
else if ( m_dropFlags.testFlag( DropFlagAlbum ) )
|
||||||
{
|
{
|
||||||
queries << getAlbum( query->data()->artist(), query->data()->album() );
|
queries << getAlbum( query->data()->artist(), query->data()->album() );
|
||||||
}
|
}
|
||||||
@@ -211,15 +253,15 @@ DropJob::tracksFromResultList( const QMimeData* data )
|
|||||||
tDebug() << "Dropped result item:" << result->data()->artist()->name() << "-" << result->data()->track();
|
tDebug() << "Dropped result item:" << result->data()->artist()->name() << "-" << result->data()->track();
|
||||||
query_ptr q = result->data()->toQuery();
|
query_ptr q = result->data()->toQuery();
|
||||||
|
|
||||||
if ( m_top10 )
|
if ( m_dropFlags.testFlag( DropFlagTop10 ) )
|
||||||
{
|
{
|
||||||
getTopTen( q->artist() );
|
getTopTen( q->artist() );
|
||||||
}
|
}
|
||||||
else if ( m_getWholeArtists )
|
else if ( m_dropFlags.testFlag( DropFlagArtist ) )
|
||||||
{
|
{
|
||||||
queries << getArtist( q->artist() );
|
queries << getArtist( q->artist() );
|
||||||
}
|
}
|
||||||
else if ( m_getWholeAlbums )
|
else if ( m_dropFlags.testFlag( DropFlagAlbum ) )
|
||||||
{
|
{
|
||||||
queries << getAlbum( q->artist(), q->album() );
|
queries << getAlbum( q->artist(), q->album() );
|
||||||
}
|
}
|
||||||
@@ -248,9 +290,9 @@ DropJob::tracksFromAlbumMetaData( const QMimeData *data )
|
|||||||
QString album;
|
QString album;
|
||||||
stream >> album;
|
stream >> album;
|
||||||
|
|
||||||
if ( m_top10 )
|
if ( m_dropFlags.testFlag( DropFlagTop10 ) )
|
||||||
getTopTen( artist );
|
getTopTen( artist );
|
||||||
else if ( m_getWholeArtists )
|
else if ( m_dropFlags.testFlag( DropFlagArtist ) )
|
||||||
queries << getArtist( artist );
|
queries << getArtist( artist );
|
||||||
else
|
else
|
||||||
queries << getAlbum( artist, album );
|
queries << getAlbum( artist, album );
|
||||||
@@ -270,14 +312,10 @@ DropJob::tracksFromArtistMetaData( const QMimeData *data )
|
|||||||
QString artist;
|
QString artist;
|
||||||
stream >> artist;
|
stream >> artist;
|
||||||
|
|
||||||
if ( !m_top10 )
|
if ( m_dropFlags.testFlag( DropFlagTop10 ) )
|
||||||
{
|
|
||||||
queries << getArtist( artist );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
getTopTen( artist );
|
getTopTen( artist );
|
||||||
}
|
else
|
||||||
|
queries << getArtist( artist );
|
||||||
}
|
}
|
||||||
return queries;
|
return queries;
|
||||||
}
|
}
|
||||||
@@ -381,10 +419,10 @@ DropJob::onTracksAdded( const QList<Tomahawk::query_ptr>& tracksList )
|
|||||||
|
|
||||||
if ( --m_queryCount == 0 )
|
if ( --m_queryCount == 0 )
|
||||||
{
|
{
|
||||||
if ( m_onlyLocal )
|
if ( m_dropFlags.testFlag( DropFlagLocal ) )
|
||||||
removeRemoteSources();
|
removeRemoteSources();
|
||||||
|
|
||||||
if ( !m_allowDuplicates )
|
if ( !m_dropFlags.testFlag( DropFlagAllowDuplicates ) )
|
||||||
removeDuplicates();
|
removeDuplicates();
|
||||||
|
|
||||||
emit tracks( m_resultList );
|
emit tracks( m_resultList );
|
||||||
|
@@ -28,10 +28,48 @@
|
|||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
#include <QMimeData>
|
#include <QMimeData>
|
||||||
|
|
||||||
|
/** @class DropJob
|
||||||
|
* Allows you to process dropped mimedata in different ways:
|
||||||
|
* Configure the DropJob using setDropFlags() or the set*() functions to do
|
||||||
|
* what you want and then feed it with MimeMata. Connect to the tracks() signal
|
||||||
|
* to receive the results.
|
||||||
|
*
|
||||||
|
* Possible configuration flags are:
|
||||||
|
* - DropFlagTrack: Get the dropped track (only valid if the dropped item is acutally a track)
|
||||||
|
* - DropFlagAlbum: Get this album (only valid if the dropped item is an album or a track with album information)
|
||||||
|
* - DropFlagArtist: Get this artist
|
||||||
|
* - DropFlagTop10: Query the Top 10 for this artist in the Network
|
||||||
|
* - DropFlagLocal: Only get local items (Filters out all remote ones)
|
||||||
|
* - DropFlagAllowDuplicates: Allow duplicate results, e.g. same song from different sources.
|
||||||
|
*
|
||||||
|
* Note: The largest possible set of the configured Flags applies. E.g. Artist is greater than Album.
|
||||||
|
* If you set both of them only the album will be fetched. Requesting the Top 10 items always results in a
|
||||||
|
* query for the whole artist. It is not possible to e.g. request the Top 10 tracks of a given album.
|
||||||
|
*
|
||||||
|
* If you configure nothing or dropping incompatible data (e.g. configured DropTrack but dropping an album),
|
||||||
|
* the DropJob will do this default actions:
|
||||||
|
* - Get this track for dropped tracks
|
||||||
|
* - Get whole album for dropped albums
|
||||||
|
* - Get whole artist for dropped artists
|
||||||
|
*/
|
||||||
|
|
||||||
class DLLEXPORT DropJob : public QObject
|
class DLLEXPORT DropJob : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
|
enum DropFlag
|
||||||
|
{
|
||||||
|
DropFlagsNone = 0x00,
|
||||||
|
DropFlagTrack = 0x01,
|
||||||
|
DropFlagAlbum = 0x02,
|
||||||
|
DropFlagArtist = 0x04,
|
||||||
|
DropFlagTop10 = 0x08,
|
||||||
|
DropFlagLocal = 0x10,
|
||||||
|
DropFlagAllowDuplicates = 0x20,
|
||||||
|
DropFlagsAll = 0xff
|
||||||
|
};
|
||||||
|
Q_DECLARE_FLAGS( DropFlags, DropFlag )
|
||||||
|
|
||||||
explicit DropJob( QObject *parent = 0 );
|
explicit DropJob( QObject *parent = 0 );
|
||||||
~DropJob();
|
~DropJob();
|
||||||
|
|
||||||
@@ -46,9 +84,15 @@ public:
|
|||||||
static bool acceptsMimeData( const QMimeData* data, bool tracksOnly = true );
|
static bool acceptsMimeData( const QMimeData* data, bool tracksOnly = true );
|
||||||
static QStringList mimeTypes();
|
static QStringList mimeTypes();
|
||||||
|
|
||||||
|
void setDropFlags( DropFlags flags );
|
||||||
|
|
||||||
void setGetWholeArtists( bool getWholeArtists );
|
void setGetWholeArtists( bool getWholeArtists );
|
||||||
void setGetWholeAlbums( bool getWholeAlbums );
|
void setGetWholeAlbums( bool getWholeAlbums );
|
||||||
void tracksFromMimeData( const QMimeData* data, bool allowDuplicates = false, bool onlyLocal = false, bool top10 = false );
|
void setGetTop10( bool top10 );
|
||||||
|
void setOnlyLocal( bool onlyLocal );
|
||||||
|
void setAllowDuplicates( bool allowDuplicates );
|
||||||
|
|
||||||
|
void tracksFromMimeData( const QMimeData* data );
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
/// QMimeData parsing results
|
/// QMimeData parsing results
|
||||||
@@ -81,13 +125,10 @@ private:
|
|||||||
void removeRemoteSources();
|
void removeRemoteSources();
|
||||||
|
|
||||||
int m_queryCount;
|
int m_queryCount;
|
||||||
bool m_allowDuplicates;
|
DropFlags m_dropFlags;
|
||||||
bool m_onlyLocal;
|
|
||||||
bool m_getWholeArtists;
|
|
||||||
bool m_getWholeAlbums;
|
|
||||||
bool m_top10;
|
|
||||||
|
|
||||||
QList< Tomahawk::query_ptr > m_resultList;
|
QList< Tomahawk::query_ptr > m_resultList;
|
||||||
};
|
};
|
||||||
|
Q_DECLARE_OPERATORS_FOR_FLAGS( DropJob::DropFlags )
|
||||||
|
|
||||||
#endif // DROPJOB_H
|
#endif // DROPJOB_H
|
||||||
|
141
src/libtomahawk/utils/dropmenu.cpp
Normal file
141
src/libtomahawk/utils/dropmenu.cpp
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
#include "dropmenu.h"
|
||||||
|
|
||||||
|
#include <QVBoxLayout>
|
||||||
|
#include <QLabel>
|
||||||
|
#include <QDragEnterEvent>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
DropMenu::DropMenu( QWidget *parent )
|
||||||
|
: QWidget( parent )
|
||||||
|
{
|
||||||
|
setLayout( new QHBoxLayout() );
|
||||||
|
layout()->setSpacing( 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
DropMenu::addEntry( DropMenuEntry *entry, bool isDefault )
|
||||||
|
{
|
||||||
|
|
||||||
|
layout()->addWidget( entry );
|
||||||
|
|
||||||
|
if( m_entries.isEmpty() || isDefault )
|
||||||
|
m_activeEntry = entry;
|
||||||
|
|
||||||
|
m_entries.append( entry );
|
||||||
|
connect( entry, SIGNAL( mouseEntered( DropMenuEntry* ) ), this, SLOT( entryHovered( DropMenuEntry* ) ) );
|
||||||
|
connect( entry, SIGNAL( mouseLeft( DropMenuEntry* ) ), this, SLOT( entryLeft(DropMenuEntry*) ) );
|
||||||
|
connect( entry, SIGNAL( dropReceived( QDropEvent* ) ) , this, SIGNAL( dropReceived( QDropEvent* ) ) );
|
||||||
|
|
||||||
|
if( isDefault )
|
||||||
|
m_defaultEntry = entry;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
DropMenu::hovered() const
|
||||||
|
{
|
||||||
|
foreach( DropMenuEntry *entry, m_entries )
|
||||||
|
{
|
||||||
|
if( entry->hovered() )
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DropMenuEntry*
|
||||||
|
DropMenu::activeEntry()
|
||||||
|
{
|
||||||
|
return m_activeEntry;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
DropMenu::entryHovered( DropMenuEntry *entry )
|
||||||
|
{
|
||||||
|
m_activeEntry->setActive( false );
|
||||||
|
m_activeEntry = entry;
|
||||||
|
entry->setActive( true );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
DropMenu::entryLeft( DropMenuEntry *entry )
|
||||||
|
{
|
||||||
|
entry->setActive( false );
|
||||||
|
m_defaultEntry->setActive( true );
|
||||||
|
m_activeEntry = m_defaultEntry;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DropMenuEntry::DropMenuEntry( const QPixmap &icon, const QString &text, DropJob::DropFlags flags, QWidget *parent )
|
||||||
|
: QWidget( parent )
|
||||||
|
, m_hovered( false )
|
||||||
|
, m_flags( flags )
|
||||||
|
{
|
||||||
|
|
||||||
|
QVBoxLayout *layout = new QVBoxLayout();
|
||||||
|
|
||||||
|
QLabel* image = new QLabel;
|
||||||
|
image->setAlignment( Qt::AlignHCenter );
|
||||||
|
image->setPixmap( icon );
|
||||||
|
layout->addWidget( image );
|
||||||
|
|
||||||
|
m_label = new QLabel( text );
|
||||||
|
m_label->setAlignment( Qt::AlignHCenter );
|
||||||
|
layout->addWidget( m_label );
|
||||||
|
|
||||||
|
setLayout( layout );
|
||||||
|
|
||||||
|
setAcceptDrops( true );
|
||||||
|
setMouseTracking( true );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
DropMenuEntry::dragEnterEvent( QDragEnterEvent *event )
|
||||||
|
{
|
||||||
|
event->acceptProposedAction();
|
||||||
|
emit mouseEntered( this );
|
||||||
|
m_hovered = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
DropMenuEntry::dragLeaveEvent( QDragLeaveEvent *event )
|
||||||
|
{
|
||||||
|
emit mouseLeft( this );
|
||||||
|
m_hovered = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
DropMenuEntry::setActive( bool active )
|
||||||
|
{
|
||||||
|
QFont font = m_label->font();
|
||||||
|
font.setBold( active );
|
||||||
|
m_label->setFont( font );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
DropMenuEntry::dropEvent( QDropEvent *event )
|
||||||
|
{
|
||||||
|
emit dropReceived( event );
|
||||||
|
m_hovered = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
DropMenuEntry::hovered() const
|
||||||
|
{
|
||||||
|
return m_hovered;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DropJob::DropFlags
|
||||||
|
DropMenuEntry::dropFlags() const
|
||||||
|
{
|
||||||
|
return m_flags;
|
||||||
|
}
|
70
src/libtomahawk/utils/dropmenu.h
Normal file
70
src/libtomahawk/utils/dropmenu.h
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
#ifndef DROPMENU_H
|
||||||
|
#define DROPMENU_H
|
||||||
|
|
||||||
|
#include "dllmacro.h"
|
||||||
|
#include "dropjob.h"
|
||||||
|
|
||||||
|
#include <QWidget>
|
||||||
|
#include <QLabel>
|
||||||
|
|
||||||
|
class DropMenuEntry;
|
||||||
|
|
||||||
|
class DLLEXPORT DropMenu: public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
/** @brief Create a DropMenu with the given default flags if an invalid/empty area is hovered */
|
||||||
|
explicit DropMenu( QWidget *parent = 0 );
|
||||||
|
|
||||||
|
void addEntry( DropMenuEntry *entry, bool isDefault = false );
|
||||||
|
|
||||||
|
|
||||||
|
/** @brief Returns true if the mouse is somewhere over the contained entries */
|
||||||
|
bool hovered() const;
|
||||||
|
|
||||||
|
DropMenuEntry *activeEntry();
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void dropReceived( QDropEvent *event );
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void entryHovered( DropMenuEntry* entry );
|
||||||
|
void entryLeft( DropMenuEntry* entry );
|
||||||
|
|
||||||
|
private:
|
||||||
|
QList< DropMenuEntry* > m_entries;
|
||||||
|
DropJob::DropFlags m_defaultFlags;
|
||||||
|
DropMenuEntry *m_defaultEntry;
|
||||||
|
DropMenuEntry *m_activeEntry;
|
||||||
|
};
|
||||||
|
|
||||||
|
class DLLEXPORT DropMenuEntry : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
explicit DropMenuEntry( const QPixmap &icon, const QString &text, DropJob::DropFlags flags, QWidget *parent = 0 );
|
||||||
|
|
||||||
|
void setActive( bool active );
|
||||||
|
bool hovered() const;
|
||||||
|
DropJob::DropFlags dropFlags() const;
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void dropReceived( QDropEvent *event );
|
||||||
|
void mouseEntered( DropMenuEntry *entry );
|
||||||
|
void mouseLeft( DropMenuEntry *entry );
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void dragEnterEvent( QDragEnterEvent *event );
|
||||||
|
virtual void dragLeaveEvent( QDragLeaveEvent *event );
|
||||||
|
virtual void dropEvent( QDropEvent *event );
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool m_hovered;
|
||||||
|
QLabel *m_label;
|
||||||
|
DropJob::DropFlags m_flags;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // DROPMENU_H
|
@@ -259,15 +259,14 @@ CategoryAddItem::dropMimeData( const QMimeData* data, Qt::DropAction )
|
|||||||
if ( dropType() == DropTypeLocalItems )
|
if ( dropType() == DropTypeLocalItems )
|
||||||
{
|
{
|
||||||
dj->setGetWholeArtists( true );
|
dj->setGetWholeArtists( true );
|
||||||
dj->tracksFromMimeData( data, false, true );
|
dj->setOnlyLocal( true );
|
||||||
}
|
}
|
||||||
else if ( dropType() == DropTypeTop50 )
|
else if ( dropType() == DropTypeTop50 )
|
||||||
{
|
{
|
||||||
dj->setGetWholeArtists( true );
|
dj->setGetTop10( true );
|
||||||
dj->tracksFromMimeData( data, false, false, true );
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
dj->tracksFromMimeData( data, false, false );
|
dj->tracksFromMimeData( data );
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@@ -183,15 +183,12 @@ PlaylistItem::dropMimeData( const QMimeData* data, Qt::DropAction action )
|
|||||||
if ( dropType() == DropTypeLocalItems )
|
if ( dropType() == DropTypeLocalItems )
|
||||||
{
|
{
|
||||||
dj->setGetWholeArtists( true );
|
dj->setGetWholeArtists( true );
|
||||||
dj->tracksFromMimeData( data, false, true );
|
dj->setOnlyLocal( true );
|
||||||
}
|
}
|
||||||
else if ( dropType() == DropTypeTop50 )
|
else if ( dropType() == DropTypeTop50 )
|
||||||
{
|
dj->setGetTop10( true );
|
||||||
dj->setGetWholeArtists( true );
|
|
||||||
dj->tracksFromMimeData( data, false, false, true );
|
dj->tracksFromMimeData( data);
|
||||||
}
|
|
||||||
else
|
|
||||||
dj->tracksFromMimeData( data, false, false );
|
|
||||||
|
|
||||||
// TODO cant' know if it works or not yet...
|
// TODO cant' know if it works or not yet...
|
||||||
return true;
|
return true;
|
||||||
|
Reference in New Issue
Block a user