Beginning of menus implementation
Fix a make dist bug
modules/gui/qt4/menus.cpp
0 → 100644
/***************************************************************************** | ||
* menus.cpp : Qt menus | ||
***************************************************************************** | ||
* Copyright (C) 2000-2004 the VideoLAN team | ||
* $Id: menus.cpp 15858 2006-06-09 21:35:13Z gbazin $ | ||
* | ||
* Authors: Clment Stenac <zorglub@videolan.org> | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License as published by | ||
* the Free Software Foundation; either version 2 of the License, or | ||
* (at your option) any later version. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* 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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. | ||
*****************************************************************************/ | ||
#include "menus.hpp" | ||
#include "dialogs_provider.hpp" | ||
#include <QMenu> | ||
#include <QAction> | ||
#include <QActionGroup> | ||
#include <QSignalMapper> | ||
enum | ||
{ | ||
ITEM_NORMAL, | ||
ITEM_CHECK, | ||
ITEM_RADIO | ||
}; | ||
static QActionGroup *currentGroup; | ||
/***************************************************************************** | ||
* Static menu helpers | ||
* These create already mapped and connected menus | ||
*****************************************************************************/ | ||
#define STATIC_ADD( text, help, icon, slot ) { QAction *action = menu->addAction( text, THEDP, SLOT( slot ) ); } | ||
QMenu *QVLCMenu::FileMenu() | ||
{ | ||
QMenu *menu = new QMenu(); | ||
STATIC_ADD( _("Quick &Open File...") , "", NULL, simpleOpenDialog() ); | ||
STATIC_ADD( _("&Advanced Open..." ), "", NULL, openDialog() ); | ||
menu->addSeparator(); | ||
STATIC_ADD( _("Streaming..."), "", NULL, streamingDialog() ); | ||
menu->addSeparator(); | ||
STATIC_ADD( _("&Quit") , "", NULL, quit() ); | ||
return menu; | ||
} | ||
#if 0 | ||
QMenu *OpenStreamMenu( intf_thread_t *p_intf ) | ||
{ | ||
QMenu *menu = new QMenu; | ||
menu->Append( OpenFileSimple_Event, wxU(_("Quick &Open File...")) ); | ||
menu->Append( OpenFile_Event, wxU(_("Open &File...")) ); | ||
menu->Append( OpenDirectory_Event, wxU(_("Open D&irectory...")) ); | ||
menu->Append( OpenDisc_Event, wxU(_("Open &Disc...")) ); | ||
menu->Append( OpenNet_Event, wxU(_("Open &Network Stream...")) ); | ||
menu->Append( OpenCapture_Event, wxU(_("Open &Capture Device...")) ); | ||
return menu; | ||
} | ||
wxMenu *MiscMenu( intf_thread_t *p_intf ) | ||
{ | ||
wxMenu *menu = new wxMenu; | ||
menu->Append( MediaInfo_Event, wxU(_("Media &Info...")) ); | ||
menu->Append( Messages_Event, wxU(_("&Messages...")) ); | ||
menu->Append( Preferences_Event, wxU(_("&Preferences...")) ); | ||
return menu; | ||
} | ||
#endif | ||
/***************************************************************************** | ||
* Builders for the dynamic menus | ||
*****************************************************************************/ | ||
#define PUSH_VAR( var ) rs_varnames.push_back( var ); \ | ||
ri_objects.push_back( p_object->i_object_id ) | ||
static int InputAutoMenuBuilder( vlc_object_t *p_object, | ||
vector<int> &ri_objects, | ||
vector<const char *> &rs_varnames ) | ||
{ | ||
PUSH_VAR( "bookmark"); | ||
PUSH_VAR( "title" ); | ||
PUSH_VAR ("chapter" ); | ||
PUSH_VAR( "program" ); | ||
PUSH_VAR( "navigation" ); | ||
PUSH_VAR( "dvd_menus" ); | ||
return VLC_SUCCESS; | ||
} | ||
static int VideoAutoMenuBuilder( vlc_object_t *p_object, | ||
vector<int> &ri_objects, | ||
vector<const char *> &rs_varnames ) | ||
{ | ||
PUSH_VAR( "fullscreen" ); | ||
PUSH_VAR( "zoom" ); | ||
PUSH_VAR( "deinterlace" ); | ||
PUSH_VAR( "aspect-ratio" ); | ||
PUSH_VAR( "crop" ); | ||
PUSH_VAR( "video-on-top" ); | ||
PUSH_VAR( "directx-wallpaper" ); | ||
PUSH_VAR( "video-snapshot" ); | ||
vlc_object_t *p_dec_obj = (vlc_object_t *)vlc_object_find( p_object, | ||
VLC_OBJECT_DECODER, | ||
FIND_PARENT ); | ||
if( p_dec_obj != NULL ) | ||
{ | ||
PUSH_VAR( "ffmpeg-pp-q" ); | ||
vlc_object_release( p_dec_obj ); | ||
} | ||
return VLC_SUCCESS; | ||
} | ||
static int AudioAutoMenuBuilder( vlc_object_t *p_object, | ||
vector<int> &ri_objects, | ||
vector<const char *> &rs_varnames ) | ||
{ | ||
PUSH_VAR( "audio-device" ); | ||
PUSH_VAR( "audio-channels" ); | ||
PUSH_VAR( "visual" ); | ||
PUSH_VAR( "equalizer" ); | ||
return VLC_SUCCESS; | ||
} | ||
static int IntfAutoMenuBuilder( intf_thread_t *p_intf, vector<int> &ri_objects, | ||
vector<const char *> &rs_varnames, bool is_popup ) | ||
{ | ||
/* vlc_object_find is needed because of the dialogs provider case */ | ||
vlc_object_t *p_object; | ||
p_object = (vlc_object_t *)vlc_object_find( p_intf, VLC_OBJECT_INTF, | ||
FIND_PARENT ); | ||
if( p_object != NULL ) | ||
{ | ||
if( is_popup ) | ||
{ | ||
PUSH_VAR( "intf-switch" ); | ||
} | ||
else | ||
{ | ||
PUSH_VAR( "intf-switch" ); | ||
} | ||
PUSH_VAR( "intf-add" ); | ||
PUSH_VAR( "intf-skins" ); | ||
vlc_object_release( p_object ); | ||
} | ||
return VLC_SUCCESS; | ||
} | ||
#undef PUSH_VAR | ||
/***************************************************************************** | ||
* Popup menus | ||
*****************************************************************************/ | ||
#define PUSH_VAR( var ) as_varnames.push_back( var ); \ | ||
ai_objects.push_back( p_object->i_object_id ) | ||
#define PUSH_SEPARATOR if( ai_objects.size() != i_last_separator ) { \ | ||
ai_objects.push_back( 0 ); \ | ||
as_varnames.push_back( "" ); \ | ||
i_last_separator = ai_objects.size(); } | ||
#define POPUP_BOILERPLATE \ | ||
unsigned int i_last_separator = 0; \ | ||
vector<int> ai_objects; \ | ||
vector<const char *> as_varnames; \ | ||
playlist_t *p_playlist = (playlist_t *) vlc_object_find( p_intf, \ | ||
VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );\ | ||
if( !p_playlist ) \ | ||
return; \ | ||
input_thread_t *p_input = p_playlist->p_input | ||
#define CREATE_POPUP \ | ||
QMenu *popupmenu = new QMenu(); \ | ||
QVLCMenu::Populate( popupmenu, as_varnames, ai_objects ); \ | ||
p_intf->p_sys->p_popup_menu = &popupmenu; \ | ||
p_intf->p_sys->p_popup_menu = NULL; \ | ||
i_last_separator = 0 // stop compiler warning | ||
/// p_parent->PopupMenu( &popupmenu, pos.x, pos.y ); \ /// TODO | ||
#define POPUP_STATIC_ENTRIES \ | ||
if( p_input != NULL ) \ | ||
{ \ | ||
vlc_value_t val; \ | ||
popupmenu.InsertSeparator( 0 ); \ | ||
popupmenu.Insert( 0, Stop_Event, wxU(_("Stop")) ); \ | ||
popupmenu.Insert( 0, Previous_Event, wxU(_("Previous")) ); \ | ||
popupmenu.Insert( 0, Next_Event, wxU(_("Next")) ); \ | ||
var_Get( p_input, "state", &val ); \ | ||
if( val.i_int == PAUSE_S ) \ | ||
popupmenu.Insert( 0, Play_Event, wxU(_("Play")) ); \ | ||
else \ | ||
popupmenu.Insert( 0, Pause_Event, wxU(_("Pause")) ); \ | ||
\ | ||
vlc_object_release( p_input ); \ | ||
} \ | ||
else \ | ||
{ \ | ||
if( p_playlist && p_playlist->i_size ) \ | ||
{ \ | ||
popupmenu.InsertSeparator( 0 ); \ | ||
popupmenu.Insert( 0, Play_Event, wxU(_("Play")) ); \ | ||
} \ | ||
if( p_playlist ) vlc_object_release( p_playlist ); \ | ||
} \ | ||
\ | ||
popupmenu.Append( MenuDummy_Event, wxU(_("Miscellaneous")), \ | ||
MiscMenu( p_intf ), wxT("") ) | ||
void QVLCMenu::VideoPopupMenu( intf_thread_t *p_intf, const QPoint &pos ) | ||
{ | ||
POPUP_BOILERPLATE; | ||
if( p_input ) | ||
{ | ||
vlc_object_yield( p_input ); | ||
as_varnames.push_back( "video-es" ); | ||
ai_objects.push_back( p_input->i_object_id ); | ||
as_varnames.push_back( "spu-es" ); | ||
ai_objects.push_back( p_input->i_object_id ); | ||
vlc_object_t *p_vout = (vlc_object_t *)vlc_object_find( p_input, | ||
VLC_OBJECT_VOUT, FIND_CHILD ); | ||
if( p_vout ) | ||
{ | ||
VideoAutoMenuBuilder( p_vout, ai_objects, as_varnames ); | ||
vlc_object_release( p_vout ); | ||
} | ||
vlc_object_release( p_input ); | ||
} | ||
vlc_object_release( p_playlist ); | ||
//CREATE_POPUP; | ||
} | ||
void QVLCMenu::AudioPopupMenu( intf_thread_t *p_intf, const QPoint &pos ) | ||
{ | ||
POPUP_BOILERPLATE; | ||
if( p_input ) | ||
{ | ||
vlc_object_yield( p_input ); | ||
as_varnames.push_back( "audio-es" ); | ||
ai_objects.push_back( p_input->i_object_id ); | ||
vlc_object_t *p_aout = (vlc_object_t *)vlc_object_find( p_input, | ||
VLC_OBJECT_AOUT, FIND_ANYWHERE ); | ||
if( p_aout ) | ||
{ | ||
AudioAutoMenuBuilder( p_aout, ai_objects, as_varnames ); | ||
vlc_object_release( p_aout ); | ||
} | ||
vlc_object_release( p_input ); | ||
} | ||
vlc_object_release( p_playlist ); | ||
//CREATE_POPUP; | ||
} | ||
#if 0 | ||
/* Navigation stuff, and general */ | ||
static void MiscPopupMenu( intf_thread_t *p_intf, const QPoint &pos ) | ||
{ | ||
POPUP_BOILERPLATE; | ||
if( p_input ) | ||
{ | ||
vlc_object_yield( p_input ); | ||
as_varnames.push_back( "audio-es" ); | ||
InputAutoMenuBuilder( VLC_OBJECT(p_input), ai_objects, as_varnames ); | ||
PUSH_SEPARATOR; | ||
} | ||
IntfAutoMenuBuilder( p_intf, ai_objects, as_varnames, true ); | ||
Menu popupmenu( p_intf, PopupMenu_Events ); | ||
popupmenu.Populate( as_varnames, ai_objects ); | ||
POPUP_STATIC_ENTRIES; | ||
popupmenu.Append( MenuDummy_Event, wxU(_("Open")), | ||
OpenStreamMenu( p_intf ), wxT("") ); | ||
p_intf->p_sys->p_popup_menu = &popupmenu; | ||
p_parent->PopupMenu( &popupmenu, pos.x, pos.y ); | ||
p_intf->p_sys->p_popup_menu = NULL; | ||
vlc_object_release( p_playlist ); | ||
} | ||
void PopupMenu( intf_thread_t *p_intf, wxWindow *p_parent, | ||
const wxPoint& pos ) | ||
{ | ||
POPUP_BOILERPLATE; | ||
if( p_input ) | ||
{ | ||
vlc_object_yield( p_input ); | ||
InputAutoMenuBuilder( VLC_OBJECT(p_input), ai_objects, as_varnames ); | ||
/* Video menu */ | ||
PUSH_SEPARATOR; | ||
as_varnames.push_back( "video-es" ); | ||
ai_objects.push_back( p_input->i_object_id ); | ||
as_varnames.push_back( "spu-es" ); | ||
ai_objects.push_back( p_input->i_object_id ); | ||
vlc_object_t *p_vout = (vlc_object_t *)vlc_object_find( p_input, | ||
VLC_OBJECT_VOUT, FIND_CHILD ); | ||
if( p_vout ) | ||
{ | ||
VideoAutoMenuBuilder( p_vout, ai_objects, as_varnames ); | ||
vlc_object_release( p_vout ); | ||
} | ||
/* Audio menu */ | ||
PUSH_SEPARATOR | ||
as_varnames.push_back( "audio-es" ); | ||
ai_objects.push_back( p_input->i_object_id ); | ||
vlc_object_t *p_aout = (vlc_object_t *)vlc_object_find( p_input, | ||
VLC_OBJECT_AOUT, FIND_ANYWHERE ); | ||
if( p_aout ) | ||
{ | ||
AudioAutoMenuBuilder( p_aout, ai_objects, as_varnames ); | ||
vlc_object_release( p_aout ); | ||
} | ||
} | ||
/* Interface menu */ | ||
PUSH_SEPARATOR | ||
IntfAutoMenuBuilder( p_intf, ai_objects, as_varnames, true ); | ||
/* Build menu */ | ||
Menu popupmenu( p_intf, PopupMenu_Events ); | ||
popupmenu.Populate( as_varnames, ai_objects ); | ||
POPUP_STATIC_ENTRIES; | ||
popupmenu.Append( MenuDummy_Event, wxU(_("Open")), | ||
OpenStreamMenu( p_intf ), wxT("") ); | ||
p_intf->p_sys->p_popup_menu = &popupmenu; | ||
p_parent->PopupMenu( &popupmenu, pos.x, pos.y ); | ||
p_intf->p_sys->p_popup_menu = NULL; | ||
vlc_object_release( p_playlist ); | ||
} | ||
#endif | ||
/***************************************************************************** | ||
* Auto menus | ||
*****************************************************************************/ | ||
QMenu *QVLCMenu::AudioMenu( intf_thread_t *p_intf, QMenu * current ) | ||
{ | ||
vector<int> ai_objects; | ||
vector<const char *> as_varnames; | ||
vlc_object_t *p_object = (vlc_object_t *)vlc_object_find( p_intf, | ||
VLC_OBJECT_INPUT, FIND_ANYWHERE ); | ||
if( p_object != NULL ) | ||
{ | ||
PUSH_VAR( "audio-es" ); | ||
vlc_object_release( p_object ); | ||
} | ||
p_object = (vlc_object_t *)vlc_object_find( p_intf, VLC_OBJECT_AOUT, | ||
FIND_ANYWHERE ); | ||
if( p_object ) | ||
{ | ||
AudioAutoMenuBuilder( p_object, ai_objects, as_varnames ); | ||
vlc_object_release( p_object ); | ||
} | ||
return Populate( p_intf, current, as_varnames, ai_objects ); | ||
} | ||
QMenu *QVLCMenu::VideoMenu( intf_thread_t *p_intf, QMenu *current ) | ||
{ | ||
vlc_object_t *p_object; | ||
vector<int> ai_objects; | ||
vector<const char *> as_varnames; | ||
p_object = (vlc_object_t *)vlc_object_find( p_intf, VLC_OBJECT_INPUT, | ||
FIND_ANYWHERE ); | ||
if( p_object != NULL ) | ||
{ | ||
PUSH_VAR( "video-es" ); | ||
PUSH_VAR( "spu-es" ); | ||
vlc_object_release( p_object ); | ||
} | ||
p_object = (vlc_object_t *)vlc_object_find( p_intf, VLC_OBJECT_VOUT, | ||
FIND_ANYWHERE ); | ||
if( p_object != NULL ) | ||
{ | ||
VideoAutoMenuBuilder( p_object, ai_objects, as_varnames ); | ||
vlc_object_release( p_object ); | ||
} | ||
return Populate( p_intf, current, as_varnames, ai_objects ); | ||
} | ||
QMenu *QVLCMenu::NavigMenu( intf_thread_t *p_intf, QMenu *current ) | ||
{ | ||
vlc_object_t *p_object; | ||
vector<int> ai_objects; | ||
vector<const char *> as_varnames; | ||
p_object = (vlc_object_t *)vlc_object_find( p_intf, VLC_OBJECT_INPUT, | ||
FIND_ANYWHERE ); | ||
if( p_object != NULL ) | ||
{ | ||
InputAutoMenuBuilder( p_object, ai_objects, as_varnames ); | ||
PUSH_VAR( "prev-title"); PUSH_VAR ( "next-title" ); | ||
PUSH_VAR( "prev-chapter"); PUSH_VAR( "next-chapter" ); | ||
vlc_object_release( p_object ); | ||
} | ||
return Populate( p_intf, current, as_varnames, ai_objects ); | ||
} | ||
#if 0 | ||
wxMenu *SettingsMenu( intf_thread_t *_p_intf, wxWindow *p_parent, | ||
wxMenu *p_menu ) | ||
{ | ||
vlc_object_t *p_object; | ||
vector<int> ai_objects; | ||
vector<const char *> as_varnames; | ||
p_object = (vlc_object_t *)vlc_object_find( _p_intf, VLC_OBJECT_INTF, | ||
FIND_PARENT ); | ||
if( p_object != NULL ) | ||
{ | ||
PUSH_VAR( "intf-switch" ); | ||
PUSH_VAR( "intf-add" ); | ||
vlc_object_release( p_object ); | ||
} | ||
/* Build menu */ | ||
Menu *p_vlc_menu = (Menu *)p_menu; | ||
if( !p_vlc_menu ) | ||
p_vlc_menu = new Menu( _p_intf, SettingsMenu_Events ); | ||
else | ||
p_vlc_menu->Clear(); | ||
p_vlc_menu->Populate( as_varnames, ai_objects ); | ||
return p_vlc_menu; | ||
} | ||
#endif | ||
QMenu * QVLCMenu::Populate( intf_thread_t *p_intf, QMenu *current, | ||
vector< const char *> & ras_varnames, | ||
vector<int> & rai_objects ) | ||
{ | ||
QMenu *menu = current; | ||
if( !menu ) | ||
menu = new QMenu(); | ||
else | ||
menu->clear(); | ||
currentGroup = NULL; | ||
vlc_object_t *p_object; | ||
vlc_bool_t b_section_empty = VLC_FALSE; | ||
int i; | ||
#define APPEND_EMPTY { QAction *action = menu->addAction( _("Empty" ) ); \ | ||
action->setEnabled( false ); } | ||
for( i = 0; i < (int)rai_objects.size() ; i++ ) | ||
{ | ||
if( !ras_varnames[i] || !*ras_varnames[i] ) | ||
{ | ||
if( b_section_empty ) | ||
APPEND_EMPTY; | ||
menu->addSeparator(); | ||
b_section_empty = VLC_TRUE; | ||
continue; | ||
} | ||
if( rai_objects[i] == 0 ) | ||
{ | ||
/// \bug What is this ? | ||
// Append( menu, ras_varnames[i], NULL ); | ||
b_section_empty = VLC_FALSE; | ||
continue; | ||
} | ||
p_object = (vlc_object_t *)vlc_object_get( p_intf, | ||
rai_objects[i] ); | ||
if( p_object == NULL ) continue; | ||
b_section_empty = VLC_FALSE; | ||
CreateItem( menu, ras_varnames[i], p_object ); | ||
< |