1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-08-05 13:47:26 +02:00

* Set remote playlists to readonly.

* Disable context menu entries for readonly playlists.
* Don't allow dropping items on readonly playlists.
* VCard work on Jabber client.
This commit is contained in:
Christian Muehlhaeuser
2010-10-26 05:46:55 +02:00
parent 6b247f8bca
commit c1eb5bdc7f
12 changed files with 87 additions and 24 deletions

View File

@@ -425,7 +425,7 @@ Jabber_p::handleRosterPresence( const RosterItem& item, const std::string& resou
return; return;
} }
// "coming online " event // "coming online" event
if( presenceMeansOnline( presence ) && if( presenceMeansOnline( presence ) &&
( !m_peers.contains( fulljid ) || ( !m_peers.contains( fulljid ) ||
!presenceMeansOnline( m_peers.value( fulljid ) ) !presenceMeansOnline( m_peers.value( fulljid ) )
@@ -478,6 +478,20 @@ Jabber_p::handleNonrosterPresence( const Presence& presence )
/// END ROSTER STUFF /// END ROSTER STUFF
void
Jabber_p::handleVCard( const JID& jid, const VCard* vcard )
{
qDebug() << "VCARD RECEIVED!" << jid.bare().c_str();
}
void
Jabber_p::handleVCardResult( VCardContext context, const JID& jid, StanzaError se )
{
qDebug() << "VCARD RESULT RECEIVED!" << jid.bare().c_str();
}
/// DISCO STUFF /// DISCO STUFF
void void
Jabber_p::handleDiscoInfo( const JID& from, const Disco::Info& info, int context) Jabber_p::handleDiscoInfo( const JID& from, const Disco::Info& info, int context)
@@ -525,8 +539,3 @@ bool Jabber_p::presenceMeansOnline( Presence::PresenceType p )
return true; return true;
} }
} }

View File

@@ -41,6 +41,9 @@
#include <gloox/error.h> #include <gloox/error.h>
#include <gloox/presence.h> #include <gloox/presence.h>
#include <gloox/rosteritem.h> #include <gloox/rosteritem.h>
#include <gloox/vcard.h>
#include <gloox/vcardhandler.h>
#include <gloox/vcardmanager.h>
#if defined( WIN32 ) || defined( _WIN32 ) #if defined( WIN32 ) || defined( _WIN32 )
# include <windows.h> # include <windows.h>
@@ -51,6 +54,7 @@ class Jabber_p :
public gloox::ConnectionListener, public gloox::ConnectionListener,
public gloox::RosterListener, public gloox::RosterListener,
public gloox::MessageHandler, public gloox::MessageHandler,
public gloox::VCardHandler,
gloox::LogHandler gloox::LogHandler
//public gloox::DiscoHandler, //public gloox::DiscoHandler,
{ {
@@ -91,6 +95,9 @@ public:
virtual void handleNonrosterPresence( const gloox::Presence& presence ); virtual void handleNonrosterPresence( const gloox::Presence& presence );
/// END ROSTER STUFF /// END ROSTER STUFF
virtual void handleVCard( const gloox::JID& jid, const gloox::VCard* vcard );
virtual void handleVCardResult( gloox::VCardHandler::VCardContext context, const gloox::JID& jid, gloox::StanzaError se );
/// DISCO STUFF /// DISCO STUFF
virtual void handleDiscoInfo( const gloox::JID& from, const gloox::Disco::Info& info, int context); virtual void handleDiscoInfo( const gloox::JID& from, const gloox::Disco::Info& info, int context);
virtual void handleDiscoItems( const gloox::JID& /*iq*/, const gloox::Disco::Items&, int /*context*/ ); virtual void handleDiscoItems( const gloox::JID& /*iq*/, const gloox::Disco::Items&, int /*context*/ );
@@ -115,7 +122,6 @@ public slots:
void broadcastMsg( const QString &msg ); void broadcastMsg( const QString &msg );
private slots: private slots:
void doJabberRecv(); void doJabberRecv();
private: private:
@@ -125,6 +131,7 @@ private:
gloox::JID m_jid; gloox::JID m_jid;
QMap<gloox::Presence::PresenceType, QString> m_presences; QMap<gloox::Presence::PresenceType, QString> m_presences;
QMap<QString, gloox::Presence::PresenceType> m_peers; QMap<QString, gloox::Presence::PresenceType> m_peers;
QSharedPointer<gloox::VCardManager> m_vcardManager;
QTimer m_timer; // for recv() QTimer m_timer; // for recv()
}; };

View File

@@ -67,7 +67,7 @@ CollectionFlatModel::removeCollection( const collection_ptr& collection )
disconnect( collection.data(), SIGNAL( tracksFinished( Tomahawk::collection_ptr ) ), disconnect( collection.data(), SIGNAL( tracksFinished( Tomahawk::collection_ptr ) ),
this, SLOT( onTracksAddingFinished( Tomahawk::collection_ptr ) ) ); this, SLOT( onTracksAddingFinished( Tomahawk::collection_ptr ) ) );
QList<PlItem*> plitems = m_collectionIndex.values( collection ); // QList<PlItem*> plitems = m_collectionIndex.values( collection );
QList< QPair< int, int > > rows; QList< QPair< int, int > > rows;
QList< QPair< int, int > > sortrows; QList< QPair< int, int > > sortrows;
QPair< int, int > row; QPair< int, int > row;
@@ -113,11 +113,15 @@ CollectionFlatModel::removeCollection( const collection_ptr& collection )
qDebug() << "Removing rows:" << row.first << row.second; qDebug() << "Removing rows:" << row.first << row.second;
emit beginRemoveRows( QModelIndex(), row.first, row.second ); emit beginRemoveRows( QModelIndex(), row.first, row.second );
for ( int i = row.second; i >= row.first; i-- )
{
PlItem* item = itemFromIndex( index( i, 0, QModelIndex() ) );
delete item;
}
emit endRemoveRows(); emit endRemoveRows();
} }
qDeleteAll( plitems ); // m_collectionIndex.remove( collection );
m_collectionIndex.remove( collection );
} }
@@ -150,7 +154,7 @@ CollectionFlatModel::onTracksAdded( const QList<QVariant>& tracks, const collect
connect( plitem, SIGNAL( dataChanged() ), SLOT( onDataChanged() ) ); connect( plitem, SIGNAL( dataChanged() ), SLOT( onDataChanged() ) );
m_collectionIndex.insertMulti( collection, plitem ); // m_collectionIndex.insertMulti( collection, plitem );
} }
m_collectionRows.insertMulti( collection, crows ); m_collectionRows.insertMulti( collection, crows );
@@ -183,7 +187,7 @@ CollectionFlatModel::onSourceOffline( const Tomahawk::source_ptr& src )
{ {
qDebug() << Q_FUNC_INFO; qDebug() << Q_FUNC_INFO;
if ( m_collectionIndex.contains( src->collection() ) ) if ( m_collectionRows.contains( src->collection() ) )
{ {
removeCollection( src->collection() ); removeCollection( src->collection() );
} }

View File

@@ -50,7 +50,6 @@ private slots:
void onSourceOffline( const Tomahawk::source_ptr& src ); void onSourceOffline( const Tomahawk::source_ptr& src );
private: private:
QMap< Tomahawk::collection_ptr, PlItem* > m_collectionIndex;
QMap< Tomahawk::collection_ptr, QPair< int, int > > m_collectionRows; QMap< Tomahawk::collection_ptr, QPair< int, int > > m_collectionRows;
}; };

View File

@@ -38,6 +38,9 @@ void
PlaylistItemDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const PlaylistItemDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const
{ {
PlItem* item = m_model->itemFromIndex( m_model->mapToSource( index ) ); PlItem* item = m_model->itemFromIndex( m_model->mapToSource( index ) );
if ( !item )
return;
if ( item->query()->results().count() ) if ( item->query()->results().count() )
painter->setOpacity( item->query()->results().at( 0 )->score() ); painter->setOpacity( item->query()->results().at( 0 )->score() );
else else

View File

@@ -59,6 +59,8 @@ PlaylistModel::loadPlaylist( const Tomahawk::playlist_ptr& playlist )
m_playlist = playlist; m_playlist = playlist;
connect( playlist.data(), SIGNAL( revisionLoaded( Tomahawk::PlaylistRevision ) ), SLOT( onRevisionLoaded( Tomahawk::PlaylistRevision ) ) ); connect( playlist.data(), SIGNAL( revisionLoaded( Tomahawk::PlaylistRevision ) ), SLOT( onRevisionLoaded( Tomahawk::PlaylistRevision ) ) );
setReadOnly( !m_playlist->author()->isLocal() );
PlItem* plitem; PlItem* plitem;
QList<plentry_ptr> entries = playlist->entries(); QList<plentry_ptr> entries = playlist->entries();
int c = rowCount( QModelIndex() ); int c = rowCount( QModelIndex() );
@@ -110,7 +112,7 @@ PlaylistModel::onRevisionLoaded( Tomahawk::PlaylistRevision revision )
bool bool
PlaylistModel::dropMimeData( const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent ) PlaylistModel::dropMimeData( const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent )
{ {
if ( action == Qt::IgnoreAction ) if ( action == Qt::IgnoreAction || isReadOnly() )
return true; return true;
if ( !data->hasFormat( "application/tomahawk.query.list" ) && !data->hasFormat( "application/tomahawk.plentry.list" ) ) if ( !data->hasFormat( "application/tomahawk.query.list" ) && !data->hasFormat( "application/tomahawk.plentry.list" ) )
@@ -210,6 +212,9 @@ PlaylistModel::playlistEntries() const
void void
PlaylistModel::removeIndex( const QModelIndex& index ) PlaylistModel::removeIndex( const QModelIndex& index )
{ {
if ( isReadOnly() )
return;
TrackModel::removeIndex( index ); TrackModel::removeIndex( index );
m_waitForUpdate = true; m_waitForUpdate = true;

View File

@@ -12,7 +12,9 @@ PlaylistView::PlaylistView( QWidget* parent )
: TrackView( parent ) : TrackView( parent )
{ {
setProxyModel( new PlaylistProxyModel( this ) ); setProxyModel( new PlaylistProxyModel( this ) );
setupMenus();
setContextMenuPolicy( Qt::CustomContextMenu );
connect( this, SIGNAL( customContextMenuRequested( const QPoint& ) ), SLOT( onCustomContextMenu( const QPoint& ) ) );
} }
@@ -25,18 +27,20 @@ PlaylistView::~PlaylistView()
void void
PlaylistView::setupMenus() PlaylistView::setupMenus()
{ {
m_itemMenu.clear();
m_playItemAction = m_itemMenu.addAction( tr( "&Play" ) ); m_playItemAction = m_itemMenu.addAction( tr( "&Play" ) );
m_itemMenu.addSeparator(); m_itemMenu.addSeparator();
m_addItemsToPlaylistAction = m_itemMenu.addAction( tr( "&Add to Playlist" ) ); m_addItemsToPlaylistAction = m_itemMenu.addAction( tr( "&Add to Playlist" ) );
m_itemMenu.addSeparator(); m_itemMenu.addSeparator();
m_deleteItemAction = m_itemMenu.addAction( tr( "&Delete Item" ) ); m_deleteItemAction = m_itemMenu.addAction( tr( "&Delete Item" ) );
if ( model() )
m_deleteItemAction->setEnabled( !model()->isReadOnly() );
connect( m_playItemAction, SIGNAL( triggered() ), SLOT( playItem() ) ); connect( m_playItemAction, SIGNAL( triggered() ), SLOT( playItem() ) );
connect( m_addItemsToPlaylistAction, SIGNAL( triggered() ), SLOT( addItemsToPlaylist() ) ); connect( m_addItemsToPlaylistAction, SIGNAL( triggered() ), SLOT( addItemsToPlaylist() ) );
connect( m_deleteItemAction, SIGNAL( triggered() ), SLOT( deleteItem() ) ); connect( m_deleteItemAction, SIGNAL( triggered() ), SLOT( deleteItem() ) );
setContextMenuPolicy( Qt::CustomContextMenu );
connect( this, SIGNAL( customContextMenuRequested( const QPoint& ) ), SLOT( onCustomContextMenu( const QPoint& ) ) );
} }
@@ -44,6 +48,7 @@ void
PlaylistView::onCustomContextMenu( const QPoint& pos ) PlaylistView::onCustomContextMenu( const QPoint& pos )
{ {
qDebug() << Q_FUNC_INFO; qDebug() << Q_FUNC_INFO;
setupMenus();
QModelIndex idx = indexAt( pos ); QModelIndex idx = indexAt( pos );
idx = idx.sibling( idx.row(), 0 ); idx = idx.sibling( idx.row(), 0 );
@@ -81,7 +86,7 @@ PlaylistView::playItem()
void void
PlaylistView::addItemToPlaylist() PlaylistView::addItemsToPlaylist()
{ {
} }

View File

@@ -21,7 +21,7 @@ private slots:
void onCustomContextMenu( const QPoint& pos ); void onCustomContextMenu( const QPoint& pos );
void playItem(); void playItem();
void addItemToPlaylist(); void addItemsToPlaylist();
void deleteItem(); void deleteItem();
private: private:

View File

@@ -11,6 +11,7 @@ using namespace Tomahawk;
TrackModel::TrackModel( QObject* parent ) TrackModel::TrackModel( QObject* parent )
: QAbstractItemModel( parent ) : QAbstractItemModel( parent )
, m_readOnly( true )
{ {
qDebug() << Q_FUNC_INFO; qDebug() << Q_FUNC_INFO;
} }

View File

@@ -18,6 +18,8 @@ public:
virtual QModelIndex index( int row, int column, const QModelIndex& parent ) const; virtual QModelIndex index( int row, int column, const QModelIndex& parent ) const;
virtual QModelIndex parent( const QModelIndex& child ) const; virtual QModelIndex parent( const QModelIndex& child ) const;
virtual bool isReadOnly() const { return m_readOnly; }
virtual int trackCount() const { return rowCount( QModelIndex() ); } virtual int trackCount() const { return rowCount( QModelIndex() ); }
virtual int rowCount( const QModelIndex& parent ) const; virtual int rowCount( const QModelIndex& parent ) const;
@@ -52,8 +54,12 @@ public slots:
virtual void setRepeatMode( PlaylistInterface::RepeatMode mode ) {} virtual void setRepeatMode( PlaylistInterface::RepeatMode mode ) {}
virtual void setShuffled( bool shuffled ) {} virtual void setShuffled( bool shuffled ) {}
protected:
virtual void setReadOnly( bool b ) { m_readOnly = b; }
private: private:
QPersistentModelIndex m_currentIndex; QPersistentModelIndex m_currentIndex;
bool m_readOnly;
}; };
#endif // TRACKMODEL_H #endif // TRACKMODEL_H

View File

@@ -208,6 +208,12 @@ TrackView::dragMoveEvent( QDragMoveEvent* event )
{ {
QTreeView::dragMoveEvent( event ); QTreeView::dragMoveEvent( event );
if ( model()->isReadOnly() )
{
event->ignore();
return;
}
if ( event->mimeData()->hasFormat( "application/tomahawk.query.list" ) || event->mimeData()->hasFormat( "application/tomahawk.plentry.list" ) ) if ( event->mimeData()->hasFormat( "application/tomahawk.query.list" ) || event->mimeData()->hasFormat( "application/tomahawk.plentry.list" ) )
{ {
setDirtyRegion( m_dropRect ); setDirtyRegion( m_dropRect );

View File

@@ -31,7 +31,8 @@ SourceTreeView::SourceTreeView( QWidget* parent )
setDropIndicatorShown( false ); setDropIndicatorShown( false );
setAllColumnsShowFocus( false ); setAllColumnsShowFocus( false );
setupMenus(); setContextMenuPolicy( Qt::CustomContextMenu );
connect( this, SIGNAL( customContextMenuRequested( const QPoint& ) ), SLOT( onCustomContextMenu( const QPoint& ) ) );
m_model = new SourcesModel( this ); m_model = new SourcesModel( this );
setModel( m_model ); setModel( m_model );
@@ -50,15 +51,30 @@ SourceTreeView::SourceTreeView( QWidget* parent )
void void
SourceTreeView::setupMenus() SourceTreeView::setupMenus()
{ {
m_playlistMenu.clear();
m_loadPlaylistAction = m_playlistMenu.addAction( tr( "&Load Playlist" ) ); m_loadPlaylistAction = m_playlistMenu.addAction( tr( "&Load Playlist" ) );
m_playlistMenu.addSeparator(); m_playlistMenu.addSeparator();
m_deletePlaylistAction = m_playlistMenu.addAction( tr( "&Delete Playlist" ) ); m_deletePlaylistAction = m_playlistMenu.addAction( tr( "&Delete Playlist" ) );
bool readonly = true;
int type = SourcesModel::indexType( m_contextMenuIndex );
if ( type == 1 )
{
playlist_ptr playlist = SourcesModel::indexToPlaylist( m_contextMenuIndex );
if ( !playlist.isNull() )
{
readonly = !playlist->author()->isLocal();
}
}
if ( readonly )
{
m_deletePlaylistAction->setEnabled( !readonly );
}
connect( m_loadPlaylistAction, SIGNAL( triggered() ), SLOT( loadPlaylist() ) ); connect( m_loadPlaylistAction, SIGNAL( triggered() ), SLOT( loadPlaylist() ) );
connect( m_deletePlaylistAction, SIGNAL( triggered() ), SLOT( deletePlaylist() ) ); connect( m_deletePlaylistAction, SIGNAL( triggered() ), SLOT( deletePlaylist() ) );
setContextMenuPolicy( Qt::CustomContextMenu );
connect( this, SIGNAL( customContextMenuRequested( const QPoint& ) ), SLOT( onCustomContextMenu( const QPoint& ) ) );
} }
@@ -162,6 +178,8 @@ SourceTreeView::onCustomContextMenu( const QPoint& pos )
if ( !idx.isValid() ) if ( !idx.isValid() )
return; return;
setupMenus();
if ( SourcesModel::indexType( idx ) ) if ( SourcesModel::indexType( idx ) )
{ {
m_playlistMenu.exec( mapToGlobal( pos ) ); m_playlistMenu.exec( mapToGlobal( pos ) );