//Maintainer: Max Howell <max.howell@methylblue.com>
//Copyright:  GPL v2

//NOTE please show restraint when adding data members to this class!
//     some users have playlists with 20,000 items or more in, one 32 bit int adds up rapidly!
//     -- on second thought, 80KB isn't all that much. be careful with TQStrings, though.


#ifndef PLAYLISTITEM_H
#define PLAYLISTITEM_H

#include "metabundle.h" //baseclass
#include "amarok_export.h"

#include <tdelistview.h> //baseclass
#include <kurl.h>      //stack allocated

#include <tqcolor.h>    //stack allocated
#include <tqfont.h>     //stack allocated
#include <tqmap.h>
#include <tqpixmap.h>
#include <tqvaluevector.h>

class TQColorGroup;
class TQDomNode;
class TQImage;
class TQListViewItem;
class TQPainter;
class MetaBundle;
class Playlist;
class PlaylistAlbum;

class LIBAMAROK_EXPORT PlaylistItem : public MetaBundle, public TDEListViewItem
{
    typedef MetaBundle super;
    public:
        /// Indicates that the current-track pixmap has changed. Animation must be redrawn.
        static void setPixmapChanged() { s_pixmapChanged = true; }

        /// For the glow colouration stuff
        static double glowIntensity;
        static TQColor glowText;
        static TQColor glowBase;

    public:
        PlaylistItem( TQListView*, TQListViewItem* ); //used by PlaylistLoader
        PlaylistItem( const MetaBundle&, TQListViewItem*, bool enabled = true );
        ~PlaylistItem();

        /// pass 'raw' data here, for example "92" for Length, and not "1:32"
        virtual void setText( int column, const TQString& );

        /**
        * @return The text of the column @p column, formatted for display purposes.
        * (For example, if the Length is 92, "1:32".)
        */
        virtual TQString text( int column ) const;

        void filter( const TQString &expression ); //makes visible depending on whether it matches

        bool isCurrent() const;

        bool isQueued() const;
        int queuePosition() const;

        bool isEnabled() const { return m_enabled; }
        bool isDynamicEnabled() const { return m_dynamicEnabled; }
        bool isFilestatusEnabled() const { return m_filestatusEnabled; }
        void setEnabled();
        void setDynamicEnabled( bool enabled );
        void setFilestatusEnabled( bool enabled );
        void setAllCriteriaEnabled( bool enabled );

        void setSelected( bool selected );
        void setVisible( bool visible );

        void setEditing( int column );
        bool isEditing( int column ) const;
        bool anyEditing() const;
        void setIsBeingRenamed( bool renaming ) { m_isBeingRenamed = renaming; }
        bool isBeingRenamed() const { return m_isBeingRenamed; }
        void setDeleteAfterEditing( bool dae ) { m_deleteAfterEdit = dae; }
        bool deleteAfterEditing() const { return m_deleteAfterEdit; }
        void setIsNew( bool is ) { m_isNew = is; }

        /// convenience functions
        Playlist *listView() const { return reinterpret_cast<Playlist*>( TDEListViewItem::listView() ); }
        PlaylistItem *nextSibling() const { return static_cast<PlaylistItem*>( TDEListViewItem::nextSibling() ); }

        static int ratingAtPoint( int x );
        static int ratingColumnWidth();

        /// like TQWidget::update()
        void update() const;

        //updates only the area of a specific column, avoids flickering of the current item marker
        void updateColumn( int column ) const;

        virtual void setup(); // from TQListViewItem

        virtual bool operator== ( const PlaylistItem & item ) const;
        virtual bool operator< ( const PlaylistItem & item ) const;

        PlaylistItem *nextInAlbum() const;
        PlaylistItem *prevInAlbum() const;

    protected:
        virtual void aboutToChange( const TQValueList<int> &columns );
        virtual void reactToChanges( const TQValueList<int> &columns );

    private:
        friend class Playlist;


        struct paintCacheItem {
            int width;
            int height;
            TQString text;
            TQFont font;
            TQColor color;
            bool selected;
            TQMap<TQString, TQPixmap> map;
        };

        virtual void paintCell( TQPainter*, const TQColorGroup&, int, int, int );
        void drawRating( TQPainter *p );
        void drawRating( TQPainter *p, int stars, int greystars, bool half );
        void drawMood( TQPainter *p, int width, int height );
        virtual void moodbarJobEvent( int newState );

        // Used for sorting
        virtual int compare( TQListViewItem*, int, bool ) const;

        /**
        * Paints a focus indicator on the rectangle (current item). We disable it
        * over the currentTrack, cause it would look like crap and flicker.
        */
        void paintFocus( TQPainter*, const TQColorGroup&, const TQRect& );

        static void imageTransparency( TQImage& image, float factor );

        AtomicString artist_album() const; // returns a placeholder 'artist' for compilations

        void refAlbum();
        void derefAlbum();

        void decrementTotals();
        void incrementTotals();

        void incrementCounts();
        void decrementCounts();
        void incrementLengths();
        void decrementLengths();

        int totalIncrementAmount() const;

        PlaylistAlbum *m_album;
        bool m_enabled;
        bool m_dynamicEnabled;
        bool m_filestatusEnabled;
        bool m_deleteAfterEdit;
        bool m_isBeingRenamed;
        bool m_isNew; //New items will be assigned a different color

        static bool s_pixmapChanged;
        static const TQString &editingText();
};

class PLItemList: public TQPtrList<PlaylistItem>
{
    public:
        PLItemList() : TQPtrList<PlaylistItem>() { }
        PLItemList( const TQPtrList<PlaylistItem> &list ) : TQPtrList<PlaylistItem>( list ) { }
        PLItemList( PlaylistItem *item ) : TQPtrList<PlaylistItem>() { append( item ); }

        inline PLItemList &operator<<( PlaylistItem *item ) { append( item ); return *this; }
};


#endif
