X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fbeos%2FPlayListWindow.cpp;h=829ca7841c2806b27e099f69b9d46a236a9f8289;hb=10a428a84cb36e20ff81ba052d772eb9013a26a8;hp=da289ebd0795bf06e4f07ad2a8ec60f8d2f8ad66;hpb=29b488fe1d592b77659873ce2873bed575fff735;p=vlc diff --git a/modules/gui/beos/PlayListWindow.cpp b/modules/gui/beos/PlayListWindow.cpp index da289ebd07..829ca7841c 100644 --- a/modules/gui/beos/PlayListWindow.cpp +++ b/modules/gui/beos/PlayListWindow.cpp @@ -1,8 +1,8 @@ /***************************************************************************** * PlayListWindow.cpp: beos interface ***************************************************************************** - * Copyright (C) 1999, 2000, 2001 VideoLAN - * $Id: PlayListWindow.cpp,v 1.5 2002/12/09 07:57:04 titer Exp $ + * Copyright (C) 1999, 2000, 2001 the VideoLAN team + * $Id$ * * Authors: Jean-Marc Dressler * Samuel Hocevar @@ -22,20 +22,18 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ - +#if 0 /* System headers */ #include #include -#include /* VLC headers */ #include -#include +#include /* BeOS interface headers */ -#include "VlcWrapper.h" #include "InterfaceWindow.h" #include "ListViews.h" #include "MsgVals.h" @@ -43,13 +41,17 @@ 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,97 +59,122 @@ enum * PlayListWindow::PlayListWindow *****************************************************************************/ PlayListWindow::PlayListWindow( BRect frame, const char* name, - 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 ), - fMainWindow( mainWindow ) + 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 ), + fMainWindow( mainWindow ) { - p_intf = p_interface; - p_wrapper = p_intf->p_sys->p_wrapper; + 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" ); + SetName( _("playlist") ); // set up the main menu bar - fMenuBar = new BMenuBar( BRect(0.0, 0.0, frame.Width(), 15.0), "main menu", - B_FOLLOW_NONE, B_ITEMS_IN_ROW, false ); + fMenuBar = new BMenuBar( BRect(0.0, 0.0, frame.Width(), 15.0), "main menu", + B_FOLLOW_NONE, B_ITEMS_IN_ROW, false ); AddChild( fMenuBar ); - // Add the File menu - BMenu *fileMenu = new BMenu( "File" ); - fMenuBar->AddItem( fileMenu ); - BMenuItem* item = new BMenuItem( "Open File" B_UTF8_ELLIPSIS, - new BMessage( OPEN_FILE ), 'O' ); - item->SetTarget( fMainWindow ); - fileMenu->AddItem( item ); - - CDMenu* cd_menu = new CDMenu( "Open Disc" ); - fileMenu->AddItem( cd_menu ); - - fileMenu->AddSeparatorItem(); - item = new BMenuItem( "Close", - new BMessage( B_QUIT_REQUESTED ), 'W' ); - fileMenu->AddItem( item ); - - // Add the Edit menu - 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 ); - - 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 ); - editMenu->AddSeparatorItem(); - item = new BMenuItem( "Remove", - new BMessage( MSG_REMOVE ) ); - editMenu->AddItem( item ); - item = new BMenuItem( "Remove All", - new BMessage( MSG_REMOVE_ALL ) ); - editMenu->AddItem( item ); - -editMenu->SetEnabled( false ); - - // make menu bar resize to correct height - float menuWidth, menuHeight; - fMenuBar->GetPreferredSize( &menuWidth, &menuHeight ); - // don't change next line! it's a workarround! - fMenuBar->ResizeTo( frame.Width(), menuHeight ); - - frame = Bounds(); - frame.top += fMenuBar->Bounds().IntegerHeight() + 1; - frame.right -= B_V_SCROLL_BAR_WIDTH; - - fListView = new PlaylistView( frame, fMainWindow ); - fBackgroundView = new BScrollView( "playlist scrollview", - fListView, B_FOLLOW_ALL_SIDES, - 0, false, true, - B_NO_BORDER ); - - AddChild( fBackgroundView ); - - // be up to date - UpdatePlaylist(); - FrameResized( Bounds().Width(), Bounds().Height() ); - SetSizeLimits( menuWidth * 2.0, menuWidth * 6.0, - menuHeight * 5.0, menuHeight * 25.0 ); - - UpdatePlaylist( true ); - // start window thread in hidden state - Hide(); - Show(); + // Add the File menu + BMenu *fileMenu = new BMenu( _("File") ); + fMenuBar->AddItem( fileMenu ); + 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") ); + fileMenu->AddItem( cd_menu ); + + fileMenu->AddSeparatorItem(); + item = new BMenuItem( _("Close"), + new BMessage( B_QUIT_REQUESTED ), 'W' ); + fileMenu->AddItem( item ); + + // Add the Edit menu + BMenu *editMenu = new BMenu( _("Edit") ); + fMenuBar->AddItem( editMenu ); + 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(); + 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(); + fRemoveMI = new BMenuItem( _("Remove"), + new BMessage( MSG_REMOVE ) ); + 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 ); + + 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; + fMenuBar->GetPreferredSize( &menuWidth, &menuHeight ); + // don't change next line! it's a workarround! + fMenuBar->ResizeTo( frame.Width(), menuHeight ); + + frame = Bounds(); + frame.top += fMenuBar->Bounds().IntegerHeight() + 1; + frame.right -= B_V_SCROLL_BAR_WIDTH; + + 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, + B_NO_BORDER ); + + AddChild( fBackgroundView ); + + // be up to date + UpdatePlaylist(); + FrameResized( Bounds().Width(), Bounds().Height() ); + SetSizeLimits( menuWidth * 1.5, menuWidth * 8.0, + menuHeight * 5.0, menuHeight * 50.0 ); + + UpdatePlaylist( true ); + // start window thread in hidden state + Hide(); + Show(); } /***************************************************************************** @@ -163,8 +190,8 @@ PlayListWindow::~PlayListWindow() bool PlayListWindow::QuitRequested() { - Hide(); - return false; + Hide(); + return false; } /***************************************************************************** @@ -173,32 +200,53 @@ PlayListWindow::QuitRequested() void PlayListWindow::MessageReceived( BMessage * p_message ) { - switch ( p_message->what ) - { - case OPEN_DVD: - case B_REFS_RECEIVED: - case B_SIMPLE_DATA: - // forward to interface window - fMainWindow->PostMessage( p_message ); - break; - case MSG_SELECT_ALL: - break; - case MSG_SELECT_NONE: - break; - case MSG_RANDOMIZE: - break; - case MSG_SORT_NAME: - break; - case MSG_SORT_PATH: - break; - case MSG_REMOVE: - break; - case MSG_REMOVE_ALL: - break; - default: - BWindow::MessageReceived( p_message ); - break; - } + switch ( p_message->what ) + { + case OPEN_DVD: + case B_REFS_RECEIVED: + case B_SIMPLE_DATA: + // forward to interface window + 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 ); + break; + } } /***************************************************************************** @@ -207,14 +255,14 @@ PlayListWindow::MessageReceived( BMessage * p_message ) void PlayListWindow::FrameResized(float width, float height) { - BRect r(Bounds()); - fMenuBar->MoveTo(r.LeftTop()); - fMenuBar->ResizeTo(r.Width(), fMenuBar->Bounds().Height()); - r.top += fMenuBar->Bounds().Height() + 1.0; - fBackgroundView->MoveTo(r.LeftTop()); - // the "+ 1.0" is to make the scrollbar - // be partly covered by the window border - fBackgroundView->ResizeTo(r.Width() + 1.0, r.Height() + 1.0); + BRect r(Bounds()); + fMenuBar->MoveTo(r.LeftTop()); + fMenuBar->ResizeTo(r.Width(), fMenuBar->Bounds().Height()); + r.top += fMenuBar->Bounds().Height() + 1.0; + fBackgroundView->MoveTo(r.LeftTop()); + // the "+ 1.0" is to make the scrollbar + // be partly covered by the window border + fBackgroundView->ResizeTo(r.Width() + 1.0, r.Height() + 1.0); } /***************************************************************************** @@ -234,17 +282,87 @@ PlayListWindow::ReallyQuit() void PlayListWindow::UpdatePlaylist( bool rebuild ) { - if ( rebuild ) - { - // 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 ) ) ); - } - fListView->SetCurrent( p_wrapper->PlaylistCurrent() ); - fListView->SetPlaying( p_wrapper->IsPlaying() ); + playlist_t * p_playlist; + + if( rebuild ) + fListView->RebuildList(); + + p_playlist = (playlist_t *) + vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); + fListView->SetCurrent( p_playlist->i_index ); + fListView->SetPlaying( p_playlist->status.i_status == PLAYLIST_RUNNING ); + vlc_object_release( p_playlist ); + + _CheckItemsEnableState(); +} + +/***************************************************************************** + * PlayListWindow::SetDisplayMode + *****************************************************************************/ +void +PlayListWindow::SetDisplayMode( uint32 mode ) +{ + if ( Lock() ) + { + // 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(); + } +} + +/***************************************************************************** + * 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 ); } +#endif