#include <assert.h>
#include "qt4.hpp"
-#include "components/playlist/playlist_model.hpp"
+#include "playlist_item.hpp"
#include <vlc_intf_strings.h>
-#include "pixmaps/type_unknown.xpm"
-
-#include <QSettings>
+#include "sorting.h"
/*************************************************************************
* Playlist item implementation
*/
-void PLItem::init( int _i_id, int _i_input_id, PLItem *parent, PLModel *m )
+void PLItem::init( playlist_item_t *_playlist_item, PLItem *parent )
{
parentItem = parent; /* Can be NULL, but only for the rootItem */
- i_id = _i_id; /* Playlist item specific id */
- i_input_id = _i_input_id; /* Identifier of the input */
- model = m; /* PLModel (QAbsmodel) */
- i_type = -1; /* Item type - Avoid segfault */
- b_current = false; /* Is the item the current Item or not */
-
- assert( model ); /* We need a model */
+ i_id = _playlist_item->i_id; /* Playlist item specific id */
+ p_input = _playlist_item->p_input;
+ vlc_gc_incref( p_input );
- /* No parent, should be the 2 main ones */
- if( parentItem == NULL )
- {
- if( model->i_depth == DEPTH_SEL ) /* Selector Panel */
- {
- item_col_strings.append( "" );
- }
- else
- {
- QSettings settings( "vlc", "vlc-qt-interface" );
- i_showflags = settings.value( "qt-pl-showflags" ).toInt();
- updateColumnHeaders();
- }
- }
- else
- {
- i_showflags = parentItem->i_showflags;
- //Add empty string and update() handles data appending
- item_col_strings.append( "" );
- }
}
/*
Constructors
Call the above function init
- So far the first constructor isn't used...
*/
-PLItem::PLItem( int _i_id, int _i_input_id, PLItem *parent, PLModel *m )
+PLItem::PLItem( playlist_item_t *p_item, PLItem *parent )
{
- init( _i_id, _i_input_id, parent, m );
+ init( p_item, parent );
}
-PLItem::PLItem( playlist_item_t * p_item, PLItem *parent, PLModel *m )
+PLItem::PLItem( playlist_item_t * p_item )
{
- init( p_item->i_id, p_item->p_input->i_id, parent, m );
+ init( p_item, NULL );
}
PLItem::~PLItem()
{
+ vlc_gc_decref( p_input );
qDeleteAll( children );
children.clear();
}
-/* Column manager */
-void PLItem::updateColumnHeaders()
-{
- item_col_strings.clear();
-
- for( int i_index=1; i_index <= VLC_META_ENGINE_ART_URL; i_index *= 2 )
- {
- if( i_showflags & i_index )
- {
- switch( i_index )
- {
- case VLC_META_ENGINE_ARTIST:
- item_col_strings.append( qtr( VLC_META_ARTIST ) );
- break;
- case VLC_META_ENGINE_TITLE:
- item_col_strings.append( qtr( VLC_META_TITLE ) );
- break;
- case VLC_META_ENGINE_DESCRIPTION:
- item_col_strings.append( qtr( VLC_META_DESCRIPTION ) );
- break;
- case VLC_META_ENGINE_DURATION:
- item_col_strings.append( qtr( "Duration" ) );
- break;
- case VLC_META_ENGINE_GENRE:
- item_col_strings.append( qtr( VLC_META_GENRE ) );
- break;
- case VLC_META_ENGINE_COLLECTION:
- item_col_strings.append( qtr( VLC_META_COLLECTION ) );
- break;
- case VLC_META_ENGINE_SEQ_NUM:
- item_col_strings.append( qtr( VLC_META_SEQ_NUM ) );
- break;
- case VLC_META_ENGINE_RATING:
- item_col_strings.append( qtr( VLC_META_RATING ) );
- break;
- default:
- break;
- }
- }
- }
-}
-
/* So far signal is always true.
Using signal false would not call PLModel... Why ?
*/
void PLItem::insertChild( PLItem *item, int i_pos, bool signal )
{
- if( signal )
- model->beginInsertRows( model->index( this , 0 ), i_pos, i_pos );
children.insert( i_pos, item );
- if( signal )
- model->endInsertRows();
}
-void PLItem::remove( PLItem *removed )
+void PLItem::removeChild( PLItem *item )
+{
+ children.removeOne( item );
+ delete item;
+}
+
+void PLItem::removeChildren()
+{
+ qDeleteAll( children );
+ children.clear();
+}
+
+void PLItem::takeChildAt( int index )
{
- if( model->i_depth == DEPTH_SEL || parentItem )
- {
- int i_index = parentItem->children.indexOf( removed );
- model->beginRemoveRows( model->index( parentItem, 0 ),
- i_index, i_index );
- parentItem->children.removeAt( i_index );
- model->endRemoveRows();
- }
+ PLItem *child = children[index];
+ child->parentItem = NULL;
+ children.removeAt( index );
}
/* This function is used to get one's parent's row number in the model */
return 0;
}
-/* update the PL Item, get the good names and so on */
-/* This function may not be the best way to do it
- It destroys everything and gets everything again instead of just
- building the necessary columns.
- This does extra work if you re-display the same column. Slower...
- On the other hand, this way saves memory.
- There must be a more clever way.
- */
-void PLItem::update( playlist_item_t *p_item, bool iscurrent )
-{
- char psz_duration[MSTRTIME_MAX_SIZE];
- char *psz_meta;
-
- assert( p_item->p_input->i_id == i_input_id );
-
- /* Useful for the model */
- i_type = p_item->p_input->i_type;
- b_current = iscurrent;
-
- item_col_strings.clear();
-
- if( model->i_depth == 1 ) /* Selector Panel */
- {
- item_col_strings.append( qfu( p_item->p_input->psz_name ) );
- return;
- }
-
-#define ADD_META( item, meta ) \
- psz_meta = input_item_Get ## meta ( item->p_input ); \
- item_col_strings.append( qfu( psz_meta ) ); \
- free( psz_meta );
-
- for( int i_index=1; i_index <= VLC_META_ENGINE_ART_URL; i_index *= 2 )
- {
- if( parentItem->i_showflags & i_index )
- {
- switch( i_index )
- {
- case VLC_META_ENGINE_ARTIST:
- ADD_META( p_item, Artist );
- break;
- case VLC_META_ENGINE_TITLE:
- char *psz_title;
- psz_title = input_item_GetTitle( p_item->p_input );
- if( psz_title )
- {
- ADD_META( p_item, Title );
- free( psz_title );
- }
- else
- {
- psz_title = input_item_GetName( p_item->p_input );
- if( psz_title )
- {
- item_col_strings.append( qfu( psz_title ) );
- }
- free( psz_title );
- }
- break;
- case VLC_META_ENGINE_DESCRIPTION:
- ADD_META( p_item, Description );
- break;
- case VLC_META_ENGINE_DURATION:
- secstotimestr( psz_duration,
- input_item_GetDuration( p_item->p_input ) / 1000000 );
- item_col_strings.append( QString( psz_duration ) );
- break;
- case VLC_META_ENGINE_GENRE:
- ADD_META( p_item, Genre );
- break;
- case VLC_META_ENGINE_COLLECTION:
- ADD_META( p_item, Album );
- break;
- case VLC_META_ENGINE_SEQ_NUM:
- ADD_META( p_item, TrackNum );
- break;
- case VLC_META_ENGINE_RATING:
- ADD_META( p_item, Rating );
- default:
- break;
- }
- }
- }
-#undef ADD_META
-}
-