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

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * PlayListWindow.cpp: beos interface
  3.  *****************************************************************************
  4.  * Copyright (C) 1999, 2000, 2001 the VideoLAN team
  5.  * $Id: 9e7a0de8696a5fbf385e1d8fe778b6c6d8762b8c $
  6.  *
  7.  * Authors: Jean-Marc Dressler <polux@via.ecp.fr>
  8.  *          Samuel Hocevar <sam@zoy.org>
  9.  *          Tony Castley <tony@castley.net>
  10.  *          Richard Shepherd <richard@rshepherd.demon.co.uk>
  11.  *          Stephan Aßmus <stippi@yellowbites.com>
  12.  *
  13.  * This program is free software; you can redistribute it and/or modify
  14.  * it under the terms of the GNU General Public License as published by
  15.  * the Free Software Foundation; either version 2 of the License, or
  16.  * (at your option) any later version.
  17.  *
  18.  * This program is distributed in the hope that it will be useful,
  19.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  20.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  21.  * GNU General Public License for more details.
  22.  *
  23.  * You should have received a copy of the GNU General Public License
  24.  * along with this program; if not, write to the Free Software
  25.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  26.  *****************************************************************************/
  27. #if 0
  28. /* System headers */
  29. #include <InterfaceKit.h>
  30. #include <StorageKit.h>
  31. /* VLC headers */
  32. #ifdef HAVE_CONFIG_H
  33. # include "config.h"
  34. #endif
  35. #include <vlc_common.h>
  36. #include <vlc_interface.h>
  37. /* BeOS interface headers */
  38. #include "InterfaceWindow.h"
  39. #include "ListViews.h"
  40. #include "MsgVals.h"
  41. #include "PlayListWindow.h"
  42. enum
  43. {
  44.     MSG_SELECT_ALL          = 'sall',
  45.     MSG_SELECT_NONE         = 'none',
  46.     MSG_RANDOMIZE           = 'rndm',
  47.     MSG_SORT_REVERSE        = 'srtr',
  48.     MSG_SORT_NAME           = 'srtn',
  49.     MSG_SORT_PATH           = 'srtp',
  50.     MSG_REMOVE              = 'rmov',
  51.     MSG_REMOVE_ALL          = 'rmal',
  52.     MSG_SELECTION_CHANGED   = 'slch',
  53.     MSG_SET_DISPLAY         = 'stds',
  54. };
  55. /*****************************************************************************
  56.  * PlayListWindow::PlayListWindow
  57.  *****************************************************************************/
  58. PlayListWindow::PlayListWindow( BRect frame, const char* name,
  59.                                 InterfaceWindow* mainWindow,
  60.                                 intf_thread_t *p_interface )
  61.     :   BWindow( frame, name, B_FLOATING_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL,
  62.                  B_WILL_ACCEPT_FIRST_CLICK | B_ASYNCHRONOUS_CONTROLS ),
  63.         fMainWindow( mainWindow )
  64. {
  65.     char psz_tmp[1024];
  66. #define ADD_ELLIPSIS( a ) 
  67.     memset( psz_tmp, 0, 1024 ); 
  68.     snprintf( psz_tmp, 1024, "%s%s", a, B_UTF8_ELLIPSIS );
  69.     p_intf = p_interface;
  70.  
  71.     SetName( _("playlist") );
  72.     // set up the main menu bar
  73.     fMenuBar = new BMenuBar( BRect(0.0, 0.0, frame.Width(), 15.0), "main menu",
  74.                              B_FOLLOW_NONE, B_ITEMS_IN_ROW, false );
  75.     AddChild( fMenuBar );
  76.     // Add the File menu
  77.     BMenu *fileMenu = new BMenu( _("File") );
  78.     fMenuBar->AddItem( fileMenu );
  79.     ADD_ELLIPSIS( _("Open File") );
  80.     BMenuItem* item = new BMenuItem( psz_tmp, new BMessage( OPEN_FILE ), 'O' );
  81.     item->SetTarget( fMainWindow );
  82.     fileMenu->AddItem( item );
  83.     CDMenu* cd_menu = new CDMenu( _("Open Disc") );
  84.     fileMenu->AddItem( cd_menu );
  85.     fileMenu->AddSeparatorItem();
  86.     item = new BMenuItem( _("Close"),
  87.                           new BMessage( B_QUIT_REQUESTED ), 'W' );
  88.     fileMenu->AddItem( item );
  89.     // Add the Edit menu
  90.     BMenu *editMenu = new BMenu( _("Edit") );
  91.     fMenuBar->AddItem( editMenu );
  92.     fSelectAllMI = new BMenuItem( _("Select All"),
  93.                                   new BMessage( MSG_SELECT_ALL ), 'A' );
  94.     editMenu->AddItem( fSelectAllMI );
  95.     fSelectNoneMI = new BMenuItem( _("Select None"),
  96.                                    new BMessage( MSG_SELECT_NONE ), 'A', B_SHIFT_KEY );
  97.     editMenu->AddItem( fSelectNoneMI );
  98.     editMenu->AddSeparatorItem();
  99.     fSortReverseMI = new BMenuItem( _("Sort Reverse"),
  100.                                  new BMessage( MSG_SORT_REVERSE ), 'F' );
  101.     editMenu->AddItem( fSortReverseMI );
  102.     fSortNameMI = new BMenuItem( _("Sort by Name"),
  103.                                  new BMessage( MSG_SORT_NAME ), 'N' );
  104. fSortNameMI->SetEnabled( false );
  105.     editMenu->AddItem( fSortNameMI );
  106.     fSortPathMI = new BMenuItem( _("Sort by Path"),
  107.                                  new BMessage( MSG_SORT_PATH ), 'P' );
  108. fSortPathMI->SetEnabled( false );
  109.     editMenu->AddItem( fSortPathMI );
  110.     fRandomizeMI = new BMenuItem( _("Randomize"),
  111.                                   new BMessage( MSG_RANDOMIZE ), 'R' );
  112. fRandomizeMI->SetEnabled( false );
  113.     editMenu->AddItem( fRandomizeMI );
  114.     editMenu->AddSeparatorItem();
  115.     fRemoveMI = new BMenuItem( _("Remove"),
  116.                           new BMessage( MSG_REMOVE ) );
  117.     editMenu->AddItem( fRemoveMI );
  118.     fRemoveAllMI = new BMenuItem( _("Remove All"),
  119.                                   new BMessage( MSG_REMOVE_ALL ) );
  120.     editMenu->AddItem( fRemoveAllMI );
  121.     // Add View menu
  122.     fViewMenu = new BMenu( _("View") );
  123.     fMenuBar->AddItem( fViewMenu );
  124.     fViewMenu->SetRadioMode( true );
  125.     BMessage* message = new BMessage( MSG_SET_DISPLAY );
  126.     message->AddInt32( "mode", DISPLAY_PATH );
  127.     item = new BMenuItem( _("Path"), message );
  128.     item->SetMarked( true );
  129.     fViewMenu->AddItem( item );
  130.     message = new BMessage( MSG_SET_DISPLAY );
  131.     message->AddInt32( "mode", DISPLAY_NAME );
  132.     item = new BMenuItem( _("Name"), message );
  133.     fViewMenu->AddItem( item );
  134.     // make menu bar resize to correct height
  135.     float menuWidth, menuHeight;
  136.     fMenuBar->GetPreferredSize( &menuWidth, &menuHeight );
  137.     // don't change next line! it's a workarround!
  138.     fMenuBar->ResizeTo( frame.Width(), menuHeight );
  139.     frame = Bounds();
  140.     frame.top += fMenuBar->Bounds().IntegerHeight() + 1;
  141.     frame.right -= B_V_SCROLL_BAR_WIDTH;
  142.     fListView = new PlaylistView( p_intf, frame, fMainWindow,
  143.                                   new BMessage( MSG_SELECTION_CHANGED ) );
  144.     fBackgroundView = new BScrollView( "playlist scrollview",
  145.                                        fListView, B_FOLLOW_ALL_SIDES,
  146.                                        0, false, true,
  147.                                        B_NO_BORDER );
  148.     AddChild( fBackgroundView );
  149.     // be up to date
  150.     UpdatePlaylist();
  151.     FrameResized( Bounds().Width(), Bounds().Height() );
  152.     SetSizeLimits( menuWidth * 1.5, menuWidth * 8.0,
  153.                    menuHeight * 5.0, menuHeight * 50.0 );
  154.     UpdatePlaylist( true );
  155.     // start window thread in hidden state
  156.     Hide();
  157.     Show();
  158. }
  159. /*****************************************************************************
  160.  * PlayListWindow::~PlayListWindow
  161.  *****************************************************************************/
  162. PlayListWindow::~PlayListWindow()
  163. {
  164. }
  165. /*****************************************************************************
  166.  * PlayListWindow::QuitRequested
  167.  *****************************************************************************/
  168. bool
  169. PlayListWindow::QuitRequested()
  170. {
  171.     Hide();
  172.     return false;
  173. }
  174. /*****************************************************************************
  175.  * PlayListWindow::MessageReceived
  176.  *****************************************************************************/
  177. void
  178. PlayListWindow::MessageReceived( BMessage * p_message )
  179. {
  180.     switch ( p_message->what )
  181.     {
  182.         case OPEN_DVD:
  183.         case B_REFS_RECEIVED:
  184.         case B_SIMPLE_DATA:
  185.             // forward to interface window
  186.             fMainWindow->PostMessage( p_message );
  187.             break;
  188.         case MSG_SELECT_ALL:
  189.             fListView->Select( 0, fListView->CountItems() - 1 );
  190.             break;
  191.         case MSG_SELECT_NONE:
  192.             fListView->DeselectAll();
  193.             break;
  194.         case MSG_RANDOMIZE:
  195.             break;
  196.         case MSG_SORT_REVERSE:
  197.             fListView->SortReverse();
  198.             break;
  199.         case MSG_SORT_NAME:
  200.             break;
  201.         case MSG_SORT_PATH:
  202.             break;
  203.         case MSG_REMOVE:
  204.             fListView->RemoveSelected();
  205.             break;
  206.         case MSG_REMOVE_ALL:
  207.             fListView->Select( 0, fListView->CountItems() - 1 );
  208.             fListView->RemoveSelected();
  209.             break;
  210.         case MSG_SELECTION_CHANGED:
  211.             _CheckItemsEnableState();
  212.             break;
  213.         case MSG_SET_DISPLAY:
  214.         {
  215.             uint32 mode;
  216.             if ( p_message->FindInt32( "mode", (int32*)&mode ) == B_OK )
  217.                 SetDisplayMode( mode );
  218.             break;
  219.         }
  220.         case B_MODIFIERS_CHANGED:
  221.             fListView->ModifiersChanged();
  222.             break;
  223.         default:
  224.             BWindow::MessageReceived( p_message );
  225.             break;
  226.     }
  227. }
  228. /*****************************************************************************
  229.  * PlayListWindow::FrameResized
  230.  *****************************************************************************/
  231. void
  232. PlayListWindow::FrameResized(float width, float height)
  233. {
  234.     BRect r(Bounds());
  235.     fMenuBar->MoveTo(r.LeftTop());
  236.     fMenuBar->ResizeTo(r.Width(), fMenuBar->Bounds().Height());
  237.     r.top += fMenuBar->Bounds().Height() + 1.0;
  238.     fBackgroundView->MoveTo(r.LeftTop());
  239.     // the "+ 1.0" is to make the scrollbar
  240.     // be partly covered by the window border
  241.     fBackgroundView->ResizeTo(r.Width() + 1.0, r.Height() + 1.0);
  242. }
  243. /*****************************************************************************
  244.  * PlayListWindow::ReallyQuit
  245.  *****************************************************************************/
  246. void
  247. PlayListWindow::ReallyQuit()
  248. {
  249.     Lock();
  250.     Hide();
  251.     Quit();
  252. }
  253. /*****************************************************************************
  254.  * PlayListWindow::UpdatePlaylist
  255.  *****************************************************************************/
  256. void
  257. PlayListWindow::UpdatePlaylist( bool rebuild )
  258. {
  259.     playlist_t * p_playlist;
  260.     if( rebuild )
  261.         fListView->RebuildList();
  262.     p_playlist = pl_Hold( p_intf );
  263.     fListView->SetCurrent( p_playlist->i_index );
  264.     fListView->SetPlaying( p_playlist->status.i_status == PLAYLIST_RUNNING );
  265.     pl_Release( p_intf );
  266.     _CheckItemsEnableState();
  267. }
  268. /*****************************************************************************
  269.  * PlayListWindow::SetDisplayMode
  270.  *****************************************************************************/
  271. void
  272. PlayListWindow::SetDisplayMode( uint32 mode )
  273. {
  274.     if ( Lock() )
  275.     {
  276.         // propagate to list view
  277.         fListView->SetDisplayMode( mode );
  278.         // mark correct menu item
  279.         for ( int32 i = 0; BMenuItem* item = fViewMenu->ItemAt( i ); i++ )
  280.         {
  281.             BMessage* message = item->Message();
  282.             uint32 itemMode;
  283.             if ( message
  284.                  && message->FindInt32( "mode", (int32*)&itemMode ) == B_OK
  285.                  && itemMode == mode )
  286.             {
  287.                 item->SetMarked( true );
  288.                 break;
  289.             }
  290.         }
  291.         Unlock();
  292.     }
  293. }
  294. /*****************************************************************************
  295.  * PlayListWindow::DisplayMode
  296.  *****************************************************************************/
  297. uint32
  298. PlayListWindow::DisplayMode() const
  299. {
  300.     return fListView->DisplayMode();
  301. }
  302. /*****************************************************************************
  303.  * PlayListWindow::_CheckItemsEnableState
  304.  *****************************************************************************/
  305. void
  306. PlayListWindow::_CheckItemsEnableState() const
  307. {
  308.     // check if one item selected
  309.     int32 test = fListView->CurrentSelection( 0 );
  310.     bool enable1 = test >= 0;
  311.     // check if at least two items selected
  312.     test = fListView->CurrentSelection( 1 );
  313.     bool enable2 = test >= 0;
  314.     bool notEmpty = fListView->CountItems() > 0;
  315.     _SetMenuItemEnabled( fSelectAllMI, notEmpty );
  316.     _SetMenuItemEnabled( fSelectNoneMI, enable1 );
  317.     _SetMenuItemEnabled( fSortReverseMI, enable2 );
  318. //  _SetMenuItemEnabled( fSortNameMI, enable2 );
  319. //  _SetMenuItemEnabled( fSortPathMI, enable2 );
  320. //  _SetMenuItemEnabled( fRandomizeMI, enable2 );
  321.     _SetMenuItemEnabled( fRemoveMI, enable1 );
  322.     _SetMenuItemEnabled( fRemoveAllMI, notEmpty );
  323. }
  324. /*****************************************************************************
  325.  * PlayListWindow::_SetMenuItemEnabled
  326.  *****************************************************************************/
  327. void
  328. PlayListWindow::_SetMenuItemEnabled( BMenuItem* item, bool enabled ) const
  329. {
  330.     // this check should actally be done in BMenuItem::SetEnabled(), but it is not...
  331.     if ( item->IsEnabled() != enabled )
  332.         item->SetEnabled( enabled );
  333. }
  334. #endif