X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fwxwidgets%2Finterface.cpp;h=60b1973bfedbf96e09f9b84a3a6b8b6474f9baf8;hb=a51138ae60bcc527d7a1aa135817f317d4def011;hp=9a01ec2227c0bbe2c53e75e3a1fa74d5b0f67d59;hpb=c4efd0241cb39e26f46bbe9303547a4aac51dbaa;p=vlc diff --git a/modules/gui/wxwidgets/interface.cpp b/modules/gui/wxwidgets/interface.cpp index 9a01ec2227..60b1973bfe 100644 --- a/modules/gui/wxwidgets/interface.cpp +++ b/modules/gui/wxwidgets/interface.cpp @@ -1,7 +1,7 @@ /***************************************************************************** * interface.cpp : wxWidgets plugin for vlc ***************************************************************************** - * Copyright (C) 2000-2005 the VideoLAN team + * Copyright (C) 2000-2006 the VideoLAN team * $Id$ * * Authors: Gildas Bazin @@ -18,19 +18,29 @@ * * 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. *****************************************************************************/ /***************************************************************************** * Preamble *****************************************************************************/ -#include -#include -#include -#include -#include +#include "interface.hpp" +#include "playlist_manager.hpp" +#include "extrapanel.hpp" +#include "timer.hpp" +#include "video.hpp" +#include -#include "wxwidgets.h" +#include "vlc_charset.h" + +#include +#include "vlc_charset.h" + +#include + +#include + +#include /* wxLaunchDefaultBrowser() */ /* include the toolbar graphics */ #include "bitmaps/play.xpm" @@ -42,6 +52,7 @@ #include "bitmaps/slow.xpm" #include "bitmaps/fast.xpm" #include "bitmaps/playlist.xpm" +#include "bitmaps/playlist_small.xpm" #include "bitmaps/speaker.xpm" #include "bitmaps/speaker_mute.xpm" @@ -55,6 +66,12 @@ #include "../../../share/vlc16x16.xpm" #endif +/***************************************************************************** + * Local prototypes + *****************************************************************************/ + static int InteractCallback( vlc_object_t *, const char *, vlc_value_t, + vlc_value_t, void *); + /***************************************************************************** * Local class declarations. *****************************************************************************/ @@ -78,31 +95,134 @@ private: }; -class wxVolCtrl; -class VLCVolCtrl : public wxControl +class Splitter : public wxSplitterWindow { public: - VLCVolCtrl( intf_thread_t *p_intf, wxWindow *p_parent ); - virtual ~VLCVolCtrl() {}; + Splitter( wxWindow *p_parent, intf_thread_t *_p_intf ) + : wxSplitterWindow( p_parent, -1, wxDefaultPosition, wxSize(0,0), +#if defined( __WXMSW__ ) + wxCLIP_CHILDREN ), +#else + wxCLIP_CHILDREN | wxSP_3DSASH ), +#endif + p_intf(_p_intf), b_video(0), i_delay(0) + { + SetSashSize( 0 ); + + wxSize size = wxSize(-1, 150); + wxPoint p = wxPoint(0,0); + bool b_dummy; + WindowSettings *ws = p_intf->p_sys->p_window_settings; + ws->GetSettings( WindowSettings::ID_SMALL_PLAYLIST, b_dummy, p, size ); + + i_width = size.GetWidth(); + i_sash_position = size.GetHeight(); + b_show_on_start = !!p.x; + } + + virtual ~Splitter() + { + WindowSettings *ws = p_intf->p_sys->p_window_settings; + ws->SetSettings( WindowSettings::ID_SMALL_PLAYLIST, true, + wxPoint(!!GetWindow2(),0), + wxSize(i_width, i_sash_position) ); + }; + + virtual bool Split( wxWindow* window1, wxWindow* window2 ) + { + SetSashSize( 0 ); + wxSize size = wxSize( i_width, i_sash_position ); + if( window2->GetSizer() ) window2->GetSizer()->SetMinSize( size ); + + return wxSplitterWindow::SplitHorizontally( window1, window2, + -i_sash_position ); + } + + virtual bool Unsplit( wxWindow* window ) + { + SetSashSize( 0 ); + return wxSplitterWindow::Unsplit( window ); + } - virtual void OnPaint( wxPaintEvent &event ); - void OnChange( wxMouseEvent& event ); - void UpdateVolume(); + bool ShowOnStart() { return b_show_on_start; } - private: +private: DECLARE_EVENT_TABLE() - wxVolCtrl *gauge; - int i_y_offset; - vlc_bool_t b_mute; + void OnSize( wxSizeEvent &event ) + { + /* If we display video, then resize the video window */ + if( GetWindow2() && + p_intf->p_sys->p_video_window && p_intf->p_sys->p_video_sizer && + p_intf->p_sys->p_video_sizer->GetMinSize() != wxSize(0,0) ) + { + if( !b_video ) i_delay = mdate() + 1000000; + b_video = true; + + SetSashSize( -1 ); + +#if defined( __WXMSW__ ) + SetSashPosition( event.GetSize().GetHeight() - i_sash_position ); +#else + SetSashPosition( event.GetSize().GetHeight() - + i_sash_position - GetSashSize() ); +#endif + } + else if( GetWindow2() && GetWindow1() && GetWindow1()->GetSizer() ) + { + wxSize size = GetWindow1()->GetSizer()->GetMinSize(); + + if( b_video ) i_delay = mdate() + 1000000; + b_video = false; + + if( event.GetSize().GetHeight() - size.GetHeight() ) + { + SetSashSize( 0 ); + + SetSashPosition( size.GetHeight() ? size.GetHeight() : 1 ); + + if( i_delay < mdate() ) + { + i_sash_position = event.GetSize().GetHeight() - + size.GetHeight(); + i_width = event.GetSize().GetWidth(); + + size = wxSize( i_width, i_sash_position ); + if( GetWindow2()->GetSizer() ) + GetWindow2()->GetSizer()->SetMinSize( size ); + } + } + } + + event.Skip(); + } + + void OnSashPosChanged( wxSplitterEvent &event ) + { + if( !GetSize().GetHeight() ){ event.Skip(); return; } + + if( i_delay < mdate() ) + { + i_sash_position = GetSize().GetHeight() - event.GetSashPosition(); + + wxSize size = wxSize( i_width, i_sash_position ); + if( GetWindow2()->GetSizer() ) + GetWindow2()->GetSizer()->SetMinSize( size ); + } + event.Skip(); + } + intf_thread_t *p_intf; + int i_sash_position; + int i_width; + bool b_video; + mtime_t i_delay; + bool b_show_on_start; }; -BEGIN_EVENT_TABLE(VLCVolCtrl, wxControl) - EVT_PAINT(VLCVolCtrl::OnPaint) - - /* Mouse events */ - EVT_LEFT_UP(VLCVolCtrl::OnChange) +BEGIN_EVENT_TABLE(Splitter, wxSplitterWindow) + EVT_SIZE( Splitter::OnSize ) + EVT_SPLITTER_SASH_POS_CHANGED(-1, Splitter::OnSashPosChanged) END_EVENT_TABLE() /***************************************************************************** @@ -131,43 +251,53 @@ enum Wizard_Event, Playlist_Event, + PlaylistSmall_Event, Logs_Event, FileInfo_Event, Prefs_Event, Extended_Event, -// Undock_Event, Bookmarks_Event, Skins_Event, - SliderScroll_Event, StopStream_Event, PlayStream_Event, PrevStream_Event, NextStream_Event, SlowStream_Event, FastStream_Event, - - DiscMenu_Event, - DiscPrev_Event, - DiscNext_Event, + ToggleMute_Event, + SlideVolume_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 * (where it is special and put into the "Apple" menu) */ About_Event = wxID_ABOUT, + OnWebLink_Event, + OnWebHelp_Event, +#ifdef UPDATE_CHECK UpdateVLC_Event, +#endif + //VLM_Event, - Iconize_Event + Iconize_Event, }; +DEFINE_LOCAL_EVENT_TYPE( wxEVT_INTERACTION ); + BEGIN_EVENT_TABLE(Interface, wxFrame) /* Menu events */ EVT_MENU(Exit_Event, Interface::OnExit) EVT_MENU(About_Event, Interface::OnAbout) + EVT_MENU(OnWebLink_Event, Interface::OnWebLink) + EVT_MENU(OnWebHelp_Event, Interface::OnWebHelp) +#ifdef UPDATE_CHECK EVT_MENU(UpdateVLC_Event, Interface::OnShowDialog) +#endif + //EVT_MENU(VLM_Event, Interface::OnShowDialog) EVT_MENU(Playlist_Event, Interface::OnShowDialog) + EVT_MENU(PlaylistSmall_Event, Interface::OnSmallPlaylist) EVT_MENU(Logs_Event, Interface::OnShowDialog) EVT_MENU(FileInfo_Event, Interface::OnShowDialog) EVT_MENU(Prefs_Event, Interface::OnShowDialog) @@ -175,7 +305,6 @@ BEGIN_EVENT_TABLE(Interface, wxFrame) EVT_MENU_OPEN(Interface::OnMenuOpen) EVT_MENU( Extended_Event, Interface::OnExtended ) -// EVT_MENU( Undock_Event, Interface::OnUndock ) EVT_MENU( Bookmarks_Event, Interface::OnShowDialog) @@ -200,21 +329,14 @@ BEGIN_EVENT_TABLE(Interface, wxFrame) EVT_MENU(NextStream_Event, Interface::OnNextStream) EVT_MENU(SlowStream_Event, Interface::OnSlowStream) EVT_MENU(FastStream_Event, Interface::OnFastStream) - - /* Disc Buttons events */ - EVT_BUTTON(DiscMenu_Event, Interface::OnDiscMenu) - EVT_BUTTON(DiscPrev_Event, Interface::OnDiscPrev) - EVT_BUTTON(DiscNext_Event, Interface::OnDiscNext) - - /* Slider events */ - EVT_COMMAND_SCROLL(SliderScroll_Event, Interface::OnSliderUpdate) + EVT_MENU(ToggleMute_Event, Interface::OnToggleMute) + EVT_COMMAND_SCROLL(SlideVolume_Event, Interface::OnSlideVolume) /* Custom events */ EVT_COMMAND(0, wxEVT_INTF, Interface::OnControlEvent) EVT_COMMAND(1, wxEVT_INTF, Interface::OnControlEvent) - EVT_TIMER(ID_CONTROLS_TIMER, Interface::OnControlsTimer) - EVT_TIMER(ID_SLIDER_TIMER, Interface::OnSliderTimer) + EVT_COMMAND( -1, wxEVT_INTERACTION, Interface::OnInteraction ) END_EVENT_TABLE() /***************************************************************************** @@ -226,44 +348,52 @@ Interface::Interface( intf_thread_t *_p_intf, long style ): { /* Initializations */ p_intf = _p_intf; - i_old_playing_status = PAUSE_S; - b_extra = VLC_FALSE; -// b_undock = VLC_FALSE; + b_extra = false; + extra_frame = 0; + playlist_manager = 0; + i_update_counter = 0; - extra_window = NULL; - /* Give our interface a nice little icon */ - SetIcon( wxIcon( vlc_xpm ) ); + SetIcon( wxIcon( (const char**) vlc_xpm ) ); - /* Create a sizer for the main frame */ - frame_sizer = new wxBoxSizer( wxVERTICAL ); - SetSizer( frame_sizer ); + /* Create a splitter window that will fill in the interface window. + * We need a splitter bar in order to make the embedded playlist + * resizable. */ + splitter = new Splitter( this, p_intf ); + main_sizer = new wxBoxSizer( wxVERTICAL ); + main_sizer->Add( splitter, 1, wxEXPAND ); + SetSizer( main_sizer ); + + /* Create a main panel that will fill in the interface window */ + main_panel = new wxPanel( splitter, -1, wxPoint(0,0), wxSize(0,0), + wxCLIP_CHILDREN ); + main_panel->SetFocus(); - /* Create a dummy widget that can get the keyboard focus */ - wxWindow *p_dummy = new wxWindow( this, 0, wxDefaultPosition, - wxSize(0,0) ); #if defined(__WXGTK20__) && wxCHECK_VERSION(2,5,6) /* As ugly as your butt! Please remove when wxWidgets 2.6 fixed their * Accelerators bug. */ - p_dummy->m_imData = 0; + main_panel->m_imData = 0; m_imData = 0; #endif - p_dummy->SetFocus(); - frame_sizer->Add( p_dummy, 0, 0 ); + /* Create a sizer for the main frame */ + panel_sizer = new wxBoxSizer( wxVERTICAL ); + main_panel->SetSizer( panel_sizer ); + + /* Put this in the splitter */ + splitter->Initialize( main_panel ); + +/* wxCocoa pretends to support this, but at least 2.6.x doesn't */ +#ifndef __APPLE__ #ifdef wxHAS_TASK_BAR_ICON /* Systray integration */ p_systray = NULL; - if ( config_GetInt( p_intf, "wx-systray" ) ) + if( config_GetInt( p_intf, "wx-systray" ) ) { - p_systray = new Systray(this, p_intf); - p_systray->SetIcon( wxIcon( vlc16x16_xpm ), wxT("VLC media player") ); - if ( (! p_systray->IsOk()) || (! p_systray->IsIconInstalled()) ) - { - msg_Warn(p_intf, "Cannot set systray icon, weird things may happen"); - } + p_systray = new Systray( this, p_intf ); } +#endif #endif /* Creation of the menu bar */ @@ -272,38 +402,45 @@ Interface::Interface( intf_thread_t *_p_intf, long style ): /* Creation of the tool bar */ CreateOurToolBar(); - /* Create the extra panel */ - extra_frame = new ExtraPanel( p_intf, this ); - frame_sizer->Add( extra_frame, 0, wxEXPAND , 0 ); - frame_sizer->Hide( extra_frame ); - /* Creation of the status bar * Helptext for menu items and toolbar tools will automatically get * displayed here. */ - int i_status_width[3] = {-6, -2, -9}; + int i_status_width[3] = {150, 55, -1}; statusbar = CreateStatusBar( 3 ); /* 2 fields */ statusbar->SetStatusWidths( 3, i_status_width ); statusbar->SetStatusText( wxString::Format(wxT("x%.2f"), 1.0), 1 ); + /* Get minimum window size to prevent user from glitching it */ + splitter->SetSizeHints( -1, 0 ); + panel_sizer->Layout(); panel_sizer->Fit( main_panel ); + main_sizer->Layout(); main_sizer->Fit( this ); + main_min_size = GetSize(); + /* FIXME HACK as far as i understan (i.e. not a lot) the toolbar + * doesn't take the labels into account when it returns its size */ + + if( config_GetInt(p_intf, "wx-labels") ) + { + main_min_size.SetWidth(800); + } + splitter->SetSizeHints( -1, -1 ); + /* Video window */ video_window = 0; if( config_GetInt( p_intf, "wx-embed" ) ) { - video_window = CreateVideoWindow( p_intf, this ); - frame_sizer->Add( p_intf->p_sys->p_video_sizer, 1, wxEXPAND, 0 ); + video_window = CreateVideoWindow( p_intf, main_panel ); + panel_sizer->Add( p_intf->p_sys->p_video_sizer, 1, wxEXPAND, 0 ); } - /* Creation of the slider sub-window */ - CreateOurSlider(); - frame_sizer->Add( slider_frame, 0, wxEXPAND , 0 ); - frame_sizer->Hide( slider_frame ); - - /* Make sure we've got the right background colour */ - SetBackgroundColour( slider_frame->GetBackgroundColour() ); + /* Creation of the input manager panel */ + input_manager = new InputManager( p_intf, this, main_panel ); + panel_sizer->Add( input_manager, 0, wxEXPAND , 0 ); /* Layout everything */ - frame_sizer->Layout(); - frame_sizer->Fit(this); + splitter->SetSizeHints( -1, 0 ); + panel_sizer->Layout(); panel_sizer->Fit( main_panel ); + main_sizer->Layout(); main_sizer->Fit( this ); + splitter->SetSizeHints( -1, -1 ); #if wxUSE_DRAG_AND_DROP /* Associate drop targets with the main interface */ @@ -312,23 +449,32 @@ Interface::Interface( intf_thread_t *_p_intf, long style ): SetupHotkeys(); - m_controls_timer.SetOwner(this, ID_CONTROLS_TIMER); - m_slider_timer.SetOwner(this, ID_SLIDER_TIMER); - /* Start timer */ timer = new Timer( p_intf, this ); - /* */ + /* Restore previous position / settings */ WindowSettings *ws = p_intf->p_sys->p_window_settings; wxPoint p; - wxSize s; - bool b_shown; + wxSize s; + bool b_shown; ws->SetScreen( wxSystemSettings::GetMetric( wxSYS_SCREEN_X ), wxSystemSettings::GetMetric( wxSYS_SCREEN_Y ) ); - if( ws->GetSettings( WindowSettings::ID_MAIN, b_shown, p, s ) ) - Move( p ); + if( ws->GetSettings( WindowSettings::ID_MAIN, b_shown, p, s ) ) Move( p ); + + /* Show extended GUI if requested */ + wxCommandEvent dummy; + if( config_GetInt( p_intf, "wx-extended" ) ) OnExtended( dummy ); + + SetIntfMinSize(); + + var_Create( p_intf, "interaction", VLC_VAR_ADDRESS ); + var_AddCallback( p_intf, "interaction", InteractCallback, this ); + p_intf->b_interaction = true; + + /* Show embedded playlist if requested */ + if( splitter->ShowOnStart() ) OnSmallPlaylist( dummy ); } Interface::~Interface() @@ -341,13 +487,22 @@ Interface::~Interface() GetPosition(), GetSize() ); } - if( video_window ) delete video_window; + PopEventHandler(true); + delete video_window; + +/* wxCocoa pretends to support this, but at least 2.6.x doesn't */ +#ifndef __APPLE__ #ifdef wxHAS_TASK_BAR_ICON - if( p_systray ) delete p_systray; + delete p_systray; +#endif #endif - if( p_intf->p_sys->p_wxwindow ) delete p_intf->p_sys->p_wxwindow; + p_intf->b_interaction = false; + var_DelCallback( p_intf, "interaction", InteractCallback, this ); + + delete p_intf->p_sys->p_wxwindow; + /* Clean up */ delete timer; @@ -362,7 +517,10 @@ void Interface::Init() void Interface::Update() { /* Misc updates */ - ((VLCVolCtrl *)volctrl)->UpdateVolume(); + + if( playlist_manager ) playlist_manager->Update(); + + i_update_counter++; } void Interface::OnControlEvent( wxCommandEvent& event ) @@ -370,13 +528,8 @@ void Interface::OnControlEvent( wxCommandEvent& event ) switch( event.GetId() ) { case 0: - { - if( p_intf->p_sys->b_video_autosize ) - { - frame_sizer->Layout(); - frame_sizer->Fit(this); - } - } + main_sizer->Layout(); + main_sizer->Fit( this ); break; case 1: @@ -426,7 +579,11 @@ void Interface::CreateOurMenuBar() } view_menu->Append( Logs_Event, wxU(_("&Messages...\tCtrl-M")) ); view_menu->Append( FileInfo_Event, - wxU(_("Stream and Media &info...\tCtrl-I")) ); + wxU(_("Stream and Media &Info...\tCtrl-I")) ); +#if 0 + view_menu->Append( VLM_Event, + wxU(_("VLM Control...\tCtrl-V")) ); +#endif /* Create the "Auto-generated" menus */ p_settings_menu = SettingsMenu( p_intf, this ); @@ -436,14 +593,19 @@ void Interface::CreateOurMenuBar() /* Create the "Help" menu */ wxMenu *help_menu = new wxMenu; - help_menu->Append( About_Event, wxU(_("About VLC media player")) ); + help_menu->Append( OnWebLink_Event, wxU(_("VideoLAN's Website")) ); + help_menu->Append( OnWebHelp_Event, wxU(_("Online Help")) ); + help_menu->AppendSeparator(); + help_menu->Append( About_Event, wxU(_("About...")) ); +#ifdef UPDATE_CHECK help_menu->AppendSeparator(); - help_menu->Append( UpdateVLC_Event, wxU(_("Check for updates ...")) ); + help_menu->Append( UpdateVLC_Event, wxU(_("Check for Updates...")) ); +#endif /* Append the freshly created menus to the menu bar... */ wxMenuBar *menubar = new wxMenuBar(); menubar->Append( file_menu, wxU(_("&File")) ); - menubar->Append( view_menu, wxU(_("&View")) ); + menubar->Append( view_menu, wxU(_("V&iew")) ); menubar->Append( p_settings_menu, wxU(_("&Settings")) ); menubar->Append( p_audio_menu, wxU(_("&Audio")) ); menubar->Append( p_video_menu, wxU(_("&Video")) ); @@ -470,7 +632,27 @@ void Interface::CreateOurMenuBar() #endif #endif } - frame_sizer->SetMinSize( i_size, -1 ); + +/* Patch by zcot for menu wrapping */ +#if defined(WIN32) + /* Find out size of msw menu bar */ + i_size = 0; + SIZE sizing; + HDC hdc = GetDC( NULL ); + for( unsigned int i = 0; i < menubar->GetMenuCount(); i++ ) + { + GetTextExtentPoint32( hdc, menubar->GetLabelTop(i).c_str(), + menubar->GetLabelTop(i).Length(), &sizing ); + + // [ SM_CXDLGFRAME + pixels + textextent + pixels + SM_CXDLGFRAME ] + i_size += sizing.cx + 2 + GetSystemMetrics( SM_CXDLGFRAME ) * 2; + } + ReleaseDC( NULL, hdc ); + i_size += GetSystemMetrics( SM_CXSIZEFRAME ) * 2 + 4; +#endif +/* End patch by zcot */ + + panel_sizer->SetMinSize( i_size, -1 ); /* Intercept all menu events in our custom event handler */ PushEventHandler( new MenuEvtHandler( p_intf, this ) ); @@ -488,59 +670,80 @@ void Interface::CreateOurToolBar() #define HELP_PLAY N_("Play") #define HELP_PAUSE N_("Pause") #define HELP_PLO N_("Playlist") +#define HELP_SPLO N_("Embedded 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") +#define HELP_VOL N_("Toggle mute/unmute of the audio") + +#define LABEL_OPEN N_("Open") +#define LABEL_STOP N_("Stop") +#define LABEL_PLAY N_("Play") +#define LABEL_PAUSE N_("Pause") +#define LABEL_PLO N_("Playlist") +#define LABEL_SPLO N_("Embedded playlist") +#define LABEL_PLP N_("Previous") +#define LABEL_PLN N_("Next") +#define LABEL_SLOW N_("Slower") +#define LABEL_FAST N_("Faster") +#define LABEL_VOL N_("Mute") int minimal = config_GetInt( p_intf, "wx-minimal" ); + bool label = config_GetInt( p_intf, "wx-labels" ); 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_FLAT ); + CreateToolBar( label?wxTB_HORIZONTAL | wxTB_FLAT |wxTB_TEXT: + wxTB_HORIZONTAL | wxTB_FLAT ); toolbar->SetToolBitmapSize( wxSize(TOOLBAR_BMP_WIDTH,TOOLBAR_BMP_HEIGHT) ); if (!minimal) { - toolbar->AddTool( OpenFile_Event, wxT(""), + toolbar->AddTool( OpenFile_Event, wxU(LABEL_OPEN), wxBitmap( eject_xpm ), wxU(_(HELP_OPEN)) ); toolbar->AddSeparator(); } - wxToolBarToolBase *p_tool = toolbar->AddTool( PlayStream_Event, wxT(""), + wxToolBarToolBase *p_tool = toolbar->AddTool( PlayStream_Event, wxU(LABEL_PLAY), wxBitmap( play_xpm ), wxU(_(HELP_PLAY)), wxITEM_CHECK ); p_tool->SetClientData( p_tool ); if (!minimal) { - toolbar->AddTool( StopStream_Event, wxT(""), wxBitmap( stop_xpm ), + toolbar->AddTool( StopStream_Event, wxU(LABEL_STOP), wxBitmap( stop_xpm ), wxU(_(HELP_STOP)) ); toolbar->AddSeparator(); - toolbar->AddTool( PrevStream_Event, wxT(""), + toolbar->AddTool( PrevStream_Event, wxU(LABEL_PLP), wxBitmap( prev_xpm ), wxU(_(HELP_PLP)) ); - toolbar->AddTool( SlowStream_Event, wxT(""), + toolbar->AddTool( SlowStream_Event, wxU(LABEL_SLOW), wxBitmap( slow_xpm ), wxU(_(HELP_SLOW)) ); - toolbar->AddTool( FastStream_Event, wxT(""), + toolbar->AddTool( FastStream_Event, wxU(LABEL_FAST), wxBitmap( fast_xpm ), wxU(_(HELP_FAST)) ); - toolbar->AddTool( NextStream_Event, wxT(""), wxBitmap( next_xpm ), + toolbar->AddTool( NextStream_Event, wxU(LABEL_PLN), wxBitmap( next_xpm ), wxU(_(HELP_PLN)) ); toolbar->AddSeparator(); - toolbar->AddTool( Playlist_Event, wxT(""), wxBitmap( playlist_xpm ), - wxU(_(HELP_PLO)) ); + if( config_GetInt( p_intf, "wx-playlist-view" ) != 1 ) + toolbar->AddTool( Playlist_Event, wxU(LABEL_PLO), + wxBitmap( playlist_xpm ), wxU(_(HELP_PLO)) ); + if( config_GetInt( p_intf, "wx-playlist-view" ) >= 1 ) + toolbar->AddTool( PlaylistSmall_Event, wxU(LABEL_SPLO), + wxBitmap( playlist_small_xpm ), wxU(_(HELP_SPLO)) ); } - wxControl *p_dummy_ctrl = - new wxControl( toolbar, -1, wxDefaultPosition, - wxSize(35, 16 ), wxBORDER_NONE ); + wxToolBarToolBase *v_tool = toolbar->AddTool( ToggleMute_Event, + wxU(LABEL_VOL), wxBitmap( speaker_xpm ), + wxU(_(HELP_VOL)), wxITEM_CHECK ); + v_tool->SetClientData( v_tool ); - toolbar->AddControl( p_dummy_ctrl ); - - volctrl = new VLCVolCtrl( p_intf, toolbar ); - toolbar->AddControl( volctrl ); + wxSlider *v_gauge = new wxSlider(toolbar, SlideVolume_Event, 256, 0, + AOUT_VOLUME_MAX, wxDefaultPosition, + wxSize(64,TOOLBAR_BMP_HEIGHT), wxSL_HORIZONTAL); + toolbar->AddControl(v_gauge); toolbar->Realize(); @@ -550,53 +753,6 @@ void Interface::CreateOurToolBar() #endif } -void Interface::CreateOurSlider() -{ - /* Create a new frame and sizer containing the slider */ - slider_frame = new wxPanel( this, -1, wxDefaultPosition, wxDefaultSize ); - slider_frame->SetAutoLayout( TRUE ); - slider_sizer = new wxBoxSizer( wxHORIZONTAL ); - //slider_sizer->SetMinSize( -1, 50 ); - - /* Create slider */ - slider = new wxSlider( slider_frame, SliderScroll_Event, 0, 0, - SLIDER_MAX_POS, wxDefaultPosition, wxDefaultSize ); - - /* Add Disc Buttons */ - disc_frame = new wxPanel( slider_frame, -1, wxDefaultPosition, - wxDefaultSize ); - disc_frame->SetAutoLayout( TRUE ); - disc_sizer = new wxBoxSizer( wxHORIZONTAL ); - - disc_menu_button = new wxBitmapButton( disc_frame, DiscMenu_Event, - wxBitmap( playlist_xpm ) ); - disc_prev_button = new wxBitmapButton( disc_frame, DiscPrev_Event, - wxBitmap( prev_xpm ) ); - disc_next_button = new wxBitmapButton( disc_frame, DiscNext_Event, - wxBitmap( next_xpm ) ); - - disc_sizer->Add( disc_menu_button, 1, wxEXPAND | wxLEFT | wxRIGHT, 1 ); - disc_sizer->Add( disc_prev_button, 1, wxEXPAND | wxLEFT | wxRIGHT, 1 ); - disc_sizer->Add( disc_next_button, 1, wxEXPAND | wxLEFT | wxRIGHT, 1 ); - - disc_frame->SetSizer( disc_sizer ); - disc_sizer->Layout(); - - /* Add everything to the frame */ - slider_sizer->Add( slider, 1, wxEXPAND | wxALL, 5 ); - slider_sizer->Add( disc_frame, 0, wxALL, 2 ); - slider_frame->SetSizer( slider_sizer ); - - disc_frame->Hide(); - slider_sizer->Hide( disc_frame ); - - slider_sizer->Layout(); - slider_sizer->Fit( slider_frame ); - - /* Hide the slider by default */ - slider_frame->Hide(); -} - static int ConvertHotkeyModifiers( int i_hotkey ) { int i_accel_flags = 0; @@ -650,7 +806,7 @@ static int ConvertHotkey( int i_hotkey ) void Interface::SetupHotkeys() { - struct vlc_t::hotkey *p_hotkeys = p_intf->p_vlc->p_hotkeys; + struct libvlc_int_t::hotkey *p_hotkeys = p_intf->p_libvlc->p_hotkeys; int i_hotkeys; /* Count number of hoteys */ @@ -690,102 +846,23 @@ void Interface::SetupHotkeys() delete [] p_entries; } -void Interface::HideSlider( bool layout ) +void Interface::SetIntfMinSize() { - ShowSlider( false, layout ); -} - -void Interface::ShowSlider( bool show, bool layout ) -{ - if( show ) - { - //prevent the hide timers from hiding it now - m_slider_timer.Stop(); - m_controls_timer.Stop(); + wxSize ms = main_min_size; - //prevent continuous layout - if( slider_frame->IsShown() ) return; - } - else + if( extra_frame && extra_frame->IsShown() ) { - //prevent continuous layout - if( !slider_frame->IsShown() ) return; + ms.SetHeight( ms.GetHeight() + ext_min_size.GetHeight() ); + if( ext_min_size.GetWidth() > ms.GetWidth() ) + ms.SetWidth( ext_min_size.GetWidth() ); } - if( layout && p_intf->p_sys->b_video_autosize ) - UpdateVideoWindow( p_intf, video_window ); - - slider_frame->Show( show ); - frame_sizer->Show( slider_frame, show ); - - if( layout ) - { - frame_sizer->Layout(); - if( p_intf->p_sys->b_video_autosize ) frame_sizer->Fit( this ); - } -} - -void Interface::HideDiscFrame( bool layout ) -{ - ShowDiscFrame( false, layout ); -} - -void Interface::ShowDiscFrame( bool show, bool layout ) -{ - if( show ) - { - //prevent the hide timer from hiding it now - m_controls_timer.Stop(); - - //prevent continuous layout - if( disc_frame->IsShown() ) return; - } - else - { - //prevent continuous layout - if( !disc_frame->IsShown() ) return; - } - - if( layout && p_intf->p_sys->b_video_autosize ) - UpdateVideoWindow( p_intf, video_window ); - - disc_frame->Show( show ); - slider_sizer->Show( disc_frame, show ); - - if( layout ) - { - slider_sizer->Layout(); - if( p_intf->p_sys->b_video_autosize ) - slider_sizer->Fit( slider_frame ); - } + SetSizeHints( ms.GetWidth(), ms.GetHeight() ); } /***************************************************************************** * Event Handlers. *****************************************************************************/ -void Interface::OnControlsTimer( wxTimerEvent& WXUNUSED(event) ) -{ - if( p_intf->p_sys->b_video_autosize ) - UpdateVideoWindow( p_intf, video_window ); - - /* Hide slider and Disc Buttons */ - //postpone layout, we'll do it ourselves - HideDiscFrame( false ); - HideSlider( false ); - - slider_sizer->Layout(); - if( p_intf->p_sys->b_video_autosize ) - { - slider_sizer->Fit( slider_frame ); - frame_sizer->Fit( this ); - } -} - -void Interface::OnSliderTimer( wxTimerEvent& WXUNUSED(event) ) -{ - HideSlider(); -} - void Interface::OnMenuOpen( wxMenuEvent& event ) { #if defined( __WXMSW__ ) @@ -800,11 +877,6 @@ void Interface::OnMenuOpen( wxMenuEvent& event ) p_settings_menu->AppendCheckItem( Extended_Event, wxU(_("Extended &GUI\tCtrl-G") ) ); if( b_extra ) p_settings_menu->Check( Extended_Event, TRUE ); -#if 0 - p_settings_menu->AppendCheckItem( Undock_Event, - wxU(_("&Undock Ext. GUI") ) ); - if( b_undock ) p_settings_menu->Check( Undock_Event, TRUE ); -#endif p_settings_menu->Append( Bookmarks_Event, wxU(_("&Bookmarks...\tCtrl-B") ) ); p_settings_menu->Append( Prefs_Event, @@ -860,21 +932,34 @@ void Interface::OnExit( wxCommandEvent& WXUNUSED(event) ) void Interface::OnAbout( wxCommandEvent& WXUNUSED(event) ) { wxString msg; - msg.Printf( wxString(wxT("VLC media player " PACKAGE_VERSION)) + + msg.Printf( wxString(wxT("VLC media player " VERSION_MESSAGE)) + wxU(_(" (wxWidgets interface)\n\n")) + - wxU(_("(c) 1996-2005 - the VideoLAN Team\n\n")) + + wxU(_("(c) " COPYRIGHT_YEARS " - the VideoLAN Team\n\n")) + + wxU(_("Compiled by "))+ wxU(VLC_CompileBy())+ wxU("@") + + wxU(VLC_CompileHost())+ wxT(".")+ wxU(VLC_CompileDomain())+ wxT(".\n") + + wxU(_("Compiler: "))+ wxU(VLC_Compiler())+wxT( ".\n") + + wxU(_("Based on Git commit: "))+wxU(VLC_Changeset())+wxT(".\n\n") + #ifdef __WXMSW__ - wxU( vlc_wraptext(INTF_ABOUT_MSG,WRAPCOUNT,VLC_TRUE) ) + wxT("\n\n") + + wxU( vlc_wraptext(LICENSE_MSG,WRAPCOUNT) ) + wxT("\n\n") + #else - wxU( INTF_ABOUT_MSG ) + wxT("\n\n") + + wxU( LICENSE_MSG ) + wxT("\n\n") + #endif wxU(_("The VideoLAN team \n" "http://www.videolan.org/\n\n")) ); - wxMessageBox( msg, wxString::Format(wxU(_("About %s")), wxT("VLC media player")), wxOK | wxICON_INFORMATION, this ); } +void Interface::OnWebLink( wxCommandEvent& WXUNUSED(event) ) +{ + wxLaunchDefaultBrowser( wxU("http://videolan.org/") ); +} + +void Interface::OnWebHelp( wxCommandEvent& WXUNUSED(event) ) +{ + wxLaunchDefaultBrowser( wxU("http://videolan.org/doc/") ); +} + void Interface::OnShowDialog( wxCommandEvent& event ) { if( p_intf->p_sys->pf_show_dialog ) @@ -888,6 +973,7 @@ void Interface::OnShowDialog( wxCommandEvent& event ) break; case OpenAdv_Event: i_id = INTF_DIALOG_FILE; + break; case OpenFile_Event: i_id = INTF_DIALOG_FILE; break; @@ -924,9 +1010,16 @@ void Interface::OnShowDialog( wxCommandEvent& event ) case Bookmarks_Event: i_id = INTF_DIALOG_BOOKMARKS; break; +#ifdef UPDATE_CHECK case UpdateVLC_Event: i_id = INTF_DIALOG_UPDATEVLC; break; +#endif +#if 0 + case VLM_Event: + i_id = INTF_DIALOG_VLM; + break; +#endif default: i_id = INTF_DIALOG_FILE; break; @@ -936,110 +1029,43 @@ void Interface::OnShowDialog( wxCommandEvent& event ) } } -void Interface::OnExtended(wxCommandEvent& event) +void Interface::OnExtended( wxCommandEvent& WXUNUSED(event) ) { - b_extra = (b_extra == VLC_TRUE ? VLC_FALSE : VLC_TRUE ); + UpdateVideoWindow( p_intf, video_window ); - if( b_extra == VLC_FALSE ) - { - extra_frame->Hide(); - frame_sizer->Hide( extra_frame ); - } - else + if( !extra_frame ) { - extra_frame->Show(); - frame_sizer->Show( extra_frame ); + /* Create the extra panel */ + extra_frame = new ExtraPanel( p_intf, main_panel ); + panel_sizer->Add( extra_frame, 0, wxEXPAND , 0 ); + ext_min_size = extra_frame->GetBestSize(); } - frame_sizer->Layout(); - frame_sizer->Fit(this); -} -#if 0 - if( b_undock == VLC_TRUE ) - { - fprintf(stderr,"Deleting window\n"); - if( extra_window ) - { - delete extra_window; - extra_window = NULL; - } - } - else - { - extra_frame->Hide(); - frame_sizer->Hide( extra_frame ); - frame_sizer->Layout(); - frame_sizer->Fit(this); - } - } - else - { - if( b_undock == VLC_TRUE ) - { - fprintf(stderr,"Creating window\n"); - extra_frame->Hide(); - frame_sizer->Hide( extra_frame ); -#if (wxCHECK_VERSION(2,5,0)) - frame_sizer->Detach( extra_frame ); -#else - frame_sizer->Remove( extra_frame ); -#endif - frame_sizer->Layout(); - frame_sizer->Fit(this); - extra_window = new ExtraWindow( p_intf, this, extra_frame ); - } - else - { - fprintf(stderr,"Deleting window\n"); - if( extra_window ) - { - delete extra_window; - } - extra_frame->Show(); - frame_sizer->Show( extra_frame ); - frame_sizer->Layout(); - frame_sizer->Fit(this); - } - } + b_extra = !b_extra; + panel_sizer->Show( extra_frame, b_extra ); + + SetIntfMinSize(); + main_sizer->Layout(); + main_sizer->Fit( this ); } -void Interface::OnUndock(wxCommandEvent& event) +void Interface::OnSmallPlaylist( wxCommandEvent& WXUNUSED(event) ) { - b_undock = (b_undock == VLC_TRUE ? VLC_FALSE : VLC_TRUE ); + UpdateVideoWindow( p_intf, video_window ); - if( b_extra == VLC_TRUE ) + if( !playlist_manager ) { - if( b_undock == VLC_FALSE ) - { - fprintf(stderr,"Deleting window\n"); - if( extra_window ) - { - delete extra_window; - extra_window = NULL; - } - extra_frame->Show(); - frame_sizer->Show( extra_frame ); - frame_sizer->Layout(); - frame_sizer->Fit(this); - } - else - { - fprintf(stderr,"Creating window\n"); - extra_frame->Hide(); - frame_sizer->Hide( extra_frame ); -#if (wxCHECK_VERSION(2,5,0)) - frame_sizer->Detach( extra_frame ); -#else - frame_sizer->Remove( extra_frame ); -#endif - frame_sizer->Layout(); - frame_sizer->Fit(this); - extra_window = new ExtraWindow( p_intf, this, extra_frame ); - } + /* Create the extra panel */ + playlist_manager = new PlaylistManager( p_intf, splitter ); } -} -#endif + if( !splitter->IsSplit() ) splitter->Split( main_panel, playlist_manager ); + else splitter->Unsplit( playlist_manager ); + + SetIntfMinSize(); + main_sizer->Layout(); + main_sizer->Fit( this ); +} void Interface::OnPlayStream( wxCommandEvent& WXUNUSED(event) ) { @@ -1049,12 +1075,10 @@ void Interface::OnPlayStream( wxCommandEvent& WXUNUSED(event) ) void Interface::PlayStream() { wxCommandEvent dummy; - playlist_t *p_playlist = - (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, - FIND_ANYWHERE ); + playlist_t *p_playlist = pl_Yield( p_intf ); if( p_playlist == NULL ) return; - if( p_playlist->i_size && p_playlist->i_enabled ) + if( !playlist_IsEmpty(p_playlist) ) { vlc_value_t state; @@ -1065,13 +1089,12 @@ void Interface::PlayStream() { /* No stream was playing, start one */ playlist_Play( p_playlist ); - TogglePlayButton( PLAYING_S ); - vlc_object_release( p_playlist ); + pl_Release( p_playlist ); + input_manager->Update(); return; } var_Get( p_input, "state", &state ); - if( state.i_int != PAUSE_S ) { /* A stream is being played, pause it */ @@ -1084,15 +1107,16 @@ void Interface::PlayStream() } var_Set( p_input, "state", state ); - TogglePlayButton( state.i_int ); vlc_object_release( p_input ); - vlc_object_release( p_playlist ); + pl_Release( p_playlist ); + input_manager->Update(); } else { /* If the playlist is empty, open a file requester instead */ - vlc_object_release( p_playlist ); + pl_Release( p_playlist ); OnShowDialog( dummy ); + GetToolBar()->ToggleTool( PlayStream_Event, false ); } } @@ -1102,66 +1126,15 @@ void Interface::OnStopStream( wxCommandEvent& WXUNUSED(event) ) } void Interface::StopStream() { - playlist_t * p_playlist = - (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, - FIND_ANYWHERE ); + playlist_t * p_playlist = pl_Yield( p_intf ); if( p_playlist == NULL ) { return; } playlist_Stop( p_playlist ); - TogglePlayButton( PAUSE_S ); - vlc_object_release( p_playlist ); -} - -void Interface::OnSliderUpdate( wxScrollEvent& event ) -{ - vlc_mutex_lock( &p_intf->change_lock ); - -#ifdef WIN32 - if( event.GetEventType() == wxEVT_SCROLL_THUMBRELEASE - || event.GetEventType() == wxEVT_SCROLL_ENDSCROLL ) - { -#endif - if( p_intf->p_sys->i_slider_pos != event.GetPosition() - && p_intf->p_sys->p_input ) - { - vlc_value_t pos; - pos.f_float = (float)event.GetPosition() / (float)SLIDER_MAX_POS; - - var_Set( p_intf->p_sys->p_input, "position", pos ); - } - -#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 */ - char psz_time[ MSTRTIME_MAX_SIZE ], psz_total[ MSTRTIME_MAX_SIZE ]; - mtime_t i_seconds; - - i_seconds = var_GetTime( p_intf->p_sys->p_input, "length" ) / - I64C(1000000 ); - secstotimestr( psz_total, i_seconds ); - - i_seconds = var_GetTime( p_intf->p_sys->p_input, "time" ) / - I64C(1000000 ); - secstotimestr( psz_time, i_seconds ); - - statusbar->SetStatusText( wxU(psz_time) + wxString(wxT(" / ") ) + - wxU(psz_total), 0 ); - } - } -#endif - -#undef WIN32 - vlc_mutex_unlock( &p_intf->change_lock ); + pl_Release( p_playlist ); + input_manager->Update(); } void Interface::OnPrevStream( wxCommandEvent& WXUNUSED(event) ) @@ -1171,32 +1144,14 @@ void Interface::OnPrevStream( wxCommandEvent& WXUNUSED(event) ) void Interface::PrevStream() { - playlist_t * p_playlist = - (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, - FIND_ANYWHERE ); + playlist_t * p_playlist = pl_Yield( p_intf ); if( p_playlist == NULL ) { return; } - /* FIXME --fenrir */ -#if 0 - if( p_playlist->p_input != NULL ) - { - vlc_mutex_lock( &p_playlist->p_input->stream.stream_lock ); - if( p_playlist->p_input->stream.p_selected_area->i_id > 1 ) - { - vlc_value_t val; val.b_bool = VLC_TRUE; - vlc_mutex_unlock( &p_playlist->p_input->stream.stream_lock ); - var_Set( p_playlist->p_input, "prev-title", val ); - } else - vlc_mutex_unlock( &p_playlist->p_input->stream.stream_lock ); - } - vlc_mutex_unlock( &p_playlist->object_lock ); -#endif - playlist_Prev( p_playlist ); - vlc_object_release( p_playlist ); + pl_Release( p_playlist ); } void Interface::OnNextStream( wxCommandEvent& WXUNUSED(event) ) @@ -1206,35 +1161,13 @@ void Interface::OnNextStream( wxCommandEvent& WXUNUSED(event) ) void Interface::NextStream() { - playlist_t * p_playlist = - (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, - FIND_ANYWHERE ); + playlist_t * p_playlist = pl_Yield( p_intf ); if( p_playlist == NULL ) { return; } - - /* FIXME --fenrir */ -#if 0 - var_Change( p_input, "title", VLC_VAR_CHOICESCOUNT, &val, NULL ); - vlc_mutex_lock( &p_playlist->object_lock ); - if( p_playlist->p_input != NULL ) - { - vlc_mutex_lock( &p_playlist->p_input->stream.stream_lock ); - if( p_playlist->p_input->stream.i_area_nb > 1 && - p_playlist->p_input->stream.p_selected_area->i_id < - p_playlist->p_input->stream.i_area_nb - 1 ) - { - vlc_value_t val; val.b_bool = VLC_TRUE; - vlc_mutex_unlock( &p_playlist->p_input->stream.stream_lock ); - var_Set( p_playlist->p_input, "next-title", val ); - } else - vlc_mutex_unlock( &p_playlist->p_input->stream.stream_lock ); - } - vlc_mutex_unlock( &p_playlist->object_lock ); -#endif playlist_Next( p_playlist ); - vlc_object_release( p_playlist ); + pl_Release( p_playlist ); } void Interface::OnSlowStream( wxCommandEvent& WXUNUSED(event) ) @@ -1244,7 +1177,7 @@ void Interface::OnSlowStream( wxCommandEvent& WXUNUSED(event) ) FIND_ANYWHERE ); if( p_input ) { - vlc_value_t val; val.b_bool = VLC_TRUE; + vlc_value_t val; val.b_bool = true; var_Set( p_input, "rate-slower", val ); vlc_object_release( p_input ); @@ -1258,18 +1191,59 @@ void Interface::OnFastStream( wxCommandEvent& WXUNUSED(event) ) FIND_ANYWHERE ); if( p_input ) { - vlc_value_t val; val.b_bool = VLC_TRUE; + vlc_value_t val; val.b_bool = true; var_Set( p_input, "rate-faster", val ); vlc_object_release( p_input ); } } -void Interface::TogglePlayButton( int i_playing_status ) +void Interface::OnToggleMute ( wxCommandEvent& WXUNUSED(event) ) { - if( i_playing_status == i_old_playing_status ) - return; + aout_VolumeMute(p_intf, NULL); + SyncVolume(); +} + +void Interface::SyncVolume() +{ + wxToolBarToolBase *p_tool = (wxToolBarToolBase *) + GetToolBar()->GetToolClientData( ToggleMute_Event ); + if ( !p_tool) return; + + audio_volume_t i_volume; + aout_VolumeGet(p_intf, &i_volume); + + /* Updating the Mute Button... IF the slider is completely moved to the left, + * the mute icon is shown too. */ + p_tool->SetNormalBitmap( wxBitmap( i_volume ? speaker_xpm : speaker_mute_xpm ) ); + GetToolBar()->Realize(); +#if defined( __WXMSW__ ) + /* Needed to work around a bug in wxToolBar::Realize() */ + GetToolBar()->SetSize( GetSize().GetWidth(), + GetToolBar()->GetSize().GetHeight() ); + GetToolBar()->Update(); +#endif + /* the Toggle to true and false is nescessary; otherwise, the Icon + * is not repainted */ + GetToolBar()->ToggleTool( ToggleMute_Event, true ); + GetToolBar()->ToggleTool( ToggleMute_Event, false ); + GetToolBar()->Update(); +} + +void Interface::OnSlideVolume( wxScrollEvent& WXUNUSED(event)) +{ + wxSlider *p_tool = (wxSlider *) + GetToolBar()->FindControl( SlideVolume_Event ); + if ( !p_tool) return; + + aout_VolumeSet(p_intf , p_tool->GetValue()); + SyncVolume(); + +} + +void Interface::TogglePlayButton( int i_playing_status ) +{ wxToolBarToolBase *p_tool = (wxToolBarToolBase *) GetToolBar()->GetToolClientData( PlayStream_Event ); if( !p_tool ) return; @@ -1288,65 +1262,50 @@ void Interface::TogglePlayButton( int i_playing_status ) } GetToolBar()->Realize(); + +#if defined( __WXMSW__ ) + /* Needed to work around a bug in wxToolBar::Realize() */ + GetToolBar()->SetSize( GetSize().GetWidth(), + GetToolBar()->GetSize().GetHeight() ); + GetToolBar()->Update(); +#endif + GetToolBar()->ToggleTool( PlayStream_Event, true ); GetToolBar()->ToggleTool( PlayStream_Event, false ); - - i_old_playing_status = i_playing_status; } -void Interface::OnDiscMenu( wxCommandEvent& WXUNUSED(event) ) +void Interface::OnInteraction( wxCommandEvent& event ) { - input_thread_t *p_input = - (input_thread_t *)vlc_object_find( p_intf, VLC_OBJECT_INPUT, - FIND_ANYWHERE ); - if( p_input ) - { - vlc_value_t val; val.i_int = 2; - - var_Set( p_input, "title 0", val); - vlc_object_release( p_input ); - } -} + interaction_dialog_t *p_dialog = (interaction_dialog_t *) + event.GetClientData(); -void Interface::OnDiscPrev( wxCommandEvent& WXUNUSED(event) ) -{ - input_thread_t *p_input = - (input_thread_t *)vlc_object_find( p_intf, VLC_OBJECT_INPUT, - FIND_ANYWHERE ); - if( p_input ) - { - int i_type = var_Type( p_input, "prev-chapter" ); - vlc_value_t val; val.b_bool = VLC_TRUE; + intf_dialog_args_t *p_arg = new intf_dialog_args_t; + p_arg->p_dialog = p_dialog; + p_arg->p_intf = p_intf; - var_Set( p_input, ( i_type & VLC_VAR_TYPE ) != 0 ? - "prev-chapter" : "prev-title", val ); + p_intf->p_sys->pf_show_dialog( p_intf, INTF_DIALOG_INTERACTION, + 0, p_arg ); - vlc_object_release( p_input ); - } } -void Interface::OnDiscNext( wxCommandEvent& WXUNUSED(event) ) +static int InteractCallback( vlc_object_t *p_this, + const char *psz_var, vlc_value_t old_val, + vlc_value_t new_val, void *param ) { - input_thread_t *p_input = - (input_thread_t *)vlc_object_find( p_intf, VLC_OBJECT_INPUT, - FIND_ANYWHERE ); - if( p_input ) - { - int i_type = var_Type( p_input, "next-chapter" ); - vlc_value_t val; val.b_bool = VLC_TRUE; - - var_Set( p_input, ( i_type & VLC_VAR_TYPE ) != 0 ? - "next-chapter" : "next-title", val ); + Interface *p_interface = (Interface*)param; + /*interaction_dialog_t *p_dialog = (interaction_dialog_t*)(new_val.p_address);*/ - vlc_object_release( p_input ); - } + wxCommandEvent event( wxEVT_INTERACTION, -1 ); + event.SetClientData( new_val.p_address ); + p_interface->AddPendingEvent( event ); + return VLC_SUCCESS; } #if wxUSE_DRAG_AND_DROP /***************************************************************************** * Definition of DragAndDrop class. *****************************************************************************/ -DragAndDrop::DragAndDrop( intf_thread_t *_p_intf, vlc_bool_t _b_enqueue ) +DragAndDrop::DragAndDrop( intf_thread_t *_p_intf, bool _b_enqueue ) { p_intf = _p_intf; b_enqueue = _b_enqueue; @@ -1356,133 +1315,54 @@ bool DragAndDrop::OnDropFiles( wxCoord, wxCoord, const wxArrayString& filenames ) { /* Add dropped files to the playlist */ - - playlist_t *p_playlist = - (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, - FIND_ANYWHERE ); + playlist_t *p_playlist = pl_Yield( p_intf ); if( p_playlist == NULL ) { return FALSE; } + /* If we drag & drop a subtitle file, add it on the fly */ + if( filenames.GetCount() == 1 ) + { + char *psz_utf8 = wxDnDFromLocale( filenames[0] ); + input_thread_t *p_input = (input_thread_t *)vlc_object_find( p_intf, + VLC_OBJECT_INPUT, FIND_ANYWHERE ); + if( p_input ) + { + if( input_AddSubtitles( p_input, psz_utf8, true ) ) + { + vlc_object_release( p_input ); + wxDnDLocaleFree( psz_utf8 ); + pl_Release( p_playlist ); + return TRUE; + } + vlc_object_release( p_input ); + } + wxDnDLocaleFree( psz_utf8 ); + } + for( size_t i = 0; i < filenames.GetCount(); i++ ) - playlist_Add( p_playlist, (const char *)filenames[i].mb_str(), - (const char *)filenames[i].mb_str(), + { + char *psz_utf8 = wxDnDFromLocale( filenames[i] ); + + playlist_Add( p_playlist, psz_utf8, NULL, PLAYLIST_APPEND | ((i | b_enqueue) ? 0 : PLAYLIST_GO), - PLAYLIST_END ); + PLAYLIST_END, true, false ); - vlc_object_release( p_playlist ); + wxDnDLocaleFree( psz_utf8 ); + } + pl_Release( p_playlist ); return TRUE; } #endif -/***************************************************************************** - * Definition of VolCtrl class. - *****************************************************************************/ -class wxVolCtrl: public wxGauge -{ -public: - /* Constructor */ - wxVolCtrl( intf_thread_t *_p_intf, wxWindow* parent, wxWindowID id, - wxPoint = wxDefaultPosition, wxSize = wxSize( 20, -1 ) ); - virtual ~wxVolCtrl() {}; - - void UpdateVolume(); - int GetVolume(); - - 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) - EVT_MOTION(wxVolCtrl::OnChange) -END_EVENT_TABLE() - -wxVolCtrl::wxVolCtrl( intf_thread_t *_p_intf, wxWindow* parent, wxWindowID id, - wxPoint point, wxSize size ) - : wxGauge( parent, id, 200, point, size, wxGA_HORIZONTAL | wxGA_SMOOTH ) -{ - p_intf = _p_intf; - UpdateVolume(); -} - -void wxVolCtrl::OnChange( wxMouseEvent& event ) -{ - if( !event.LeftDown() && !event.LeftIsDown() ) return; - - int i_volume = event.GetX() * 200 / GetClientSize().GetWidth(); - aout_VolumeSet( p_intf, i_volume * AOUT_VOLUME_MAX / 200 / 2 ); - UpdateVolume(); -} - -void wxVolCtrl::UpdateVolume() -{ - audio_volume_t i_volume; - aout_VolumeGet( p_intf, &i_volume ); - - int i_gauge_volume = i_volume * 200 * 2 / AOUT_VOLUME_MAX; - if( i_gauge_volume == GetValue() ) return; - - SetValue( i_gauge_volume ); - SetToolTip( wxString::Format((wxString)wxU(_("Volume")) + wxT(" %d"), - i_gauge_volume / 2 ) ); -} - -#if defined(__WXGTK__) -#define VLCVOL_HEIGHT p_parent->GetSize().GetHeight() -#else -#define VLCVOL_HEIGHT TOOLBAR_BMP_HEIGHT -#endif -VLCVolCtrl::VLCVolCtrl( intf_thread_t *_p_intf, wxWindow *p_parent ) - :wxControl( p_parent, -1, wxDefaultPosition, wxSize(64, VLCVOL_HEIGHT ), - wxBORDER_NONE ), - i_y_offset((VLCVOL_HEIGHT - TOOLBAR_BMP_HEIGHT) / 2), - b_mute(0), p_intf(_p_intf) -{ - gauge = new wxVolCtrl( p_intf, this, -1, wxPoint( 18, i_y_offset ), - wxSize( 44, TOOLBAR_BMP_HEIGHT ) ); -} - -void VLCVolCtrl::OnPaint( wxPaintEvent &evt ) -{ - wxPaintDC dc( this ); - wxBitmap mPlayBitmap( b_mute ? speaker_mute_xpm : speaker_xpm ); - dc.DrawBitmap( mPlayBitmap, 0, i_y_offset, TRUE ); -} - -void VLCVolCtrl::OnChange( wxMouseEvent& event ) -{ - if( event.GetX() < TOOLBAR_BMP_WIDTH ) - { - int i_volume; - aout_VolumeMute( p_intf, (audio_volume_t *)&i_volume ); - - b_mute = !b_mute; - Refresh(); - } -} - -void VLCVolCtrl::UpdateVolume() -{ - gauge->UpdateVolume(); - - int i_volume = gauge->GetValue(); - if( !!i_volume == !b_mute ) return; - b_mute = !b_mute; - Refresh(); -} - /***************************************************************************** * Systray class. *****************************************************************************/ +/* wxCocoa pretends to support this, but at least 2.6.x doesn't */ +#ifndef __APPLE__ #ifdef wxHAS_TASK_BAR_ICON BEGIN_EVENT_TABLE(Systray, wxTaskBarIcon) @@ -1505,6 +1385,12 @@ Systray::Systray( Interface *_p_main_interface, intf_thread_t *_p_intf ) { p_main_interface = _p_main_interface; p_intf = _p_intf; + + SetIcon( wxIcon( (const char**) vlc16x16_xpm ), wxT("VLC media player") ); + if( !IsOk() || !IsIconInstalled() ) + { + msg_Warn(p_intf, "cannot set systray icon, weird things may happen"); + } } /* Event handlers */ @@ -1562,12 +1448,13 @@ wxMenu* Systray::CreatePopupMenu() systray_menu->Append( StopStream_Event, wxU(_("Stop")) ); } systray_menu->AppendSeparator(); - systray_menu->Append( Iconize_Event, wxU(_("Show/Hide interface")) ); + systray_menu->Append( Iconize_Event, wxU(_("Show/Hide Interface")) ); return systray_menu; } void Systray::UpdateTooltip( const wxChar* tooltip ) { - SetIcon( wxIcon( vlc16x16_xpm ), tooltip ); + SetIcon( wxIcon( (const char**) vlc16x16_xpm ), tooltip ); } #endif +#endif