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", 39 ).toInt();
74 i_showflags = 39; //reasonable default to show something;
75 updateColumnHeaders();
80 i_showflags = parentItem->i_showflags;
81 //Add empty string and update() handles data appending
82 item_col_strings.append( "" );
88 Call the above function init
89 So far the first constructor isn't used...
91 PLItem::PLItem( int _i_id, int _i_input_id, PLItem *parent, PLModel *m )
93 init( _i_id, _i_input_id, parent, m );
96 PLItem::PLItem( playlist_item_t * p_item, PLItem *parent, PLModel *m )
98 init( p_item->i_id, p_item->p_input->i_id, parent, m );
103 qDeleteAll( children );
108 void PLItem::updateColumnHeaders()
110 item_col_strings.clear();
112 for( int i_index=1; i_index <= VLC_META_ENGINE_ART_URL; i_index *= 2 )
114 if( i_showflags & i_index )
118 case VLC_META_ENGINE_ARTIST:
119 item_col_strings.append( qtr( VLC_META_ARTIST ) );
121 case VLC_META_ENGINE_TITLE:
122 item_col_strings.append( qtr( VLC_META_TITLE ) );
124 case VLC_META_ENGINE_DESCRIPTION:
125 item_col_strings.append( qtr( VLC_META_DESCRIPTION ) );
127 case VLC_META_ENGINE_DURATION:
128 item_col_strings.append( qtr( "Duration" ) );
130 case VLC_META_ENGINE_GENRE:
131 item_col_strings.append( qtr( VLC_META_GENRE ) );
133 case VLC_META_ENGINE_COLLECTION:
134 item_col_strings.append( qtr( VLC_META_COLLECTION ) );
136 case VLC_META_ENGINE_SEQ_NUM:
137 item_col_strings.append( qtr( VLC_META_SEQ_NUM ) );
139 case VLC_META_ENGINE_RATING:
140 item_col_strings.append( qtr( VLC_META_RATING ) );
149 /* So far signal is always true.
150 Using signal false would not call PLModel... Why ?
152 void PLItem::insertChild( PLItem *item, int i_pos, bool signal )
155 model->beginInsertRows( model->index( this , 0 ), i_pos, i_pos );
156 children.insert( i_pos, item );
158 model->endInsertRows();
161 void PLItem::remove( PLItem *removed )
163 if( model->i_depth == DEPTH_SEL || parentItem )
165 int i_index = parentItem->children.indexOf( removed );
166 model->beginRemoveRows( model->index( parentItem, 0 ),
168 parentItem->children.removeAt( i_index );
169 model->endRemoveRows();
173 /* This function is used to get one's parent's row number in the model */
174 int PLItem::row() const
177 return parentItem->children.indexOf( const_cast<PLItem*>(this) );
178 // We don't ever inherit PLItem, yet, but it might come :D
182 /* update the PL Item, get the good names and so on */
183 /* This function may not be the best way to do it
184 It destroys everything and gets everything again instead of just
185 building the necessary columns.
186 This does extra work if you re-display the same column. Slower...
187 On the other hand, this way saves memory.
188 There must be a more clever way.
190 void PLItem::update( playlist_item_t *p_item, bool iscurrent )
192 char psz_duration[MSTRTIME_MAX_SIZE];
195 assert( p_item->p_input->i_id == i_input_id );
197 /* Useful for the model */
198 i_type = p_item->p_input->i_type;
199 b_current = iscurrent;
201 item_col_strings.clear();
203 if( model->i_depth == 1 ) /* Selector Panel */
205 item_col_strings.append( qfu( p_item->p_input->psz_name ) );
209 #define ADD_META( item, meta ) \
210 psz_meta = input_item_Get ## meta ( item->p_input ); \
211 item_col_strings.append( qfu( psz_meta ) ); \
214 for( int i_index=1; i_index <= VLC_META_ENGINE_ART_URL; i_index *= 2 )
216 if( parentItem->i_showflags & i_index )
220 case VLC_META_ENGINE_ARTIST:
221 ADD_META( p_item, Artist );
223 case VLC_META_ENGINE_TITLE:
225 psz_title = input_item_GetTitle( p_item->p_input );
228 ADD_META( p_item, Title );
233 psz_title = input_item_GetName( p_item->p_input );
236 item_col_strings.append( qfu( psz_title ) );
241 case VLC_META_ENGINE_DESCRIPTION:
242 ADD_META( p_item, Description );
244 case VLC_META_ENGINE_DURATION:
245 secstotimestr( psz_duration,
246 input_item_GetDuration( p_item->p_input ) / 1000000 );
247 item_col_strings.append( QString( psz_duration ) );
249 case VLC_META_ENGINE_GENRE:
250 ADD_META( p_item, Genre );
252 case VLC_META_ENGINE_COLLECTION:
253 ADD_META( p_item, Album );
255 case VLC_META_ENGINE_SEQ_NUM:
256 ADD_META( p_item, TrackNum );
258 case VLC_META_ENGINE_RATING:
259 ADD_META( p_item, Rating );