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"
41 /*************************************************************************
42 * Playlist item implementation
43 *************************************************************************/
46 Playlist item is just a wrapper, an abstraction of the playlist_item
47 in order to be managed by PLModel
49 PLItem have a parent, and id and a input Id
53 void PLItem::init( int _i_id, int _i_input_id, PLItem *parent, PLModel *m )
55 parentItem = parent; /* Can be NULL, but only for the rootItem */
56 i_id = _i_id; /* Playlist item specific id */
57 i_input_id = _i_input_id; /* Identifier of the input */
58 model = m; /* PLModel (QAbsmodel) */
59 i_type = -1; /* Item type - Avoid segfault */
60 b_current = false; /* Is the item the current Item or not */
62 assert( model ); /* We need a model */
64 /* No parent, should be the 2 main ones */
65 if( parentItem == NULL )
67 if( model->i_depth == DEPTH_SEL ) /* Selector Panel */
69 item_col_strings.append( "" );
73 QSettings settings( "vlc", "vlc-qt-interface" );
74 i_showflags = settings.value( "qt-pl-showflags", 39 ).toInt();
76 i_showflags = 39; //reasonable default to show something;
77 updateColumnHeaders();
82 i_showflags = parentItem->i_showflags;
83 //Add empty string and update() handles data appending
84 item_col_strings.append( "" );
90 Call the above function init
91 So far the first constructor isn't used...
93 PLItem::PLItem( int _i_id, int _i_input_id, PLItem *parent, PLModel *m )
95 init( _i_id, _i_input_id, parent, m );
98 PLItem::PLItem( playlist_item_t * p_item, PLItem *parent, PLModel *m )
100 init( p_item->i_id, p_item->p_input->i_id, parent, m );
105 qDeleteAll( children );
110 void PLItem::updateColumnHeaders()
112 item_col_strings.clear();
114 assert( i_showflags < COLUMN_END );
116 for( uint32_t i_index=1; i_index < COLUMN_END; i_index <<= 1 )
118 if( i_showflags & i_index )
119 item_col_strings.append( qfu( psz_column_title( i_index ) ) );
123 /* So far signal is always true.
124 Using signal false would not call PLModel... Why ?
126 void PLItem::insertChild( PLItem *item, int i_pos, bool signal )
129 model->beginInsertRows( model->index( this , 0 ), i_pos, i_pos );
130 children.insert( i_pos, item );
132 model->endInsertRows();
135 void PLItem::remove( PLItem *removed )
137 if( model->i_depth == DEPTH_SEL || parentItem )
139 int i_index = parentItem->children.indexOf( removed );
140 model->beginRemoveRows( model->index( parentItem, 0 ),
142 parentItem->children.removeAt( i_index );
143 model->endRemoveRows();
147 /* This function is used to get one's parent's row number in the model */
148 int PLItem::row() const
151 return parentItem->children.indexOf( const_cast<PLItem*>(this) );
152 // We don't ever inherit PLItem, yet, but it might come :D
156 /* update the PL Item, get the good names and so on */
157 /* This function may not be the best way to do it
158 It destroys everything and gets everything again instead of just
159 building the necessary columns.
160 This does extra work if you re-display the same column. Slower...
161 On the other hand, this way saves memory.
162 There must be a more clever way.
164 void PLItem::update( playlist_item_t *p_item, bool iscurrent )
166 char psz_duration[MSTRTIME_MAX_SIZE];
169 assert( p_item->p_input->i_id == i_input_id );
171 /* Useful for the model */
172 i_type = p_item->p_input->i_type;
173 b_current = iscurrent;
175 item_col_strings.clear();
177 if( model->i_depth == 1 ) /* Selector Panel */
179 item_col_strings.append( qfu( p_item->p_input->psz_name ) );
183 assert( parentItem->i_showflags < COLUMN_END );
185 for( uint32_t i_index=1; i_index < COLUMN_END; i_index <<= 1 )
187 if( parentItem->i_showflags & i_index )
189 char *psz = psz_column_meta( p_item->p_input, i_index );
190 item_col_strings.append( qfu( psz ) );