X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fwxwidgets%2Finterface.cpp;h=83c9325d8213d2e6e824bd8b129c0714885fe0dd;hb=f485214f09dd284cbb85674e937fbbb0a6032a2e;hp=adc9fd8ce0ae8fb3a6fd40cced05ae208647db10;hpb=c4c65e064a6a1e6db423aa157d2d4b940336e654;p=vlc diff --git a/modules/gui/wxwidgets/interface.cpp b/modules/gui/wxwidgets/interface.cpp index adc9fd8ce0..83c9325d82 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,7 +18,7 @@ * * 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. *****************************************************************************/ /***************************************************************************** @@ -36,6 +36,8 @@ #include #include "charset.h" +#include + #include /* include the toolbar graphics */ @@ -62,6 +64,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. *****************************************************************************/ @@ -117,19 +125,38 @@ 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 ), - p_intf(_p_intf), i_sash_position(150), i_width(-1) +#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() {}; + 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( -1 ); - - wxSize size = wxSize( i_width, i_sash_position - GetSashSize() ); + SetSashSize( 0 ); + wxSize size = wxSize( i_width, i_sash_position ); if( window2->GetSizer() ) window2->GetSizer()->SetMinSize( size ); return wxSplitterWindow::SplitHorizontally( window1, window2, @@ -142,6 +169,8 @@ public: return wxSplitterWindow::Unsplit( window ); } + bool ShowOnStart() { return b_show_on_start; } + private: DECLARE_EVENT_TABLE() @@ -152,22 +181,41 @@ private: 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 ); - i_sash_position = event.GetSize().GetHeight() - - size.GetHeight(); - i_width = event.GetSize().GetWidth(); - size = wxSize( i_width, i_sash_position - GetSashSize() ); - if( GetWindow2()->GetSizer() ) - GetWindow2()->GetSizer()->SetMinSize( size ); + 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 ); + } } } @@ -177,13 +225,24 @@ private: void OnSashPosChanged( wxSplitterEvent &event ) { if( !GetSize().GetHeight() ){ event.Skip(); return; } - i_sash_position = GetSize().GetHeight() - event.GetSashPosition(); + + 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) @@ -240,9 +299,11 @@ enum UpdateVLC_Event, 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) @@ -287,6 +348,8 @@ BEGIN_EVENT_TABLE(Interface, wxFrame) /* Custom events */ EVT_COMMAND(0, wxEVT_INTF, Interface::OnControlEvent) EVT_COMMAND(1, wxEVT_INTF, Interface::OnControlEvent) + + EVT_COMMAND( -1, wxEVT_INTERACTION, Interface::OnInteraction ) END_EVENT_TABLE() /***************************************************************************** @@ -301,6 +364,8 @@ Interface::Interface( intf_thread_t *_p_intf, long style ): b_extra = VLC_FALSE; extra_frame = 0; playlist_manager = 0; + i_update_counter = 0; + /* Give our interface a nice little icon */ SetIcon( wxIcon( vlc_xpm ) ); @@ -332,6 +397,8 @@ Interface::Interface( intf_thread_t *_p_intf, long style ): /* 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; @@ -339,6 +406,7 @@ Interface::Interface( intf_thread_t *_p_intf, long style ): { p_systray = new Systray( this, p_intf ); } +#endif #endif /* Creation of the menu bar */ @@ -360,6 +428,13 @@ Interface::Interface( intf_thread_t *_p_intf, long style ): 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 */ @@ -406,6 +481,13 @@ Interface::Interface( intf_thread_t *_p_intf, long style ): 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 = VLC_TRUE; + + /* Show embedded playlist if requested */ + if( splitter->ShowOnStart() ) OnSmallPlaylist( dummy ); } Interface::~Interface() @@ -422,12 +504,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; } @@ -441,9 +530,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 ) @@ -502,7 +593,7 @@ 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")) ); view_menu->Append( VLM_Event, wxU(_("VLM Control...\tCtrl-V")) ); @@ -514,9 +605,9 @@ 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( About_Event, wxU(_("About...")) ); help_menu->AppendSeparator(); - help_menu->Append( UpdateVLC_Event, wxU(_("Check for updates ...")) ); + help_menu->Append( UpdateVLC_Event, wxU(_("Check for Updates...")) ); /* Append the freshly created menus to the menu bar... */ wxMenuBar *menubar = new wxMenuBar(); @@ -586,52 +677,66 @@ void Interface::CreateOurToolBar() #define HELP_PLAY N_("Play") #define HELP_PAUSE N_("Pause") #define HELP_PLO N_("Playlist") -#define HELP_SPLO N_("Small 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)) ); - toolbar->AddTool( PlaylistSmall_Event, wxT(""), - wxBitmap( playlist_small_xpm ), wxU(_(HELP_SPLO)) ); + 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 = @@ -704,7 +809,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 */ @@ -832,13 +937,15 @@ void Interface::OnAbout( wxCommandEvent& WXUNUSED(event) ) wxString msg; msg.Printf( wxString(wxT("VLC media player " PACKAGE_VERSION)) + wxU(_(" (wxWidgets interface)\n\n")) + - wxU(_("(c) 1996-2005 - the VideoLAN Team\n\n")) + + wxU(_("(c) 1996-2006 - 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") + +#ifndef HAVE_SHARED_LIBVLC wxU(_("Based on SVN revision: "))+wxU(VLC_Changeset())+wxT(".\n\n") + +#endif #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 @@ -1003,6 +1110,7 @@ void Interface::PlayStream() /* If the playlist is empty, open a file requester instead */ vlc_object_release( p_playlist ); OnShowDialog( dummy ); + GetToolBar()->ToggleTool( PlayStream_Event, false ); } } @@ -1122,6 +1230,33 @@ void Interface::TogglePlayButton( int i_playing_status ) GetToolBar()->ToggleTool( PlayStream_Event, false ); } +void Interface::OnInteraction( wxCommandEvent& event ) +{ + interaction_dialog_t *p_dialog = (interaction_dialog_t *) + event.GetClientData(); + + intf_dialog_args_t *p_arg = new intf_dialog_args_t; + p_arg->p_dialog = p_dialog; + p_arg->p_intf = p_intf; + + p_intf->p_sys->pf_show_dialog( p_intf, INTF_DIALOG_INTERACTION, + 0, p_arg ); + +} + +static int InteractCallback( vlc_object_t *p_this, + const char *psz_var, vlc_value_t old_val, + vlc_value_t new_val, void *param ) +{ + Interface *p_interface = (Interface*)param; + /*interaction_dialog_t *p_dialog = (interaction_dialog_t*)(new_val.p_address);*/ + + 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. @@ -1145,14 +1280,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_PlaylistAdd( p_playlist, psz_utf8, psz_utf8, PLAYLIST_APPEND | ((i | b_enqueue) ? 0 : PLAYLIST_GO), PLAYLIST_END ); - wxLocaleFree( psz_utf8 ); + + wxDnDLocaleFree( psz_utf8 ); } vlc_object_release( p_playlist ); @@ -1267,6 +1423,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) @@ -1352,7 +1510,7 @@ 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; } @@ -1361,3 +1519,4 @@ void Systray::UpdateTooltip( const wxChar* tooltip ) SetIcon( wxIcon( vlc16x16_xpm ), tooltip ); } #endif +#endif