* interface.cpp : wxWindows plugin for vlc
*****************************************************************************
* Copyright (C) 2000-2001 VideoLAN
- * $Id: interface.cpp,v 1.26 2003/05/11 15:55:51 gbazin Exp $
+ * $Id: interface.cpp,v 1.47 2003/07/17 18:58:23 gbazin Exp $
*
* Authors: Gildas Bazin <gbazin@netcourrier.com>
*
#include <stdio.h>
#include <vlc/vlc.h>
+#include <vlc/aout.h>
#ifdef WIN32 /* mingw32 hack */
#undef Yield
#include "bitmaps/previous.xpm"
#include "bitmaps/next.xpm"
#include "bitmaps/playlist.xpm"
-#define TOOLBAR_BMP_WIDTH 24
-#define TOOLBAR_BMP_HEIGHT 24
+#include "bitmaps/fast.xpm"
+#include "bitmaps/slow.xpm"
+
+#define TOOLBAR_BMP_WIDTH 36
+#define TOOLBAR_BMP_HEIGHT 36
/* include the icon graphic */
-#include "share/vlc32x32.xpm"
+#include "../../../share/vlc32x32.xpm"
/*****************************************************************************
* Local class declarations.
};
+class wxVolCtrl: public wxGauge
+{
+public:
+ /* Constructor */
+ wxVolCtrl( intf_thread_t *_p_intf, wxWindow* parent, wxWindowID id );
+ virtual ~wxVolCtrl() {};
+
+ void Change( int i_volume );
+
+ void OnChange( wxMouseEvent& event );
+
+private:
+ intf_thread_t *p_intf;
+
+ DECLARE_EVENT_TABLE();
+};
+
+BEGIN_EVENT_TABLE(wxVolCtrl, wxWindow)
+ /* Mouse events */
+ EVT_LEFT_DOWN(wxVolCtrl::OnChange)
+END_EVENT_TABLE()
+
/*****************************************************************************
* Event Table.
*****************************************************************************/
{
/* menu items */
Exit_Event = wxID_HIGHEST,
+ OpenFileSimple_Event,
OpenFile_Event,
OpenDisc_Event,
OpenNet_Event,
PlayStream_Event,
PrevStream_Event,
NextStream_Event,
+ SlowStream_Event,
+ FastStream_Event,
/* it is important for the id corresponding to the "About" command to have
* this standard value as otherwise it won't be handled properly under Mac
/* Menu events */
EVT_MENU(Exit_Event, Interface::OnExit)
EVT_MENU(About_Event, Interface::OnAbout)
- EVT_MENU(Playlist_Event, Interface::OnPlaylist)
- EVT_MENU(Logs_Event, Interface::OnLogs)
- EVT_MENU(FileInfo_Event, Interface::OnFileInfo)
- EVT_MENU(Prefs_Event, Interface::OnPreferences)
+
+ EVT_MENU(Playlist_Event, Interface::OnShowDialog)
+ EVT_MENU(Logs_Event, Interface::OnShowDialog)
+ EVT_MENU(FileInfo_Event, Interface::OnShowDialog)
+ EVT_MENU(Prefs_Event, Interface::OnShowDialog)
EVT_MENU_OPEN(Interface::OnMenuOpen)
#if defined( __WXMSW__ ) || defined( __WXMAC__ )
- EVT_CONTEXT_MENU(Interface::OnContextMenu)
-#else
- EVT_RIGHT_UP(Interface::OnContextMenu)
+ EVT_CONTEXT_MENU(Interface::OnContextMenu2)
#endif
+ EVT_RIGHT_UP(Interface::OnContextMenu)
/* Toolbar events */
- EVT_MENU(OpenFile_Event, Interface::OnOpenFile)
- EVT_MENU(OpenDisc_Event, Interface::OnOpenDisc)
- EVT_MENU(OpenNet_Event, Interface::OnOpenNet)
- EVT_MENU(OpenSat_Event, Interface::OnOpenSat)
+ EVT_MENU(OpenFileSimple_Event, Interface::OnShowDialog)
+ EVT_MENU(OpenFile_Event, Interface::OnShowDialog)
+ EVT_MENU(OpenDisc_Event, Interface::OnShowDialog)
+ EVT_MENU(OpenNet_Event, Interface::OnShowDialog)
+ EVT_MENU(OpenSat_Event, Interface::OnShowDialog)
EVT_MENU(StopStream_Event, Interface::OnStopStream)
EVT_MENU(PlayStream_Event, Interface::OnPlayStream)
EVT_MENU(PrevStream_Event, Interface::OnPrevStream)
EVT_MENU(NextStream_Event, Interface::OnNextStream)
+ EVT_MENU(SlowStream_Event, Interface::OnSlowStream)
+ EVT_MENU(FastStream_Event, Interface::OnFastStream)
/* Slider events */
EVT_COMMAND_SCROLL(SliderScroll_Event, Interface::OnSliderUpdate)
+
END_EVENT_TABLE()
/*****************************************************************************
* Constructor.
*****************************************************************************/
Interface::Interface( intf_thread_t *_p_intf ):
- wxFrame( NULL, -1, wxT(VOUT_TITLE),
+ wxFrame( NULL, -1, wxT("VLC media player"),
wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE )
{
/* Initializations */
p_intf = _p_intf;
- p_prefs_dialog = NULL;
i_old_playing_status = PAUSE_S;
/* Give our interface a nice little icon */
- p_intf->p_sys->p_icon = new wxIcon( vlc_xpm );
- SetIcon( *p_intf->p_sys->p_icon );
+ SetIcon( wxIcon( vlc_xpm ) );
/* Create a sizer for the main frame */
frame_sizer = new wxBoxSizer( wxHORIZONTAL );
/* Creation of the status bar
* Helptext for menu items and toolbar tools will automatically get
* displayed here. */
- int i_status_width[2] = {-2,-3};
- statusbar = CreateStatusBar( 2 ); /* 2 fields */
- statusbar->SetStatusWidths( 2, i_status_width );
+ int i_status_width[3] = {-6, -2, -9};
+ statusbar = CreateStatusBar( 3 ); /* 2 fields */
+ statusbar->SetStatusWidths( 3, i_status_width );
+ statusbar->SetStatusText( wxString::Format(wxT("x%.2f"), 1.0), 1 );
/* Make sure we've got the right background colour */
SetBackgroundColour( slider_frame->GetBackgroundColour() );
Interface::~Interface()
{
- if( p_prefs_dialog ) p_prefs_dialog->Destroy();
+ /* Clean up */
}
/*****************************************************************************
/* Create the "File" menu */
wxMenu *file_menu = new wxMenu;
- file_menu->Append( OpenFile_Event, wxU(_("&Open File...")),
+ file_menu->Append( OpenFileSimple_Event, wxU(_("Simple &Open ...")),
+ wxU(_(HELP_FILE)) );
+ file_menu->Append( OpenFile_Event, wxU(_("Open &File...")),
wxU(_(HELP_FILE)) );
file_menu->Append( OpenDisc_Event, wxU(_("Open &Disc...")),
wxU(_(HELP_DISC)) );
- file_menu->Append( OpenNet_Event, wxU(_("&Network Stream...")),
+ file_menu->Append( OpenNet_Event, wxU(_("Open &Network Stream...")),
wxU(_(HELP_NET)) );
#if 0
- file_menu->Append( OpenSat_Event, wxU(_("&Satellite Stream...")),
+ file_menu->Append( OpenSat_Event, wxU(_("Open &Satellite Stream...")),
wxU(_(HELP_NET)) );
#endif
#if 0
wxMenu *view_menu = new wxMenu;
view_menu->Append( Playlist_Event, wxU(_("&Playlist...")),
wxU(_(HELP_PLAYLIST)) );
- view_menu->Append( Logs_Event, wxU(_("&Logs...")), wxU(_(HELP_LOGS)) );
+ view_menu->Append( Logs_Event, wxU(_("&Messages...")), wxU(_(HELP_LOGS)) );
view_menu->Append( FileInfo_Event, wxU(_("&File info...")),
wxU(_(HELP_FILEINFO)) );
p_video_menu = new wxMenu;
b_video_menu = 1;
+ /* Create the "Navigation" menu */
+ p_navig_menu = new wxMenu;
+ b_navig_menu = 1;
+
/* Create the "Help" menu */
wxMenu *help_menu = new wxMenu;
help_menu->Append( About_Event, wxU(_("&About...")), wxU(_(HELP_ABOUT)) );
menubar->Append( settings_menu, wxU(_("&Settings")) );
menubar->Append( p_audio_menu, wxU(_("&Audio")) );
menubar->Append( p_video_menu, wxU(_("&Video")) );
+ menubar->Append( p_navig_menu, wxU(_("&Navigation")) );
menubar->Append( help_menu, wxU(_("&Help")) );
/* Attach the menu bar to the frame */
#define HELP_PLO N_("Open playlist")
#define HELP_PLP N_("Previous playlist item")
#define HELP_PLN N_("Next playlist item")
+#define HELP_SLOW N_("Play slower")
+#define HELP_FAST N_("Play faster")
wxLogNull LogDummy; /* Hack to suppress annoying log message on the win32
* version because we don't include wx.rc */
wxToolBar *toolbar = CreateToolBar(
- wxTB_HORIZONTAL | wxTB_TEXT | wxTB_FLAT | wxTB_DOCKABLE );
+ wxTB_HORIZONTAL | wxTB_FLAT | wxTB_DOCKABLE );
toolbar->SetToolBitmapSize( wxSize(TOOLBAR_BMP_WIDTH,TOOLBAR_BMP_HEIGHT) );
wxBitmap( previous_xpm ), wxU(_(HELP_PLP)) );
toolbar->AddTool( NextStream_Event, wxU(_("Next")), wxBitmap( next_xpm ),
wxU(_(HELP_PLN)) );
+ toolbar->AddTool( SlowStream_Event, wxU(_("Slower")), wxBitmap( slow_xpm ),
+ wxU(_(HELP_SLOW)) );
+ toolbar->AddTool( FastStream_Event, wxU(_("Faster")), wxBitmap( fast_xpm ),
+ wxU(_(HELP_FAST)) );
toolbar->Realize();
void Interface::CreateOurSlider()
{
- /* Create a new frame containing the slider */
+ /* Create a new frame and sizer containing the slider */
slider_frame = new wxPanel( this, -1, wxDefaultPosition, wxDefaultSize );
slider_frame->SetAutoLayout( TRUE );
+ wxBoxSizer *frame_sizer =
+ new wxBoxSizer( wxHORIZONTAL );
/* Create static box to surround the slider */
slider_box = new wxStaticBox( slider_frame, -1, wxT("") );
/* Create sizer for slider frame */
wxStaticBoxSizer *slider_sizer =
new wxStaticBoxSizer( slider_box, wxHORIZONTAL );
- slider_frame->SetSizer( slider_sizer );
slider_sizer->SetMinSize( -1, 50 );
/* Create slider */
slider = new wxSlider( slider_frame, SliderScroll_Event, 0, 0,
SLIDER_MAX_POS, wxDefaultPosition, wxDefaultSize );
- slider_sizer->Add( slider, 1, wxGROW | wxALL, 5 );
- slider_sizer->Layout();
- slider_sizer->SetSizeHints(slider_frame);
+ slider_sizer->Add( slider, 1, wxEXPAND | wxALL, 5 );
- /* Hide the slider by default */
- slider_frame->Hide();
-}
-void Interface::Open( int i_access_method )
-{
- /* Show/hide the open dialog */
- OpenDialog dialog( p_intf, this, i_access_method );
-
- if( dialog.ShowModal() == wxID_OK )
- {
- /* Update the playlist */
- playlist_t *p_playlist =
- (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
- FIND_ANYWHERE );
- if( p_playlist == NULL )
- {
- return;
- }
+ volctrl = new wxVolCtrl( p_intf, slider_frame, -1 );
- playlist_Add( p_playlist, (const char *)dialog.mrl.mb_str(),
- PLAYLIST_APPEND | PLAYLIST_GO, PLAYLIST_END );
-
- TogglePlayButton( PLAYING_S );
-
- /* Rebuild the playlist */
- p_intf->p_sys->p_playlist_window->Rebuild();
+ /* Add everything to the frame */
+ frame_sizer->Add( slider_sizer, 1, wxEXPAND | wxBOTTOM, 5 );
+ frame_sizer->Add( volctrl, 0, wxEXPAND | wxALL, 5 );
+ slider_frame->SetSizer( frame_sizer );
+ frame_sizer->Layout();
+ frame_sizer->SetSizeHints(slider_frame);
- vlc_object_release( p_playlist );
- }
+ /* Hide the slider by default */
+ slider_frame->Hide();
}
/*****************************************************************************
for( ; node; )
{
wxMenuItem *item = node->GetData();
- node = node->GetNext();
-
- /* Delete the submenus */
- wxMenu *submenu = item->GetSubMenu();
- if( submenu )
- {
- RecursiveDestroy( submenu );
- }
- menu->Delete( item );
+ node = node->GetNext();
+
+ /* Delete the submenus */
+ wxMenu *submenu = item->GetSubMenu();
+ if( submenu )
+ {
+ RecursiveDestroy( submenu );
+ }
+ menu->Delete( item );
}
}
}
else b_video_menu = 1;
}
+ else if( event.GetEventObject() == p_navig_menu )
+ {
+ if( b_navig_menu )
+ {
+ p_navig_menu = NavigMenu( p_intf, this );
+
+ /* Work-around for buggy wxGTK */
+ wxMenu *menu = GetMenuBar()->GetMenu( 5 );
+ RecursiveDestroy( menu );
+ /* End work-around */
+
+ menu =
+ GetMenuBar()->Replace( 5, p_navig_menu, wxU(_("&Navigation")));
+ if( menu ) delete menu;
+
+ b_navig_menu = 0;
+ }
+ else b_navig_menu = 1;
+ }
#else
p_audio_menu = AudioMenu( p_intf, this );
menu = GetMenuBar()->Replace( 4, p_video_menu, wxU(_("&Video")) );
if( menu ) delete menu;
+ p_navig_menu = NavigMenu( p_intf, this );
+ menu = GetMenuBar()->Replace( 5, p_navig_menu, wxU(_("&Navigation")) );
+ if( menu ) delete menu;
+
#endif
}
#if defined( __WXMSW__ ) || defined( __WXMAC__ )
-void Interface::OnContextMenu(wxContextMenuEvent& event)
+void Interface::OnContextMenu2(wxContextMenuEvent& event)
{
- ::PopupMenu( p_intf, this, ScreenToClient(event.GetPosition()) );
+ if( p_intf->p_sys->pf_show_dialog )
+ p_intf->p_sys->pf_show_dialog( p_intf, INTF_DIALOG_POPUPMENU, 0 );
+ //::PopupMenu( p_intf, this, ScreenToClient(event.GetPosition()) );
}
-#else
+#endif
void Interface::OnContextMenu(wxMouseEvent& event)
{
- ::PopupMenu( p_intf, this, event.GetPosition() );
+ if( p_intf->p_sys->pf_show_dialog )
+ p_intf->p_sys->pf_show_dialog( p_intf, INTF_DIALOG_POPUPMENU, 0 );
+ //::PopupMenu( p_intf, this, event.GetPosition() );
}
-#endif
void Interface::OnExit( wxCommandEvent& WXUNUSED(event) )
{
void Interface::OnAbout( wxCommandEvent& WXUNUSED(event) )
{
wxString msg;
- msg.Printf( wxString(wxT(VOUT_TITLE)) +
+ msg.Printf( wxString(wxT("VLC media player " VERSION)) +
wxU(_(" (wxWindows interface)\n\n")) +
wxU(_("(C) 1996-2003 - the VideoLAN Team\n\n")) +
wxU(_("The VideoLAN team <videolan@videolan.org>\n"
"\nIt can play MPEG and MPEG2 files from a file or from a "
"network source.")) );
- wxMessageBox( msg, wxString::Format(wxU(_("About %s")), wxT(VOUT_TITLE)),
- wxOK | wxICON_INFORMATION, this );
+ wxMessageBox( msg, wxString::Format(wxU(_("About %s")),
+ wxT("VLC media player")), wxOK | wxICON_INFORMATION, this );
}
-void Interface::OnPlaylist( wxCommandEvent& WXUNUSED(event) )
+void Interface::OnShowDialog( wxCommandEvent& event )
{
- /* Show/hide the playlist window */
- wxFrame *p_playlist_window = p_intf->p_sys->p_playlist_window;
- if( p_playlist_window )
+ if( p_intf->p_sys->pf_show_dialog )
{
- p_playlist_window->Show( ! p_playlist_window->IsShown() );
- }
-}
+ int i_id;
-void Interface::OnLogs( wxCommandEvent& WXUNUSED(event) )
-{
- /* Show/hide the log window */
- wxFrame *p_messages_window = p_intf->p_sys->p_messages_window;
- if( p_messages_window )
- {
- p_messages_window->Show( ! p_messages_window->IsShown() );
- }
-}
+ switch( event.GetId() )
+ {
+ case OpenFileSimple_Event:
+ i_id = INTF_DIALOG_FILE_SIMPLE;
+ break;
+ case OpenFile_Event:
+ i_id = INTF_DIALOG_FILE;
+ break;
+ case OpenDisc_Event:
+ i_id = INTF_DIALOG_DISC;
+ break;
+ case OpenNet_Event:
+ i_id = INTF_DIALOG_NET;
+ break;
+ case OpenSat_Event:
+ i_id = INTF_DIALOG_SAT;
+ break;
+ case Playlist_Event:
+ i_id = INTF_DIALOG_PLAYLIST;
+ break;
+ case Logs_Event:
+ i_id = INTF_DIALOG_MESSAGES;
+ break;
+ case FileInfo_Event:
+ i_id = INTF_DIALOG_FILEINFO;
+ break;
+ case Prefs_Event:
+ i_id = INTF_DIALOG_PREFS;
+ break;
+ default:
+ i_id = INTF_DIALOG_FILE;
+ break;
-void Interface::OnFileInfo( wxCommandEvent& WXUNUSED(event) )
-{
- /* Show/hide the file info window */
- wxFrame *p_fileinfo_window = p_intf->p_sys->p_fileinfo_window;
- if( p_fileinfo_window )
- {
- p_fileinfo_window->Show( ! p_fileinfo_window->IsShown() );
- }
-}
+ }
-void Interface::OnPreferences( wxCommandEvent& WXUNUSED(event) )
-{
- /* Show/hide the open dialog */
- if( p_prefs_dialog == NULL )
- {
- p_prefs_dialog = new PrefsDialog( p_intf, this );
+ p_intf->p_sys->pf_show_dialog( p_intf, i_id, 1 );
}
-
- if( p_prefs_dialog )
- {
- p_prefs_dialog->Show( true );
- }
-}
-
-void Interface::OnOpenFile( wxCommandEvent& WXUNUSED(event) )
-{
- Open( FILE_ACCESS );
-}
-
-void Interface::OnOpenDisc( wxCommandEvent& WXUNUSED(event) )
-{
- Open( DISC_ACCESS );
-}
-
-void Interface::OnOpenNet( wxCommandEvent& WXUNUSED(event) )
-{
- Open( NET_ACCESS );
-}
-
-void Interface::OnOpenSat( wxCommandEvent& WXUNUSED(event) )
-{
- Open( SAT_ACCESS );
}
void Interface::OnPlayStream( wxCommandEvent& WXUNUSED(event) )
if( p_playlist == NULL )
{
/* If the playlist is empty, open a file requester instead */
- OnOpenFile( dummy );
+ OnShowDialog( dummy );
return;
}
- vlc_mutex_lock( &p_playlist->object_lock );
if( p_playlist->i_size )
{
- vlc_mutex_unlock( &p_playlist->object_lock );
-
input_thread_t *p_input = (input_thread_t *)vlc_object_find( p_intf,
VLC_OBJECT_INPUT,
FIND_ANYWHERE );
}
/* Stream is paused, resume it */
- playlist_Play( p_playlist );
+ input_SetStatus( p_input, INPUT_STATUS_PLAY );
TogglePlayButton( PLAYING_S );
vlc_object_release( p_input );
vlc_object_release( p_playlist );
{
vlc_mutex_unlock( &p_playlist->object_lock );
vlc_object_release( p_playlist );
- OnOpenFile( dummy );
+ OnShowDialog( dummy );
}
}
vlc_object_release( p_playlist );
}
+void Interface::OnSlowStream( wxCommandEvent& WXUNUSED(event) )
+{
+ input_thread_t *p_input =
+ (input_thread_t *)vlc_object_find( p_intf, VLC_OBJECT_INPUT,
+ FIND_ANYWHERE );
+ if( p_input )
+ {
+ input_SetStatus( p_input, INPUT_STATUS_SLOWER );
+ vlc_object_release( p_input );
+ }
+}
+
+void Interface::OnFastStream( wxCommandEvent& WXUNUSED(event) )
+{
+ input_thread_t *p_input =
+ (input_thread_t *)vlc_object_find( p_intf, VLC_OBJECT_INPUT,
+ FIND_ANYWHERE );
+ if( p_input )
+ {
+ input_SetStatus( p_input, INPUT_STATUS_FASTER );
+ vlc_object_release( p_input );
+ }
+}
+
void Interface::TogglePlayButton( int i_playing_status )
{
if( i_playing_status == i_old_playing_status )
if( i_playing_status == PLAYING_S )
{
GetToolBar()->InsertTool( 5, PlayStream_Event, wxU(_("Pause")),
- wxBitmap( pause_xpm ) );
+ wxBitmap( pause_xpm ), wxNullBitmap,
+ wxITEM_NORMAL, wxU(_(HELP_PAUSE)) );
}
else
{
GetToolBar()->InsertTool( 5, PlayStream_Event, wxU(_("Play")),
- wxBitmap( play_xpm ) );
+ wxBitmap( play_xpm ), wxNullBitmap,
+ wxITEM_NORMAL, wxU(_(HELP_PLAY)) );
}
GetToolBar()->Realize();
bool DragAndDrop::OnDropFiles( wxCoord, wxCoord,
const wxArrayString& filenames )
{
- unsigned int i;
-
/* Add dropped files to the playlist */
playlist_t *p_playlist =
return FALSE;
}
- for( i = 0; i < filenames.GetCount(); i++ )
+ for( size_t i = 0; i < filenames.GetCount(); i++ )
playlist_Add( p_playlist, (const char *)filenames[i].mb_str(),
- PLAYLIST_APPEND | PLAYLIST_GO, PLAYLIST_END );
-
- /* Rebuild the playlist */
- p_intf->p_sys->p_playlist_window->Rebuild();
+ PLAYLIST_APPEND | (i ? 0 : PLAYLIST_GO), PLAYLIST_END );
vlc_object_release( p_playlist );
return TRUE;
}
#endif
+
+/*****************************************************************************
+ * Definition of wxVolCtrl class.
+ *****************************************************************************/
+wxVolCtrl::wxVolCtrl( intf_thread_t *_p_intf, wxWindow* parent, wxWindowID id )
+ : wxGauge( parent, id, 200, wxDefaultPosition, wxDefaultSize,
+ wxGA_VERTICAL | wxGA_SMOOTH )
+{
+ p_intf = _p_intf;
+}
+
+void wxVolCtrl::OnChange( wxMouseEvent& event )
+{
+ int i_volume = (GetRect().height - event.GetY()) * 200 / GetRect().height;
+ Change( i_volume );
+}
+
+void wxVolCtrl::Change( int i_volume )
+{
+ aout_VolumeSet( p_intf, i_volume * AOUT_VOLUME_MAX / 200 );
+ SetValue( i_volume );
+ SetToolTip( wxString::Format((wxString)wxU(_("Volume")) + wxT(" %d"),
+ i_volume ) );
+}