playlist_item.cpp
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:6k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * playlist_item.cpp : Manage playlist item
  3.  ****************************************************************************
  4.  * Copyright © 2006-2008 the VideoLAN team
  5.  * $Id: 0edde6a5f91c338b4de5c1333dd0fb0bfc70b3e1 $
  6.  *
  7.  * Authors: Clément Stenac <zorglub@videolan.org>
  8.  *          Jean-Baptiste Kempf <jb@videolan.org>
  9.  *
  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.
  14.  *
  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.
  19.  *
  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.  *****************************************************************************/
  24. #ifdef HAVE_CONFIG_H
  25. # include "config.h"
  26. #endif
  27. #include <assert.h>
  28. #include "qt4.hpp"
  29. #include "components/playlist/playlist_model.hpp"
  30. #include <vlc_intf_strings.h>
  31. #include <QSettings>
  32. #include "sorting.h"
  33. /*************************************************************************
  34.  * Playlist item implementation
  35.  *************************************************************************/
  36. /*
  37.    Playlist item is just a wrapper, an abstraction of the playlist_item
  38.    in order to be managed by PLModel
  39.    PLItem have a parent, and id and a input Id
  40. */
  41. void PLItem::init( int _i_id, int _i_input_id, PLItem *parent, PLModel *m, QSettings *settings )
  42. {
  43.     parentItem = parent;          /* Can be NULL, but only for the rootItem */
  44.     i_id       = _i_id;           /* Playlist item specific id */
  45.     i_input_id = _i_input_id;     /* Identifier of the input */
  46.     model      = m;               /* PLModel (QAbsmodel) */
  47.     i_type     = -1;              /* Item type - Avoid segfault */
  48.     b_current  = false;           /* Is the item the current Item or not */
  49.     assert( model );              /* We need a model */
  50.     /* No parent, should be the 2 main ones */
  51.     if( parentItem == NULL )
  52.     {
  53.         if( model->i_depth == DEPTH_SEL )  /* Selector Panel */
  54.         {
  55.             i_showflags = 0;
  56.             item_col_strings.append( "" );
  57.         }
  58.         else
  59.         {
  60.             i_showflags = settings->value( "qt-pl-showflags", COLUMN_DEFAULT ).toInt();
  61.             if( i_showflags < 1)
  62.                 i_showflags = COLUMN_DEFAULT; /* reasonable default to show something; */
  63.             else if ( i_showflags >= COLUMN_END )
  64.                 i_showflags = COLUMN_END - 1; /* show everything */
  65.             updateColumnHeaders();
  66.         }
  67.     }
  68.     else
  69.     {
  70.         i_showflags = parentItem->i_showflags;
  71.         //Add empty string and update() handles data appending
  72.         item_col_strings.append( "" );
  73.     }
  74. }
  75. /*
  76.    Constructors
  77.    Call the above function init
  78.    So far the first constructor isn't used...
  79.    */
  80. PLItem::PLItem( int _i_id, int _i_input_id, PLItem *parent, PLModel *m )
  81. {
  82.     init( _i_id, _i_input_id, parent, m, NULL );
  83. }
  84. PLItem::PLItem( playlist_item_t * p_item, PLItem *parent, PLModel *m )
  85. {
  86.     init( p_item->i_id, p_item->p_input->i_id, parent, m, NULL );
  87. }
  88. PLItem::PLItem( playlist_item_t * p_item, QSettings *settings, PLModel *m )
  89. {
  90.     init( p_item->i_id, p_item->p_input->i_id, NULL, m, settings );
  91. }
  92. PLItem::~PLItem()
  93. {
  94.     qDeleteAll( children );
  95.     children.clear();
  96. }
  97. /* Column manager */
  98. void PLItem::updateColumnHeaders()
  99. {
  100.     item_col_strings.clear();
  101.     assert( i_showflags < COLUMN_END );
  102.     for( uint32_t i_index=1; i_index < COLUMN_END; i_index <<= 1 )
  103.     {
  104.         if( i_showflags & i_index )
  105.             item_col_strings.append( qfu( psz_column_title( i_index ) ) );
  106.     }
  107. }
  108. /* So far signal is always true.
  109.    Using signal false would not call PLModel... Why ?
  110.  */
  111. void PLItem::insertChild( PLItem *item, int i_pos, bool signal )
  112. {
  113.     if( signal )
  114.         model->beginInsertRows( model->index( this , 0 ), i_pos, i_pos );
  115.     children.insert( i_pos, item );
  116.     if( signal )
  117.         model->endInsertRows();
  118. }
  119. void PLItem::remove( PLItem *removed )
  120. {
  121.     if( model->i_depth == DEPTH_SEL || parentItem )
  122.     {
  123.         int i_index = parentItem->children.indexOf( removed );
  124.         model->beginRemoveRows( model->index( parentItem, 0 ),
  125.                                 i_index, i_index );
  126.         parentItem->children.removeAt( i_index );
  127.         model->endRemoveRows();
  128.     }
  129. }
  130. /* This function is used to get one's parent's row number in the model */
  131. int PLItem::row() const
  132. {
  133.     if( parentItem )
  134.         return parentItem->children.indexOf( const_cast<PLItem*>(this) );
  135.        // We don't ever inherit PLItem, yet, but it might come :D
  136.     return 0;
  137. }
  138. /* update the PL Item, get the good names and so on */
  139. /* This function may not be the best way to do it
  140.    It destroys everything and gets everything again instead of just
  141.    building the necessary columns.
  142.    This does extra work if you re-display the same column. Slower...
  143.    On the other hand, this way saves memory.
  144.    There must be a more clever way.
  145.    */
  146. void PLItem::update( playlist_item_t *p_item, bool iscurrent )
  147. {
  148.     assert( p_item->p_input->i_id == i_input_id );
  149.     /* Useful for the model */
  150.     i_type = p_item->p_input->i_type;
  151.     b_current = iscurrent;
  152.     item_col_strings.clear();
  153.     if( model->i_depth == 1 )  /* Selector Panel */
  154.     {
  155.         item_col_strings.append( qfu( p_item->p_input->psz_name ) );
  156.         return;
  157.     }
  158.     i_showflags = parentItem ? parentItem->i_showflags : i_showflags;
  159.     /* Meta: ID */
  160.     if( i_showflags & COLUMN_NUMBER )
  161.     {
  162.         QModelIndex idx = model->index( this, 0 );
  163.         item_col_strings.append( QString::number( idx.row() + 1 ) );
  164.     }
  165.     /* Other meta informations */
  166.     for( uint32_t i_index=2; i_index < COLUMN_END; i_index <<= 1 )
  167.     {
  168.         if( i_showflags & i_index )
  169.         {
  170.             char *psz = psz_column_meta( p_item->p_input, i_index );
  171.             item_col_strings.append( qfu( psz ) );
  172.             free( psz );
  173.         }
  174.     }
  175. }