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

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * playtree.cpp
  3.  *****************************************************************************
  4.  * Copyright (C) 2005 the VideoLAN team
  5.  * $Id: 839b928291b101a03be093d42fb6cf0295104157 $
  6.  *
  7.  * Authors: Antoine Cellerier <dionoea@videolan.org>
  8.  *          Clément Stenac <zorglub@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 <vlc_common.h>
  28. #include "playtree.hpp"
  29. #include <vlc_playlist.h>
  30. #include "../utils/ustring.hpp"
  31. #include "vlc_charset.h"
  32. Playtree::Playtree( intf_thread_t *pIntf ): VarTree( pIntf )
  33. {
  34.     // Get the VLC playlist object
  35.     m_pPlaylist = pIntf->p_sys->p_playlist;
  36.     i_items_to_append = 0;
  37.     buildTree();
  38. }
  39. Playtree::~Playtree()
  40. {
  41. }
  42. void Playtree::delSelected()
  43. {
  44.     Iterator it = begin();
  45.     playlist_Lock( getIntf()->p_sys->p_playlist );
  46.     for( it = begin(); it != end(); it = getNextVisibleItem( it ) )
  47.     {
  48.         if( (*it).m_selected && !(*it).isReadonly() )
  49.         {
  50.             (*it).m_deleted = true;
  51.         }
  52.     }
  53.     /// todo Do this better (handle item-deleted)
  54.     tree_update descr;
  55.     descr.i_type = 3;
  56.     notify( &descr );
  57.     it = begin();
  58.     while( it != end() )
  59.     {
  60.         if( (*it).m_deleted )
  61.         {
  62.             VarTree::Iterator it2;
  63.             playlist_item_t *p_item = (playlist_item_t *)(it->m_pData);
  64.             if( p_item->i_children == -1 )
  65.             {
  66.                 playlist_DeleteFromInput( getIntf()->p_sys->p_playlist,
  67.                                           p_item->p_input->i_id, pl_Locked );
  68.                 it2 = getNextVisibleItem( it ) ;
  69.                 it->parent()->removeChild( it );
  70.                 it = it2;
  71.             }
  72.             else
  73.             {
  74.                 playlist_NodeDelete( getIntf()->p_sys->p_playlist, p_item,
  75.                                      true, false );
  76.                 it2 = getNextSibling( it );
  77.                 it->parent()->removeChild( it );
  78.                 it = it2;
  79.             }
  80.         }
  81.         else
  82.         {
  83.             it = getNextVisibleItem( it );
  84.         }
  85.     }
  86.     playlist_Unlock( getIntf()->p_sys->p_playlist );
  87. }
  88. void Playtree::action( VarTree *pItem )
  89. {
  90.     playlist_Lock( m_pPlaylist );
  91.     VarTree::Iterator it;
  92.     playlist_item_t *p_item = (playlist_item_t *)pItem->m_pData;
  93.     playlist_item_t *p_parent = p_item;
  94.     while( p_parent )
  95.     {
  96.         if( p_parent == m_pPlaylist->p_root_category )
  97.             break;
  98.         p_parent = p_parent->p_parent;
  99.     }
  100.     if( p_parent )
  101.     {
  102.         playlist_Control( m_pPlaylist, PLAYLIST_VIEWPLAY, pl_Locked, p_parent, p_item );
  103.     }
  104.     playlist_Unlock( m_pPlaylist );
  105. }
  106. void Playtree::onChange()
  107. {
  108.     buildTree();
  109.     tree_update descr;
  110.     descr.i_type = 1;
  111.     notify( &descr );
  112. }
  113. void Playtree::onUpdateItem( int id )
  114. {
  115.     Iterator it = findById( id );
  116.     tree_update descr;
  117.     descr.b_active_item = false;
  118.     if( it != end() )
  119.     {
  120.         // Update the item
  121.         playlist_item_t* pNode = (playlist_item_t*)(it->m_pData);
  122.         UString *pName = new UString( getIntf(), pNode->p_input->psz_name );
  123.         it->m_cString = UStringPtr( pName );
  124.         playlist_Lock( m_pPlaylist );
  125.         it->m_playing = playlist_CurrentPlayingItem( m_pPlaylist ) == pNode;
  126.         playlist_Unlock( m_pPlaylist );
  127.         if( it->m_playing ) descr.b_active_item = true;
  128.     }
  129.     else
  130.     {
  131.         msg_Warn(getIntf(), "cannot find node with id %d", id );
  132.     }
  133.     descr.i_type = 0;
  134.     notify( &descr );
  135. }
  136. /// todo keep a list of "recently removed" to avoid looking up if we
  137. //  already removed it
  138. void Playtree::onDelete( int i_id )
  139. {
  140.     tree_update descr;
  141.     descr.i_id = i_id;
  142.     descr.i_type = 3;
  143.     Iterator item = findById( i_id ) ;
  144.     if( item != end() )
  145.     {
  146.         if( item->parent() )
  147.             item->parent()->removeChild( item );
  148.         descr.b_visible = item->parent() ? true : item->parent()->m_expanded;
  149.         notify( &descr );
  150.     }
  151. }
  152. void Playtree::onAppend( playlist_add_t *p_add )
  153. {
  154.     i_items_to_append --;
  155.     Iterator node = findById( p_add->i_node );
  156.     if( node != end() )
  157.     {
  158.         Iterator item =  findById( p_add->i_item );
  159.         if( item == end() )
  160.         {
  161.             playlist_Lock( m_pPlaylist );
  162.             playlist_item_t *p_item = playlist_ItemGetById(
  163.                                         m_pPlaylist, p_add->i_item );
  164.             if( !p_item )
  165.             {
  166.                 playlist_Unlock( m_pPlaylist );
  167.                 return;
  168.             }
  169.             UString *pName = new UString( getIntf(),
  170.                                           p_item->p_input->psz_name );
  171.             node->add( p_add->i_item, UStringPtr( pName ),
  172.                       false,false, false, p_item->i_flags & PLAYLIST_RO_FLAG,
  173.                       p_item );
  174.             playlist_Unlock( m_pPlaylist );
  175.         }
  176.     }
  177.     tree_update descr;
  178.     descr.i_id = p_add->i_item;
  179.     descr.i_parent = p_add->i_node;
  180.     descr.b_visible = node->m_expanded;
  181.     descr.i_type = 2;
  182.     notify( &descr );
  183. }
  184. void Playtree::buildNode( playlist_item_t *pNode, VarTree &rTree )
  185. {
  186.     for( int i = 0; i < pNode->i_children; i++ )
  187.     {
  188.         UString *pName = new UString( getIntf(),
  189.                                    pNode->pp_children[i]->p_input->psz_name );
  190.         rTree.add( pNode->pp_children[i]->i_id, UStringPtr( pName ),
  191.                      false,
  192.                      playlist_CurrentPlayingItem(m_pPlaylist) == pNode->pp_children[i],
  193.                      false, pNode->pp_children[i]->i_flags & PLAYLIST_RO_FLAG,
  194.                      pNode->pp_children[i] );
  195.         if( pNode->pp_children[i]->i_children )
  196.         {
  197.             buildNode( pNode->pp_children[i], rTree.back() );
  198.         }
  199.     }
  200. }
  201. void Playtree::buildTree()
  202. {
  203.     clear();
  204.     playlist_Lock( m_pPlaylist );
  205.     i_items_to_append = 0;
  206.     clear();
  207.     /* TODO: Let user choose view - Stick with category ATM */
  208.     /* Set the root's name */
  209.     UString *pName = new UString( getIntf(),
  210.                              m_pPlaylist->p_root_category->p_input->psz_name );
  211.     m_cString = UStringPtr( pName );
  212.     buildNode( m_pPlaylist->p_root_category, *this );
  213.     playlist_Unlock( m_pPlaylist );
  214. //  What is it ?
  215. //    checkParents( NULL );
  216. }