From b2f3dedaffc9e3550c0a38c993e135a952659bf3 Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Sun, 4 Sep 2011 20:54:16 +0200 Subject: [PATCH] more work the dropmenu for the audiocontrols --- src/audiocontrols.cpp | 147 +++++++++++++++++-------- src/audiocontrols.h | 6 + src/audiocontrols.ui | 8 +- src/libtomahawk/CMakeLists.txt | 2 + src/libtomahawk/dropjob.cpp | 88 ++++++++++----- src/libtomahawk/dropjob.h | 53 ++++++++- src/libtomahawk/utils/dropmenu.cpp | 141 ++++++++++++++++++++++++ src/libtomahawk/utils/dropmenu.h | 70 ++++++++++++ src/sourcetree/items/categoryitems.cpp | 9 +- src/sourcetree/items/playlistitems.cpp | 11 +- 10 files changed, 445 insertions(+), 90 deletions(-) create mode 100644 src/libtomahawk/utils/dropmenu.cpp create mode 100644 src/libtomahawk/utils/dropmenu.h diff --git a/src/audiocontrols.cpp b/src/audiocontrols.cpp index 5df690327..a23730d43 100644 --- a/src/audiocontrols.cpp +++ b/src/audiocontrols.cpp @@ -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 ) ), this, SLOT( droppedTracks( QList ) ) ); + 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 ); +} diff --git a/src/audiocontrols.h b/src/audiocontrols.h index 06da6a324..7544e8ffa 100644 --- a/src/audiocontrols.h +++ b/src/audiocontrols.h @@ -22,10 +22,12 @@ #include #include #include +#include #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 diff --git a/src/audiocontrols.ui b/src/audiocontrols.ui index 4636d8e60..041cc2652 100644 --- a/src/audiocontrols.ui +++ b/src/audiocontrols.ui @@ -130,7 +130,7 @@ 0 - + 16777215 @@ -565,6 +565,12 @@ QLabel
utils/querylabel.h
+ + DropMenu + QWidget +
utils/dropmenu.h
+ 1 +
diff --git a/src/libtomahawk/CMakeLists.txt b/src/libtomahawk/CMakeLists.txt index 8616e1f0b..85dd157b3 100644 --- a/src/libtomahawk/CMakeLists.txt +++ b/src/libtomahawk/CMakeLists.txt @@ -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 diff --git a/src/libtomahawk/dropjob.cpp b/src/libtomahawk/dropjob.cpp index 467821e29..46c36fd39 100644 --- a/src/libtomahawk/dropjob.cpp +++ b/src/libtomahawk/dropjob.cpp @@ -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& 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 ); diff --git a/src/libtomahawk/dropjob.h b/src/libtomahawk/dropjob.h index 3e84d6510..5ddd9e0c7 100644 --- a/src/libtomahawk/dropjob.h +++ b/src/libtomahawk/dropjob.h @@ -28,10 +28,48 @@ #include #include +/** @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 diff --git a/src/libtomahawk/utils/dropmenu.cpp b/src/libtomahawk/utils/dropmenu.cpp new file mode 100644 index 000000000..3b959de11 --- /dev/null +++ b/src/libtomahawk/utils/dropmenu.cpp @@ -0,0 +1,141 @@ +#include "dropmenu.h" + +#include +#include +#include + + + +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; +} diff --git a/src/libtomahawk/utils/dropmenu.h b/src/libtomahawk/utils/dropmenu.h new file mode 100644 index 000000000..b218a72a0 --- /dev/null +++ b/src/libtomahawk/utils/dropmenu.h @@ -0,0 +1,70 @@ +#ifndef DROPMENU_H +#define DROPMENU_H + +#include "dllmacro.h" +#include "dropjob.h" + +#include +#include + +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 diff --git a/src/sourcetree/items/categoryitems.cpp b/src/sourcetree/items/categoryitems.cpp index 00cd45f57..9046d9588 100644 --- a/src/sourcetree/items/categoryitems.cpp +++ b/src/sourcetree/items/categoryitems.cpp @@ -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; } diff --git a/src/sourcetree/items/playlistitems.cpp b/src/sourcetree/items/playlistitems.cpp index c59f4258f..ea63c627b 100644 --- a/src/sourcetree/items/playlistitems.cpp +++ b/src/sourcetree/items/playlistitems.cpp @@ -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;