playlistitem.cpp

来自「Amarok是一款在LINUX或其他类UNIX操作系统中运行的音频播放器软件。 」· C++ 代码 · 共 1,153 行 · 第 1/3 页

CPP
1,153
字号
/***************************************************************************                        playlistitem.cpp  -  description                           -------------------  begin                : Die Dez 3 2002  copyright            : (C) 2002 by Mark Kretschmann  email                : markey@web.de  copyright            : (C) 2005 by Alexandre Oliveira  email                : aleprj@gmail.com***************************************************************************//*************************************************************************** *                                                                         * *   This program is free software; you can redistribute it and/or modify  * *   it under the terms of the GNU General Public License as published by  * *   the Free Software Foundation; either version 2 of the License, or     * *   (at your option) any later version.                                   * *                                                                         * ***************************************************************************/#define DEBUG_PREFIX "PlaylistItem"#include <config.h>#include "amarok.h"#include "amarokconfig.h"#include "collectiondb.h"#include "debug.h"#include "enginecontroller.h"#include "playlist.h"#include "sliderwidget.h"#include "starmanager.h"#include <qcursor.h>#include <qheader.h>#include <qimage.h>#include <qmutex.h>#include <qpainter.h>#include <qpen.h>#include <qpixmap.h>#include <qrect.h>#include <kdeversion.h>#include <kfilemetainfo.h>#include <kglobal.h>#include <kiconeffect.h>#include <kstandarddirs.h>#include <kstringhandler.h>#include "playlistitem.h"double  PlaylistItem::glowIntensity;QColor  PlaylistItem::glowText = Qt::white;QColor  PlaylistItem::glowBase = Qt::white;bool    PlaylistItem::s_pixmapChanged = false;PlaylistItem::PlaylistItem( QListView *listview, QListViewItem *item )        : KListViewItem( listview, item )        , m_album( 0 ){    KListViewItem::setVisible( false );}PlaylistItem::PlaylistItem( const MetaBundle &bundle, QListViewItem *lvi, bool enabled )        : MetaBundle( bundle ), KListViewItem( lvi->listView(), lvi->itemAbove() )        , m_album( 0 )        , m_deleteAfterEdit( false )        , m_isBeingRenamed( false )        , m_isNew( true ){    setDragEnabled( true );    Playlist::instance()->m_urlIndex.add( this );    if( !uniqueId().isEmpty() )        Playlist::instance()->addToUniqueMap( uniqueId(), this );    refAlbum();    incrementCounts();    incrementLengths();    filter( listView()->m_filter );    listView()->countChanged();    setAllCriteriaEnabled( enabled );}PlaylistItem::~PlaylistItem(){    if( isEmpty() ) //constructed with the generic constructor, for PlaylistLoader's marker item        return;    decrementCounts();    decrementLengths();    derefAlbum();    listView()->countChanged();    if( listView()->m_hoveredRating == this )        listView()->m_hoveredRating = 0;    Playlist::instance()->removeFromUniqueMap( uniqueId(), this );    Playlist::instance()->m_urlIndex.remove(this);}/////////////////////////////////////////////////////////////////////////////////////// PUBLIC METHODS/////////////////////////////////////////////////////////////////////////////////////void PlaylistItem::setText( int column, const QString &text ){    if( column == Rating )        setExactText( column, QString::number( int( text.toFloat() * 2 ) ) );    else        setExactText( column, text );}QString PlaylistItem::text( int column ) const{    if( column == Title && listView()->header()->sectionSize( Filename ) ) //don't show the filename twice        return exactText( column );    else switch ( column )    {        case Artist:        case Composer:        case Album:        case Genre:        case Comment:            return exactText( column ); //HACK        case Rating:            return isEditing( column ) ? exactText( column ) : prettyText( column );        default:        {            if( column != Title && isEditing( column ) )                return editingText();            else                return prettyText( column );        }    }}void PlaylistItem::aboutToChange( const QValueList<int> &columns ){    bool totals = false, ref = false, length = false, url = false;    for( int i = 0, n = columns.count(); i < n; ++i )        switch( columns[i] )        {	    case Length: length = true; break;            case Artist: case Album: ref = true; //note, no breaks            case Track: case Rating: case Score: case LastPlayed:                totals = true; break;            case Filename: case Directory: url = true; break;        }    if ( length )        decrementLengths();    if( totals )        decrementTotals();    if( ref )        derefAlbum();    if ( url )        Playlist::instance()->m_urlIndex.remove(this);}void PlaylistItem::reactToChanges( const QValueList<int> &columns ){    MetaBundle::reactToChanges(columns);    bool totals = false, ref = false, length = false, url = false;    for( int i = 0, n = columns.count(); i < n; ++i )      {        if( columns[i] == Mood )          moodbar().reset();	if ( !length && columns[i] == Length ) {	    length = true;	    incrementLengths();	    listView()->countChanged();	}        switch( columns[i] )        {            case Artist: case Album: ref = true; //note, no breaks            case Track: case Rating: case Score: case LastPlayed:                totals = true; break;            case Filename: case Directory: url = true;        }        updateColumn( columns[i] );      }    if ( url )        Playlist::instance()->m_urlIndex.add(this);    if( ref )        refAlbum();    if( totals )        incrementTotals();}void PlaylistItem::filter( const QString &expression ){    setVisible( matchesExpression( expression, listView()->visibleColumns() ) );}bool PlaylistItem::isCurrent() const{    return this == listView()->currentTrack();}bool PlaylistItem::isQueued() const{    return queuePosition() != -1;}int PlaylistItem::queuePosition() const{    return listView()->m_nextTracks.findRef( this );}void PlaylistItem::setEnabled(){    m_enabled = m_filestatusEnabled && m_dynamicEnabled;    setDropEnabled( m_enabled ); // this forbids items to be dropped into a history queue.    update();}void PlaylistItem::setDynamicEnabled( bool enabled ){    m_dynamicEnabled = enabled;    setEnabled();}void PlaylistItem::setFilestatusEnabled( bool enabled ){    m_filestatusEnabled = enabled;    checkExists();    setEnabled();}void PlaylistItem::setAllCriteriaEnabled( bool enabled ){    m_filestatusEnabled = enabled;    m_dynamicEnabled = enabled;    checkExists();    setEnabled();}void PlaylistItem::setSelected( bool selected ){    if( isEmpty() )        return;    if( isVisible() )    {        const bool prevSelected = isSelected();        KListViewItem::setSelected( selected );        if( prevSelected && !isSelected() )        {            listView()->m_selCount--;            listView()->m_selLength -= length();            listView()->countChanged();        }        else if( !prevSelected && isSelected() )        {            listView()->m_selCount++;            listView()->m_selLength += length();            listView()->countChanged();        }    }}void PlaylistItem::setVisible( bool visible ){    if( isEmpty() )        return;    if( !visible && isSelected() )    {        listView()->m_selCount--;        listView()->m_selLength -= length();        KListViewItem::setSelected( false );        listView()->countChanged();    }    const bool prevVisible = isVisible();    KListViewItem::setVisible( visible );    if( prevVisible && !isVisible() )    {        listView()->m_visCount--;        listView()->m_visLength -= length();        listView()->countChanged();        decrementTotals();    }    else if( !prevVisible && isVisible() )    {        listView()->m_visCount++;        listView()->m_visLength += length();        listView()->countChanged();        incrementTotals();    }}void PlaylistItem::setEditing( int column ){    switch( column )    {        case Title:        case Artist:        case Composer:        case Album:        case Genre:        case Comment:            setExactText( column, editingText() );            break;        case Year:       m_year       = -1; break;        case DiscNumber: m_discNumber = -1; break;        case Track:      m_track      = -1; break;        case Bpm:        m_bpm        = -1; break;        case Length:     m_length     = -1; break;        case Bitrate:    m_bitrate    = -1; break;        case SampleRate: m_sampleRate = -1; break;        case Score:      m_score      = -1; break;        case Rating:     m_rating     = -1; break;        case PlayCount:  m_playCount  = -1; break;        case LastPlayed: m_lastPlay   =  1; break;        default: warning() << "Tried to set the text of an immutable or nonexistent column!" << endl;    }    update();}bool PlaylistItem::isEditing( int column ) const{    switch( column )    {        case Title:        case Artist:        case Composer:        case Album:        case Genre:        case Comment: //FIXME fix this hack!            return exactText( column ) == editingText();        case Year:       return m_year       == -1;        case DiscNumber: return m_discNumber == -1;        case Track:      return m_track      == -1;        case Bpm:        return m_bpm        == -1;        case Length:     return m_length     == -1;        case Bitrate:    return m_bitrate    == -1;        case SampleRate: return m_sampleRate == -1;        case Score:      return m_score      == -1;        case Rating:     return m_rating     == -1;        case PlayCount:  return m_playCount  == -1;        case LastPlayed: return m_lastPlay   ==  1;        default: return false;    }}bool PlaylistItem::anyEditing() const{    for( int i = 0; i < NUM_COLUMNS; i++ )    {        if( isEditing( i ) )            return true;    }    return false;}int PlaylistItem::ratingAtPoint( int x ) //static{    Playlist* const pl = Playlist::instance();    x -= pl->header()->sectionPos( Rating );    return kClamp( ( x - 1 ) / ( StarManager::instance()->getGreyStar()->width() + pl->itemMargin() ) + 1, 1, 5 ) * 2;}int PlaylistItem::ratingColumnWidth() //static{    return StarManager::instance()->getGreyStar()->width() * 5 + Playlist::instance()->itemMargin() * 6;}void PlaylistItem::update() const{    listView()->repaintItem( this );}void PlaylistItem::updateColumn( int column ) const

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?