]> git.sesse.net Git - vlc/blobdiff - modules/gui/beos/PlayListWindow.cpp
* small fixes (the icon change should now work under windows)
[vlc] / modules / gui / beos / PlayListWindow.cpp
index 1ba66dc1baece67e89881aa8f48fa8f0b0acf2d6..5ee34763f6d6999d035853d74bdd23c70fa889e4 100644 (file)
@@ -2,7 +2,7 @@
  * PlayListWindow.cpp: beos interface
  *****************************************************************************
  * Copyright (C) 1999, 2000, 2001 VideoLAN
- * $Id: PlayListWindow.cpp,v 1.3 2002/10/10 23:11:52 titer Exp $
+ * $Id$
  *
  * Authors: Jean-Marc Dressler <polux@via.ecp.fr>
  *          Samuel Hocevar <sam@zoy.org>
@@ -35,7 +35,6 @@
 #include <vlc/intf.h>
 
 /* BeOS interface headers */
-#include "VlcWrapper.h"
 #include "InterfaceWindow.h"
 #include "ListViews.h"
 #include "MsgVals.h"
 
 enum
 {
-       MSG_SELECT_ALL          = 'sall',
-       MSG_SELECT_NONE         = 'none',
-       MSG_RANDOMIZE           = 'rndm',
-       MSG_SORT_NAME           = 'srtn',
-       MSG_SORT_PATH           = 'srtp',
-       MSG_REMOVE                      = 'rmov',
-       MSG_REMOVE_ALL          = 'rmal',
+       MSG_SELECT_ALL                  = 'sall',
+       MSG_SELECT_NONE                 = 'none',
+       MSG_RANDOMIZE                   = 'rndm',
+       MSG_SORT_REVERSE                = 'srtr',
+       MSG_SORT_NAME                   = 'srtn',
+       MSG_SORT_PATH                   = 'srtp',
+       MSG_REMOVE                              = 'rmov',
+       MSG_REMOVE_ALL                  = 'rmal',
+
+       MSG_SELECTION_CHANGED   = 'slch',
+       MSG_SET_DISPLAY                 = 'stds',
 };
 
 
@@ -57,16 +60,20 @@ enum
  * PlayListWindow::PlayListWindow
  *****************************************************************************/
 PlayListWindow::PlayListWindow( BRect frame, const char* name,
-                                                               playlist_t *playlist,
                                                                InterfaceWindow* mainWindow,
                                                                intf_thread_t *p_interface )
        :       BWindow( frame, name, B_FLOATING_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL,
                                 B_WILL_ACCEPT_FIRST_CLICK | B_ASYNCHRONOUS_CONTROLS ),
-               fPlaylist( playlist ),
                fMainWindow( mainWindow )
 {
-       this->p_intf = p_interface;
-    SetName( "playlist" );
+    char psz_tmp[1024];
+#define ADD_ELLIPSIS( a ) \
+    memset( psz_tmp, 0, 1024 ); \
+    snprintf( psz_tmp, 1024, "%s%s", a, B_UTF8_ELLIPSIS );
+
+       p_intf = p_interface;
+    
+    SetName( _("playlist") );
 
     // set up the main menu bar
        fMenuBar = new BMenuBar( BRect(0.0, 0.0, frame.Width(), 15.0), "main menu",
@@ -75,50 +82,70 @@ PlayListWindow::PlayListWindow( BRect frame, const char* name,
     AddChild( fMenuBar );
 
        // Add the File menu
-       BMenu *fileMenu = new BMenu( "File" );
+       BMenu *fileMenu = new BMenu( _("File") );
        fMenuBar->AddItem( fileMenu );
-       BMenuItem* item = new BMenuItem( "Open File" B_UTF8_ELLIPSIS,
-                                                                        new BMessage( OPEN_FILE ), 'O' );
+       ADD_ELLIPSIS( _("Open File") );
+       BMenuItem* item = new BMenuItem( psz_tmp, new BMessage( OPEN_FILE ), 'O' );
        item->SetTarget( fMainWindow );
        fileMenu->AddItem( item );
 
-       CDMenu* cd_menu = new CDMenu( "Open Disc" );
+       CDMenu* cd_menu = new CDMenu( _("Open Disc") );
        fileMenu->AddItem( cd_menu );
 
        fileMenu->AddSeparatorItem();
-       item = new BMenuItem( "Close",
+       item = new BMenuItem( _("Close"),
                                                  new BMessage( B_QUIT_REQUESTED ), 'W' );
        fileMenu->AddItem( item );
 
        // Add the Edit menu
-       BMenu *editMenu = new BMenu( "Edit" );
+       BMenu *editMenu = new BMenu( _("Edit") );
        fMenuBar->AddItem( editMenu );
-       item = new BMenuItem( "Select All",
-                                                 new BMessage( MSG_SELECT_ALL ), 'A' );
-       editMenu->AddItem( item );
-       item = new BMenuItem( "Select None",
-                                                 new BMessage( MSG_SELECT_NONE ), 'A', B_SHIFT_KEY );
-       editMenu->AddItem( item );
+       fSelectAllMI = new BMenuItem( _("Select All"),
+                                                                 new BMessage( MSG_SELECT_ALL ), 'A' );
+       editMenu->AddItem( fSelectAllMI );
+       fSelectNoneMI = new BMenuItem( _("Select None"),
+                                                                  new BMessage( MSG_SELECT_NONE ), 'A', B_SHIFT_KEY );
+       editMenu->AddItem( fSelectNoneMI );
 
        editMenu->AddSeparatorItem();
-       item = new BMenuItem( "Sort by Name",
-                                                 new BMessage( MSG_SORT_NAME ), 'N' );
-       editMenu->AddItem( item );
-       item = new BMenuItem( "Sort by Path",
-                                                 new BMessage( MSG_SORT_PATH ), 'P' );
-       editMenu->AddItem( item );
-       item = new BMenuItem( "Randomize",
-                                                 new BMessage( MSG_RANDOMIZE ), 'R' );
-       editMenu->AddItem( item );
+       fSortReverseMI = new BMenuItem( _("Sort Reverse"),
+                                                                new BMessage( MSG_SORT_REVERSE ), 'F' );
+       editMenu->AddItem( fSortReverseMI );
+       fSortNameMI = new BMenuItem( _("Sort by Name"),
+                                                                new BMessage( MSG_SORT_NAME ), 'N' );
+fSortNameMI->SetEnabled( false );
+       editMenu->AddItem( fSortNameMI );
+       fSortPathMI = new BMenuItem( _("Sort by Path"),
+                                                                new BMessage( MSG_SORT_PATH ), 'P' );
+fSortPathMI->SetEnabled( false );
+       editMenu->AddItem( fSortPathMI );
+       fRandomizeMI = new BMenuItem( _("Randomize"),
+                                                                 new BMessage( MSG_RANDOMIZE ), 'R' );
+fRandomizeMI->SetEnabled( false );
+       editMenu->AddItem( fRandomizeMI );
        editMenu->AddSeparatorItem();
-       item = new BMenuItem( "Remove",
+       fRemoveMI = new BMenuItem( _("Remove"),
                                                  new BMessage( MSG_REMOVE ) );
-       editMenu->AddItem( item );
-       item = new BMenuItem( "Remove All",
-                                                 new BMessage( MSG_REMOVE_ALL ) );
-       editMenu->AddItem( item );
+       editMenu->AddItem( fRemoveMI );
+       fRemoveAllMI = new BMenuItem( _("Remove All"),
+                                                                 new BMessage( MSG_REMOVE_ALL ) );
+       editMenu->AddItem( fRemoveAllMI );
+
+       // Add View menu
+       fViewMenu = new BMenu( _("View") );
+       fMenuBar->AddItem( fViewMenu );
+
+       fViewMenu->SetRadioMode( true );
+       BMessage* message = new BMessage( MSG_SET_DISPLAY );
+       message->AddInt32( "mode", DISPLAY_PATH );
+       item = new BMenuItem( _("Path"), message );
+       item->SetMarked( true );
+       fViewMenu->AddItem( item );
 
-editMenu->SetEnabled( false );
+       message = new BMessage( MSG_SET_DISPLAY );
+       message->AddInt32( "mode", DISPLAY_NAME );
+       item = new BMenuItem( _("Name"), message );
+       fViewMenu->AddItem( item );
 
        // make menu bar resize to correct height
        float menuWidth, menuHeight;
@@ -130,7 +157,8 @@ editMenu->SetEnabled( false );
        frame.top += fMenuBar->Bounds().IntegerHeight() + 1;
        frame.right -= B_V_SCROLL_BAR_WIDTH;
 
-       fListView = new PlaylistView( frame, fMainWindow );
+       fListView = new PlaylistView( p_intf, frame, fMainWindow,
+                                                                 new BMessage( MSG_SELECTION_CHANGED ) );
        fBackgroundView = new BScrollView( "playlist scrollview",
                                                                           fListView, B_FOLLOW_ALL_SIDES,
                                                                           0, false, true,
@@ -141,8 +169,8 @@ editMenu->SetEnabled( false );
        // be up to date
        UpdatePlaylist();
        FrameResized( Bounds().Width(), Bounds().Height() );
-       SetSizeLimits( menuWidth * 2.0, menuWidth * 6.0,
-                                  menuHeight * 5.0, menuHeight * 25.0 );
+       SetSizeLimits( menuWidth * 1.5, menuWidth * 8.0,
+                                  menuHeight * 5.0, menuHeight * 50.0 );
 
        UpdatePlaylist( true );
        // start window thread in hidden state
@@ -182,18 +210,39 @@ PlayListWindow::MessageReceived( BMessage * p_message )
                        fMainWindow->PostMessage( p_message );
                        break;
                case MSG_SELECT_ALL:
+                       fListView->Select( 0, fListView->CountItems() - 1 );
                        break;
                case MSG_SELECT_NONE:
+                       fListView->DeselectAll();
                        break;
                case MSG_RANDOMIZE:
                        break;
+               case MSG_SORT_REVERSE:
+                       fListView->SortReverse();
+                       break;
                case MSG_SORT_NAME:
                        break;
                case MSG_SORT_PATH:
                        break;
                case MSG_REMOVE:
+                       fListView->RemoveSelected();
                        break;
                case MSG_REMOVE_ALL:
+                       fListView->Select( 0, fListView->CountItems() - 1 );
+                       fListView->RemoveSelected();
+                       break;
+               case MSG_SELECTION_CHANGED:
+                       _CheckItemsEnableState();
+                       break;
+               case MSG_SET_DISPLAY:
+               {
+                       uint32 mode;
+                       if ( p_message->FindInt32( "mode", (int32*)&mode ) == B_OK )
+                               SetDisplayMode( mode );
+                       break;
+               }
+               case B_MODIFIERS_CHANGED:
+                       fListView->ModifiersChanged();
                        break;
                default:
                        BWindow::MessageReceived( p_message );
@@ -235,16 +284,80 @@ void
 PlayListWindow::UpdatePlaylist( bool rebuild )
 {
        if ( rebuild )
+               fListView->RebuildList();
+#if 0
+       fListView->SetCurrent( p_wrapper->PlaylistCurrent() );
+       fListView->SetPlaying( p_wrapper->IsPlaying() );
+#endif
+       _CheckItemsEnableState();
+}
+
+/*****************************************************************************
+ * PlayListWindow::SetDisplayMode
+ *****************************************************************************/
+void
+PlayListWindow::SetDisplayMode( uint32 mode )
+{
+       if ( Lock() )
        {
-               // remove all items
-               int32 count = fListView->CountItems();
-               while ( BListItem* item = fListView->RemoveItem( --count ) )
-                       delete item;
-       
-               // rebuild listview from VLC's playlist
-               for ( int i = 0; i < fPlaylist->i_size; i++ )
-                       fListView->AddItem( new PlaylistItem( fPlaylist->pp_items[i]->psz_name ) );
+               // propagate to list view
+               fListView->SetDisplayMode( mode );
+               // mark correct menu item
+               for ( int32 i = 0; BMenuItem* item = fViewMenu->ItemAt( i ); i++ )
+               {
+                       BMessage* message = item->Message();
+                       uint32 itemMode;
+                       if ( message
+                                && message->FindInt32( "mode", (int32*)&itemMode ) == B_OK
+                                && itemMode == mode )
+                       {
+                               item->SetMarked( true );
+                               break;
+                       }
+               }
+               Unlock();
        }
-       fListView->SetCurrent( fPlaylist->i_index );
-       fListView->SetPlaying( p_intf->p_sys->p_vlc_wrapper->is_playing() );
+}
+
+/*****************************************************************************
+ * PlayListWindow::DisplayMode
+ *****************************************************************************/
+uint32
+PlayListWindow::DisplayMode() const
+{
+       return fListView->DisplayMode();
+}
+
+/*****************************************************************************
+ * PlayListWindow::_CheckItemsEnableState
+ *****************************************************************************/
+void
+PlayListWindow::_CheckItemsEnableState() const
+{
+       // check if one item selected
+       int32 test = fListView->CurrentSelection( 0 );
+       bool enable1 = test >= 0;
+       // check if at least two items selected
+       test = fListView->CurrentSelection( 1 );
+       bool enable2 = test >= 0;
+       bool notEmpty = fListView->CountItems() > 0;
+       _SetMenuItemEnabled( fSelectAllMI, notEmpty );
+       _SetMenuItemEnabled( fSelectNoneMI, enable1 );
+       _SetMenuItemEnabled( fSortReverseMI, enable2 );
+//     _SetMenuItemEnabled( fSortNameMI, enable2 );
+//     _SetMenuItemEnabled( fSortPathMI, enable2 );
+//     _SetMenuItemEnabled( fRandomizeMI, enable2 );
+       _SetMenuItemEnabled( fRemoveMI, enable1 );
+       _SetMenuItemEnabled( fRemoveAllMI, notEmpty );
+}
+
+/*****************************************************************************
+ * PlayListWindow::_SetMenuItemEnabled
+ *****************************************************************************/
+void
+PlayListWindow::_SetMenuItemEnabled( BMenuItem* item, bool enabled ) const
+{
+       // this check should actally be done in BMenuItem::SetEnabled(), but it is not...
+       if ( item->IsEnabled() != enabled )
+               item->SetEnabled( enabled );
 }