* interface.cpp : wxWindows plugin for vlc
*****************************************************************************
* Copyright (C) 2000-2001 VideoLAN
- * $Id: interface.cpp,v 1.9 2002/11/23 18:42:59 gbazin Exp $
+ * $Id: interface.cpp,v 1.16 2003/03/26 00:56:22 gbazin Exp $
*
* Authors: Gildas Bazin <gbazin@netcourrier.com>
*
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
- *
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
#include <wx/wx.h>
#include <vlc/intf.h>
+#include "stream_control.h"
#include "wxwindows.h"
enum
{
/* menu items */
- Exit_Event = 1,
+ Exit_Event = wxID_HIGHEST,
OpenFile_Event,
OpenDisc_Event,
OpenNet_Event,
Playlist_Event,
Logs_Event,
+ FileInfo_Event,
Audio_Event,
Subtitles_Event,
SliderScroll_Event,
StopStream_Event,
PlayStream_Event,
- PauseStream_Event,
PrevStream_Event,
NextStream_Event,
EVT_MENU(Exit_Event, Interface::OnExit)
EVT_MENU(About_Event, Interface::OnAbout)
EVT_MENU(Playlist_Event, Interface::OnPlaylist)
- EVT_MENU(OpenFile_Event, Interface::OnOpenFile)
+ EVT_MENU(Logs_Event, Interface::OnLogs)
+ EVT_MENU(FileInfo_Event, Interface::OnFileInfo)
+ EVT_MENU(Prefs_Event, Interface::OnPreferences)
+
/* 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(StopStream_Event, Interface::OnStopStream)
EVT_MENU(PlayStream_Event, Interface::OnPlayStream)
- EVT_MENU(PauseStream_Event, Interface::OnPauseStream)
EVT_MENU(PrevStream_Event, Interface::OnPrevStream)
EVT_MENU(NextStream_Event, Interface::OnNextStream)
+
/* Slider events */
EVT_COMMAND_SCROLL(SliderScroll_Event, Interface::OnSliderUpdate)
END_EVENT_TABLE()
* Constructor.
*****************************************************************************/
Interface::Interface( intf_thread_t *_p_intf ):
- wxFrame( NULL, -1, "title", wxDefaultPosition, wxDefaultSize,
- wxDEFAULT_FRAME_STYLE )
+ wxFrame( NULL, -1, VOUT_TITLE,
+ wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE )
{
/* Initializations */
p_intf = _p_intf;
+ p_prefs_dialog = NULL;
+ p_fileinfo_window = NULL;
+ i_old_playing_status = PAUSE_S;
/* Give our interface a nice little icon */
SetIcon( *new wxIcon( vlc_xpm ) );
/* Creation of the slider sub-window */
CreateOurSlider();
- /* Creation of the status bar
+ /* 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 );
- SetTitle( COPYRIGHT_MESSAGE );
-
/* Make sure we've got the right background colour */
SetBackgroundColour( slider_frame->GetBackgroundColour() );
frame_sizer->Layout();
frame_sizer->Fit(this);
+#if !defined(__WXX11__)
/* Associate drop targets with the main interface */
SetDropTarget( new DragAndDrop( p_intf ) );
+#endif
}
Interface::~Interface()
{
+ if( p_prefs_dialog ) p_prefs_dialog->Destroy();
+ if( p_fileinfo_window ) p_fileinfo_window->Destroy();
}
/*****************************************************************************
#define HELP_PLAYLIST N_("Open the playlist")
#define HELP_LOGS N_("Show the program logs")
+#define HELP_FILEINFO N_("Show information about the file being played")
#define HELP_AUDIO N_("Change the current audio track")
#define HELP_SUBS N_("Change the current subtitles stream")
wxMenu *view_menu = new wxMenu;
view_menu->Append( Playlist_Event, _("&Playlist..."), HELP_PLAYLIST );
view_menu->Append( Logs_Event, _("&Logs..."), HELP_LOGS );
+ view_menu->Append( FileInfo_Event, _("&File info..."), HELP_FILEINFO );
/* Create the "Settings" menu */
wxMenu *settings_menu = new wxMenu;
/* Attach the menu bar to the frame */
SetMenuBar( menubar );
+#if !defined(__WXX11__)
/* Associate drop targets with the menubar */
menubar->SetDropTarget( new DragAndDrop( p_intf ) );
+#endif
}
void Interface::CreateOurToolBar()
#define HELP_PLP N_("Previous playlist item")
#define HELP_PLN N_("Next playlist item")
- wxBitmap *p_bmp_file = new wxBitmap( file_xpm );
- wxBitmap *p_bmp_disc = new wxBitmap( disc_xpm );
- wxBitmap *p_bmp_net = new wxBitmap( net_xpm );
- wxBitmap *p_bmp_play = new wxBitmap( play_xpm );
- wxBitmap *p_bmp_stop = new wxBitmap( stop_xpm );
- wxBitmap *p_bmp_pause = new wxBitmap( pause_xpm );
- wxBitmap *p_bmp_prev = new wxBitmap( previous_xpm );
- wxBitmap *p_bmp_next = new wxBitmap( next_xpm );
- wxBitmap *p_bmp_playlist = new wxBitmap( playlist_xpm );
+ 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 );
toolbar->SetToolBitmapSize( wxSize(TOOLBAR_BMP_WIDTH,TOOLBAR_BMP_HEIGHT) );
- toolbar->AddTool( OpenFile_Event, _("File"), *p_bmp_file, HELP_FILE );
- toolbar->AddTool( OpenFile_Event, _("Disc"), *p_bmp_disc, HELP_DISC );
- toolbar->AddTool( OpenFile_Event, _("Net"), *p_bmp_net, HELP_NET );
+ toolbar->AddTool( OpenFile_Event, _("File"), wxBitmap( file_xpm ),
+ HELP_FILE );
+ toolbar->AddTool( OpenDisc_Event, _("Disc"), wxBitmap( disc_xpm ),
+ HELP_DISC );
+ toolbar->AddTool( OpenNet_Event, _("Net"), wxBitmap( net_xpm ),
+ HELP_NET );
#if 0
- toolbar->AddTool( OpenFile_Event, _("Sat"), *p_bmp_net, HELP_SAT );
+ toolbar->AddTool( OpenSat_Event, _("Sat"), wxBitmap( sat_xpm ),
+ HELP_SAT );
#endif
toolbar->AddSeparator();
- toolbar->AddTool( StopStream_Event, _("Stop"), *p_bmp_stop, HELP_STOP );
- toolbar->AddTool( PlayStream_Event, _("Play"), *p_bmp_play, HELP_PLAY );
- toolbar->AddTool( PauseStream_Event, _("Pause"), *p_bmp_pause, HELP_PAUSE);
+ toolbar->AddTool( StopStream_Event, _("Stop"), wxBitmap( stop_xpm ),
+ HELP_STOP );
+ toolbar->AddTool( PlayStream_Event, _("Play"), wxBitmap( play_xpm ),
+ HELP_PLAY );
toolbar->AddSeparator();
- toolbar->AddTool( Playlist_Event, _("Playlist"), *p_bmp_playlist,
+ toolbar->AddTool( Playlist_Event, _("Playlist"), wxBitmap( playlist_xpm ),
HELP_PLO );
- toolbar->AddTool( PrevStream_Event, _("Prev"), *p_bmp_prev, HELP_PLP );
- toolbar->AddTool( NextStream_Event, _("Next"), *p_bmp_next, HELP_PLN );
+ toolbar->AddTool( PrevStream_Event, _("Prev"), wxBitmap( previous_xpm ),
+ HELP_PLP );
+ toolbar->AddTool( NextStream_Event, _("Next"), wxBitmap( next_xpm ),
+ HELP_PLN );
toolbar->Realize();
wxBoxSizer *toolbar_sizer = new wxBoxSizer( wxHORIZONTAL );
toolbar_sizer->Add( toolbar, 0, 0, 0 );
toolbar_sizer->Layout();
+
+#ifndef WIN32
frame_sizer->SetMinSize( toolbar_sizer->GetMinSize().GetWidth(), -1 );
+#else
+ frame_sizer->SetMinSize( toolbar->GetToolSize().GetWidth() *
+ toolbar->GetToolsCount(), -1 );
+#endif
+#if !defined(__WXX11__)
/* Associate drop targets with the toolbar */
toolbar->SetDropTarget( new DragAndDrop( p_intf ) );
+#endif
}
void Interface::CreateOurSlider()
slider_sizer->SetSizeHints(slider_frame);
}
+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;
+ }
+
+ msg_Err( p_intf, "%s", (char *)dialog.mrl.c_str() );
+
+ playlist_Add( p_playlist, (char *)dialog.mrl.c_str(),
+ PLAYLIST_APPEND | PLAYLIST_GO, PLAYLIST_END );
+
+ TogglePlayButton( PLAYING_S );
+
+ /* Rebuild the playlist */
+ p_intf->p_sys->p_playlist_window->Rebuild();
+
+ vlc_object_release( p_playlist );
+ }
+}
+
/*****************************************************************************
* Event Handlers.
*****************************************************************************/
void Interface::OnAbout( wxCommandEvent& WXUNUSED(event) )
{
wxString msg;
- msg.Printf( _("This is the about dialog of the VideoLAN Client.\n") );
-
- wxMessageBox( msg, _("About VideoLAN Client"),
+ msg.Printf( VOUT_TITLE + wxString(_(" (wxWindows interface)\n\n")) +
+ wxString(_("(C) 1996-2003 - the VideoLAN Team\n\n")) +
+ wxString(_("The VideoLAN team <videolan@videolan.org>\n"
+ "http://www.videolan.org/\n\n")) +
+ wxString(_("This is the VideoLAN Client, a DVD, MPEG and DivX player."
+ "\nIt can play MPEG and MPEG2 files from a file or from a "
+ "network source.")) );
+
+ wxMessageBox( msg, wxString(_("About ")) + VOUT_TITLE,
wxOK | wxICON_INFORMATION, this );
}
}
}
-void Interface::OnOpenFile( wxCommandEvent& WXUNUSED(event) )
+void Interface::OnLogs( wxCommandEvent& WXUNUSED(event) )
{
- wxFileDialog dialog( this, _("Open file"), _(""), _(""), _("*.*") );
+ /* 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() );
+ }
+}
- if( dialog.ShowModal() == wxID_OK )
+void Interface::OnFileInfo( wxCommandEvent& WXUNUSED(event) )
+{
+ /* Show/hide the fileinfo window */
+ if( p_fileinfo_window == NULL )
{
- /* Update the playlist */
- playlist_t *p_playlist =
- (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
- FIND_ANYWHERE );
- if( p_playlist == NULL )
- {
- return;
- }
+ p_fileinfo_window = new FileInfo( p_intf, this );
+ }
- playlist_Add( p_playlist, (char *)dialog.GetPath().c_str(),
- PLAYLIST_APPEND | PLAYLIST_GO, PLAYLIST_END );
+ if( p_fileinfo_window )
+ {
+ p_fileinfo_window->Show( true );//! p_messages_window->IsShown() );
+ }
+}
- /* Rebuild the playlist */
- p_intf->p_sys->p_playlist_window->Rebuild();
+void Interface::OnPreferences( wxCommandEvent& WXUNUSED(event) )
+{
+ /* Show/hide the open dialog */
+ if( p_prefs_dialog == NULL )
+ {
+ p_prefs_dialog = new PrefsDialog( p_intf, this );
+ }
- vlc_object_release( p_playlist );
+ 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) )
{
wxCommandEvent dummy;
FIND_ANYWHERE );
if( p_playlist == NULL )
{
+ /* If the playlist is empty, open a file requester instead */
OnOpenFile( dummy );
return;
}
- /* If the playlist is empty, open a file requester instead */
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 );
+ if( p_input == NULL )
+ {
+ /* No stream was playing, start one */
+ playlist_Play( p_playlist );
+ TogglePlayButton( PLAYING_S );
+ vlc_object_release( p_playlist );
+ return;
+ }
+
+ if( p_input->stream.control.i_status != PAUSE_S )
+ {
+ /* A stream is being played, pause it */
+ input_SetStatus( p_input, INPUT_STATUS_PAUSE );
+ TogglePlayButton( PAUSE_S );
+ vlc_object_release( p_playlist );
+ vlc_object_release( p_input );
+ return;
+ }
+
+ /* Stream is paused, resume it */
playlist_Play( p_playlist );
+ TogglePlayButton( PLAYING_S );
+ vlc_object_release( p_input );
vlc_object_release( p_playlist );
}
else
}
playlist_Stop( p_playlist );
+ TogglePlayButton( PAUSE_S );
vlc_object_release( p_playlist );
}
-void Interface::OnPauseStream( wxCommandEvent& WXUNUSED(event) )
+void Interface::OnSliderUpdate( wxScrollEvent& event )
{
- if( p_intf->p_sys->p_input == NULL )
+ vlc_mutex_lock( &p_intf->change_lock );
+
+#ifdef WIN32
+ if( event.GetEventType() == wxEVT_SCROLL_THUMBRELEASE
+ || event.GetEventType() == wxEVT_SCROLL_ENDSCROLL )
{
- return;
+#endif
+ if( p_intf->p_sys->i_slider_pos != event.GetPosition()
+ && p_intf->p_sys->p_input )
+ {
+ p_intf->p_sys->i_slider_pos = event.GetPosition();
+ input_Seek( p_intf->p_sys->p_input, p_intf->p_sys->i_slider_pos *
+ 100 / SLIDER_MAX_POS,
+ INPUT_SEEK_PERCENT | INPUT_SEEK_SET );
+ }
+
+#ifdef WIN32
+ p_intf->p_sys->b_slider_free = VLC_TRUE;
}
+ else
+ {
+ p_intf->p_sys->b_slider_free = VLC_FALSE;
+
+ if( p_intf->p_sys->p_input )
+ {
+ /* Update stream date */
+#define p_area p_intf->p_sys->p_input->stream.p_selected_area
+ char psz_time[ OFFSETTOTIME_MAX_SIZE ];
+
+ slider_box->SetLabel(
+ input_OffsetToTime( p_intf->p_sys->p_input,
+ psz_time,
+ p_area->i_size * event.GetPosition()
+ / SLIDER_MAX_POS ) );
+#undef p_area
+ }
+ }
+#endif
- input_SetStatus( p_intf->p_sys->p_input, INPUT_STATUS_PAUSE );
-}
-
-void Interface::OnSliderUpdate( wxScrollEvent& event )
-{
- p_intf->p_sys->i_slider_pos = event.GetPosition();
+ vlc_mutex_unlock( &p_intf->change_lock );
}
void Interface::OnPrevStream( wxCommandEvent& WXUNUSED(event) )
vlc_object_release( p_playlist );
}
+void Interface::TogglePlayButton( int i_playing_status )
+{
+ if( i_playing_status == i_old_playing_status )
+ return;
+
+ GetToolBar()->DeleteTool( PlayStream_Event );
+
+ if( i_playing_status == PLAYING_S )
+ {
+ GetToolBar()->InsertTool( 5, PlayStream_Event, _("Pause"),
+ wxBitmap( pause_xpm ) );
+ }
+ else
+ {
+ GetToolBar()->InsertTool( 5, PlayStream_Event, _("Play"),
+ wxBitmap( play_xpm ) );
+ }
+
+ GetToolBar()->Realize();
+
+ i_old_playing_status = i_playing_status;
+}
+
+#if !defined(__WXX11__)
/*****************************************************************************
* Definition of DragAndDrop class.
*****************************************************************************/
return TRUE;
}
+#endif