1 /*****************************************************************************
2 * playlist_item.cpp : Manage playlist item
3 ****************************************************************************
4 * Copyright © 2006-2008 the VideoLAN team
7 * Authors: Clément Stenac <zorglub@videolan.org>
8 * Jean-Baptiste Kempf <jb@videolan.org>
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23 *****************************************************************************/
32 #include "components/playlist/playlist_model.hpp"
33 #include <vlc_intf_strings.h>
35 #include "pixmaps/type_unknown.xpm"
39 /*************************************************************************
40 * Playlist item implementation
41 *************************************************************************/
44 Playlist item is just a wrapper, an abstraction of the playlist_item
45 in order to be managed by PLModel
47 PLItem have a parent, and id and a input Id
51 void PLItem::init( int _i_id, int _i_input_id, PLItem *parent, PLModel *m )
53 parentItem = parent; /* Can be NULL, but only for the rootItem */
54 i_id = _i_id; /* Playlist item specific id */
55 i_input_id = _i_input_id; /* Identifier of the input */
56 model = m; /* PLModel (QAbsmodel) */
57 i_type = -1; /* Item type - Avoid segfault */
58 b_current = false; /* Is the item the current Item or not */
60 assert( model ); /* We need a model */
62 /* No parent, should be the 2 main ones */
63 if( parentItem == NULL )
65 if( model->i_depth == DEPTH_SEL ) /* Selector Panel */
67 item_col_strings.append( "" );
71 QSettings settings( "vlc", "vlc-qt-interface" );
72 i_showflags = settings.value( "qt-pl-showflags" ).toInt();
73 updateColumnHeaders();
78 i_showflags = parentItem->i_showflags;
79 //Add empty string and update() handles data appending
80 item_col_strings.append( "" );
86 Call the above function init
87 So far the first constructor isn't used...
89 PLItem::PLItem( int _i_id, int _i_input_id, PLItem *parent, PLModel *m )
91 init( _i_id, _i_input_id, parent, m );
94 PLItem::PLItem( playlist_item_t * p_item, PLItem *parent, PLModel *m )
96 init( p_item->i_id, p_item->p_input->i_id, parent, m );
101 qDeleteAll( children );
106 void PLItem::updateColumnHeaders()
108 item_col_strings.clear();
110 for( int i_index=1; i_index <= VLC_META_ENGINE_ART_URL; i_index *= 2 )
112 if( i_showflags & i_index )
116 case VLC_META_ENGINE_ARTIST:
117 item_col_strings.append( qtr( VLC_META_ARTIST ) );
119 case VLC_META_ENGINE_TITLE:
120 item_col_strings.append( qtr( VLC_META_TITLE ) );
122 case VLC_META_ENGINE_DESCRIPTION:
123 item_col_strings.append( qtr( VLC_META_DESCRIPTION ) );
125 case VLC_META_ENGINE_DURATION:
126 item_col_strings.append( qtr( "Duration" ) );
128 case VLC_META_ENGINE_GENRE:
129 item_col_strings.append( qtr( VLC_META_GENRE ) );
131 case VLC_META_ENGINE_COLLECTION:
132 item_col_strings.append( qtr( VLC_META_COLLECTION ) );
134 case VLC_META_ENGINE_SEQ_NUM:
135 item_col_strings.append( qtr( VLC_META_SEQ_NUM ) );
137 case VLC_META_ENGINE_RATING:
138 item_col_strings.append( qtr( VLC_META_RATING ) );
147 /* So far signal is always true.
148 Using signal false would not call PLModel... Why ?
150 void PLItem::insertChild( PLItem *item, int i_pos, bool signal )
153 model->beginInsertRows( model->index( this , 0 ), i_pos, i_pos );
154 children.insert( i_pos, item );
156 model->endInsertRows();
159 void PLItem::remove( PLItem *removed )
161 if( model->i_depth == DEPTH_SEL || parentItem )
163 int i_index = parentItem->children.indexOf( removed );
164 model->beginRemoveRows( model->index( parentItem, 0 ),
166 parentItem->children.removeAt( i_index );
167 model->endRemoveRows();
171 /* This function is used to get one's parent's row number in the model */
172 int PLItem::row() const
175 return parentItem->children.indexOf( const_cast<PLItem*>(this) );
176 // We don't ever inherit PLItem, yet, but it might come :D
180 /* update the PL Item, get the good names and so on */
181 /* This function may not be the best way to do it
182 It destroys everything and gets everything again instead of just
183 building the necessary columns.
184 This does extra work if you re-display the same column. Slower...
185 On the other hand, this way saves memory.
186 There must be a more clever way.
188 void PLItem::update( playlist_item_t *p_item, bool iscurrent )
190 char psz_duration[MSTRTIME_MAX_SIZE];
193 assert( p_item->p_input->i_id == i_input_id );
195 /* Useful for the model */
196 i_type = p_item->p_input->i_type;
197 b_current = iscurrent;
199 item_col_strings.clear();
201 if( model->i_depth == 1 ) /* Selector Panel */
203 item_col_strings.append( qfu( p_item->p_input->psz_name ) );
207 #define ADD_META( item, meta ) \
208 psz_meta = input_item_Get ## meta ( item->p_input ); \
209 item_col_strings.append( qfu( psz_meta ) ); \
212 for( int i_index=1; i_index <= VLC_META_ENGINE_ART_URL; i_index *= 2 )
214 if( parentItem->i_showflags & i_index )
218 case VLC_META_ENGINE_ARTIST:
219 ADD_META( p_item, Artist );
221 case VLC_META_ENGINE_TITLE:
223 psz_title = input_item_GetTitle( p_item->p_input );
226 ADD_META( p_item, Title );
231 psz_title = input_item_GetName( p_item->p_input );
234 item_col_strings.append( qfu( psz_title ) );
239 case VLC_META_ENGINE_DESCRIPTION:
240 ADD_META( p_item, Description );
242 case VLC_META_ENGINE_DURATION:
243 secstotimestr( psz_duration,
244 input_item_GetDuration( p_item->p_input ) / 1000000 );
245 item_col_strings.append( QString( psz_duration ) );
247 case VLC_META_ENGINE_GENRE:
248 ADD_META( p_item, Genre );
250 case VLC_META_ENGINE_COLLECTION:
251 ADD_META( p_item, Album );
253 case VLC_META_ENGINE_SEQ_NUM:
254 ADD_META( p_item, TrackNum );
256 case VLC_META_ENGINE_RATING:
257 ADD_META( p_item, Rating );