* PlayListWindow.cpp: beos interface
*****************************************************************************
* Copyright (C) 1999, 2000, 2001 VideoLAN
- * $Id: PlayListWindow.cpp,v 1.4 2002/11/26 01:06:08 titer Exp $
+ * $Id: PlayListWindow.cpp,v 1.9 2003/04/22 16:36:16 titer Exp $
*
* Authors: Jean-Marc Dressler <polux@via.ecp.fr>
* Samuel Hocevar <sam@zoy.org>
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',
};
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,
+ BMenuItem* item = new BMenuItem( _AddEllipsis(_("Open File")),
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;
frame.top += fMenuBar->Bounds().IntegerHeight() + 1;
frame.right -= B_V_SCROLL_BAR_WIDTH;
- fListView = new PlaylistView( frame, fMainWindow );
+ fListView = new PlaylistView( frame, fMainWindow, p_wrapper,
+ new BMessage( MSG_SELECTION_CHANGED ) );
fBackgroundView = new BScrollView( "playlist scrollview",
fListView, B_FOLLOW_ALL_SIDES,
0, false, true,
// 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
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 );
PlayListWindow::UpdatePlaylist( bool rebuild )
{
if ( rebuild )
+ fListView->RebuildList();
+ fListView->SetCurrent( p_wrapper->PlaylistCurrent() );
+ fListView->SetPlaying( p_wrapper->IsPlaying() );
+
+ _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 < p_wrapper->PlaylistSize(); i++ )
- fListView->AddItem( new PlaylistItem( p_wrapper->PlaylistItemName( i ) ) );
+ // 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( p_wrapper->PlaylistCurrent() );
- fListView->SetPlaying( p_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 );
}