mirror of
https://github.com/tomahawk-player/tomahawk.git
synced 2025-08-11 16:44:05 +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 )
|
||||
, m_repeatMode( PlaylistInterface::NoRepeat )
|
||||
, m_shuffled( false )
|
||||
, m_dropAreaExpanded( false )
|
||||
{
|
||||
ui->setupUi( this );
|
||||
setAcceptDrops( true );
|
||||
@@ -151,57 +152,86 @@ AudioControls::AudioControls( QWidget* parent )
|
||||
|
||||
|
||||
m_dragAnimation = new QPropertyAnimation( this, "dropAreaSize", this );
|
||||
m_dragAnimation->setStartValue( 0 );
|
||||
m_dragAnimation->setDuration( 500 );
|
||||
m_dragAnimation->setEasingCurve( QEasingCurve::OutExpo );
|
||||
m_dragAnimation->setEasingCurve( QEasingCurve::Linear );
|
||||
connect( m_dragAnimation, SIGNAL( finished() ), SLOT(dragAnimationFinished()));
|
||||
|
||||
QGridLayout *dropMenuLayout = new QGridLayout;
|
||||
ui->metaDataDropArea->setLayout( dropMenuLayout );
|
||||
m_dropAreaCollapseTimer.setInterval( 500 );
|
||||
m_dropAreaCollapseTimer.setSingleShot( true );
|
||||
connect( &m_dropAreaCollapseTimer, SIGNAL( timeout() ), this, SLOT( collapseDropMenu() ) );
|
||||
|
||||
QLabel* dropTrackImage = new QLabel;
|
||||
dropTrackImage->setAlignment( Qt::AlignHCenter );
|
||||
dropTrackImage->setPixmap( QPixmap(":/data/images/drop-song.png" ).scaledToWidth( 32, Qt::SmoothTransformation ) );
|
||||
dropMenuLayout->addWidget( dropTrackImage, 0, 0 );
|
||||
connect( ui->metaDataDropArea, SIGNAL( dropReceived( QDropEvent* ) ), this, SLOT( dropReceived( QDropEvent* ) ) );
|
||||
|
||||
QLabel* dropAlbumImage = new QLabel;
|
||||
dropAlbumImage->setAlignment( Qt::AlignHCenter );
|
||||
dropAlbumImage->setPixmap( QPixmap( ":/data/images/drop-album.png" ).scaledToWidth( 32, Qt::SmoothTransformation ) );
|
||||
dropMenuLayout->addWidget( dropAlbumImage, 0, 1 );
|
||||
DropMenuEntry *trackEntry = new DropMenuEntry( QPixmap(":/data/images/drop-song.png" ).scaledToWidth( 32, Qt::SmoothTransformation ),
|
||||
"Track",
|
||||
DropJob::DropFlagTrack );
|
||||
ui->metaDataDropArea->addEntry( trackEntry, true );
|
||||
|
||||
QLabel* dropArtistImage = new QLabel;
|
||||
dropArtistImage->setAlignment( Qt::AlignHCenter );
|
||||
dropArtistImage->setPixmap( QPixmap( ":/data/images/drop-all-songs.png" ).scaledToWidth( 32, Qt::SmoothTransformation ) );
|
||||
dropMenuLayout->addWidget( dropArtistImage, 0, 2 );
|
||||
DropMenuEntry *albumEntry = new DropMenuEntry( QPixmap(":/data/images/drop-album.png" ).scaledToWidth( 32, Qt::SmoothTransformation ),
|
||||
"Album",
|
||||
DropJob::DropFlagAlbum );
|
||||
ui->metaDataDropArea->addEntry( albumEntry );
|
||||
|
||||
QLabel* dropLocalImage = new QLabel;
|
||||
dropLocalImage->setAlignment( Qt::AlignHCenter );
|
||||
dropLocalImage->setPixmap( QPixmap( ":/data/images/drop-local-songs.png" ).scaledToWidth( 32, Qt::SmoothTransformation ) );
|
||||
dropMenuLayout->addWidget( dropLocalImage, 0, 3 );
|
||||
DropMenuEntry *artistEntry = new DropMenuEntry( QPixmap(":/data/images/drop-all-songs.png" ).scaledToWidth( 32, Qt::SmoothTransformation ),
|
||||
"Artist",
|
||||
DropJob::DropFlagArtist );
|
||||
ui->metaDataDropArea->addEntry( artistEntry );
|
||||
|
||||
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 );
|
||||
DropMenuEntry *localEntry = new DropMenuEntry( QPixmap(":/data/images/drop-local-songs.png" ).scaledToWidth( 32, Qt::SmoothTransformation ),
|
||||
"Local",
|
||||
DropJob::DropFlagAlbum | DropJob::DropFlagLocal );
|
||||
ui->metaDataDropArea->addEntry( localEntry );
|
||||
|
||||
QLabel* dropAllText = new QLabel( "Track" );
|
||||
dropAllText->setAlignment( Qt::AlignHCenter );
|
||||
dropMenuLayout->addWidget( dropAllText, 1, 0 );
|
||||
DropMenuEntry *top10Entry = new DropMenuEntry( QPixmap(":/data/images/drop-top-songs.png" ).scaledToWidth( 32, Qt::SmoothTransformation ),
|
||||
"Top 10",
|
||||
DropJob::DropFlagArtist | DropJob::DropFlagTop10 );
|
||||
ui->metaDataDropArea->addEntry( top10Entry );
|
||||
|
||||
QLabel* dropAlbumText = new QLabel( "Album" );
|
||||
dropAlbumText->setAlignment( Qt::AlignHCenter );
|
||||
dropMenuLayout->addWidget( dropAlbumText, 1, 1 );
|
||||
// QLabel* dropTrackImage = new QLabel;
|
||||
// dropTrackImage->setAlignment( Qt::AlignHCenter );
|
||||
// dropTrackImage->setPixmap( QPixmap(":/data/images/drop-song.png" ).scaledToWidth( 32, Qt::SmoothTransformation ) );
|
||||
// dropMenuLayout->addWidget( dropTrackImage, 0, 0 );
|
||||
|
||||
QLabel* dropArtistText = new QLabel( "Artist" );
|
||||
dropArtistText->setAlignment( Qt::AlignHCenter );
|
||||
dropMenuLayout->addWidget( dropArtistText, 1, 2 );
|
||||
// QLabel* dropAlbumImage = new QLabel;
|
||||
// dropAlbumImage->setAlignment( Qt::AlignHCenter );
|
||||
// dropAlbumImage->setPixmap( QPixmap( ":/data/images/drop-album.png" ).scaledToWidth( 32, Qt::SmoothTransformation ) );
|
||||
// dropMenuLayout->addWidget( dropAlbumImage, 0, 1 );
|
||||
|
||||
QLabel* dropLocalText = new QLabel( "Local" );
|
||||
dropLocalText->setAlignment( Qt::AlignHCenter );
|
||||
dropMenuLayout->addWidget( dropLocalText, 1, 3 );
|
||||
// QLabel* dropArtistImage = new QLabel;
|
||||
// dropArtistImage->setAlignment( Qt::AlignHCenter );
|
||||
// dropArtistImage->setPixmap( QPixmap( ":/data/images/drop-all-songs.png" ).scaledToWidth( 32, Qt::SmoothTransformation ) );
|
||||
// dropMenuLayout->addWidget( dropArtistImage, 0, 2 );
|
||||
|
||||
QLabel* dropTop10Text = new QLabel( "Top 10" );
|
||||
dropTop10Text->setAlignment( Qt::AlignHCenter );
|
||||
dropMenuLayout->addWidget( dropTop10Text, 1, 4 );
|
||||
// QLabel* dropLocalImage = new QLabel;
|
||||
// dropLocalImage->setAlignment( Qt::AlignHCenter );
|
||||
// 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();
|
||||
|
||||
m_dragAnimation->setStartValue( 0 );
|
||||
m_dragAnimation->setEndValue( ui->metaDataArea->height() );
|
||||
m_dragAnimation->setDirection( QAbstractAnimation::Forward );
|
||||
m_dragAnimation->start();
|
||||
m_dropAreaCollapseTimer.stop();
|
||||
|
||||
if( !m_dropAreaExpanded )
|
||||
{
|
||||
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
|
||||
AudioControls::dragLeaveEvent( QDragLeaveEvent * )
|
||||
{
|
||||
ui->metaDataInfoArea->setMaximumHeight( 1000 );
|
||||
ui->metaDataDropArea->setMaximumHeight( 0 );
|
||||
if( !ui->metaDataDropArea->hovered() )
|
||||
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();
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -615,8 +661,11 @@ AudioControls::dropEvent( QDropEvent* e )
|
||||
{
|
||||
DropJob *dj = new DropJob();
|
||||
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() );
|
||||
|
||||
QTimer::singleShot( 0, this, SLOT( collapseDropMenu() ) );
|
||||
|
||||
e->accept();
|
||||
}
|
||||
}
|
||||
@@ -688,3 +737,9 @@ AudioControls::setDropAreaSize( int size )
|
||||
ui->metaDataDropArea->setMaximumHeight( size );
|
||||
ui->metaDataInfoArea->setMaximumHeight( ui->metaDataArea->height() - size );
|
||||
}
|
||||
|
||||
void
|
||||
AudioControls::dropReceived( QDropEvent *event )
|
||||
{
|
||||
dropEvent( event );
|
||||
}
|
||||
|
@@ -22,10 +22,12 @@
|
||||
#include <QWidget>
|
||||
#include <QTimeLine>
|
||||
#include <QPropertyAnimation>
|
||||
#include <QTimer>
|
||||
|
||||
#include "result.h"
|
||||
#include "playlistinterface.h"
|
||||
#include "infosystem/infosystem.h"
|
||||
#include "utils/dropmenu.h"
|
||||
|
||||
class QDropEvent;
|
||||
class QDragEnterEvent;
|
||||
@@ -88,7 +90,9 @@ private slots:
|
||||
|
||||
void socialActionsLoaded();
|
||||
|
||||
void collapseDropMenu();
|
||||
void dragAnimationFinished();
|
||||
void dropReceived( QDropEvent *event );
|
||||
|
||||
private:
|
||||
Ui::AudioControls *ui;
|
||||
@@ -103,6 +107,8 @@ private:
|
||||
qint64 m_seekMsecs;
|
||||
|
||||
QPropertyAnimation *m_dragAnimation;
|
||||
bool m_dropAreaExpanded;
|
||||
QTimer m_dropAreaCollapseTimer;
|
||||
};
|
||||
|
||||
#endif // AUDIOCONTROLS_H
|
||||
|
@@ -130,7 +130,7 @@
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QWidget" name="metaDataDropArea" native="true">
|
||||
<widget class="DropMenu" name="metaDataDropArea" native="true">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>16777215</width>
|
||||
@@ -565,6 +565,12 @@
|
||||
<extends>QLabel</extends>
|
||||
<header>utils/querylabel.h</header>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>DropMenu</class>
|
||||
<extends>QWidget</extends>
|
||||
<header>utils/dropmenu.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
|
@@ -183,6 +183,7 @@ set( libSources
|
||||
utils/rdioparser.cpp
|
||||
utils/shortenedlinkparser.cpp
|
||||
utils/stylehelper.cpp
|
||||
utils/dropmenu.cpp
|
||||
|
||||
widgets/newplaylistwidget.cpp
|
||||
widgets/searchwidget.cpp
|
||||
@@ -381,6 +382,7 @@ set( libHeaders
|
||||
utils/rdioparser.h
|
||||
utils/shortenedlinkparser.h
|
||||
utils/stylehelper.h
|
||||
utils/dropmenu.h
|
||||
|
||||
widgets/newplaylistwidget.h
|
||||
widgets/searchwidget.h
|
||||
|
@@ -34,6 +34,7 @@ using namespace Tomahawk;
|
||||
DropJob::DropJob( QObject *parent )
|
||||
: QObject( parent )
|
||||
, m_queryCount( 0 )
|
||||
, m_dropFlags( DropFlagsNone )
|
||||
{
|
||||
}
|
||||
|
||||
@@ -98,31 +99,72 @@ DropJob::acceptsMimeData( const QMimeData* data, bool tracksOnly )
|
||||
void
|
||||
DropJob::setGetWholeArtists( bool getWholeArtists )
|
||||
{
|
||||
m_getWholeArtists = getWholeArtists;
|
||||
if( getWholeArtists )
|
||||
m_dropFlags |= DropFlagArtist;
|
||||
else
|
||||
m_dropFlags &= !DropFlagArtist;
|
||||
}
|
||||
|
||||
void
|
||||
DropJob::setGetWholeAlbums( bool getWholeAlbums )
|
||||
{
|
||||
m_getWholeAlbums = getWholeAlbums;
|
||||
if ( getWholeAlbums )
|
||||
m_dropFlags |= DropFlagAlbum;
|
||||
else
|
||||
m_dropFlags &= !DropFlagAlbum;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
DropJob::tracksFromMimeData( const QMimeData* data, bool allowDuplicates, bool onlyLocal, bool top10 )
|
||||
DropJob::setGetTop10( bool top10 )
|
||||
{
|
||||
m_allowDuplicates = allowDuplicates;
|
||||
m_onlyLocal = onlyLocal;
|
||||
m_top10 = top10;
|
||||
if( top10 )
|
||||
m_dropFlags |= DropFlagTop10;
|
||||
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 );
|
||||
|
||||
if ( m_queryCount == 0 )
|
||||
{
|
||||
if ( onlyLocal )
|
||||
if ( m_dropFlags.testFlag( DropFlagLocal ) )
|
||||
removeRemoteSources();
|
||||
|
||||
if ( !allowDuplicates )
|
||||
if ( !m_dropFlags.testFlag( DropFlagAllowDuplicates ) )
|
||||
removeDuplicates();
|
||||
|
||||
emit tracks( m_resultList );
|
||||
@@ -171,15 +213,15 @@ DropJob::tracksFromQueryList( const QMimeData* data )
|
||||
{
|
||||
tDebug() << "Dropped query item:" << query->data()->artist() << "-" << query->data()->track();
|
||||
|
||||
if ( m_top10 )
|
||||
if ( m_dropFlags.testFlag( DropFlagTop10 ) )
|
||||
{
|
||||
getTopTen( query->data()->artist() );
|
||||
}
|
||||
else if ( m_getWholeArtists )
|
||||
else if ( m_dropFlags.testFlag( DropFlagArtist ) )
|
||||
{
|
||||
queries << getArtist( query->data()->artist() );
|
||||
}
|
||||
else if ( m_getWholeAlbums )
|
||||
else if ( m_dropFlags.testFlag( DropFlagAlbum ) )
|
||||
{
|
||||
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();
|
||||
query_ptr q = result->data()->toQuery();
|
||||
|
||||
if ( m_top10 )
|
||||
if ( m_dropFlags.testFlag( DropFlagTop10 ) )
|
||||
{
|
||||
getTopTen( q->artist() );
|
||||
}
|
||||
else if ( m_getWholeArtists )
|
||||
else if ( m_dropFlags.testFlag( DropFlagArtist ) )
|
||||
{
|
||||
queries << getArtist( q->artist() );
|
||||
}
|
||||
else if ( m_getWholeAlbums )
|
||||
else if ( m_dropFlags.testFlag( DropFlagAlbum ) )
|
||||
{
|
||||
queries << getAlbum( q->artist(), q->album() );
|
||||
}
|
||||
@@ -248,9 +290,9 @@ DropJob::tracksFromAlbumMetaData( const QMimeData *data )
|
||||
QString album;
|
||||
stream >> album;
|
||||
|
||||
if ( m_top10 )
|
||||
if ( m_dropFlags.testFlag( DropFlagTop10 ) )
|
||||
getTopTen( artist );
|
||||
else if ( m_getWholeArtists )
|
||||
else if ( m_dropFlags.testFlag( DropFlagArtist ) )
|
||||
queries << getArtist( artist );
|
||||
else
|
||||
queries << getAlbum( artist, album );
|
||||
@@ -270,14 +312,10 @@ DropJob::tracksFromArtistMetaData( const QMimeData *data )
|
||||
QString artist;
|
||||
stream >> artist;
|
||||
|
||||
if ( !m_top10 )
|
||||
{
|
||||
queries << getArtist( artist );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( m_dropFlags.testFlag( DropFlagTop10 ) )
|
||||
getTopTen( artist );
|
||||
}
|
||||
else
|
||||
queries << getArtist( artist );
|
||||
}
|
||||
return queries;
|
||||
}
|
||||
@@ -381,10 +419,10 @@ DropJob::onTracksAdded( const QList<Tomahawk::query_ptr>& tracksList )
|
||||
|
||||
if ( --m_queryCount == 0 )
|
||||
{
|
||||
if ( m_onlyLocal )
|
||||
if ( m_dropFlags.testFlag( DropFlagLocal ) )
|
||||
removeRemoteSources();
|
||||
|
||||
if ( !m_allowDuplicates )
|
||||
if ( !m_dropFlags.testFlag( DropFlagAllowDuplicates ) )
|
||||
removeDuplicates();
|
||||
|
||||
emit tracks( m_resultList );
|
||||
|
@@ -28,10 +28,48 @@
|
||||
#include <QStringList>
|
||||
#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
|
||||
{
|
||||
Q_OBJECT
|
||||
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 );
|
||||
~DropJob();
|
||||
|
||||
@@ -46,9 +84,15 @@ public:
|
||||
static bool acceptsMimeData( const QMimeData* data, bool tracksOnly = true );
|
||||
static QStringList mimeTypes();
|
||||
|
||||
void setDropFlags( DropFlags flags );
|
||||
|
||||
void setGetWholeArtists( bool getWholeArtists );
|
||||
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:
|
||||
/// QMimeData parsing results
|
||||
@@ -81,13 +125,10 @@ private:
|
||||
void removeRemoteSources();
|
||||
|
||||
int m_queryCount;
|
||||
bool m_allowDuplicates;
|
||||
bool m_onlyLocal;
|
||||
bool m_getWholeArtists;
|
||||
bool m_getWholeAlbums;
|
||||
bool m_top10;
|
||||
DropFlags m_dropFlags;
|
||||
|
||||
QList< Tomahawk::query_ptr > m_resultList;
|
||||
};
|
||||
Q_DECLARE_OPERATORS_FOR_FLAGS( DropJob::DropFlags )
|
||||
|
||||
#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 )
|
||||
{
|
||||
dj->setGetWholeArtists( true );
|
||||
dj->tracksFromMimeData( data, false, true );
|
||||
dj->setOnlyLocal( true );
|
||||
}
|
||||
else if ( dropType() == DropTypeTop50 )
|
||||
{
|
||||
dj->setGetWholeArtists( true );
|
||||
dj->tracksFromMimeData( data, false, false, true );
|
||||
dj->setGetTop10( true );
|
||||
}
|
||||
else
|
||||
dj->tracksFromMimeData( data, false, false );
|
||||
|
||||
dj->tracksFromMimeData( data );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@@ -183,15 +183,12 @@ PlaylistItem::dropMimeData( const QMimeData* data, Qt::DropAction action )
|
||||
if ( dropType() == DropTypeLocalItems )
|
||||
{
|
||||
dj->setGetWholeArtists( true );
|
||||
dj->tracksFromMimeData( data, false, true );
|
||||
dj->setOnlyLocal( true );
|
||||
}
|
||||
else if ( dropType() == DropTypeTop50 )
|
||||
{
|
||||
dj->setGetWholeArtists( true );
|
||||
dj->tracksFromMimeData( data, false, false, true );
|
||||
}
|
||||
else
|
||||
dj->tracksFromMimeData( data, false, false );
|
||||
dj->setGetTop10( true );
|
||||
|
||||
dj->tracksFromMimeData( data);
|
||||
|
||||
// TODO cant' know if it works or not yet...
|
||||
return true;
|
||||
|
Reference in New Issue
Block a user