X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fwxwidgets%2Finterface.cpp;h=6485c9a2b5bf0d774faf9f5ee00edba4add95030;hb=0a520894c4451459a1e93426a1042e88be5db0cc;hp=66786c0782720a520d8e6fb979fd2d94c95a5b12;hpb=7b885b9bdb3005af8365094ac6fe63cef1fa6566;p=vlc diff --git a/modules/gui/wxwidgets/interface.cpp b/modules/gui/wxwidgets/interface.cpp index 66786c0782..6485c9a2b5 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,22 +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 "interface.hpp" +#include "playlist_manager.hpp" #include "extrapanel.hpp" #include "timer.hpp" #include "video.hpp" #include -#include "charset.h" +#include "vlc_charset.h" -#include -#include "charset.h" +#include +#include "vlc_charset.h" + +#include + +#include + +#include /* wxLaunchDefaultBrowser() */ /* include the toolbar graphics */ #include "bitmaps/play.xpm" @@ -45,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" @@ -58,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. *****************************************************************************/ @@ -102,12 +116,142 @@ public: }; BEGIN_EVENT_TABLE(VLCVolCtrl, wxControl) - EVT_PAINT(VLCVolCtrl::OnPaint) + EVT_PAINT(VLCVolCtrl::OnPaint) /* Mouse events */ EVT_LEFT_UP(VLCVolCtrl::OnChange) END_EVENT_TABLE() +class Splitter : public wxSplitterWindow +{ +public: + 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 ); + } + + bool ShowOnStart() { return b_show_on_start; } + +private: + DECLARE_EVENT_TABLE() + + 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 = VLC_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 = VLC_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; + vlc_bool_t b_video; + mtime_t i_delay; + vlc_bool_t b_show_on_start; +}; + +BEGIN_EVENT_TABLE(Splitter, wxSplitterWindow) + EVT_SIZE( Splitter::OnSize ) + EVT_SPLITTER_SASH_POS_CHANGED(-1, Splitter::OnSashPosChanged) +END_EVENT_TABLE() + /***************************************************************************** * Event Table. *****************************************************************************/ @@ -134,16 +278,15 @@ 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, @@ -151,28 +294,35 @@ enum SlowStream_Event, FastStream_Event, - DiscMenu_Event, - DiscPrev_Event, - DiscNext_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, - VLM_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) - EVT_MENU(VLM_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) @@ -180,7 +330,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) @@ -206,20 +355,11 @@ BEGIN_EVENT_TABLE(Interface, wxFrame) 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) - /* 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() /***************************************************************************** @@ -231,44 +371,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; - + 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 */ @@ -277,38 +425,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 */ @@ -317,60 +472,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 ); - - /* Set minimum window size to prevent user from glitching it */ - wxSize s2; - s = GetSize(); + if( ws->GetSettings( WindowSettings::ID_MAIN, b_shown, p, s ) ) Move( p ); - /* save smallest possible default minimum size */ - default_size = GetSize(); + /* Show extended GUI if requested */ + wxCommandEvent dummy; + if( config_GetInt( p_intf, "wx-extended" ) ) OnExtended( dummy ); - /* save slider size for height only for MinSizing */ - slider_size = slider_sizer->GetSize(); + SetIntfMinSize(); - /* and save extended gui size for MinSize scheme */ - s2 = extra_frame->GetSize(); - s2.SetWidth( s2.GetWidth() + - 2 * wxSystemSettings::GetMetric( wxSYS_FRAMESIZE_X ) ); - extended_size = s2; + var_Create( p_intf, "interaction", VLC_VAR_ADDRESS ); + var_AddCallback( p_intf, "interaction", InteractCallback, this ); + p_intf->b_interaction = VLC_TRUE; - /* Set initial minimum window size */ - if( config_GetInt( p_intf, "wx-embed" ) ) - { - s2 = video_window->GetSize(); - s.SetHeight( s.GetHeight() - s2.GetHeight() ); - } - if( config_GetInt( p_intf, "wx-extended" ) ) - { - s.SetWidth( extended_size.GetWidth() ); - s.SetHeight( s.GetHeight() + extended_size.GetHeight() ); - } -#if (wxCHECK_VERSION(2,5,4)) - SetMinSize( s ); -#else - frame_sizer->SetMinSize( s ); -#endif - - /* Show extended GUI if requested */ - if( ( b_extra = config_GetInt( p_intf, "wx-extended" ) ) ) - frame_sizer->Show( extra_frame ); + /* Show embedded playlist if requested */ + if( splitter->ShowOnStart() ) OnSmallPlaylist( dummy ); } Interface::~Interface() @@ -387,12 +514,19 @@ Interface::~Interface() if( video_window ) 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; #endif +#endif + + p_intf->b_interaction = VLC_FALSE; + var_DelCallback( p_intf, "interaction", InteractCallback, this ); if( p_intf->p_sys->p_wxwindow ) delete p_intf->p_sys->p_wxwindow; + /* Clean up */ delete timer; } @@ -406,7 +540,11 @@ void Interface::Init() void Interface::Update() { /* Misc updates */ - ((VLCVolCtrl *)volctrl)->UpdateVolume(); + if( !(i_update_counter % 10) ) ((VLCVolCtrl *)volctrl)->UpdateVolume(); + + if( playlist_manager ) playlist_manager->Update(); + + i_update_counter++; } void Interface::OnControlEvent( wxCommandEvent& event ) @@ -414,13 +552,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: @@ -470,9 +603,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-I")) ); + wxU(_("VLM Control...\tCtrl-V")) ); +#endif /* Create the "Auto-generated" menus */ p_settings_menu = SettingsMenu( p_intf, this ); @@ -482,14 +617,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")) ); @@ -536,7 +676,7 @@ void Interface::CreateOurMenuBar() #endif /* End patch by zcot */ - frame_sizer->SetMinSize( i_size, -1 ); + panel_sizer->SetMinSize( i_size, -1 ); /* Intercept all menu events in our custom event handler */ PushEventHandler( new MenuEvtHandler( p_intf, this ) ); @@ -554,58 +694,73 @@ 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 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") 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)) ); } -#if !( (wxMAJOR_VERSION <= 2) && (wxMINOR_VERSION <= 6) && (wxRELEASE_NUMBER < 2) ) wxControl *p_dummy_ctrl = new wxControl( toolbar, -1, wxDefaultPosition, - wxSize(35, 16 ), wxBORDER_NONE ); + wxSize(16, 16 ), wxBORDER_NONE ); toolbar->AddControl( p_dummy_ctrl ); -#endif volctrl = new VLCVolCtrl( p_intf, toolbar ); toolbar->AddControl( volctrl ); @@ -618,53 +773,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; @@ -718,7 +826,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 */ @@ -758,118 +866,23 @@ void Interface::SetupHotkeys() delete [] p_entries; } -void Interface::HideSlider( bool layout ) +void Interface::SetIntfMinSize() { - ShowSlider( false, layout ); -} + wxSize ms = main_min_size; -void Interface::ShowSlider( bool show, bool layout ) -{ - if( show ) + if( extra_frame && extra_frame->IsShown() ) { - //prevent the hide timers from hiding it now - m_slider_timer.Stop(); - m_controls_timer.Stop(); - - //prevent continuous layout - if( slider_frame->IsShown() ) return; - - wxSize ms = GetMinSize(); - ms.SetHeight( ms.GetHeight() + slider_size.GetHeight() ); -#if ( wxCHECK_VERSION( 2,5,4 ) ) - SetMinSize( ms ); -#else - frame_sizer->SetMinSize( ms ); -#endif + ms.SetHeight( ms.GetHeight() + ext_min_size.GetHeight() ); + if( ext_min_size.GetWidth() > ms.GetWidth() ) + ms.SetWidth( ext_min_size.GetWidth() ); } - else - { - //prevent continuous layout - if( !slider_frame->IsShown() ) return; - - wxSize ms = GetMinSize(); - ms.SetHeight( ms.GetHeight() - slider_size.GetHeight() ); -#if ( wxCHECK_VERSION( 2,5,4 ) ) - SetMinSize( ms ); -#else - frame_sizer->SetMinSize( ms ); -#endif - } - - 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__ ) @@ -884,11 +897,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, @@ -944,25 +952,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 SVN revision: "))+wxU(VLC_Changeset())+wxT(".\n\n") + + wxU(_("Based on Git commit: "))+wxU(VLC_Changeset())+wxT(".\n\n") + #ifdef __WXMSW__ - wxU( vlc_wraptext(LICENSE_MSG,WRAPCOUNT,VLC_TRUE) ) + wxT("\n\n") + + wxU( vlc_wraptext(LICENSE_MSG,WRAPCOUNT) ) + wxT("\n\n") + #else 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 ) @@ -1013,12 +1030,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; @@ -1028,38 +1049,42 @@ 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 ) + if( !extra_frame ) { - extra_frame->Hide(); - frame_sizer->Hide( extra_frame ); - wxSize ms = GetMinSize(); - ms.SetHeight( ms.GetHeight() - extended_size.GetHeight() ); - ms.SetWidth( default_size.GetWidth() ); -#if ( wxCHECK_VERSION( 2,5,4 ) ) - SetMinSize( ms ); -#else - frame_sizer->SetMinSize( ms ); -#endif + /* 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(); } - else + + b_extra = !b_extra; + panel_sizer->Show( extra_frame, b_extra ); + + SetIntfMinSize(); + main_sizer->Layout(); + main_sizer->Fit( this ); +} + +void Interface::OnSmallPlaylist( wxCommandEvent& WXUNUSED(event) ) +{ + UpdateVideoWindow( p_intf, video_window ); + + if( !playlist_manager ) { - extra_frame->Show(); - frame_sizer->Show( extra_frame ); - wxSize ms = GetMinSize(); - ms.SetHeight( ms.GetHeight() + extended_size.GetHeight() ); - ms.SetWidth( extended_size.GetWidth() ); -#if ( wxCHECK_VERSION( 2,5,4 ) ) - SetMinSize( ms ); -#else - frame_sizer->SetMinSize( ms ); -#endif + /* Create the extra panel */ + playlist_manager = new PlaylistManager( p_intf, splitter ); } - frame_sizer->Layout(); - frame_sizer->Fit(this); + + 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) ) @@ -1075,7 +1100,7 @@ void Interface::PlayStream() FIND_ANYWHERE ); if( p_playlist == NULL ) return; - if( p_playlist->i_size && p_playlist->i_enabled ) + if( !playlist_IsEmpty(p_playlist) && p_playlist->i_enabled ) { vlc_value_t state; @@ -1086,13 +1111,12 @@ void Interface::PlayStream() { /* No stream was playing, start one */ playlist_Play( p_playlist ); - TogglePlayButton( PLAYING_S ); vlc_object_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 */ @@ -1105,15 +1129,16 @@ void Interface::PlayStream() } var_Set( p_input, "state", state ); - TogglePlayButton( state.i_int ); vlc_object_release( p_input ); vlc_object_release( p_playlist ); + input_manager->Update(); } else { /* If the playlist is empty, open a file requester instead */ vlc_object_release( p_playlist ); OnShowDialog( dummy ); + GetToolBar()->ToggleTool( PlayStream_Event, false ); } } @@ -1132,57 +1157,8 @@ void Interface::StopStream() } 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 ); + input_manager->Update(); } void Interface::OnPrevStream( wxCommandEvent& WXUNUSED(event) ) @@ -1252,9 +1228,6 @@ void Interface::OnFastStream( wxCommandEvent& WXUNUSED(event) ) void Interface::TogglePlayButton( int i_playing_status ) { - if( i_playing_status == i_old_playing_status ) - return; - wxToolBarToolBase *p_tool = (wxToolBarToolBase *) GetToolBar()->GetToolClientData( PlayStream_Event ); if( !p_tool ) return; @@ -1273,58 +1246,43 @@ 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; + interaction_dialog_t *p_dialog = (interaction_dialog_t *) + event.GetClientData(); - var_Set( p_input, "title 0", val); - vlc_object_release( p_input ); - } -} + intf_dialog_args_t *p_arg = new intf_dialog_args_t; + p_arg->p_dialog = p_dialog; + p_arg->p_intf = p_intf; -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; - - 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 @@ -1350,14 +1308,35 @@ bool DragAndDrop::OnDropFiles( wxCoord, wxCoord, 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, VLC_TRUE ) ) + { + vlc_object_release( p_input ); + wxDnDLocaleFree( psz_utf8 ); + vlc_object_release( p_playlist ); + return TRUE; + } + vlc_object_release( p_input ); + } + wxDnDLocaleFree( psz_utf8 ); + } + for( size_t i = 0; i < filenames.GetCount(); i++ ) { - char *psz_utf8 = wxFromLocale( filenames[i] ); + char *psz_utf8 = wxDnDFromLocale( filenames[i] ); - playlist_Add( p_playlist, psz_utf8, psz_utf8, + playlist_Add( p_playlist, psz_utf8, NULL, PLAYLIST_APPEND | ((i | b_enqueue) ? 0 : PLAYLIST_GO), - PLAYLIST_END ); - wxLocaleFree( psz_utf8 ); + PLAYLIST_END, VLC_TRUE, VLC_FALSE ); + + wxDnDLocaleFree( psz_utf8 ); } vlc_object_release( p_playlist ); @@ -1472,6 +1451,8 @@ void VLCVolCtrl::UpdateVolume() * 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) @@ -1494,6 +1475,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 */ @@ -1551,12 +1538,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