Move Qt from qt4 to qt folder
authorJean-Baptiste Kempf <jb@videolan.org>
Sat, 27 Feb 2016 16:22:41 +0000 (17:22 +0100)
committerJean-Baptiste Kempf <jb@videolan.org>
Sat, 27 Feb 2016 16:25:04 +0000 (17:25 +0100)
698 files changed:
configure.ac
modules/gui/Makefile.am
modules/gui/qt/.gitignore [new file with mode: 0644]
modules/gui/qt/HACKING [new file with mode: 0644]
modules/gui/qt/Makefile.am [new file with mode: 0644]
modules/gui/qt/actions_manager.cpp [new file with mode: 0644]
modules/gui/qt/actions_manager.hpp [new file with mode: 0644]
modules/gui/qt/adapters/chromaprint.cpp [new file with mode: 0644]
modules/gui/qt/adapters/chromaprint.hpp [new file with mode: 0644]
modules/gui/qt/adapters/seekpoints.cpp [new file with mode: 0644]
modules/gui/qt/adapters/seekpoints.hpp [new file with mode: 0644]
modules/gui/qt/adapters/variables.cpp [new file with mode: 0644]
modules/gui/qt/adapters/variables.hpp [new file with mode: 0644]
modules/gui/qt/components/complete_preferences.cpp [new file with mode: 0644]
modules/gui/qt/components/complete_preferences.hpp [new file with mode: 0644]
modules/gui/qt/components/controller.cpp [new file with mode: 0644]
modules/gui/qt/components/controller.hpp [new file with mode: 0644]
modules/gui/qt/components/controller_widget.cpp [new file with mode: 0644]
modules/gui/qt/components/controller_widget.hpp [new file with mode: 0644]
modules/gui/qt/components/epg/EPGChannels.cpp [new file with mode: 0644]
modules/gui/qt/components/epg/EPGChannels.hpp [new file with mode: 0644]
modules/gui/qt/components/epg/EPGItem.cpp [new file with mode: 0644]
modules/gui/qt/components/epg/EPGItem.hpp [new file with mode: 0644]
modules/gui/qt/components/epg/EPGRuler.cpp [new file with mode: 0644]
modules/gui/qt/components/epg/EPGRuler.hpp [new file with mode: 0644]
modules/gui/qt/components/epg/EPGView.cpp [new file with mode: 0644]
modules/gui/qt/components/epg/EPGView.hpp [new file with mode: 0644]
modules/gui/qt/components/epg/EPGWidget.cpp [new file with mode: 0644]
modules/gui/qt/components/epg/EPGWidget.hpp [new file with mode: 0644]
modules/gui/qt/components/extended_panels.cpp [new file with mode: 0644]
modules/gui/qt/components/extended_panels.hpp [new file with mode: 0644]
modules/gui/qt/components/info_panels.cpp [new file with mode: 0644]
modules/gui/qt/components/info_panels.hpp [new file with mode: 0644]
modules/gui/qt/components/info_widgets.cpp [new file with mode: 0644]
modules/gui/qt/components/info_widgets.hpp [new file with mode: 0644]
modules/gui/qt/components/interface_widgets.cpp [new file with mode: 0644]
modules/gui/qt/components/interface_widgets.hpp [new file with mode: 0644]
modules/gui/qt/components/open_panels.cpp [new file with mode: 0644]
modules/gui/qt/components/open_panels.hpp [new file with mode: 0644]
modules/gui/qt/components/playlist/playlist.cpp [new file with mode: 0644]
modules/gui/qt/components/playlist/playlist.hpp [new file with mode: 0644]
modules/gui/qt/components/playlist/playlist_item.cpp [new file with mode: 0644]
modules/gui/qt/components/playlist/playlist_item.hpp [new file with mode: 0644]
modules/gui/qt/components/playlist/playlist_model.cpp [new file with mode: 0644]
modules/gui/qt/components/playlist/playlist_model.hpp [new file with mode: 0644]
modules/gui/qt/components/playlist/selector.cpp [new file with mode: 0644]
modules/gui/qt/components/playlist/selector.hpp [new file with mode: 0644]
modules/gui/qt/components/playlist/sorting.h [new file with mode: 0644]
modules/gui/qt/components/playlist/standardpanel.cpp [new file with mode: 0644]
modules/gui/qt/components/playlist/standardpanel.hpp [new file with mode: 0644]
modules/gui/qt/components/playlist/views.cpp [new file with mode: 0644]
modules/gui/qt/components/playlist/views.hpp [new file with mode: 0644]
modules/gui/qt/components/playlist/vlc_model.cpp [new file with mode: 0644]
modules/gui/qt/components/playlist/vlc_model.hpp [new file with mode: 0644]
modules/gui/qt/components/preferences_widgets.cpp [new file with mode: 0644]
modules/gui/qt/components/preferences_widgets.hpp [new file with mode: 0644]
modules/gui/qt/components/simple_preferences.cpp [new file with mode: 0644]
modules/gui/qt/components/simple_preferences.hpp [new file with mode: 0644]
modules/gui/qt/components/sout/profile_selector.cpp [new file with mode: 0644]
modules/gui/qt/components/sout/profile_selector.hpp [new file with mode: 0644]
modules/gui/qt/components/sout/profiles.hpp [new file with mode: 0644]
modules/gui/qt/components/sout/sout_widgets.cpp [new file with mode: 0644]
modules/gui/qt/components/sout/sout_widgets.hpp [new file with mode: 0644]
modules/gui/qt/dialogs/bookmarks.cpp [new file with mode: 0644]
modules/gui/qt/dialogs/bookmarks.hpp [new file with mode: 0644]
modules/gui/qt/dialogs/convert.cpp [new file with mode: 0644]
modules/gui/qt/dialogs/convert.hpp [new file with mode: 0644]
modules/gui/qt/dialogs/epg.cpp [new file with mode: 0644]
modules/gui/qt/dialogs/epg.hpp [new file with mode: 0644]
modules/gui/qt/dialogs/errors.cpp [new file with mode: 0644]
modules/gui/qt/dialogs/errors.hpp [new file with mode: 0644]
modules/gui/qt/dialogs/extended.cpp [new file with mode: 0644]
modules/gui/qt/dialogs/extended.hpp [new file with mode: 0644]
modules/gui/qt/dialogs/extensions.cpp [new file with mode: 0644]
modules/gui/qt/dialogs/extensions.hpp [new file with mode: 0644]
modules/gui/qt/dialogs/external.cpp [new file with mode: 0644]
modules/gui/qt/dialogs/external.hpp [new file with mode: 0644]
modules/gui/qt/dialogs/fingerprintdialog.cpp [new file with mode: 0644]
modules/gui/qt/dialogs/fingerprintdialog.hpp [new file with mode: 0644]
modules/gui/qt/dialogs/firstrun.cpp [new file with mode: 0644]
modules/gui/qt/dialogs/firstrun.hpp [new file with mode: 0644]
modules/gui/qt/dialogs/gototime.cpp [new file with mode: 0644]
modules/gui/qt/dialogs/gototime.hpp [new file with mode: 0644]
modules/gui/qt/dialogs/help.cpp [new file with mode: 0644]
modules/gui/qt/dialogs/help.hpp [new file with mode: 0644]
modules/gui/qt/dialogs/mediainfo.cpp [new file with mode: 0644]
modules/gui/qt/dialogs/mediainfo.hpp [new file with mode: 0644]
modules/gui/qt/dialogs/messages.cpp [new file with mode: 0644]
modules/gui/qt/dialogs/messages.hpp [new file with mode: 0644]
modules/gui/qt/dialogs/open.cpp [new file with mode: 0644]
modules/gui/qt/dialogs/open.hpp [new file with mode: 0644]
modules/gui/qt/dialogs/openurl.cpp [new file with mode: 0644]
modules/gui/qt/dialogs/openurl.hpp [new file with mode: 0644]
modules/gui/qt/dialogs/playlist.cpp [new file with mode: 0644]
modules/gui/qt/dialogs/playlist.hpp [new file with mode: 0644]
modules/gui/qt/dialogs/plugins.cpp [new file with mode: 0644]
modules/gui/qt/dialogs/plugins.hpp [new file with mode: 0644]
modules/gui/qt/dialogs/podcast_configuration.cpp [new file with mode: 0644]
modules/gui/qt/dialogs/podcast_configuration.hpp [new file with mode: 0644]
modules/gui/qt/dialogs/preferences.cpp [new file with mode: 0644]
modules/gui/qt/dialogs/preferences.hpp [new file with mode: 0644]
modules/gui/qt/dialogs/sout.cpp [new file with mode: 0644]
modules/gui/qt/dialogs/sout.hpp [new file with mode: 0644]
modules/gui/qt/dialogs/toolbar.cpp [new file with mode: 0644]
modules/gui/qt/dialogs/toolbar.hpp [new file with mode: 0644]
modules/gui/qt/dialogs/vlm.cpp [new file with mode: 0644]
modules/gui/qt/dialogs/vlm.hpp [new file with mode: 0644]
modules/gui/qt/dialogs_provider.cpp [new file with mode: 0644]
modules/gui/qt/dialogs_provider.hpp [new file with mode: 0644]
modules/gui/qt/extensions_manager.cpp [new file with mode: 0644]
modules/gui/qt/extensions_manager.hpp [new file with mode: 0644]
modules/gui/qt/input_manager.cpp [new file with mode: 0644]
modules/gui/qt/input_manager.hpp [new file with mode: 0644]
modules/gui/qt/main_interface.cpp [new file with mode: 0644]
modules/gui/qt/main_interface.hpp [new file with mode: 0644]
modules/gui/qt/main_interface_win32.cpp [new file with mode: 0644]
modules/gui/qt/managers/addons_manager.cpp [new file with mode: 0644]
modules/gui/qt/managers/addons_manager.hpp [new file with mode: 0644]
modules/gui/qt/menus.cpp [new file with mode: 0644]
modules/gui/qt/menus.hpp [new file with mode: 0644]
modules/gui/qt/pixmaps/addons/addon.png [new file with mode: 0644]
modules/gui/qt/pixmaps/addons/addon.svgz [new file with mode: 0644]
modules/gui/qt/pixmaps/addons/addon_broken.png [new file with mode: 0644]
modules/gui/qt/pixmaps/addons/addon_broken.svgz [new file with mode: 0644]
modules/gui/qt/pixmaps/addons/score.png [new file with mode: 0644]
modules/gui/qt/pixmaps/addons/score.svgz [new file with mode: 0644]
modules/gui/qt/pixmaps/arrow_down_dark.png [new file with mode: 0644]
modules/gui/qt/pixmaps/clear.png [new file with mode: 0644]
modules/gui/qt/pixmaps/eject.png [new file with mode: 0644]
modules/gui/qt/pixmaps/faster.png [new file with mode: 0644]
modules/gui/qt/pixmaps/faster2.png [new file with mode: 0644]
modules/gui/qt/pixmaps/go-next.png [new file with mode: 0644]
modules/gui/qt/pixmaps/lock.png [new file with mode: 0644]
modules/gui/qt/pixmaps/menus/exit.svgz [new file with mode: 0644]
modules/gui/qt/pixmaps/menus/exit_16px.png [new file with mode: 0644]
modules/gui/qt/pixmaps/menus/help.svgz [new file with mode: 0644]
modules/gui/qt/pixmaps/menus/help_16px.png [new file with mode: 0644]
modules/gui/qt/pixmaps/menus/info.svgz [new file with mode: 0644]
modules/gui/qt/pixmaps/menus/info_16px.png [new file with mode: 0644]
modules/gui/qt/pixmaps/menus/messages.svgz [new file with mode: 0644]
modules/gui/qt/pixmaps/menus/messages_16px.png [new file with mode: 0644]
modules/gui/qt/pixmaps/menus/playlist.svgz [new file with mode: 0644]
modules/gui/qt/pixmaps/menus/playlist_16px.png [new file with mode: 0644]
modules/gui/qt/pixmaps/menus/preferences.svgz [new file with mode: 0644]
modules/gui/qt/pixmaps/menus/preferences_16px.png [new file with mode: 0644]
modules/gui/qt/pixmaps/menus/quit_16px.png [new file with mode: 0644]
modules/gui/qt/pixmaps/menus/settings.svgz [new file with mode: 0644]
modules/gui/qt/pixmaps/menus/settings_16px.png [new file with mode: 0644]
modules/gui/qt/pixmaps/menus/stream.svgz [new file with mode: 0644]
modules/gui/qt/pixmaps/menus/stream_16px.png [new file with mode: 0644]
modules/gui/qt/pixmaps/next.png [new file with mode: 0644]
modules/gui/qt/pixmaps/next_16px.png [new file with mode: 0644]
modules/gui/qt/pixmaps/noart-64.png [new file with mode: 0644]
modules/gui/qt/pixmaps/noart.png [new file with mode: 0644]
modules/gui/qt/pixmaps/pause.png [new file with mode: 0644]
modules/gui/qt/pixmaps/pause_16px.png [new file with mode: 0644]
modules/gui/qt/pixmaps/play.png [new file with mode: 0644]
modules/gui/qt/pixmaps/play_16px.png [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/add.png [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/dropzone.png [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/jumpto.png [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/playlist.png [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/remove.png [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/repeat_all.png [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/repeat_off.png [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/repeat_one.png [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/shuffle_off.png [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/shuffle_on.png [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/capture.png [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/capture.svgz [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/disc.png [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/disc.svgz [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/lan.png [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/lan.svgz [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/library.png [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/library.svgz [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/movie.png [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/movie.svgz [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/mtp.png [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/music.png [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/music.svgz [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/network.png [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/network.svgz [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/pictures.png [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/pictures.svgz [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/playlist.png [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/playlist.svgz [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/podcast.png [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/podcast.svgz [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/screen.png [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/screen.svgz [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/sd/appletrailers.png [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/sd/appletrailers.svgz [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/sd/assembleenationale.png [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/sd/assembleenationale.svgz [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/sd/fmc.png [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/sd/fmc.svgz [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/sd/frenchtv.png [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/sd/frenchtv.svgz [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/sd/icecast.png [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/sd/icecast.svgz [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/sd/jamendo.png [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/sd/jamendo.svgz [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/sd/katsomo.png [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/sd/katsomo.svgz [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/sd/metachannels.png [new file with mode: 0644]
modules/gui/qt/pixmaps/playlist/sidebar-icons/sd/metachannels.svgz [new file with mode: 0644]
modules/gui/qt/pixmaps/prefs/advprefs_audio.png [new file with mode: 0644]
modules/gui/qt/pixmaps/prefs/advprefs_codec.png [new file with mode: 0644]
modules/gui/qt/pixmaps/prefs/advprefs_extended.png [new file with mode: 0644]
modules/gui/qt/pixmaps/prefs/advprefs_intf.png [new file with mode: 0644]
modules/gui/qt/pixmaps/prefs/advprefs_playlist.png [new file with mode: 0644]
modules/gui/qt/pixmaps/prefs/advprefs_sout.png [new file with mode: 0644]
modules/gui/qt/pixmaps/prefs/advprefs_video.png [new file with mode: 0644]
modules/gui/qt/pixmaps/prefs/spref_cone_Audio_64.png [new file with mode: 0644]
modules/gui/qt/pixmaps/prefs/spref_cone_Hotkeys_64.png [new file with mode: 0644]
modules/gui/qt/pixmaps/prefs/spref_cone_Input_64.png [new file with mode: 0644]
modules/gui/qt/pixmaps/prefs/spref_cone_Interface_64.png [new file with mode: 0644]
modules/gui/qt/pixmaps/prefs/spref_cone_Subtitles_64.png [new file with mode: 0644]
modules/gui/qt/pixmaps/prefs/spref_cone_Video_64.png [new file with mode: 0644]
modules/gui/qt/pixmaps/previous.png [new file with mode: 0644]
modules/gui/qt/pixmaps/previous_16px.png [new file with mode: 0644]
modules/gui/qt/pixmaps/profile_new.png [new file with mode: 0644]
modules/gui/qt/pixmaps/sample_complete.png [new file with mode: 0644]
modules/gui/qt/pixmaps/sample_minimal.png [new file with mode: 0644]
modules/gui/qt/pixmaps/sample_skins.png [new file with mode: 0644]
modules/gui/qt/pixmaps/search_clear.png [new file with mode: 0644]
modules/gui/qt/pixmaps/slower.png [new file with mode: 0644]
modules/gui/qt/pixmaps/slower2.png [new file with mode: 0644]
modules/gui/qt/pixmaps/space.png [new file with mode: 0644]
modules/gui/qt/pixmaps/stop.png [new file with mode: 0644]
modules/gui/qt/pixmaps/stop_16px.png [new file with mode: 0644]
modules/gui/qt/pixmaps/toolbar/arrows.png [new file with mode: 0644]
modules/gui/qt/pixmaps/toolbar/aspect-ratio.png [new file with mode: 0644]
modules/gui/qt/pixmaps/toolbar/atob.png [new file with mode: 0644]
modules/gui/qt/pixmaps/toolbar/atob_noa.png [new file with mode: 0644]
modules/gui/qt/pixmaps/toolbar/atob_nob.png [new file with mode: 0644]
modules/gui/qt/pixmaps/toolbar/defullscreen.png [new file with mode: 0644]
modules/gui/qt/pixmaps/toolbar/dvd_menu.png [new file with mode: 0644]
modules/gui/qt/pixmaps/toolbar/dvd_next.png [new file with mode: 0644]
modules/gui/qt/pixmaps/toolbar/dvd_prev.png [new file with mode: 0644]
modules/gui/qt/pixmaps/toolbar/extended_16px.png [new file with mode: 0644]
modules/gui/qt/pixmaps/toolbar/frame-by-frame.png [new file with mode: 0644]
modules/gui/qt/pixmaps/toolbar/frame-by-frame.svgz [new file with mode: 0644]
modules/gui/qt/pixmaps/toolbar/fullscreen.png [new file with mode: 0644]
modules/gui/qt/pixmaps/toolbar/play_reverse.png [new file with mode: 0644]
modules/gui/qt/pixmaps/toolbar/record_16px.png [new file with mode: 0644]
modules/gui/qt/pixmaps/toolbar/skip_back.png [new file with mode: 0644]
modules/gui/qt/pixmaps/toolbar/skip_for.png [new file with mode: 0644]
modules/gui/qt/pixmaps/toolbar/snapshot.png [new file with mode: 0644]
modules/gui/qt/pixmaps/toolbar/tv.png [new file with mode: 0644]
modules/gui/qt/pixmaps/toolbar/tvtelx.png [new file with mode: 0644]
modules/gui/qt/pixmaps/toolbar/visu.png [new file with mode: 0644]
modules/gui/qt/pixmaps/toolbar/volume-high.png [new file with mode: 0644]
modules/gui/qt/pixmaps/toolbar/volume-low.png [new file with mode: 0644]
modules/gui/qt/pixmaps/toolbar/volume-medium.png [new file with mode: 0644]
modules/gui/qt/pixmaps/toolbar/volume-muted.png [new file with mode: 0644]
modules/gui/qt/pixmaps/toolbar/volume-slider-inside.png [new file with mode: 0644]
modules/gui/qt/pixmaps/toolbar/volume-slider-outside.png [new file with mode: 0644]
modules/gui/qt/pixmaps/types/capture-card.svgz [new file with mode: 0644]
modules/gui/qt/pixmaps/types/capture-card_16px.png [new file with mode: 0644]
modules/gui/qt/pixmaps/types/disc.svgz [new file with mode: 0644]
modules/gui/qt/pixmaps/types/disc_16px.png [new file with mode: 0644]
modules/gui/qt/pixmaps/types/file-asym_16px.png [new file with mode: 0644]
modules/gui/qt/pixmaps/types/file-wide_16px.png [new file with mode: 0644]
modules/gui/qt/pixmaps/types/folder-blue.svgz [new file with mode: 0644]
modules/gui/qt/pixmaps/types/folder-blue_16px.png [new file with mode: 0644]
modules/gui/qt/pixmaps/types/folder-grey.svgz [new file with mode: 0644]
modules/gui/qt/pixmaps/types/folder-grey_16px.png [new file with mode: 0644]
modules/gui/qt/pixmaps/types/harddisk_16px.png [new file with mode: 0644]
modules/gui/qt/pixmaps/types/network_16px.png [new file with mode: 0644]
modules/gui/qt/pixmaps/types/tape_16px.png [new file with mode: 0644]
modules/gui/qt/pixmaps/types/type_directory.png [new file with mode: 0644]
modules/gui/qt/pixmaps/types/type_file.png [new file with mode: 0644]
modules/gui/qt/pixmaps/types/type_node.png [new file with mode: 0644]
modules/gui/qt/pixmaps/types/type_playlist.png [new file with mode: 0644]
modules/gui/qt/pixmaps/types/type_stream.png [new file with mode: 0644]
modules/gui/qt/pixmaps/types/type_stream.svgz [new file with mode: 0644]
modules/gui/qt/pixmaps/types/type_unknown.xpm [new file with mode: 0644]
modules/gui/qt/pixmaps/update.png [new file with mode: 0644]
modules/gui/qt/pixmaps/util/wait0.png [new file with mode: 0644]
modules/gui/qt/pixmaps/util/wait1.png [new file with mode: 0644]
modules/gui/qt/pixmaps/util/wait2.png [new file with mode: 0644]
modules/gui/qt/pixmaps/util/wait3.png [new file with mode: 0644]
modules/gui/qt/pixmaps/util/wait4.png [new file with mode: 0644]
modules/gui/qt/pixmaps/valid.png [new file with mode: 0644]
modules/gui/qt/pixmaps/valid.svgz [new file with mode: 0644]
modules/gui/qt/pixmaps/win7/win7thumbnail_next.png [new file with mode: 0644]
modules/gui/qt/pixmaps/win7/win7thumbnail_pause.png [new file with mode: 0644]
modules/gui/qt/pixmaps/win7/win7thumbnail_play.png [new file with mode: 0644]
modules/gui/qt/pixmaps/win7/win7thumbnail_prev.png [new file with mode: 0644]
modules/gui/qt/qt4.cpp [new file with mode: 0644]
modules/gui/qt/qt4.hpp [new file with mode: 0644]
modules/gui/qt/recents.cpp [new file with mode: 0644]
modules/gui/qt/recents.hpp [new file with mode: 0644]
modules/gui/qt/styles/seekstyle.cpp [new file with mode: 0644]
modules/gui/qt/styles/seekstyle.hpp [new file with mode: 0644]
modules/gui/qt/ui/about.ui [new file with mode: 0644]
modules/gui/qt/ui/equalizer.ui [new file with mode: 0644]
modules/gui/qt/ui/fingerprintdialog.ui [new file with mode: 0644]
modules/gui/qt/ui/messages_panel.ui [new file with mode: 0644]
modules/gui/qt/ui/open.ui [new file with mode: 0644]
modules/gui/qt/ui/open_capture.ui [new file with mode: 0644]
modules/gui/qt/ui/open_disk.ui [new file with mode: 0644]
modules/gui/qt/ui/open_file.ui [new file with mode: 0644]
modules/gui/qt/ui/open_net.ui [new file with mode: 0644]
modules/gui/qt/ui/podcast_configuration.ui [new file with mode: 0644]
modules/gui/qt/ui/profiles.ui [new file with mode: 0644]
modules/gui/qt/ui/sout.ui [new file with mode: 0644]
modules/gui/qt/ui/sprefs_audio.ui [new file with mode: 0644]
modules/gui/qt/ui/sprefs_input.ui [new file with mode: 0644]
modules/gui/qt/ui/sprefs_interface.ui [new file with mode: 0644]
modules/gui/qt/ui/sprefs_subtitles.ui [new file with mode: 0644]
modules/gui/qt/ui/sprefs_video.ui [new file with mode: 0644]
modules/gui/qt/ui/streampanel.ui [new file with mode: 0644]
modules/gui/qt/ui/update.ui [new file with mode: 0644]
modules/gui/qt/ui/video_effects.ui [new file with mode: 0644]
modules/gui/qt/ui/vlm.ui [new file with mode: 0644]
modules/gui/qt/util/animators.cpp [new file with mode: 0644]
modules/gui/qt/util/animators.hpp [new file with mode: 0644]
modules/gui/qt/util/buttons/BrowseButton.cpp [new file with mode: 0644]
modules/gui/qt/util/buttons/BrowseButton.hpp [new file with mode: 0644]
modules/gui/qt/util/buttons/DeckButtonsLayout.cpp [new file with mode: 0644]
modules/gui/qt/util/buttons/DeckButtonsLayout.hpp [new file with mode: 0644]
modules/gui/qt/util/buttons/RoundButton.cpp [new file with mode: 0644]
modules/gui/qt/util/buttons/RoundButton.hpp [new file with mode: 0644]
modules/gui/qt/util/customwidgets.cpp [new file with mode: 0644]
modules/gui/qt/util/customwidgets.hpp [new file with mode: 0644]
modules/gui/qt/util/input_slider.cpp [new file with mode: 0644]
modules/gui/qt/util/input_slider.hpp [new file with mode: 0644]
modules/gui/qt/util/pictureflow.cpp [new file with mode: 0644]
modules/gui/qt/util/pictureflow.hpp [new file with mode: 0644]
modules/gui/qt/util/qmenuview.cpp [new file with mode: 0644]
modules/gui/qt/util/qmenuview.hpp [new file with mode: 0644]
modules/gui/qt/util/qt_dirs.cpp [new file with mode: 0644]
modules/gui/qt/util/qt_dirs.hpp [new file with mode: 0644]
modules/gui/qt/util/qvlcapp.hpp [new file with mode: 0644]
modules/gui/qt/util/qvlcframe.hpp [new file with mode: 0644]
modules/gui/qt/util/registry.cpp [new file with mode: 0644]
modules/gui/qt/util/registry.hpp [new file with mode: 0644]
modules/gui/qt/util/searchlineedit.cpp [new file with mode: 0644]
modules/gui/qt/util/searchlineedit.hpp [new file with mode: 0644]
modules/gui/qt/util/searchlineedit_mac.mm [new file with mode: 0644]
modules/gui/qt/util/singleton.hpp [new file with mode: 0644]
modules/gui/qt/util/timetooltip.cpp [new file with mode: 0644]
modules/gui/qt/util/timetooltip.hpp [new file with mode: 0644]
modules/gui/qt/util/validators.cpp [new file with mode: 0644]
modules/gui/qt/util/validators.hpp [new file with mode: 0644]
modules/gui/qt/vlc.qrc [new file with mode: 0644]
modules/gui/qt4/.gitignore [deleted file]
modules/gui/qt4/HACKING [deleted file]
modules/gui/qt4/Makefile.am [deleted file]
modules/gui/qt4/actions_manager.cpp [deleted file]
modules/gui/qt4/actions_manager.hpp [deleted file]
modules/gui/qt4/adapters/chromaprint.cpp [deleted file]
modules/gui/qt4/adapters/chromaprint.hpp [deleted file]
modules/gui/qt4/adapters/seekpoints.cpp [deleted file]
modules/gui/qt4/adapters/seekpoints.hpp [deleted file]
modules/gui/qt4/adapters/variables.cpp [deleted file]
modules/gui/qt4/adapters/variables.hpp [deleted file]
modules/gui/qt4/components/complete_preferences.cpp [deleted file]
modules/gui/qt4/components/complete_preferences.hpp [deleted file]
modules/gui/qt4/components/controller.cpp [deleted file]
modules/gui/qt4/components/controller.hpp [deleted file]
modules/gui/qt4/components/controller_widget.cpp [deleted file]
modules/gui/qt4/components/controller_widget.hpp [deleted file]
modules/gui/qt4/components/epg/EPGChannels.cpp [deleted file]
modules/gui/qt4/components/epg/EPGChannels.hpp [deleted file]
modules/gui/qt4/components/epg/EPGItem.cpp [deleted file]
modules/gui/qt4/components/epg/EPGItem.hpp [deleted file]
modules/gui/qt4/components/epg/EPGRuler.cpp [deleted file]
modules/gui/qt4/components/epg/EPGRuler.hpp [deleted file]
modules/gui/qt4/components/epg/EPGView.cpp [deleted file]
modules/gui/qt4/components/epg/EPGView.hpp [deleted file]
modules/gui/qt4/components/epg/EPGWidget.cpp [deleted file]
modules/gui/qt4/components/epg/EPGWidget.hpp [deleted file]
modules/gui/qt4/components/extended_panels.cpp [deleted file]
modules/gui/qt4/components/extended_panels.hpp [deleted file]
modules/gui/qt4/components/info_panels.cpp [deleted file]
modules/gui/qt4/components/info_panels.hpp [deleted file]
modules/gui/qt4/components/info_widgets.cpp [deleted file]
modules/gui/qt4/components/info_widgets.hpp [deleted file]
modules/gui/qt4/components/interface_widgets.cpp [deleted file]
modules/gui/qt4/components/interface_widgets.hpp [deleted file]
modules/gui/qt4/components/open_panels.cpp [deleted file]
modules/gui/qt4/components/open_panels.hpp [deleted file]
modules/gui/qt4/components/playlist/playlist.cpp [deleted file]
modules/gui/qt4/components/playlist/playlist.hpp [deleted file]
modules/gui/qt4/components/playlist/playlist_item.cpp [deleted file]
modules/gui/qt4/components/playlist/playlist_item.hpp [deleted file]
modules/gui/qt4/components/playlist/playlist_model.cpp [deleted file]
modules/gui/qt4/components/playlist/playlist_model.hpp [deleted file]
modules/gui/qt4/components/playlist/selector.cpp [deleted file]
modules/gui/qt4/components/playlist/selector.hpp [deleted file]
modules/gui/qt4/components/playlist/sorting.h [deleted file]
modules/gui/qt4/components/playlist/standardpanel.cpp [deleted file]
modules/gui/qt4/components/playlist/standardpanel.hpp [deleted file]
modules/gui/qt4/components/playlist/views.cpp [deleted file]
modules/gui/qt4/components/playlist/views.hpp [deleted file]
modules/gui/qt4/components/playlist/vlc_model.cpp [deleted file]
modules/gui/qt4/components/playlist/vlc_model.hpp [deleted file]
modules/gui/qt4/components/preferences_widgets.cpp [deleted file]
modules/gui/qt4/components/preferences_widgets.hpp [deleted file]
modules/gui/qt4/components/simple_preferences.cpp [deleted file]
modules/gui/qt4/components/simple_preferences.hpp [deleted file]
modules/gui/qt4/components/sout/profile_selector.cpp [deleted file]
modules/gui/qt4/components/sout/profile_selector.hpp [deleted file]
modules/gui/qt4/components/sout/profiles.hpp [deleted file]
modules/gui/qt4/components/sout/sout_widgets.cpp [deleted file]
modules/gui/qt4/components/sout/sout_widgets.hpp [deleted file]
modules/gui/qt4/dialogs/bookmarks.cpp [deleted file]
modules/gui/qt4/dialogs/bookmarks.hpp [deleted file]
modules/gui/qt4/dialogs/convert.cpp [deleted file]
modules/gui/qt4/dialogs/convert.hpp [deleted file]
modules/gui/qt4/dialogs/epg.cpp [deleted file]
modules/gui/qt4/dialogs/epg.hpp [deleted file]
modules/gui/qt4/dialogs/errors.cpp [deleted file]
modules/gui/qt4/dialogs/errors.hpp [deleted file]
modules/gui/qt4/dialogs/extended.cpp [deleted file]
modules/gui/qt4/dialogs/extended.hpp [deleted file]
modules/gui/qt4/dialogs/extensions.cpp [deleted file]
modules/gui/qt4/dialogs/extensions.hpp [deleted file]
modules/gui/qt4/dialogs/external.cpp [deleted file]
modules/gui/qt4/dialogs/external.hpp [deleted file]
modules/gui/qt4/dialogs/fingerprintdialog.cpp [deleted file]
modules/gui/qt4/dialogs/fingerprintdialog.hpp [deleted file]
modules/gui/qt4/dialogs/firstrun.cpp [deleted file]
modules/gui/qt4/dialogs/firstrun.hpp [deleted file]
modules/gui/qt4/dialogs/gototime.cpp [deleted file]
modules/gui/qt4/dialogs/gototime.hpp [deleted file]
modules/gui/qt4/dialogs/help.cpp [deleted file]
modules/gui/qt4/dialogs/help.hpp [deleted file]
modules/gui/qt4/dialogs/mediainfo.cpp [deleted file]
modules/gui/qt4/dialogs/mediainfo.hpp [deleted file]
modules/gui/qt4/dialogs/messages.cpp [deleted file]
modules/gui/qt4/dialogs/messages.hpp [deleted file]
modules/gui/qt4/dialogs/open.cpp [deleted file]
modules/gui/qt4/dialogs/open.hpp [deleted file]
modules/gui/qt4/dialogs/openurl.cpp [deleted file]
modules/gui/qt4/dialogs/openurl.hpp [deleted file]
modules/gui/qt4/dialogs/playlist.cpp [deleted file]
modules/gui/qt4/dialogs/playlist.hpp [deleted file]
modules/gui/qt4/dialogs/plugins.cpp [deleted file]
modules/gui/qt4/dialogs/plugins.hpp [deleted file]
modules/gui/qt4/dialogs/podcast_configuration.cpp [deleted file]
modules/gui/qt4/dialogs/podcast_configuration.hpp [deleted file]
modules/gui/qt4/dialogs/preferences.cpp [deleted file]
modules/gui/qt4/dialogs/preferences.hpp [deleted file]
modules/gui/qt4/dialogs/sout.cpp [deleted file]
modules/gui/qt4/dialogs/sout.hpp [deleted file]
modules/gui/qt4/dialogs/toolbar.cpp [deleted file]
modules/gui/qt4/dialogs/toolbar.hpp [deleted file]
modules/gui/qt4/dialogs/vlm.cpp [deleted file]
modules/gui/qt4/dialogs/vlm.hpp [deleted file]
modules/gui/qt4/dialogs_provider.cpp [deleted file]
modules/gui/qt4/dialogs_provider.hpp [deleted file]
modules/gui/qt4/extensions_manager.cpp [deleted file]
modules/gui/qt4/extensions_manager.hpp [deleted file]
modules/gui/qt4/input_manager.cpp [deleted file]
modules/gui/qt4/input_manager.hpp [deleted file]
modules/gui/qt4/main_interface.cpp [deleted file]
modules/gui/qt4/main_interface.hpp [deleted file]
modules/gui/qt4/main_interface_win32.cpp [deleted file]
modules/gui/qt4/managers/addons_manager.cpp [deleted file]
modules/gui/qt4/managers/addons_manager.hpp [deleted file]
modules/gui/qt4/menus.cpp [deleted file]
modules/gui/qt4/menus.hpp [deleted file]
modules/gui/qt4/pixmaps/addons/addon.png [deleted file]
modules/gui/qt4/pixmaps/addons/addon.svgz [deleted file]
modules/gui/qt4/pixmaps/addons/addon_broken.png [deleted file]
modules/gui/qt4/pixmaps/addons/addon_broken.svgz [deleted file]
modules/gui/qt4/pixmaps/addons/score.png [deleted file]
modules/gui/qt4/pixmaps/addons/score.svgz [deleted file]
modules/gui/qt4/pixmaps/arrow_down_dark.png [deleted file]
modules/gui/qt4/pixmaps/clear.png [deleted file]
modules/gui/qt4/pixmaps/eject.png [deleted file]
modules/gui/qt4/pixmaps/faster.png [deleted file]
modules/gui/qt4/pixmaps/faster2.png [deleted file]
modules/gui/qt4/pixmaps/go-next.png [deleted file]
modules/gui/qt4/pixmaps/lock.png [deleted file]
modules/gui/qt4/pixmaps/menus/exit.svgz [deleted file]
modules/gui/qt4/pixmaps/menus/exit_16px.png [deleted file]
modules/gui/qt4/pixmaps/menus/help.svgz [deleted file]
modules/gui/qt4/pixmaps/menus/help_16px.png [deleted file]
modules/gui/qt4/pixmaps/menus/info.svgz [deleted file]
modules/gui/qt4/pixmaps/menus/info_16px.png [deleted file]
modules/gui/qt4/pixmaps/menus/messages.svgz [deleted file]
modules/gui/qt4/pixmaps/menus/messages_16px.png [deleted file]
modules/gui/qt4/pixmaps/menus/playlist.svgz [deleted file]
modules/gui/qt4/pixmaps/menus/playlist_16px.png [deleted file]
modules/gui/qt4/pixmaps/menus/preferences.svgz [deleted file]
modules/gui/qt4/pixmaps/menus/preferences_16px.png [deleted file]
modules/gui/qt4/pixmaps/menus/quit_16px.png [deleted file]
modules/gui/qt4/pixmaps/menus/settings.svgz [deleted file]
modules/gui/qt4/pixmaps/menus/settings_16px.png [deleted file]
modules/gui/qt4/pixmaps/menus/stream.svgz [deleted file]
modules/gui/qt4/pixmaps/menus/stream_16px.png [deleted file]
modules/gui/qt4/pixmaps/next.png [deleted file]
modules/gui/qt4/pixmaps/next_16px.png [deleted file]
modules/gui/qt4/pixmaps/noart-64.png [deleted file]
modules/gui/qt4/pixmaps/noart.png [deleted file]
modules/gui/qt4/pixmaps/pause.png [deleted file]
modules/gui/qt4/pixmaps/pause_16px.png [deleted file]
modules/gui/qt4/pixmaps/play.png [deleted file]
modules/gui/qt4/pixmaps/play_16px.png [deleted file]
modules/gui/qt4/pixmaps/playlist/add.png [deleted file]
modules/gui/qt4/pixmaps/playlist/dropzone.png [deleted file]
modules/gui/qt4/pixmaps/playlist/jumpto.png [deleted file]
modules/gui/qt4/pixmaps/playlist/playlist.png [deleted file]
modules/gui/qt4/pixmaps/playlist/remove.png [deleted file]
modules/gui/qt4/pixmaps/playlist/repeat_all.png [deleted file]
modules/gui/qt4/pixmaps/playlist/repeat_off.png [deleted file]
modules/gui/qt4/pixmaps/playlist/repeat_one.png [deleted file]
modules/gui/qt4/pixmaps/playlist/shuffle_off.png [deleted file]
modules/gui/qt4/pixmaps/playlist/shuffle_on.png [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/capture.png [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/capture.svgz [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/disc.png [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/disc.svgz [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/lan.png [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/lan.svgz [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/library.png [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/library.svgz [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/movie.png [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/movie.svgz [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/mtp.png [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/music.png [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/music.svgz [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/network.png [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/network.svgz [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/pictures.png [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/pictures.svgz [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/playlist.png [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/playlist.svgz [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/podcast.png [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/podcast.svgz [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/screen.png [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/screen.svgz [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/sd/appletrailers.png [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/sd/appletrailers.svgz [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/sd/assembleenationale.png [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/sd/assembleenationale.svgz [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/sd/fmc.png [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/sd/fmc.svgz [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/sd/frenchtv.png [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/sd/frenchtv.svgz [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/sd/icecast.png [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/sd/icecast.svgz [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/sd/jamendo.png [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/sd/jamendo.svgz [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/sd/katsomo.png [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/sd/katsomo.svgz [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/sd/metachannels.png [deleted file]
modules/gui/qt4/pixmaps/playlist/sidebar-icons/sd/metachannels.svgz [deleted file]
modules/gui/qt4/pixmaps/prefs/advprefs_audio.png [deleted file]
modules/gui/qt4/pixmaps/prefs/advprefs_codec.png [deleted file]
modules/gui/qt4/pixmaps/prefs/advprefs_extended.png [deleted file]
modules/gui/qt4/pixmaps/prefs/advprefs_intf.png [deleted file]
modules/gui/qt4/pixmaps/prefs/advprefs_playlist.png [deleted file]
modules/gui/qt4/pixmaps/prefs/advprefs_sout.png [deleted file]
modules/gui/qt4/pixmaps/prefs/advprefs_video.png [deleted file]
modules/gui/qt4/pixmaps/prefs/spref_cone_Audio_64.png [deleted file]
modules/gui/qt4/pixmaps/prefs/spref_cone_Hotkeys_64.png [deleted file]
modules/gui/qt4/pixmaps/prefs/spref_cone_Input_64.png [deleted file]
modules/gui/qt4/pixmaps/prefs/spref_cone_Interface_64.png [deleted file]
modules/gui/qt4/pixmaps/prefs/spref_cone_Subtitles_64.png [deleted file]
modules/gui/qt4/pixmaps/prefs/spref_cone_Video_64.png [deleted file]
modules/gui/qt4/pixmaps/previous.png [deleted file]
modules/gui/qt4/pixmaps/previous_16px.png [deleted file]
modules/gui/qt4/pixmaps/profile_new.png [deleted file]
modules/gui/qt4/pixmaps/sample_complete.png [deleted file]
modules/gui/qt4/pixmaps/sample_minimal.png [deleted file]
modules/gui/qt4/pixmaps/sample_skins.png [deleted file]
modules/gui/qt4/pixmaps/search_clear.png [deleted file]
modules/gui/qt4/pixmaps/slower.png [deleted file]
modules/gui/qt4/pixmaps/slower2.png [deleted file]
modules/gui/qt4/pixmaps/space.png [deleted file]
modules/gui/qt4/pixmaps/stop.png [deleted file]
modules/gui/qt4/pixmaps/stop_16px.png [deleted file]
modules/gui/qt4/pixmaps/toolbar/arrows.png [deleted file]
modules/gui/qt4/pixmaps/toolbar/aspect-ratio.png [deleted file]
modules/gui/qt4/pixmaps/toolbar/atob.png [deleted file]
modules/gui/qt4/pixmaps/toolbar/atob_noa.png [deleted file]
modules/gui/qt4/pixmaps/toolbar/atob_nob.png [deleted file]
modules/gui/qt4/pixmaps/toolbar/defullscreen.png [deleted file]
modules/gui/qt4/pixmaps/toolbar/dvd_menu.png [deleted file]
modules/gui/qt4/pixmaps/toolbar/dvd_next.png [deleted file]
modules/gui/qt4/pixmaps/toolbar/dvd_prev.png [deleted file]
modules/gui/qt4/pixmaps/toolbar/extended_16px.png [deleted file]
modules/gui/qt4/pixmaps/toolbar/frame-by-frame.png [deleted file]
modules/gui/qt4/pixmaps/toolbar/frame-by-frame.svgz [deleted file]
modules/gui/qt4/pixmaps/toolbar/fullscreen.png [deleted file]
modules/gui/qt4/pixmaps/toolbar/play_reverse.png [deleted file]
modules/gui/qt4/pixmaps/toolbar/record_16px.png [deleted file]
modules/gui/qt4/pixmaps/toolbar/skip_back.png [deleted file]
modules/gui/qt4/pixmaps/toolbar/skip_for.png [deleted file]
modules/gui/qt4/pixmaps/toolbar/snapshot.png [deleted file]
modules/gui/qt4/pixmaps/toolbar/tv.png [deleted file]
modules/gui/qt4/pixmaps/toolbar/tvtelx.png [deleted file]
modules/gui/qt4/pixmaps/toolbar/visu.png [deleted file]
modules/gui/qt4/pixmaps/toolbar/volume-high.png [deleted file]
modules/gui/qt4/pixmaps/toolbar/volume-low.png [deleted file]
modules/gui/qt4/pixmaps/toolbar/volume-medium.png [deleted file]
modules/gui/qt4/pixmaps/toolbar/volume-muted.png [deleted file]
modules/gui/qt4/pixmaps/toolbar/volume-slider-inside.png [deleted file]
modules/gui/qt4/pixmaps/toolbar/volume-slider-outside.png [deleted file]
modules/gui/qt4/pixmaps/types/capture-card.svgz [deleted file]
modules/gui/qt4/pixmaps/types/capture-card_16px.png [deleted file]
modules/gui/qt4/pixmaps/types/disc.svgz [deleted file]
modules/gui/qt4/pixmaps/types/disc_16px.png [deleted file]
modules/gui/qt4/pixmaps/types/file-asym_16px.png [deleted file]
modules/gui/qt4/pixmaps/types/file-wide_16px.png [deleted file]
modules/gui/qt4/pixmaps/types/folder-blue.svgz [deleted file]
modules/gui/qt4/pixmaps/types/folder-blue_16px.png [deleted file]
modules/gui/qt4/pixmaps/types/folder-grey.svgz [deleted file]
modules/gui/qt4/pixmaps/types/folder-grey_16px.png [deleted file]
modules/gui/qt4/pixmaps/types/harddisk_16px.png [deleted file]
modules/gui/qt4/pixmaps/types/network_16px.png [deleted file]
modules/gui/qt4/pixmaps/types/tape_16px.png [deleted file]
modules/gui/qt4/pixmaps/types/type_directory.png [deleted file]
modules/gui/qt4/pixmaps/types/type_file.png [deleted file]
modules/gui/qt4/pixmaps/types/type_node.png [deleted file]
modules/gui/qt4/pixmaps/types/type_playlist.png [deleted file]
modules/gui/qt4/pixmaps/types/type_stream.png [deleted file]
modules/gui/qt4/pixmaps/types/type_stream.svgz [deleted file]
modules/gui/qt4/pixmaps/types/type_unknown.xpm [deleted file]
modules/gui/qt4/pixmaps/update.png [deleted file]
modules/gui/qt4/pixmaps/util/wait0.png [deleted file]
modules/gui/qt4/pixmaps/util/wait1.png [deleted file]
modules/gui/qt4/pixmaps/util/wait2.png [deleted file]
modules/gui/qt4/pixmaps/util/wait3.png [deleted file]
modules/gui/qt4/pixmaps/util/wait4.png [deleted file]
modules/gui/qt4/pixmaps/valid.png [deleted file]
modules/gui/qt4/pixmaps/valid.svgz [deleted file]
modules/gui/qt4/pixmaps/win7/win7thumbnail_next.png [deleted file]
modules/gui/qt4/pixmaps/win7/win7thumbnail_pause.png [deleted file]
modules/gui/qt4/pixmaps/win7/win7thumbnail_play.png [deleted file]
modules/gui/qt4/pixmaps/win7/win7thumbnail_prev.png [deleted file]
modules/gui/qt4/qt4.cpp [deleted file]
modules/gui/qt4/qt4.hpp [deleted file]
modules/gui/qt4/recents.cpp [deleted file]
modules/gui/qt4/recents.hpp [deleted file]
modules/gui/qt4/styles/seekstyle.cpp [deleted file]
modules/gui/qt4/styles/seekstyle.hpp [deleted file]
modules/gui/qt4/ui/about.ui [deleted file]
modules/gui/qt4/ui/equalizer.ui [deleted file]
modules/gui/qt4/ui/fingerprintdialog.ui [deleted file]
modules/gui/qt4/ui/messages_panel.ui [deleted file]
modules/gui/qt4/ui/open.ui [deleted file]
modules/gui/qt4/ui/open_capture.ui [deleted file]
modules/gui/qt4/ui/open_disk.ui [deleted file]
modules/gui/qt4/ui/open_file.ui [deleted file]
modules/gui/qt4/ui/open_net.ui [deleted file]
modules/gui/qt4/ui/podcast_configuration.ui [deleted file]
modules/gui/qt4/ui/profiles.ui [deleted file]
modules/gui/qt4/ui/sout.ui [deleted file]
modules/gui/qt4/ui/sprefs_audio.ui [deleted file]
modules/gui/qt4/ui/sprefs_input.ui [deleted file]
modules/gui/qt4/ui/sprefs_interface.ui [deleted file]
modules/gui/qt4/ui/sprefs_subtitles.ui [deleted file]
modules/gui/qt4/ui/sprefs_video.ui [deleted file]
modules/gui/qt4/ui/streampanel.ui [deleted file]
modules/gui/qt4/ui/update.ui [deleted file]
modules/gui/qt4/ui/video_effects.ui [deleted file]
modules/gui/qt4/ui/vlm.ui [deleted file]
modules/gui/qt4/util/animators.cpp [deleted file]
modules/gui/qt4/util/animators.hpp [deleted file]
modules/gui/qt4/util/buttons/BrowseButton.cpp [deleted file]
modules/gui/qt4/util/buttons/BrowseButton.hpp [deleted file]
modules/gui/qt4/util/buttons/DeckButtonsLayout.cpp [deleted file]
modules/gui/qt4/util/buttons/DeckButtonsLayout.hpp [deleted file]
modules/gui/qt4/util/buttons/RoundButton.cpp [deleted file]
modules/gui/qt4/util/buttons/RoundButton.hpp [deleted file]
modules/gui/qt4/util/customwidgets.cpp [deleted file]
modules/gui/qt4/util/customwidgets.hpp [deleted file]
modules/gui/qt4/util/input_slider.cpp [deleted file]
modules/gui/qt4/util/input_slider.hpp [deleted file]
modules/gui/qt4/util/pictureflow.cpp [deleted file]
modules/gui/qt4/util/pictureflow.hpp [deleted file]
modules/gui/qt4/util/qmenuview.cpp [deleted file]
modules/gui/qt4/util/qmenuview.hpp [deleted file]
modules/gui/qt4/util/qt_dirs.cpp [deleted file]
modules/gui/qt4/util/qt_dirs.hpp [deleted file]
modules/gui/qt4/util/qvlcapp.hpp [deleted file]
modules/gui/qt4/util/qvlcframe.hpp [deleted file]
modules/gui/qt4/util/registry.cpp [deleted file]
modules/gui/qt4/util/registry.hpp [deleted file]
modules/gui/qt4/util/searchlineedit.cpp [deleted file]
modules/gui/qt4/util/searchlineedit.hpp [deleted file]
modules/gui/qt4/util/searchlineedit_mac.mm [deleted file]
modules/gui/qt4/util/singleton.hpp [deleted file]
modules/gui/qt4/util/timetooltip.cpp [deleted file]
modules/gui/qt4/util/timetooltip.hpp [deleted file]
modules/gui/qt4/util/validators.cpp [deleted file]
modules/gui/qt4/util/validators.hpp [deleted file]
modules/gui/qt4/vlc.qrc [deleted file]
po/Makevars
po/POTFILES.in

index dae0aa8..b4fa3db 100644 (file)
@@ -4304,7 +4304,7 @@ AC_CONFIG_FILES([
   bin/Makefile
   test/Makefile
   modules/gui/macosx/Makefile
-  modules/gui/qt4/Makefile
+  modules/gui/qt/Makefile
   modules/gui/skins2/Makefile
   modules/hw/mmal/Makefile
 ])
index a75c0f9..f0a9e7d 100644 (file)
@@ -1,13 +1,13 @@
 guidir = $(pluginsdir)/gui
 gui_LTLIBRARIES =
 
-DIST_SUBDIRS += gui/macosx gui/qt4 gui/skins2
+DIST_SUBDIRS += gui/macosx gui/qt gui/skins2
 
 if ENABLE_MACOSX_UI
 SUBDIRS += gui/macosx
 endif
 if ENABLE_QT4
-SUBDIRS += gui/qt4
+SUBDIRS += gui/qt
 endif
 if BUILD_SKINS
 SUBDIRS += gui/skins2
diff --git a/modules/gui/qt/.gitignore b/modules/gui/qt/.gitignore
new file mode 100644 (file)
index 0000000..e7252b6
--- /dev/null
@@ -0,0 +1,2 @@
+resources.cpp
+ui/*.h
diff --git a/modules/gui/qt/HACKING b/modules/gui/qt/HACKING
new file mode 100644 (file)
index 0000000..a265295
--- /dev/null
@@ -0,0 +1,67 @@
+Small Hacking file for the Qt Interface
+
+If you ever code for Qt interface, please read this before.
+
+** Code Conventions **
+
+Please respect VLC code conventions here:
+ - NO trailing spaces
+ - NO tab
+ - Indentation is 4 spaces
+ - Braces ARE indented
+ - Space before and after operators
+ - Case labels are on the same column as the switch
+
+Refer to http://wiki.videolan.org/Code_Conventions it should be up to date
+
+** Include order **
+
+- VLC include/*.h includes
+- Other VLC .h includes (gruiking :D)
+- Qt module includes
+- Qt includes
+
+** Naming **
+This naming is stupid and inconsistent :D
+
+Try to prefix with psz_, i_, b_, ui_ for the normal basic C/C++ styles.
+
+If you have spare time, prefix QString with qs_.
+
+Use aPointerName over a_pointer_name for long names.
+
+** QVLCFrame vs QVLCDialog **
+
+A QVLCFrame is just a QWidget, without any parent and used as a Qt::Windows
+A QVLCDialog is a QDialog.
+
+This mean that the QVLCDialog is centered on the parent and ABOVE it, will be destroyed by the parent automatically.
+This also mean that you have to destroy the QVLCFrame and to save its position/size.
+
+So if your dialog is a dialog you are used to keep during a playing of a video, then use a QVLCFrame, else use a QVLCDialog, if this is something you do over anything else.
+
+QVLCFrame: extended panel, messages...
+QVLCDialog: preferences, open...
+
+** virtual vs Q_DECL_OVERRIDE **
+Only mark functions with the virtual keyword if this is the initial virtual
+declaration. Functions that override a virtual function should have the
+Q_DECL_OVERRIDE macro appended (which expands to the override identifier
+when compiled with Qt5 and C++11). This is a visual indicator to distinguish
+virtual declarations from overriding implementations and will include a
+compile-time check in C++11 language mode.
+
+** HIG for Qt **
+We tend to use GNOME/KDE specs over Vista ones for capitalizations:
+We use Header for:
+ - Menu
+ - Menu items
+ - GroupBox Titles
+ - Windows and dialog Titles
+We use Sentence for:
+ - CheckBoxes
+ - ComboBox list
+ - ComboBox labels
+ - Tooltips
+
+We use "..." after a menu item if it opens another dialog.
diff --git a/modules/gui/qt/Makefile.am b/modules/gui/qt/Makefile.am
new file mode 100644 (file)
index 0000000..0fe4348
--- /dev/null
@@ -0,0 +1,422 @@
+include $(top_srcdir)/modules/common.am
+guidir = $(pluginsdir)/gui
+
+## Howto
+# For each Q_OBJECT:
+#   - Add *.moc.cpp to nodist_..._SOURCES
+#   - Add *.cpp to ..._SOURCES
+#   - Add *.hpp to ..._SOURCES
+# For each UI
+#   - Add *.ui to ..._UI
+#   - Add *.h to nodist_..._SOURCES
+# For each ressource (icon, png, ...)
+#   - Add it to DEPS_res
+
+SUFFIXES += .ui .h .hpp .moc.cpp
+
+libqt4_plugin_la_CXXFLAGS = $(AM_CXXFLAGS) $(QT_CFLAGS) $(CXXFLAGS_qt4)
+libqt4_plugin_la_LIBADD = $(QT_LIBS) $(LIBS_qt4) $(LIBM)
+libqt4_plugin_la_LDFLAGS = $(AM_LDFLAGS) -rpath '$(guidir)'
+if HAVE_OS2
+else
+if HAVE_WIN32
+libqt4_plugin_la_LIBADD += -lole32 -lcomctl32 -luuid
+else
+libqt4_plugin_la_LIBADD += $(X_LIBS) $(X_PRE_LIB) -lX11
+endif
+endif
+if HAVE_DARWIN
+libqt4_plugin_la_LDFLAGS += -Wl,-framework,Cocoa
+endif
+
+gui_LTLIBRARIES =  $(LTLIBqt4)
+EXTRA_LTLIBRARIES = libqt4_plugin.la
+
+libqt4_plugin_la_SOURCES = \
+       qt4.cpp qt4.hpp \
+       menus.cpp menus.hpp \
+       main_interface.cpp main_interface.hpp \
+       dialogs_provider.cpp dialogs_provider.hpp \
+       input_manager.cpp input_manager.hpp \
+       actions_manager.cpp actions_manager.hpp \
+       extensions_manager.cpp extensions_manager.hpp \
+       managers/addons_manager.cpp managers/addons_manager.hpp \
+       recents.cpp recents.hpp \
+       adapters/seekpoints.cpp adapters/seekpoints.hpp \
+       adapters/chromaprint.cpp adapters/chromaprint.hpp \
+       adapters/variables.cpp adapters/variables.hpp \
+       dialogs/playlist.cpp dialogs/playlist.hpp \
+       dialogs/bookmarks.cpp dialogs/bookmarks.hpp \
+       dialogs/preferences.cpp dialogs/preferences.hpp \
+       dialogs/mediainfo.cpp dialogs/mediainfo.hpp \
+       dialogs/epg.cpp dialogs/epg.hpp \
+       dialogs/extended.cpp dialogs/extended.hpp \
+       dialogs/messages.cpp dialogs/messages.hpp \
+       dialogs/errors.cpp dialogs/errors.hpp \
+       dialogs/external.cpp dialogs/external.hpp \
+       dialogs/plugins.cpp dialogs/plugins.hpp \
+       dialogs/sout.cpp dialogs/sout.hpp \
+       dialogs/convert.cpp dialogs/convert.hpp \
+       dialogs/help.cpp dialogs/help.hpp \
+       dialogs/gototime.cpp dialogs/gototime.hpp \
+       dialogs/toolbar.cpp dialogs/toolbar.hpp \
+       dialogs/open.cpp dialogs/open.hpp \
+       dialogs/openurl.cpp dialogs/openurl.hpp \
+       dialogs/vlm.cpp dialogs/vlm.hpp \
+       dialogs/firstrun.cpp dialogs/firstrun.hpp \
+       dialogs/podcast_configuration.cpp dialogs/podcast_configuration.hpp \
+       dialogs/extensions.cpp dialogs/extensions.hpp \
+       dialogs/fingerprintdialog.cpp dialogs/fingerprintdialog.hpp \
+       components/extended_panels.cpp components/extended_panels.hpp \
+       components/info_panels.cpp components/info_panels.hpp \
+       components/info_widgets.cpp components/info_widgets.hpp \
+       components/preferences_widgets.cpp components/preferences_widgets.hpp \
+       components/complete_preferences.cpp \
+       components/complete_preferences.hpp \
+       components/simple_preferences.cpp components/simple_preferences.hpp \
+       components/open_panels.cpp components/open_panels.hpp \
+       components/interface_widgets.cpp components/interface_widgets.hpp \
+       components/controller.cpp components/controller.hpp \
+       components/controller_widget.cpp components/controller_widget.hpp \
+       components/epg/EPGChannels.cpp components/epg/EPGChannels.hpp \
+       components/epg/EPGItem.cpp components/epg/EPGItem.hpp \
+       components/epg/EPGRuler.cpp components/epg/EPGRuler.hpp \
+       components/epg/EPGView.cpp components/epg/EPGView.hpp \
+       components/epg/EPGWidget.cpp components/epg/EPGWidget.hpp \
+       components/playlist/views.cpp components/playlist/views.hpp \
+       components/playlist/vlc_model.cpp components/playlist/vlc_model.hpp \
+       components/playlist/playlist_model.cpp \
+       components/playlist/playlist_model.hpp \
+       components/playlist/playlist_item.cpp \
+       components/playlist/playlist_item.hpp \
+       components/playlist/standardpanel.cpp \
+       components/playlist/standardpanel.hpp \
+       components/playlist/playlist.cpp components/playlist/playlist.hpp \
+       components/playlist/selector.cpp components/playlist/selector.hpp \
+       components/playlist/sorting.h \
+       components/sout/profile_selector.cpp \
+       components/sout/profile_selector.hpp \
+       components/sout/sout_widgets.cpp components/sout/sout_widgets.hpp \
+       components/sout/profiles.hpp \
+       util/animators.cpp util/animators.hpp \
+       util/input_slider.cpp util/input_slider.hpp \
+       util/timetooltip.cpp util/timetooltip.hpp \
+       util/customwidgets.cpp util/customwidgets.hpp \
+       util/searchlineedit.cpp util/searchlineedit.hpp \
+       util/registry.cpp util/registry.hpp \
+       util/qmenuview.cpp util/qmenuview.hpp \
+       util/qt_dirs.cpp util/qt_dirs.hpp \
+       util/pictureflow.cpp util/pictureflow.hpp \
+       util/validators.cpp util/validators.hpp \
+       util/buttons/BrowseButton.cpp util/buttons/BrowseButton.hpp \
+       util/buttons/DeckButtonsLayout.cpp util/buttons/DeckButtonsLayout.hpp \
+       util/buttons/RoundButton.cpp util/buttons/RoundButton.hpp \
+       util/qvlcframe.hpp \
+       util/qvlcapp.hpp \
+       util/singleton.hpp \
+       styles/seekstyle.cpp styles/seekstyle.hpp
+if HAVE_WIN32
+libqt4_plugin_la_SOURCES += main_interface_win32.cpp
+endif
+
+# Meta-object compilation
+
+moc_verbose = $(moc_verbose_$(V))
+moc_verbose_ = $(moc_verbose__$(AM_DEFAULT_VERBOSITY))
+moc_verbose_0 = @echo "  MOC   " $@;
+moc_verbose__0 = $(moc_verbose_0)
+
+.hpp.moc.cpp:
+       $(moc_verbose)$(MOC) $(MOC_CPPFLAGS) -o $@ $<
+
+# These MOC files depend on the configure settings:
+dialogs_provider.moc.cpp dialogs/vlm.moc.cpp: $(top_builddir)/config.h
+
+nodist_libqt4_plugin_la_SOURCES = \
+       main_interface.moc.cpp \
+       menus.moc.cpp \
+       dialogs_provider.moc.cpp \
+       input_manager.moc.cpp \
+       actions_manager.moc.cpp \
+       extensions_manager.moc.cpp \
+       managers/addons_manager.moc.cpp \
+       recents.moc.cpp \
+       adapters/seekpoints.moc.cpp \
+       adapters/chromaprint.moc.cpp \
+       adapters/variables.moc.cpp \
+       dialogs/playlist.moc.cpp \
+       dialogs/bookmarks.moc.cpp \
+       dialogs/mediainfo.moc.cpp \
+       dialogs/extended.moc.cpp \
+       dialogs/messages.moc.cpp \
+       dialogs/epg.moc.cpp \
+       dialogs/errors.moc.cpp \
+       dialogs/external.moc.cpp \
+       dialogs/plugins.moc.cpp \
+       dialogs/preferences.moc.cpp \
+       dialogs/sout.moc.cpp \
+       dialogs/convert.moc.cpp \
+       dialogs/help.moc.cpp \
+       dialogs/gototime.moc.cpp \
+       dialogs/toolbar.moc.cpp \
+       dialogs/open.moc.cpp \
+       dialogs/openurl.moc.cpp \
+       dialogs/podcast_configuration.moc.cpp \
+       dialogs/vlm.moc.cpp \
+       dialogs/firstrun.moc.cpp \
+       dialogs/extensions.moc.cpp \
+       dialogs/fingerprintdialog.moc.cpp \
+       components/extended_panels.moc.cpp \
+       components/info_panels.moc.cpp \
+       components/info_widgets.moc.cpp \
+       components/preferences_widgets.moc.cpp \
+       components/complete_preferences.moc.cpp \
+       components/simple_preferences.moc.cpp \
+       components/open_panels.moc.cpp \
+       components/interface_widgets.moc.cpp \
+       components/controller.moc.cpp \
+       components/controller_widget.moc.cpp \
+       components/epg/EPGChannels.moc.cpp \
+       components/epg/EPGRuler.moc.cpp \
+       components/epg/EPGView.moc.cpp \
+       components/epg/EPGWidget.moc.cpp \
+       components/playlist/views.moc.cpp \
+       components/playlist/vlc_model.moc.cpp \
+       components/playlist/playlist_model.moc.cpp \
+       components/playlist/playlist.moc.cpp \
+       components/playlist/standardpanel.moc.cpp \
+       components/playlist/selector.moc.cpp \
+       components/sout/profile_selector.moc.cpp \
+       components/sout/sout_widgets.moc.cpp \
+       util/animators.moc.cpp \
+       util/input_slider.moc.cpp \
+       util/timetooltip.moc.cpp \
+       util/customwidgets.moc.cpp \
+       util/searchlineedit.moc.cpp \
+       util/qmenuview.moc.cpp \
+       util/qvlcapp.moc.cpp \
+       util/pictureflow.moc.cpp \
+       util/validators.moc.cpp \
+       util/buttons/RoundButton.moc.cpp \
+       util/buttons/DeckButtonsLayout.moc.cpp \
+       util/buttons/BrowseButton.moc.cpp \
+       styles/seekstyle.moc.cpp
+
+nodist_libqt4_plugin_la_SOURCES += \
+       ui/equalizer.h \
+       ui/video_effects.h \
+       ui/open_file.h \
+       ui/open_disk.h \
+       ui/open_net.h \
+       ui/open_capture.h \
+       ui/open.h \
+       ui/vlm.h \
+       ui/podcast_configuration.h \
+       ui/profiles.h \
+       ui/sprefs_audio.h \
+       ui/sprefs_input.h \
+       ui/sprefs_interface.h \
+       ui/sprefs_subtitles.h \
+       ui/sprefs_video.h \
+       ui/streampanel.h \
+       ui/messages_panel.h \
+       ui/about.h \
+       ui/update.h \
+       ui/fingerprintdialog.h \
+       ui/sout.h
+
+# User interface compilation
+
+uic_verbose = $(uic_verbose_$(V))
+uic_verbose_ = $(uic_verbose__$(AM_DEFAULT_VERBOSITY))
+uic_verbose_0 = @echo "  UIC   " $@;
+uic_verbose__0 = $(uic_verbose_0)
+
+MOC_CPPFLAGS = $(DEFS) \
+       -I$(top_srcdir)/include -I$(top_builddir)/include -I$(top_builddir) \
+       $(libqt4_plugin_la_CPPFLAGS)
+if HAVE_DARWIN
+MOC_CPPFLAGS += -DQ_OS_MAC
+endif
+if HAVE_WIN32
+MOC_CPPFLAGS += -D_WIN32
+endif
+
+libqt4_plugin_la_UI = \
+       ui/equalizer.ui \
+       ui/video_effects.ui \
+       ui/open_file.ui \
+       ui/open_disk.ui \
+       ui/open_net.ui \
+       ui/open_capture.ui \
+       ui/open.ui \
+       ui/podcast_configuration.ui \
+       ui/profiles.ui \
+       ui/sprefs_audio.ui \
+       ui/sprefs_input.ui \
+       ui/sprefs_interface.ui \
+       ui/sprefs_subtitles.ui \
+       ui/sprefs_video.ui \
+       ui/streampanel.ui \
+       ui/messages_panel.ui \
+       ui/about.ui \
+       ui/update.ui \
+       ui/sout.ui \
+       ui/vlm.ui \
+       ui/fingerprintdialog.ui
+EXTRA_DIST = $(libqt4_plugin_la_UI)
+
+.ui.h:
+       $(AM_V_at)mkdir -p -- ui
+       $(AM_V_at)rm -f $@ $@.tmp
+       $(AM_V_at)echo "#define Q_(a,b) QString::fromUtf8(_(a))" > $@.tmp
+       $(uic_verbose)$(UIC) -tr "Q_" $< >> $@.tmp
+       $(AM_V_at)sed -e 's/Q_(\"_(\\\"\(.*\)\\\")"/Q_("\1"/' $@.tmp >$@
+       $(AM_V_at)rm -f $@.tmp
+
+# Resources
+
+DEPS_res = \
+       pixmaps/arrow_down_dark.png \
+       pixmaps/clear.png \
+       pixmaps/eject.png \
+       pixmaps/faster.png \
+       pixmaps/faster2.png \
+       pixmaps/go-next.png \
+       pixmaps/addons/addon.png \
+       pixmaps/addons/addon_broken.png \
+       pixmaps/addons/score.png \
+       pixmaps/menus/exit_16px.png \
+       pixmaps/menus/help_16px.png \
+       pixmaps/menus/info_16px.png \
+       pixmaps/menus/messages_16px.png \
+       pixmaps/menus/playlist_16px.png \
+       pixmaps/menus/preferences_16px.png \
+       pixmaps/menus/quit_16px.png \
+       pixmaps/menus/settings_16px.png \
+       pixmaps/menus/stream_16px.png \
+       pixmaps/next.png \
+       pixmaps/next_16px.png \
+       pixmaps/noart-64.png \
+       pixmaps/noart.png \
+       pixmaps/pause.png \
+       pixmaps/pause_16px.png \
+       pixmaps/play.png \
+       pixmaps/play_16px.png \
+       pixmaps/playlist/add.png \
+       pixmaps/playlist/jumpto.png \
+       pixmaps/playlist/playlist.png \
+       pixmaps/playlist/remove.png \
+       pixmaps/playlist/repeat_all.png \
+       pixmaps/playlist/repeat_off.png \
+       pixmaps/playlist/repeat_one.png \
+       pixmaps/playlist/shuffle_off.png \
+       pixmaps/playlist/shuffle_on.png \
+       pixmaps/playlist/dropzone.png \
+       pixmaps/playlist/sidebar-icons/capture.png \
+       pixmaps/playlist/sidebar-icons/pictures.png \
+       pixmaps/playlist/sidebar-icons/disc.png \
+       pixmaps/playlist/sidebar-icons/playlist.png \
+       pixmaps/playlist/sidebar-icons/lan.png \
+       pixmaps/playlist/sidebar-icons/podcast.png \
+       pixmaps/playlist/sidebar-icons/library.png \
+       pixmaps/playlist/sidebar-icons/screen.png \
+       pixmaps/playlist/sidebar-icons/movie.png \
+       pixmaps/playlist/sidebar-icons/mtp.png \
+       pixmaps/playlist/sidebar-icons/music.png \
+       pixmaps/playlist/sidebar-icons/network.png \
+       pixmaps/playlist/sidebar-icons/sd/appletrailers.png \
+       pixmaps/playlist/sidebar-icons/sd/icecast.png \
+       pixmaps/playlist/sidebar-icons/sd/metachannels.png \
+       pixmaps/playlist/sidebar-icons/sd/katsomo.png \
+       pixmaps/playlist/sidebar-icons/sd/fmc.png \
+       pixmaps/playlist/sidebar-icons/sd/frenchtv.png \
+       pixmaps/playlist/sidebar-icons/sd/jamendo.png \
+       pixmaps/playlist/sidebar-icons/sd/assembleenationale.png \
+       pixmaps/prefs/advprefs_audio.png \
+       pixmaps/prefs/advprefs_codec.png \
+       pixmaps/prefs/advprefs_extended.png \
+       pixmaps/prefs/advprefs_intf.png \
+       pixmaps/prefs/advprefs_playlist.png \
+       pixmaps/prefs/advprefs_sout.png \
+       pixmaps/prefs/advprefs_video.png \
+       pixmaps/prefs/spref_cone_Audio_64.png \
+       pixmaps/prefs/spref_cone_Hotkeys_64.png \
+       pixmaps/prefs/spref_cone_Input_64.png \
+       pixmaps/prefs/spref_cone_Interface_64.png \
+       pixmaps/prefs/spref_cone_Subtitles_64.png \
+       pixmaps/prefs/spref_cone_Video_64.png \
+       pixmaps/previous.png \
+       pixmaps/previous_16px.png \
+       pixmaps/profile_new.png \
+       pixmaps/sample_complete.png \
+       pixmaps/sample_minimal.png \
+       pixmaps/sample_skins.png \
+       pixmaps/slower.png \
+       pixmaps/slower2.png \
+       pixmaps/space.png \
+       pixmaps/stop.png \
+       pixmaps/stop_16px.png \
+       pixmaps/toolbar/arrows.png \
+       pixmaps/toolbar/aspect-ratio.png \
+       pixmaps/toolbar/atob.png \
+       pixmaps/toolbar/atob_noa.png \
+       pixmaps/toolbar/atob_nob.png \
+       pixmaps/toolbar/defullscreen.png \
+       pixmaps/toolbar/dvd_menu.png \
+       pixmaps/toolbar/dvd_next.png \
+       pixmaps/toolbar/dvd_prev.png \
+       pixmaps/toolbar/extended_16px.png \
+       pixmaps/toolbar/frame-by-frame.png \
+       pixmaps/toolbar/fullscreen.png \
+       pixmaps/toolbar/play_reverse.png \
+       pixmaps/toolbar/record_16px.png \
+       pixmaps/toolbar/snapshot.png \
+       pixmaps/toolbar/skip_for.png \
+       pixmaps/toolbar/skip_back.png \
+       pixmaps/toolbar/tv.png \
+       pixmaps/toolbar/tvtelx.png \
+       pixmaps/toolbar/visu.png \
+       pixmaps/toolbar/volume-high.png \
+       pixmaps/toolbar/volume-low.png \
+       pixmaps/toolbar/volume-medium.png \
+       pixmaps/toolbar/volume-muted.png \
+       pixmaps/toolbar/volume-slider-inside.png \
+       pixmaps/toolbar/volume-slider-outside.png \
+       pixmaps/types/capture-card_16px.png \
+       pixmaps/types/disc_16px.png \
+       pixmaps/types/file-asym_16px.png \
+       pixmaps/types/file-wide_16px.png \
+       pixmaps/types/folder-blue_16px.png \
+       pixmaps/types/folder-grey_16px.png \
+       pixmaps/types/harddisk_16px.png \
+       pixmaps/types/network_16px.png \
+       pixmaps/types/tape_16px.png \
+       pixmaps/types/type_directory.png \
+       pixmaps/types/type_file.png \
+       pixmaps/types/type_stream.png \
+       pixmaps/types/type_node.png \
+       pixmaps/types/type_playlist.png \
+       pixmaps/types/type_unknown.xpm \
+       pixmaps/util/wait0.png \
+       pixmaps/util/wait1.png \
+       pixmaps/util/wait2.png \
+       pixmaps/util/wait3.png \
+       pixmaps/util/wait4.png \
+       pixmaps/win7/win7thumbnail_pause.png \
+       pixmaps/win7/win7thumbnail_prev.png \
+       pixmaps/win7/win7thumbnail_next.png \
+       pixmaps/win7/win7thumbnail_play.png \
+       pixmaps/update.png \
+       pixmaps/valid.png \
+       pixmaps/search_clear.png \
+       pixmaps/lock.png
+EXTRA_DIST += vlc.qrc $(DEPS_res)
+
+nodist_libqt4_plugin_la_SOURCES += resources.cpp
+
+resources.cpp: vlc.qrc $(DEPS_res)
+       $(AM_V_GEN)$(RCC) -name vlc -o $@ $<
+
+
+BUILT_SOURCES += $(nodist_libqt4_plugin_la_SOURCES)
diff --git a/modules/gui/qt/actions_manager.cpp b/modules/gui/qt/actions_manager.cpp
new file mode 100644 (file)
index 0000000..eff40d9
--- /dev/null
@@ -0,0 +1,212 @@
+/*****************************************************************************
+ * actions_manager.cpp : Controller for the main interface
+ ****************************************************************************
+ * Copyright © 2009-2014 VideoLAN and VLC authors
+ * $Id$
+ *
+ * Authors: Jean-Baptiste Kempf <jb@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.
+ *****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <vlc_vout.h>
+#include <vlc_keys.h>
+
+#include "actions_manager.hpp"
+
+#include "dialogs_provider.hpp"      /* Opening Dialogs */
+#include "input_manager.hpp"         /* THEMIM */
+#include "main_interface.hpp"        /* Show playlist */
+#include "components/controller.hpp" /* Toggle FSC controller width */
+#include "components/extended_panels.hpp"
+
+ActionsManager::ActionsManager( intf_thread_t * _p_i )
+{
+    p_intf = _p_i;
+}
+
+void ActionsManager::doAction( int id_action )
+{
+    switch( id_action )
+    {
+        case PLAY_ACTION:
+            play(); break;
+        case STOP_ACTION:
+            THEMIM->stop(); break;
+        case OPEN_ACTION:
+            THEDP->openDialog(); break;
+        case PREVIOUS_ACTION:
+            THEMIM->prev(); break;
+        case NEXT_ACTION:
+            THEMIM->next(); break;
+        case SLOWER_ACTION:
+            THEMIM->getIM()->slower(); break;
+        case FASTER_ACTION:
+            THEMIM->getIM()->faster(); break;
+        case FULLSCREEN_ACTION:
+            fullscreen(); break;
+        case EXTENDED_ACTION:
+            THEDP->extendedDialog(); break;
+        case PLAYLIST_ACTION:
+            playlist(); break;
+        case SNAPSHOT_ACTION:
+            snapshot(); break;
+        case RECORD_ACTION:
+            record(); break;
+        case FRAME_ACTION:
+            frame(); break;
+        case ATOB_ACTION:
+            THEMIM->getIM()->setAtoB(); break;
+        case REVERSE_ACTION:
+            THEMIM->getIM()->reverse(); break;
+        case SKIP_BACK_ACTION:
+            skipBackward();
+            break;
+        case SKIP_FW_ACTION:
+            skipForward();
+            break;
+        case QUIT_ACTION:
+            THEDP->quit();  break;
+        case RANDOM_ACTION:
+            THEMIM->toggleRandom(); break;
+        case INFO_ACTION:
+            THEDP->mediaInfoDialog(); break;
+        case OPEN_SUB_ACTION:
+            THEDP->loadSubtitlesFile(); break;
+        case FULLWIDTH_ACTION:
+            if( p_intf->p_sys->p_mi )
+                p_intf->p_sys->p_mi->getFullscreenControllerWidget()->toggleFullwidth();
+            break;
+        default:
+            msg_Warn( p_intf, "Action not supported: %i", id_action );
+            break;
+    }
+}
+
+void ActionsManager::play()
+{
+    if( THEPL->current.i_size == 0 && THEPL->items.i_size == 0 )
+    {
+        /* The playlist is empty, open a file requester */
+        THEDP->openFileDialog();
+        return;
+    }
+    THEMIM->togglePlayPause();
+}
+
+/**
+ * TODO
+ * This functions toggle the fullscreen mode
+ * If there is no video, it should first activate Visualisations...
+ * This has also to be fixed in enableVideo()
+ */
+void ActionsManager::fullscreen()
+{
+    bool fs = var_ToggleBool( THEPL, "fullscreen" );
+    vout_thread_t *p_vout = THEMIM->getVout();
+    if( p_vout)
+    {
+        var_SetBool( p_vout, "fullscreen", fs );
+        vlc_object_release( p_vout );
+    }
+}
+
+void ActionsManager::snapshot()
+{
+    vout_thread_t *p_vout = THEMIM->getVout();
+    if( p_vout )
+    {
+        var_TriggerCallback( p_vout, "video-snapshot" );
+        vlc_object_release( p_vout );
+    }
+}
+
+void ActionsManager::playlist()
+{
+    if( p_intf->p_sys->p_mi )
+        p_intf->p_sys->p_mi->togglePlaylist();
+}
+
+void ActionsManager::record()
+{
+    input_thread_t *p_input = THEMIM->getInput();
+    if( p_input )
+    {
+        /* This method won't work fine if the stream can't be cut anywhere */
+        var_ToggleBool( p_input, "record" );
+#if 0
+        else
+        {
+            /* 'record' access-filter is not loaded, we open Save dialog */
+            input_item_t *p_item = input_GetItem( p_input );
+            if( !p_item )
+                return;
+
+            char *psz = input_item_GetURI( p_item );
+            if( psz )
+                THEDP->streamingDialog( NULL, qfu(psz), true );
+        }
+#endif
+    }
+}
+
+void ActionsManager::frame()
+{
+    input_thread_t *p_input = THEMIM->getInput();
+    if( p_input )
+        var_TriggerCallback( p_input, "frame-next" );
+}
+
+void ActionsManager::toggleMuteAudio()
+{
+    playlist_MuteToggle( THEPL );
+}
+
+void ActionsManager::AudioUp()
+{
+    playlist_VolumeUp( THEPL, 1, NULL );
+}
+
+void ActionsManager::AudioDown()
+{
+    playlist_VolumeDown( THEPL, 1, NULL );
+}
+
+void ActionsManager::skipForward()
+{
+    input_thread_t *p_input = THEMIM->getInput();
+    if( p_input )
+        THEMIM->getIM()->jumpFwd();
+}
+
+void ActionsManager::skipBackward()
+{
+    input_thread_t *p_input = THEMIM->getInput();
+    if( p_input )
+        THEMIM->getIM()->jumpBwd();
+}
+
+void ActionsManager::PPaction( QAction *a )
+{
+    int i_q = -1;
+    if( a != NULL )
+        i_q = a->data().toInt();
+
+    ExtVideo::setPostprocessing( p_intf, i_q );
+}
diff --git a/modules/gui/qt/actions_manager.hpp b/modules/gui/qt/actions_manager.hpp
new file mode 100644 (file)
index 0000000..543f10a
--- /dev/null
@@ -0,0 +1,98 @@
+/*****************************************************************************
+ * actions_manager.hpp : Controller for the main interface
+ ****************************************************************************
+ * Copyright (C) 2006-2008 the VideoLAN team
+ * $Id$
+ *
+ * Authors: Jean-Baptiste Kempf <jb@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.
+ *****************************************************************************/
+
+#ifndef QVLC_ACTIONS_MANAGER_H_
+#define QVLC_ACTIONS_MANAGER_H_ 1
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "qt4.hpp"
+#include "util/singleton.hpp"
+
+#include <QObject>
+class QAction;
+
+typedef enum actionType_e
+{
+    PLAY_ACTION,
+    STOP_ACTION,
+    OPEN_ACTION,
+    PREVIOUS_ACTION,
+    NEXT_ACTION,
+    SLOWER_ACTION,
+    FASTER_ACTION,
+    FULLSCREEN_ACTION,
+    FULLWIDTH_ACTION,
+    EXTENDED_ACTION,
+    PLAYLIST_ACTION,
+    SNAPSHOT_ACTION,
+    RECORD_ACTION,
+    FRAME_ACTION,
+    ATOB_ACTION,
+    REVERSE_ACTION,
+    SKIP_BACK_ACTION,
+    SKIP_FW_ACTION,
+    QUIT_ACTION,
+    RANDOM_ACTION,
+    LOOP_ACTION,
+    INFO_ACTION,
+    OPEN_SUB_ACTION,
+} actionType_e;
+
+class ActionsManager : public QObject, public Singleton<ActionsManager>
+{
+
+    Q_OBJECT
+    friend class Singleton<ActionsManager>;
+
+public:
+
+private:
+    ActionsManager( intf_thread_t  *_p_i );
+    virtual ~ActionsManager() {}
+
+    intf_thread_t       *p_intf;
+
+public slots:
+    void toggleMuteAudio();
+    void AudioUp();
+    void AudioDown();
+    void play();
+    void record();
+    void skipForward();
+    void skipBackward();
+    void PPaction( QAction * );
+
+protected slots:
+    void fullscreen();
+    void snapshot();
+    void playlist();
+    void frame();
+
+    virtual void doAction( int );
+};
+
+#endif
+
diff --git a/modules/gui/qt/adapters/chromaprint.cpp b/modules/gui/qt/adapters/chromaprint.cpp
new file mode 100644 (file)
index 0000000..f4b19c4
--- /dev/null
@@ -0,0 +1,77 @@
+/*****************************************************************************
+ * chromaprint.cpp: Fingerprinter helper class
+ *****************************************************************************
+ * Copyright (C) 2012 VLC authors and VideoLAN
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser 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.
+ *****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "chromaprint.hpp"
+#include <vlc_fingerprinter.h>
+#include <vlc_modules.h>
+
+Chromaprint::Chromaprint( intf_thread_t *_p_intf ) : p_intf( _p_intf )
+{
+    Q_ASSERT( p_intf );
+    p_fingerprinter = fingerprinter_Create( VLC_OBJECT( p_intf ) );
+    if ( p_fingerprinter )
+        var_AddCallback( p_fingerprinter, "results-available", results_available, this );
+}
+
+int Chromaprint::results_available( vlc_object_t *, const char *, vlc_value_t, vlc_value_t , void *param )
+{
+    Chromaprint *me = (Chromaprint *) param;
+    me->finish();
+    return 0;
+}
+
+fingerprint_request_t * Chromaprint::fetchResults()
+{
+    return p_fingerprinter->pf_getresults( p_fingerprinter );
+}
+
+void Chromaprint::apply( fingerprint_request_t *p_r, int i_id )
+{
+    p_fingerprinter->pf_apply( p_r, i_id );
+}
+
+bool Chromaprint::enqueue( input_item_t *p_item )
+{
+    if ( ! p_fingerprinter ) return false;
+    fingerprint_request_t *p_r = fingerprint_request_New( p_item );
+    if ( ! p_r ) return false;
+    mtime_t t = input_item_GetDuration( p_item );
+    if ( t ) p_r->i_duration = (unsigned int) ( t / 1000000 );
+    p_fingerprinter->pf_enqueue( p_fingerprinter, p_r );
+    return true;
+}
+
+bool Chromaprint::isSupported( QString uri )
+{
+    if ( !module_exists( "stream_out_chromaprint" ) )
+        return false;
+    else
+    return ( uri.startsWith( "file://" ) || uri.startsWith( "/" ) );
+}
+
+Chromaprint::~Chromaprint()
+{
+    if ( p_fingerprinter )
+        fingerprinter_Destroy( p_fingerprinter );
+}
diff --git a/modules/gui/qt/adapters/chromaprint.hpp b/modules/gui/qt/adapters/chromaprint.hpp
new file mode 100644 (file)
index 0000000..af159d6
--- /dev/null
@@ -0,0 +1,55 @@
+/*****************************************************************************
+ * chromaprint.hpp: Fingerprinter helper class
+ *****************************************************************************
+ * Copyright (C) 2012 VLC authors and VideoLAN
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser 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.
+ *****************************************************************************/
+#ifndef CHROMAPRINT_HPP
+#define CHROMAPRINT_HPP
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <QObject>
+#include <QString>
+#include <vlc_fingerprinter.h>
+#include <vlc_interface.h>
+
+class Chromaprint : public QObject
+{
+    Q_OBJECT
+
+public:
+    Chromaprint( intf_thread_t *p_intf = NULL );
+    virtual ~Chromaprint();
+    bool enqueue( input_item_t *p_item );
+    static int results_available( vlc_object_t *p_this, const char *,
+                                  vlc_value_t, vlc_value_t newval, void *param );
+    fingerprint_request_t * fetchResults();
+    void apply( fingerprint_request_t *, int i_id );
+    static bool isSupported( QString uri );
+
+signals:
+    void finished();
+
+private:
+    void finish() { emit finished(); }
+    intf_thread_t *p_intf;
+    fingerprinter_thread_t *p_fingerprinter;
+};
+
+#endif // CHROMAPRINT_HPP
diff --git a/modules/gui/qt/adapters/seekpoints.cpp b/modules/gui/qt/adapters/seekpoints.cpp
new file mode 100644 (file)
index 0000000..fbf2957
--- /dev/null
@@ -0,0 +1,92 @@
+/*****************************************************************************
+ * seekpoints.cpp : Chapters & Bookmarks (menu)
+ *****************************************************************************
+ * Copyright © 2011 the VideoLAN team
+ *
+ *
+ * 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 "recents.hpp"
+#include "dialogs_provider.hpp"
+#include "menus.hpp"
+
+#include "seekpoints.hpp"
+
+#include "qt4.hpp"
+#include "input_manager.hpp"
+
+SeekPoints::SeekPoints( QObject *parent, intf_thread_t *p_intf_ ) :
+    QObject( parent ), p_intf( p_intf_ )
+{}
+
+void SeekPoints::update()
+{
+    input_title_t *p_title = NULL;
+    input_thread_t *p_input_thread = playlist_CurrentInput( THEPL );
+    int i_title_id = -1;
+    if( !p_input_thread ) { pointsList.clear(); return; }
+
+    if ( input_Control( p_input_thread, INPUT_GET_TITLE_INFO, &p_title, &i_title_id )
+        != VLC_SUCCESS )
+    {
+        vlc_object_release( p_input_thread );
+        pointsList.clear();
+        return;
+    }
+
+    vlc_object_release( p_input_thread );
+
+    if( !p_title )
+        return;
+
+    /* lock here too, as update event is triggered by an external thread */
+    if ( !access() ) return;
+    pointsList.clear();
+    if ( p_title->i_seekpoint > 0 )
+    {
+        /* first check the last point to see if we have filled time offsets (> 0) */
+        if ( p_title->seekpoint[p_title->i_seekpoint - 1]->i_time_offset > 0 )
+        {
+            for ( int i=0; i<p_title->i_seekpoint ; i++ )
+                pointsList << SeekPoint( p_title->seekpoint[i] );
+        }
+    }
+    vlc_input_title_Delete( p_title );
+    release();
+}
+
+QList<SeekPoint> const SeekPoints::getPoints()
+{
+    QList<SeekPoint> copy;
+    if ( access() )
+    {
+        copy = pointsList;
+        release();
+    }
+    return copy;
+}
+
+bool SeekPoints::jumpTo( int i_chapterindex )
+{
+    vlc_value_t val;
+    val.i_int = i_chapterindex;
+    input_thread_t *p_input_thread = playlist_CurrentInput( THEPL );
+    if( !p_input_thread ) return false;
+    bool b_succ = var_Set( p_input_thread, "chapter", val );
+    vlc_object_release( p_input_thread );
+    return ( b_succ == VLC_SUCCESS );
+}
diff --git a/modules/gui/qt/adapters/seekpoints.hpp b/modules/gui/qt/adapters/seekpoints.hpp
new file mode 100644 (file)
index 0000000..0083989
--- /dev/null
@@ -0,0 +1,68 @@
+/*****************************************************************************
+ * seekpoints.hpp : Chapters & Bookmarks (menu)
+ *****************************************************************************
+ * Copyright © 2011 the VideoLAN team
+ *
+ *
+ * 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.
+ *****************************************************************************/
+
+#ifndef SEEKPOINTS_HPP
+#define SEEKPOINTS_HPP
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <vlc_common.h>
+#include <vlc_interface.h>
+#include <vlc_input.h>
+
+#include <QObject>
+#include <QList>
+#include <QMutex>
+
+class SeekPoint
+{
+public:
+    SeekPoint( seekpoint_t *seekpoint )
+    {
+        time = seekpoint->i_time_offset;
+        name = QString::fromUtf8( seekpoint->psz_name );
+    };
+    int64_t time;
+    QString name;
+};
+
+class SeekPoints : public QObject
+{
+    Q_OBJECT
+public:
+    SeekPoints( QObject *, intf_thread_t * );
+    QList<SeekPoint> const getPoints();
+    bool access() { return listMutex.tryLock( 100 ); }
+    void release() { listMutex.unlock(); }
+    bool jumpTo( int );
+
+public slots:
+    void update();
+
+private:
+    QList<SeekPoint> pointsList;
+    QMutex listMutex;
+    intf_thread_t *p_intf;
+};
+
+#endif // SEEKPOINTS_HPP
diff --git a/modules/gui/qt/adapters/variables.cpp b/modules/gui/qt/adapters/variables.cpp
new file mode 100644 (file)
index 0000000..c927a42
--- /dev/null
@@ -0,0 +1,140 @@
+/*****************************************************************************
+ * variables.cpp : VLC variable class
+ ****************************************************************************
+ * Copyright (C) 2009 Rémi Denis-Courmont
+ * Copyright (C) 2006 the VideoLAN team
+ *
+ * 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.
+ *****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "qt4.hpp"
+#include "variables.hpp"
+
+QVLCVariable::QVLCVariable (vlc_object_t *obj, const char *varname, int type,
+                            bool inherit)
+    : object (obj), name (qfu(varname))
+{
+    vlc_object_hold (object);
+
+    if (inherit)
+        type |= VLC_VAR_DOINHERIT;
+    var_Create (object, qtu(name), type);
+    var_AddCallback (object, qtu(name), callback, this);
+}
+
+QVLCVariable::~QVLCVariable (void)
+{
+    var_DelCallback (object, qtu(name), callback, this);
+    var_Destroy (object, qtu(name));
+    vlc_object_release (object);
+}
+
+int QVLCVariable::callback (vlc_object_t *object, const char *,
+                            vlc_value_t old, vlc_value_t cur, void *data)
+{
+    VLC_UNUSED(object);
+
+    QVLCVariable *self = static_cast<QVLCVariable *>(data);
+
+    self->trigger (old, cur);
+    return VLC_SUCCESS;
+}
+
+
+QVLCPointer::QVLCPointer (vlc_object_t *obj, const char *varname, bool inherit)
+    : QVLCVariable (obj, varname, VLC_VAR_ADDRESS, inherit)
+{
+}
+
+void QVLCPointer::trigger (vlc_value_t, vlc_value_t cur)
+{
+    emit pointerChanged (cur.p_address);
+}
+
+bool QVLCPointer::addCallback (QObject *tgt, const char *method,
+                               Qt::ConnectionType type)
+{
+    return tgt->connect (this, SIGNAL(pointerChanged(void *)), method, type);
+}
+
+QVLCInteger::QVLCInteger (vlc_object_t *obj, const char *varname, bool inherit)
+    : QVLCVariable (obj, varname, VLC_VAR_INTEGER, inherit)
+{
+}
+
+void QVLCInteger::trigger (vlc_value_t, vlc_value_t cur)
+{
+    emit integerChanged (cur.i_int);
+}
+
+bool QVLCInteger::addCallback (QObject *tgt, const char *method,
+                               Qt::ConnectionType type)
+{
+    return tgt->connect (this, SIGNAL(integerChanged(qlonglong)), method,
+                         type);
+}
+
+QVLCBool::QVLCBool (vlc_object_t *obj, const char *varname, bool inherit)
+    : QVLCVariable (obj, varname, VLC_VAR_BOOL, inherit)
+{
+}
+
+void QVLCBool::trigger (vlc_value_t, vlc_value_t cur)
+{
+    emit boolChanged (cur.b_bool);
+}
+
+bool QVLCBool::addCallback (QObject *tgt, const char *method,
+                            Qt::ConnectionType type)
+{
+    return tgt->connect (this, SIGNAL(boolChanged(bool)), method, type);
+}
+
+QVLCFloat::QVLCFloat (vlc_object_t *obj, const char *varname, bool inherit)
+    : QVLCVariable (obj, varname, VLC_VAR_FLOAT, inherit)
+{
+}
+
+void QVLCFloat::trigger (vlc_value_t, vlc_value_t cur)
+{
+    emit floatChanged (cur.f_float);
+}
+
+bool QVLCFloat::addCallback (QObject *tgt, const char *method,
+                            Qt::ConnectionType type)
+{
+    return tgt->connect (this, SIGNAL(floatChanged(float)), method, type);
+}
+
+QVLCString::QVLCString (vlc_object_t *obj, const char *varname, bool inherit)
+    : QVLCVariable (obj, varname, VLC_VAR_STRING, inherit)
+{
+}
+
+void QVLCString::trigger (vlc_value_t, vlc_value_t cur)
+{
+    QString str = qfu(cur.psz_string);
+    emit stringChanged (str);
+}
+
+bool QVLCString::addCallback (QObject *tgt, const char *method,
+                              Qt::ConnectionType type)
+{
+    return tgt->connect (this, SIGNAL(stringChanged(QString)), method, type);
+}
diff --git a/modules/gui/qt/adapters/variables.hpp b/modules/gui/qt/adapters/variables.hpp
new file mode 100644 (file)
index 0000000..fb0b4cb
--- /dev/null
@@ -0,0 +1,122 @@
+/*****************************************************************************
+ * variables.hpp : Dialogs from other LibVLC core and other plugins
+ ****************************************************************************
+ * Copyright (C) 2009 Rémi Denis-Courmont
+ *
+ * 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.
+ *****************************************************************************/
+
+#ifndef QVLC_VARIABLES_H_
+#define QVLC_VARIABLES_H_ 1
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "qt4.hpp"
+
+#include <QObject>
+#include <vlc_common.h>
+
+class QVLCVariable : public QObject
+{
+    Q_OBJECT
+private:
+    static int callback (vlc_object_t *, const char *,
+                         vlc_value_t, vlc_value_t, void *);
+    vlc_object_t *object;
+    QString name;
+    virtual void trigger (vlc_value_t, vlc_value_t) = 0;
+
+public:
+    QVLCVariable (vlc_object_t *, const char *, int, bool);
+    virtual ~QVLCVariable (void);
+};
+
+class QVLCPointer : public QVLCVariable
+{
+    Q_OBJECT
+private:
+    void trigger (vlc_value_t, vlc_value_t) Q_DECL_OVERRIDE;
+
+public:
+    QVLCPointer (vlc_object_t *, const char *, bool inherit = false);
+    bool addCallback (QObject *, const char *,
+                      Qt::ConnectionType type = Qt::AutoConnection);
+
+signals:
+    void pointerChanged (void *);
+};
+
+class QVLCInteger : public QVLCVariable
+{
+    Q_OBJECT
+private:
+    void trigger (vlc_value_t, vlc_value_t) Q_DECL_OVERRIDE;
+
+public:
+    QVLCInteger (vlc_object_t *, const char *, bool inherit = false);
+    bool addCallback (QObject *, const char *,
+                      Qt::ConnectionType type = Qt::AutoConnection);
+
+signals:
+    void integerChanged (qlonglong);
+};
+
+class QVLCBool : public QVLCVariable
+{
+    Q_OBJECT
+private:
+   void trigger (vlc_value_t, vlc_value_t) Q_DECL_OVERRIDE;
+
+public:
+    QVLCBool (vlc_object_t *, const char *, bool inherit = false);
+    bool addCallback (QObject *, const char *,
+                      Qt::ConnectionType type = Qt::AutoConnection);
+
+signals:
+    void boolChanged (bool);
+};
+
+class QVLCFloat : public QVLCVariable
+{
+    Q_OBJECT
+private:
+    void trigger (vlc_value_t, vlc_value_t) Q_DECL_OVERRIDE;
+
+public:
+    QVLCFloat (vlc_object_t *, const char *, bool inherit = false);
+    bool addCallback (QObject *, const char *,
+                      Qt::ConnectionType type = Qt::AutoConnection);
+
+signals:
+    void floatChanged (float);
+};
+
+class QVLCString : public QVLCVariable
+{
+    Q_OBJECT
+private:
+    void trigger (vlc_value_t, vlc_value_t) Q_DECL_OVERRIDE;
+
+public:
+    QVLCString (vlc_object_t *, const char *, bool inherit = false);
+    bool addCallback (QObject *, const char *,
+                      Qt::ConnectionType type = Qt::AutoConnection);
+
+signals:
+    void stringChanged (QString);
+};
+#endif
diff --git a/modules/gui/qt/components/complete_preferences.cpp b/modules/gui/qt/components/complete_preferences.cpp
new file mode 100644 (file)
index 0000000..d8620b1
--- /dev/null
@@ -0,0 +1,751 @@
+/*****************************************************************************
+ * complete_preferences.cpp : "Normal preferences"
+ ****************************************************************************
+ * Copyright (C) 2006-2011 the VideoLAN team
+ * $Id$
+ *
+ * Authors: Clément 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.
+ *****************************************************************************/
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <QApplication>
+#include <QLabel>
+#include <QTreeWidget>
+#include <QTreeWidgetItem>
+#include <QVariant>
+#include <QString>
+#include <QFont>
+#include <QGroupBox>
+#include <QScrollArea>
+#include <QVBoxLayout>
+#include <QGridLayout>
+
+#include "components/complete_preferences.hpp"
+#include "components/preferences_widgets.hpp"
+
+#include <vlc_config_cat.h>
+#include <vlc_intf_strings.h>
+#include <vlc_modules.h>
+#include <vlc_plugin.h>
+#include <assert.h>
+
+#define ITEM_HEIGHT 25
+
+/*********************************************************************
+ * The Tree
+ *********************************************************************/
+PrefsTree::PrefsTree( intf_thread_t *_p_intf, QWidget *_parent ) :
+                            QTreeWidget( _parent ), p_intf( _p_intf )
+{
+    b_show_only_loaded = false;
+    /* General Qt options */
+    setAlternatingRowColors( true );
+    setHeaderHidden( true );
+
+    setIconSize( QSize( ITEM_HEIGHT,ITEM_HEIGHT ) );
+    setTextElideMode( Qt::ElideNone );
+
+    setUniformRowHeights( true );
+    CONNECT( this, itemExpanded(QTreeWidgetItem*), this, resizeColumns() );
+
+    /* Nice icons */
+#define BI( a,b) QIcon a##_icon = QIcon( b )
+    BI( audio, ":/prefsmenu/advanced/audio" );
+    BI( video, ":/prefsmenu/advanced/video" );
+    BI( input, ":/prefsmenu/advanced/codec" );
+    BI( sout, ":/prefsmenu/advanced/sout" );
+    BI( advanced, ":/prefsmenu/advanced/extended" );
+    BI( playlist, ":/prefsmenu/advanced/playlist" );
+    BI( interface, ":/prefsmenu/advanced/intf" );
+#undef BI
+
+    /* Build the tree for the main module */
+    module_t *p_module = module_get_main();
+
+    /* Initialisation and get the confsize */
+    PrefsItemData *data = NULL;
+    PrefsItemData *data_sub = NULL;
+    QTreeWidgetItem *current_item = NULL;
+    unsigned confsize;
+    module_config_t *const p_config = module_config_get (p_module, &confsize);
+
+    /* Go through the list of conf */
+    for( size_t i = 0; i < confsize; i++ )
+    {
+        const char *psz_help;
+        QIcon icon;
+
+        /* Work on a new item */
+        module_config_t *p_item = p_config + i;
+
+        switch( p_item->i_type )
+        {
+        /* This is a category */
+        case CONFIG_CATEGORY:
+            if( p_item->value.i == -1 ) break;
+
+            /* PrefsItemData Init */
+            data = new PrefsItemData( this );
+            data->name = qtr( config_CategoryNameGet( p_item->value.i ) );
+            psz_help = config_CategoryHelpGet( p_item->value.i );
+            if( psz_help )
+                data->help = qtr( psz_help );
+            else
+                data->help.clear();
+            data->i_type = PrefsItemData::TYPE_CATEGORY;
+            data->i_object_id = p_item->value.i;
+
+            /* This is a category, put a nice icon */
+            switch( p_item->value.i )
+            {
+#define CI(a,b) case a: icon = b##_icon;break
+            CI( CAT_AUDIO, audio );
+            CI( CAT_VIDEO, video );
+            CI( CAT_INPUT, input );
+            CI( CAT_SOUT, sout );
+            CI( CAT_ADVANCED, advanced );
+            CI( CAT_PLAYLIST, playlist );
+            CI( CAT_INTERFACE, interface );
+            }
+#undef CI
+
+            /* Create a new QTreeItem to display it in the tree at top level */
+            current_item = new QTreeWidgetItem();
+            current_item->setText( 0, data->name );
+            current_item->setIcon( 0 , icon );
+            //current_item->setSizeHint( 0, QSize( -1, ITEM_HEIGHT ) );
+            current_item->setData( 0, Qt::UserRole,
+                                   qVariantFromValue( data ) );
+            addTopLevelItem( current_item );
+            expandItem( current_item );
+            break;
+
+        /* This is a subcategory */
+        case CONFIG_SUBCATEGORY:
+            if( p_item->value.i == -1 ) break;
+
+            /* Special cases: move the main subcategories to the parent cat*/
+            if( data &&
+                ( p_item->value.i == SUBCAT_VIDEO_GENERAL ||
+                  p_item->value.i == SUBCAT_ADVANCED_MISC ||
+                  p_item->value.i == SUBCAT_INPUT_GENERAL ||
+                  p_item->value.i == SUBCAT_INTERFACE_GENERAL ||
+                  p_item->value.i == SUBCAT_SOUT_GENERAL||
+                  p_item->value.i == SUBCAT_PLAYLIST_GENERAL||
+                  p_item->value.i == SUBCAT_AUDIO_GENERAL ) )
+            {
+                /* Data still contains the correct thing */
+                data->i_type = PrefsItemData::TYPE_CATSUBCAT;
+                data->i_subcat_id = p_item->value.i;
+                data->name = qtr( config_CategoryNameGet( p_item->value.i ) );
+                psz_help = config_CategoryHelpGet( p_item->value.i );
+                if( psz_help )
+                    data->help = qtr( psz_help );
+                else
+                    data->help.clear();
+                current_item->setData( 0, Qt::UserRole,
+                                       QVariant::fromValue( data ) );
+                continue;
+            }
+
+            /* Normal Subcategories */
+
+            /* Process the Data */
+            data_sub = new PrefsItemData( this );
+            data_sub->name = qtr( config_CategoryNameGet( p_item->value.i) );
+            psz_help = config_CategoryHelpGet( p_item->value.i );
+            if( psz_help )
+                data_sub->help = qtr( psz_help );
+            else
+                data_sub->help.clear();
+            data_sub->i_type = PrefsItemData::TYPE_SUBCATEGORY;
+            data_sub->i_object_id = p_item->value.i;
+
+            /* Create a new TreeWidget */
+            QTreeWidgetItem *subcat_item = new QTreeWidgetItem();
+            subcat_item->setText( 0, data_sub->name );
+            subcat_item->setData( 0, Qt::UserRole,
+                                  qVariantFromValue( data_sub ) );
+            //subcat_item->setSizeHint( 0, QSize( -1, ITEM_HEIGHT ) );
+
+            /* Add it to the parent */
+            assert( current_item );
+            current_item->addChild( subcat_item );
+            break;
+
+        /* Other items don't need yet a place on the tree */
+        }
+    }
+    module_config_free( p_config );
+
+    size_t count;
+    module_t **p_list = module_list_get( &count );
+    /* Build the tree of plugins */
+    for( size_t i = 0; i < count; i++ )
+    {
+        p_module = p_list[i];
+        // Main module excluded
+        if( module_is_main( p_module) ) continue;
+
+        unsigned  confsize;
+        int i_subcategory = 0, i_category = 0;
+
+        bool b_options = false;
+        module_config_t *const p_config = module_config_get (p_module, &confsize);
+
+        /* Loop through the configurations items */
+        for (size_t i = 0; i < confsize; i++)
+        {
+            const module_config_t *p_item = p_config + i;
+
+            if( p_item->i_type == CONFIG_CATEGORY )
+                i_category = p_item->value.i;
+            else if( p_item->i_type == CONFIG_SUBCATEGORY )
+                i_subcategory = p_item->value.i;
+
+            if( CONFIG_ITEM(p_item->i_type) )
+                b_options = true;
+
+            if( b_options && i_category && i_subcategory )
+                break;
+        }
+        module_config_free (p_config);
+
+        /* Dummy item, please proceed */
+        if( !b_options || i_category == 0 || i_subcategory == 0 ) continue;
+
+
+        // Locate the category item;
+        QTreeWidgetItem *subcat_item = NULL;
+        bool b_found = false;
+
+        for( int i_cat_index = 0 ; i_cat_index < topLevelItemCount();
+                                   i_cat_index++ )
+        {
+            /* Get the treeWidgetItem that correspond to the category */
+            QTreeWidgetItem *cat_item = topLevelItem( i_cat_index );
+            PrefsItemData *data = cat_item->data( 0, Qt::UserRole ).
+                                             value<PrefsItemData *>();
+
+            /* If we match the good category */
+            if( data->i_object_id == i_category )
+            {
+                for( int i_sc_index = 0; i_sc_index < cat_item->childCount();
+                         i_sc_index++ )
+                {
+                    subcat_item = cat_item->child( i_sc_index );
+                    PrefsItemData *sc_data = subcat_item->data(0, Qt::UserRole).
+                                                value<PrefsItemData *>();
+                    if( sc_data && sc_data->i_object_id == i_subcategory )
+                    {
+                        b_found = true;
+                        break;
+                    }
+                }
+                if( !b_found )
+                {
+                    subcat_item = cat_item;
+                    b_found = true;
+                }
+                break;
+            }
+        }
+        if( !b_found ) continue;
+
+        PrefsItemData *module_data = new PrefsItemData( this );
+        module_data->i_type = PrefsItemData::TYPE_MODULE;
+        module_data->psz_shortcut = strdup( module_get_object( p_module ) );
+        module_data->name = qtr( module_get_name( p_module, false ) );
+        module_data->help.clear();
+        const char *psz_help = module_get_help( p_module );
+        if ( psz_help )
+            module_data->help = qtr( psz_help );
+
+        QTreeWidgetItem *module_item = new QTreeWidgetItem();
+        module_item->setText( 0, module_data->name );
+        module_item->setData( 0, Qt::UserRole,
+                              QVariant::fromValue( module_data) );
+        //module_item->setSizeHint( 0, QSize( -1, ITEM_HEIGHT ) );
+        subcat_item->addChild( module_item );
+    }
+
+    /* We got everything, just sort a bit */
+    sortItems( 0, Qt::AscendingOrder );
+
+    module_list_free( p_list );
+    resizeColumnToContents( 0 );
+}
+
+void PrefsTree::applyAll()
+{
+    doAll( false );
+}
+
+void PrefsTree::cleanAll()
+{
+    doAll( true );
+}
+
+void PrefsTree::doAll( bool doclean )
+{
+    for( int i_cat_index = 0 ; i_cat_index < topLevelItemCount();
+             i_cat_index++ )
+    {
+        QTreeWidgetItem *cat_item = topLevelItem( i_cat_index );
+        for( int i_sc_index = 0; i_sc_index < cat_item->childCount();
+                 i_sc_index++ )
+        {
+            QTreeWidgetItem *sc_item = cat_item->child( i_sc_index );
+            for( int i_module = 0 ; i_module < sc_item->childCount();
+                     i_module++ )
+            {
+                PrefsItemData *data = sc_item->child( i_module )->
+                               data( 0, Qt::UserRole).value<PrefsItemData *>();
+                if( data->panel && doclean )
+                {
+                    delete data->panel;
+                    data->panel = NULL;
+                }
+                else if( data->panel )
+                    data->panel->apply();
+            }
+            PrefsItemData *data = sc_item->data( 0, Qt::UserRole).
+                                            value<PrefsItemData *>();
+            if( data->panel && doclean )
+            {
+                delete data->panel;
+                data->panel = NULL;
+            }
+            else if( data->panel )
+                data->panel->apply();
+        }
+        PrefsItemData *data = cat_item->data( 0, Qt::UserRole).
+                                            value<PrefsItemData *>();
+        if( data->panel && doclean )
+        {
+            delete data->panel;
+            data->panel = NULL;
+        }
+        else if( data->panel )
+            data->panel->apply();
+    }
+}
+
+/* apply filter on tree item and recursively on its sub items
+ * returns whether the item was filtered */
+bool PrefsTree::filterItems( QTreeWidgetItem *item, const QString &text,
+                           Qt::CaseSensitivity cs )
+{
+    bool sub_filtered = true;
+
+    for( int i = 0; i < item->childCount(); i++ )
+    {
+        QTreeWidgetItem *sub_item = item->child( i );
+        if ( !filterItems( sub_item, text, cs ) )
+        {
+            /* not all the sub items were filtered */
+            sub_filtered = false;
+        }
+    }
+
+    PrefsItemData *data = item->data( 0, Qt::UserRole ).value<PrefsItemData *>();
+
+    bool filtered = sub_filtered && !data->contains( text, cs );
+    if ( b_show_only_loaded && sub_filtered && !data->b_loaded )
+        filtered = true;
+    item->setExpanded( !sub_filtered );
+    item->setHidden( filtered );
+
+    return filtered;
+}
+
+
+/* collapse item if it's not selected or one of its sub items
+ * returns whether the item was collapsed */
+bool PrefsTree::collapseUnselectedItems( QTreeWidgetItem *item )
+{
+    bool sub_collapsed = true;
+
+    for( int i = 0; i < item->childCount(); i++ )
+    {
+        QTreeWidgetItem *sub_item = item->child( i );
+        if ( !collapseUnselectedItems( sub_item ) )
+        {
+            /* not all the sub items were collapsed */
+            sub_collapsed = false;
+        }
+    }
+
+    bool collapsed = sub_collapsed && !item->isSelected();
+    item->setExpanded( !sub_collapsed );
+    item->setHidden( false );
+
+    return collapsed;
+}
+
+static void populateLoadedSet( QSet<QString> *loaded, vlc_object_t *p_node )
+{
+    Q_ASSERT( loaded );
+    char *name = vlc_object_get_name( p_node );
+    if ( !EMPTY_STR( name ) ) loaded->insert( QString( name ) );
+    free( name );
+
+    vlc_list_t *l = vlc_list_children( p_node );
+    for( int i=0; i < l->i_count; i++ )
+        populateLoadedSet( loaded, (vlc_object_t *)l->p_values[i].p_address );
+    vlc_list_release( l );
+}
+
+/* Updates the PrefsItemData loaded status to reflect currently
+ * running modules */
+void PrefsTree::updateLoadedStatus( QTreeWidgetItem *item = NULL,
+                                    QSet<QString> *loaded = NULL )
+{
+    bool b_release = false;
+
+    if( loaded == NULL )
+    {
+        vlc_object_t *p_root = VLC_OBJECT( p_intf->p_libvlc );
+        loaded = new QSet<QString>();
+        populateLoadedSet( loaded, p_root );
+        b_release = true;
+    }
+
+    if ( item == NULL )
+    {
+        for( int i = 0 ; i < topLevelItemCount(); i++ )
+            updateLoadedStatus( topLevelItem( i ), loaded );
+    }
+    else
+    {
+        PrefsItemData *data = item->data( 0, Qt::UserRole )
+                .value<PrefsItemData *>();
+        data->b_loaded = loaded->contains( QString( data->psz_shortcut ) );
+
+        for( int i = 0; i < item->childCount(); i++ )
+            updateLoadedStatus( item->child( i ), loaded );
+    }
+
+    if ( b_release )
+        delete loaded;
+}
+
+/* apply filter on tree */
+void PrefsTree::filter( const QString &text )
+{
+    bool clear_filter = text.isEmpty() && ! b_show_only_loaded;
+
+    updateLoadedStatus();
+
+    for( int i = 0 ; i < topLevelItemCount(); i++ )
+    {
+        QTreeWidgetItem *cat_item = topLevelItem( i );
+        if ( clear_filter )
+        {
+            collapseUnselectedItems( cat_item );
+        }
+        else
+        {
+            filterItems( cat_item, text, Qt::CaseInsensitive );
+        }
+    }
+}
+
+void PrefsTree::setLoadedOnly( bool b_only )
+{
+    b_show_only_loaded = b_only;
+    filter( "" );
+}
+
+void PrefsTree::resizeColumns()
+{
+    resizeColumnToContents( 0 );
+}
+
+PrefsItemData::PrefsItemData( QObject *_parent ) : QObject( _parent )
+{
+    panel = NULL;
+    i_object_id = 0;
+    i_subcat_id = -1;
+    psz_shortcut = NULL;
+    b_loaded = false;
+}
+
+/* go over the module config items and search text in psz_text
+ * also search the module name and head */
+bool PrefsItemData::contains( const QString &text, Qt::CaseSensitivity cs )
+{
+    /* Find our module */
+    module_t *p_module = NULL;
+    if( this->i_type == TYPE_CATEGORY )
+        return false;
+    else if( this->i_type == TYPE_MODULE )
+        p_module = module_find( this->psz_shortcut );
+    else
+    {
+        p_module = module_get_main();
+        assert( p_module );
+    }
+
+    unsigned confsize;
+    module_config_t *const p_config = module_config_get (p_module, &confsize),
+                    *p_item = p_config,
+                    *p_end = p_config + confsize;
+
+    if( this->i_type == TYPE_SUBCATEGORY || this->i_type ==  TYPE_CATSUBCAT )
+    {
+        while ( p_item < p_end )
+        {
+            if( p_item->i_type == CONFIG_SUBCATEGORY &&
+                (
+                    ( this->i_type == TYPE_SUBCATEGORY &&
+                              p_item->value.i == this->i_object_id )
+                    ||
+                    ( this->i_type == TYPE_CATSUBCAT &&
+                              p_item->value.i == this->i_subcat_id )
+                )
+              )
+                break;
+            p_item++;
+        }
+    }
+
+    QString head;
+
+    if( this->i_type == TYPE_SUBCATEGORY || this->i_type ==  TYPE_CATSUBCAT )
+    {
+        head.clear();
+        p_item++; // Why that ? +1
+    }
+    else
+    {
+        head = QString( qtr( module_GetLongName( p_module ) ) );
+    }
+
+    if (name.contains( text, cs ) || head.contains( text, cs ) || help.contains( text, cs ))
+    {
+        module_config_free( p_config );
+        return true;
+    }
+
+    if( p_item ) do
+    {
+        if (
+            (
+                ( this->i_type == TYPE_SUBCATEGORY && p_item->value.i != this->i_object_id )
+                ||
+                ( this->i_type == TYPE_CATSUBCAT && p_item->value.i != this->i_subcat_id )
+            ) &&
+            ( p_item->i_type == CONFIG_CATEGORY || p_item->i_type == CONFIG_SUBCATEGORY )
+           ) break;
+
+        if( p_item->b_internal ) continue;
+
+        if ( p_item->psz_text && qtr( p_item->psz_text ).contains( text, cs ) )
+        {
+            module_config_free( p_config );
+            return true;
+        }
+    }
+    while (
+            !(
+                ( this->i_type == TYPE_SUBCATEGORY || this->i_type == TYPE_CATSUBCAT )
+                &&
+                ( p_item->i_type == CONFIG_CATEGORY || p_item->i_type == CONFIG_SUBCATEGORY )
+             )
+             && ( ++p_item < p_end )
+          );
+
+    module_config_free( p_config );
+    return false;
+}
+
+/*********************************************************************
+ * The Panel
+ *********************************************************************/
+AdvPrefsPanel::AdvPrefsPanel( QWidget *_parent ) : QWidget( _parent )
+{
+    p_config = NULL;
+}
+
+AdvPrefsPanel::AdvPrefsPanel( intf_thread_t *_p_intf, QWidget *_parent,
+                        PrefsItemData * data ) :
+                        QWidget( _parent ), p_intf( _p_intf )
+{
+    /* Find our module */
+    module_t *p_module = NULL;
+    p_config = NULL;
+    if( data->i_type == PrefsItemData::TYPE_CATEGORY )
+        return;
+    else if( data->i_type == PrefsItemData::TYPE_MODULE )
+        p_module = module_find( data->psz_shortcut );
+    else
+    {
+        p_module = module_get_main();
+        assert( p_module );
+    }
+
+    unsigned confsize;
+    p_config = module_config_get( p_module, &confsize );
+    module_config_t *p_item = p_config,
+                    *p_end = p_config + confsize;
+
+    if( data->i_type == PrefsItemData::TYPE_SUBCATEGORY ||
+        data->i_type == PrefsItemData::TYPE_CATSUBCAT )
+    {
+        while (p_item < p_end)
+        {
+            if(  p_item->i_type == CONFIG_SUBCATEGORY &&
+                 ( ( data->i_type == PrefsItemData::TYPE_SUBCATEGORY &&
+                     p_item->value.i == data->i_object_id ) ||
+                   ( data->i_type == PrefsItemData::TYPE_CATSUBCAT &&
+                     p_item->value.i == data->i_subcat_id ) ) )
+                break;
+            p_item++;
+        }
+    }
+
+    /* Widgets now */
+    global_layout = new QVBoxLayout();
+    global_layout->setMargin( 2 );
+    QString head;
+    QString help;
+
+    help = QString( data->help );
+
+    if( data->i_type == PrefsItemData::TYPE_SUBCATEGORY ||
+        data->i_type == PrefsItemData::TYPE_CATSUBCAT )
+    {
+        head = QString( data->name );
+        p_item++; // Why that ?
+    }
+    else
+    {
+        head = QString( qtr( module_GetLongName( p_module ) ) );
+    }
+
+    QLabel *titleLabel = new QLabel( head );
+    QFont titleFont = QApplication::font();
+    titleFont.setPointSize( titleFont.pointSize() + 6 );
+    titleLabel->setFont( titleFont );
+
+    // Title <hr>
+    QFrame *title_line = new QFrame;
+    title_line->setFrameShape(QFrame::HLine);
+    title_line->setFrameShadow(QFrame::Sunken);
+
+    QLabel *helpLabel = new QLabel( help, this );
+    helpLabel->setWordWrap( true );
+
+    global_layout->addWidget( titleLabel );
+    global_layout->addWidget( title_line );
+    global_layout->addWidget( helpLabel );
+
+    QGroupBox *box = NULL;
+    QGridLayout *boxlayout = NULL;
+
+    QScrollArea *scroller= new QScrollArea;
+    scroller->setFrameStyle( QFrame::NoFrame );
+    QWidget *scrolled_area = new QWidget;
+
+    QGridLayout *layout = new QGridLayout();
+    int i_line = 0, i_boxline = 0;
+    bool has_hotkey = false;
+
+    if( p_item ) do
+    {
+        if( ( ( data->i_type == PrefsItemData::TYPE_SUBCATEGORY &&
+                p_item->value.i != data->i_object_id ) ||
+              ( data->i_type == PrefsItemData::TYPE_CATSUBCAT  &&
+                p_item->value.i != data->i_subcat_id ) ) &&
+            ( p_item->i_type == CONFIG_CATEGORY ||
+              p_item->i_type == CONFIG_SUBCATEGORY ) )
+            break;
+        if( p_item->b_internal ) continue;
+
+        if( p_item->i_type == CONFIG_SECTION )
+        {
+            if( box )
+            {
+                box->setLayout( boxlayout );
+                box->show();
+                layout->addWidget( box, i_line, 0, 1, -1 );
+                i_line++;
+            }
+            box = new QGroupBox( qtr( p_item->psz_text ), this );
+            box->hide();
+            boxlayout = new QGridLayout();
+        }
+        /* Only one hotkey control */
+        if( p_item->i_type == CONFIG_ITEM_KEY )
+        {
+            if( has_hotkey )
+                continue;
+            has_hotkey = true;
+        }
+
+        ConfigControl *control;
+        if( ! box )
+            control = ConfigControl::createControl( VLC_OBJECT( p_intf ),
+                                        p_item, this, layout, i_line );
+        else
+            control = ConfigControl::createControl( VLC_OBJECT( p_intf ),
+                                    p_item, this, boxlayout, i_boxline );
+        if( !control )
+            continue;
+
+        if( box ) i_boxline++;
+        else i_line++;
+        controls.append( control );
+    }
+    while( !( ( data->i_type == PrefsItemData::TYPE_SUBCATEGORY ||
+               data->i_type == PrefsItemData::TYPE_CATSUBCAT ) &&
+             ( p_item->i_type == CONFIG_CATEGORY ||
+               p_item->i_type == CONFIG_SUBCATEGORY ) )
+        && ( ++p_item < p_end ) );
+
+    if( box && i_boxline > 0 )
+    {
+        box->setLayout( boxlayout );
+        box->show();
+        layout->addWidget( box, i_line, 0, 1, -1 );
+    }
+
+    scrolled_area->setSizePolicy( QSizePolicy::Preferred,QSizePolicy::Fixed );
+    scrolled_area->setLayout( layout );
+    scroller->setWidget( scrolled_area );
+    scroller->setWidgetResizable( true );
+    global_layout->addWidget( scroller );
+    setLayout( global_layout );
+}
+
+void AdvPrefsPanel::apply()
+{
+    foreach ( ConfigControl *cfg, controls )
+        cfg->doApply();
+}
+
+void AdvPrefsPanel::clean()
+{}
+
+AdvPrefsPanel::~AdvPrefsPanel()
+{
+    qDeleteAll( controls ); controls.clear();
+    module_config_free( p_config );
+}
diff --git a/modules/gui/qt/components/complete_preferences.hpp b/modules/gui/qt/components/complete_preferences.hpp
new file mode 100644 (file)
index 0000000..5c3bfa7
--- /dev/null
@@ -0,0 +1,108 @@
+/*****************************************************************************
+ * complete_preferences.hpp : Tree of modules for preferences
+ ****************************************************************************
+ * Copyright (C) 2006-2007 the VideoLAN team
+ * $Id$
+ *
+ * Authors: Clément 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.
+ *****************************************************************************/
+
+#ifndef VLC_QT_COMPLETE_PREFERENCES_HPP_
+#define VLC_QT_COMPLETE_PREFERENCES_HPP_
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <vlc_common.h>
+#include <vlc_interface.h>
+
+#include <QTreeWidget>
+#include <QSet>
+
+class AdvPrefsPanel;
+class QVBoxLayout;
+
+class PrefsItemData : public QObject
+{
+    Q_OBJECT
+public:
+    PrefsItemData( QObject * );
+    virtual ~PrefsItemData() { free( psz_shortcut ); };
+    bool contains( const QString &text, Qt::CaseSensitivity cs );
+    AdvPrefsPanel *panel;
+    int i_object_id;
+    int i_subcat_id;
+    enum prefsType
+    {
+        TYPE_CATEGORY,
+        TYPE_CATSUBCAT,
+        TYPE_SUBCATEGORY,
+        TYPE_MODULE
+    };
+    prefsType i_type;
+    char *psz_shortcut;
+    bool b_loaded;
+    QString name;
+    QString help;
+};
+
+Q_DECLARE_METATYPE( PrefsItemData* );
+
+class PrefsTree : public QTreeWidget
+{
+    Q_OBJECT
+
+public:
+    PrefsTree( intf_thread_t *, QWidget * );
+
+    void applyAll();
+    void cleanAll();
+    void filter( const QString &text );
+    void setLoadedOnly( bool );
+
+private:
+    void doAll( bool );
+    bool filterItems( QTreeWidgetItem *item, const QString &text, Qt::CaseSensitivity cs );
+    bool collapseUnselectedItems( QTreeWidgetItem *item );
+    void updateLoadedStatus( QTreeWidgetItem *item , QSet<QString> *loaded );
+    intf_thread_t *p_intf;
+    bool b_show_only_loaded;
+
+private slots:
+    void resizeColumns();
+};
+
+class ConfigControl;
+
+class AdvPrefsPanel : public QWidget
+{
+    Q_OBJECT
+public:
+    AdvPrefsPanel( intf_thread_t *, QWidget *, PrefsItemData * );
+    AdvPrefsPanel( QWidget *);
+    virtual ~AdvPrefsPanel();
+    void apply();
+    void clean();
+private:
+    module_config_t *p_config;
+    intf_thread_t *p_intf;
+    QList<ConfigControl *> controls;
+    QVBoxLayout *global_layout;
+};
+
+#endif
diff --git a/modules/gui/qt/components/controller.cpp b/modules/gui/qt/components/controller.cpp
new file mode 100644 (file)
index 0000000..4630140
--- /dev/null
@@ -0,0 +1,1253 @@
+/*****************************************************************************
+ * controller.cpp : Controller for the main interface
+ ****************************************************************************
+ * Copyright (C) 2006-2009 the VideoLAN team
+ * $Id$
+ *
+ * Authors: Jean-Baptiste Kempf <jb@videolan.org>
+ *          Ilkka Ollakka <ileoo@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.
+ *****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <vlc_vout.h>                       /* vout_thread_t for FSC */
+
+/* Widgets */
+#include "components/controller.hpp"
+#include "components/controller_widget.hpp"
+#include "components/interface_widgets.hpp"
+#include "util/buttons/DeckButtonsLayout.hpp"
+#include "util/buttons/BrowseButton.hpp"
+#include "util/buttons/RoundButton.hpp"
+
+#include "dialogs_provider.hpp"                     /* Opening Dialogs */
+#include "actions_manager.hpp"                             /* *_ACTION */
+
+#include "util/input_slider.hpp"                         /* SeekSlider */
+#include "util/customwidgets.hpp"                       /* qEventToKey */
+
+#include "adapters/seekpoints.hpp"
+
+#include <QToolButton>
+#include <QHBoxLayout>
+#include <QRegion>
+#include <QSignalMapper>
+#include <QTimer>
+
+//#define DEBUG_LAYOUT 1
+
+/**********************************************************************
+ * TEH controls
+ **********************************************************************/
+
+/******
+ * This is an abstract Toolbar/Controller
+ * This has helper to create any toolbar, any buttons and to manage the actions
+ *
+ *****/
+AbstractController::AbstractController( intf_thread_t * _p_i, QWidget *_parent )
+                   : QFrame( _parent )
+{
+    p_intf = _p_i;
+    advControls = NULL;
+    buttonGroupLayout = NULL;
+
+    /* Main action provider */
+    toolbarActionsMapper = new QSignalMapper( this );
+    CONNECT( toolbarActionsMapper, mapped( int ),
+             ActionsManager::getInstance( p_intf  ), doAction( int ) );
+    CONNECT( THEMIM->getIM(), playingStatusChanged( int ), this, setStatus( int ) );
+
+    setSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::Fixed );
+}
+
+/* Reemit some signals on status Change to activate some buttons */
+void AbstractController::setStatus( int status )
+{
+    bool b_hasInput = THEMIM->getIM()->hasInput();
+    /* Activate the interface buttons according to the presence of the input */
+    emit inputExists( b_hasInput );
+
+    emit inputPlaying( status == PLAYING_S );
+
+    emit inputIsRecordable( b_hasInput &&
+                            var_GetBool( THEMIM->getInput(), "can-record" ) );
+
+    emit inputIsTrickPlayable( b_hasInput &&
+                            var_GetBool( THEMIM->getInput(), "can-rewind" ) );
+}
+
+/* Generic button setup */
+void AbstractController::setupButton( QAbstractButton *aButton )
+{
+    static QSizePolicy sizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed );
+    sizePolicy.setHorizontalStretch( 0 );
+    sizePolicy.setVerticalStretch( 0 );
+
+    qreal scalingFactorX = static_cast<qreal>(aButton->logicalDpiX()) / DPI_REF_VALUE;
+    qreal scalingFactorY = static_cast<qreal>(aButton->logicalDpiY()) / DPI_REF_VALUE;
+
+    aButton->setSizePolicy( sizePolicy );
+    aButton->setFixedSize( QSize( 26.0*scalingFactorX, 26.0*scalingFactorY ) );
+    aButton->setIconSize( QSize( 20.0*scalingFactorX, 20.0*scalingFactorY ) );
+    aButton->setFocusPolicy( Qt::NoFocus );
+}
+
+/* Open the generic config line for the toolbar, parse it
+ * and create the widgets accordingly */
+void AbstractController::parseAndCreate( const QString& config,
+                                         QBoxLayout *newControlLayout )
+{
+    QStringList list = config.split( ";", QString::SkipEmptyParts ) ;
+    for( int i = 0; i < list.count(); i++ )
+    {
+        QStringList list2 = list.at( i ).split( "-" );
+        if( list2.count() < 1 )
+        {
+            msg_Warn( p_intf, "Parsing error 1. Please, report this." );
+            continue;
+        }
+
+        bool ok;
+        int i_option = WIDGET_NORMAL;
+        buttonType_e i_type = (buttonType_e)list2.at( 0 ).toInt( &ok );
+        if( !ok )
+        {
+            msg_Warn( p_intf, "Parsing error 2. Please, report this." );
+            continue;
+        }
+
+        if( list2.count() > 1 )
+        {
+            i_option = list2.at( 1 ).toInt( &ok );
+            if( !ok )
+            {
+                msg_Warn( p_intf, "Parsing error 3. Please, report this." );
+                continue;
+            }
+        }
+
+        createAndAddWidget( newControlLayout, -1, i_type, i_option );
+    }
+
+    if( buttonGroupLayout )
+    {
+        newControlLayout->addLayout( buttonGroupLayout );
+        buttonGroupLayout = NULL;
+    }
+}
+
+void AbstractController::createAndAddWidget( QBoxLayout *controlLayout_,
+                                             int i_index,
+                                             buttonType_e i_type,
+                                             int i_option )
+{
+    VLC_UNUSED( i_index ); // i_index should only be required for edition
+
+    /* Close the current buttonGroup if we have a special widget or a spacer */
+    if( buttonGroupLayout && i_type > BUTTON_MAX )
+    {
+        controlLayout_->addLayout( buttonGroupLayout );
+        buttonGroupLayout = NULL;
+    }
+
+    qreal scalingFactorX = static_cast<qreal>(logicalDpiX())/DPI_REF_VALUE;
+    /* Special case for SPACERS, who aren't QWidgets */
+    if( i_type == WIDGET_SPACER )
+    {
+        controlLayout_->addSpacing( static_cast<int>(12*scalingFactorX) );
+    }
+    else if(  i_type == WIDGET_SPACER_EXTEND )
+    {
+        controlLayout_->addStretch( static_cast<int>(12*scalingFactorX) );
+    }
+    else
+    {
+        /* Create the widget */
+        QWidget *widg = createWidget( i_type, i_option );
+        if( !widg ) return;
+
+        /* Buttons */
+        if( i_type < BUTTON_MAX )
+        {
+            if( !buttonGroupLayout )
+            {
+                buttonGroupLayout = new QHBoxLayout;
+
+            }
+            buttonGroupLayout->addWidget( widg );
+        }
+        else /* Special widgets */
+        {
+            controlLayout_->addWidget( widg );
+        }
+    }
+}
+
+
+#define CONNECT_MAP( a ) CONNECT( a, clicked(),  toolbarActionsMapper, map() )
+#define SET_MAPPING( a, b ) toolbarActionsMapper->setMapping( a , b )
+#define CONNECT_MAP_SET( a, b ) \
+    CONNECT_MAP( a ); \
+    SET_MAPPING( a, b );
+#define BUTTON_SET_BAR( a_button ) \
+    a_button->setToolTip( qtr( tooltipL[button] ) ); \
+    a_button->setIcon( QIcon( iconL[button] ) );
+#define BUTTON_SET_BAR2( button, image, tooltip ) \
+    button->setToolTip( tooltip );          \
+    button->setIcon( QIcon( ":/"#image ) );
+
+#define ENABLE_ON_VIDEO( a ) \
+    CONNECT( THEMIM->getIM(), voutChanged( bool ), a, setEnabled( bool ) ); \
+    a->setEnabled( THEMIM->getIM()->hasVideo() ); /* TODO: is this necessary? when input is started before the interface? */
+
+#define ENABLE_ON_INPUT( a ) \
+    CONNECT( this, inputExists( bool ), a, setEnabled( bool ) ); \
+    a->setEnabled( THEMIM->getIM()->hasInput() ); /* TODO: is this necessary? when input is started before the interface? */
+
+#define NORMAL_BUTTON( name )                           \
+    QToolButton * name ## Button = new QToolButton;     \
+    setupButton( name ## Button );                      \
+    CONNECT_MAP_SET( name ## Button, name ## _ACTION ); \
+    BUTTON_SET_BAR( name ## Button );                   \
+    widget = name ## Button;
+
+QWidget *AbstractController::createWidget( buttonType_e button, int options )
+{
+    bool b_flat  = options & WIDGET_FLAT;
+    bool b_big   = options & WIDGET_BIG;
+    bool b_shiny = options & WIDGET_SHINY;
+    bool b_special = false;
+
+    QWidget *widget = NULL;
+    switch( button )
+    {
+    case PLAY_BUTTON: {
+        PlayButton *playButton = new PlayButton;
+        setupButton( playButton );
+        BUTTON_SET_BAR(  playButton );
+        CONNECT_MAP_SET( playButton, PLAY_ACTION );
+        CONNECT( this, inputPlaying( bool ),
+                 playButton, updateButtonIcons( bool ));
+        playButton->updateButtonIcons( THEMIM->getIM()->playingStatus() == PLAYING_S );
+        widget = playButton;
+        }
+        break;
+    case STOP_BUTTON:{
+        NORMAL_BUTTON( STOP );
+        }
+        break;
+    case OPEN_BUTTON:{
+        NORMAL_BUTTON( OPEN );
+        }
+        break;
+    case OPEN_SUB_BUTTON:{
+        NORMAL_BUTTON( OPEN_SUB );
+        }
+        break;
+    case PREVIOUS_BUTTON:{
+        NORMAL_BUTTON( PREVIOUS );
+        }
+        break;
+    case NEXT_BUTTON: {
+        NORMAL_BUTTON( NEXT );
+        }
+        break;
+    case SLOWER_BUTTON:{
+        NORMAL_BUTTON( SLOWER );
+        ENABLE_ON_INPUT( SLOWERButton );
+        }
+        break;
+    case FASTER_BUTTON:{
+        NORMAL_BUTTON( FASTER );
+        ENABLE_ON_INPUT( FASTERButton );
+        }
+        break;
+    case PREV_SLOW_BUTTON:{
+        QToolButtonExt *but = new QToolButtonExt;
+        setupButton( but );
+        BUTTON_SET_BAR( but );
+        CONNECT( but, shortClicked(), THEMIM, prev() );
+        CONNECT( but, longClicked(), THEAM, skipBackward() );
+        widget = but;
+        }
+        break;
+    case NEXT_FAST_BUTTON:{
+        QToolButtonExt *but = new QToolButtonExt;
+        setupButton( but );
+        BUTTON_SET_BAR( but );
+        CONNECT( but, shortClicked(), THEMIM, next() );
+        CONNECT( but, longClicked(), THEAM, skipForward() );
+        widget = but;
+        }
+        break;
+    case FRAME_BUTTON: {
+        NORMAL_BUTTON( FRAME );
+        ENABLE_ON_VIDEO( FRAMEButton );
+        }
+        break;
+    case FULLSCREEN_BUTTON:
+    case DEFULLSCREEN_BUTTON:
+        {
+        NORMAL_BUTTON( FULLSCREEN );
+        ENABLE_ON_VIDEO( FULLSCREENButton );
+        }
+        break;
+    case FULLWIDTH_BUTTON: {
+            NORMAL_BUTTON( FULLWIDTH );
+        }
+        break;
+    case EXTENDED_BUTTON:{
+        NORMAL_BUTTON( EXTENDED );
+        }
+        break;
+    case PLAYLIST_BUTTON:{
+        NORMAL_BUTTON( PLAYLIST );
+        }
+        break;
+    case SNAPSHOT_BUTTON:{
+        NORMAL_BUTTON( SNAPSHOT );
+        ENABLE_ON_VIDEO( SNAPSHOTButton );
+        }
+        break;
+    case RECORD_BUTTON:{
+        QToolButton *recordButton = new QToolButton;
+        setupButton( recordButton );
+        CONNECT_MAP_SET( recordButton, RECORD_ACTION );
+        BUTTON_SET_BAR(  recordButton );
+        ENABLE_ON_INPUT( recordButton );
+        recordButton->setCheckable( true );
+        CONNECT( THEMIM->getIM(), recordingStateChanged( bool ),
+                 recordButton, setChecked( bool ) );
+        widget = recordButton;
+        }
+        break;
+    case ATOB_BUTTON: {
+        AtoB_Button *ABButton = new AtoB_Button;
+        setupButton( ABButton );
+        ABButton->setShortcut( qtr("Shift+L") );
+        BUTTON_SET_BAR( ABButton );
+        ENABLE_ON_INPUT( ABButton );
+        CONNECT_MAP_SET( ABButton, ATOB_ACTION );
+        CONNECT( THEMIM->getIM(), AtoBchanged( bool, bool),
+                 ABButton, updateButtonIcons( bool, bool ) );
+        widget = ABButton;
+        }
+        break;
+    case INPUT_SLIDER: {
+        SeekSlider *slider = new SeekSlider( Qt::Horizontal, NULL, !b_shiny );
+        SeekPoints *chapters = new SeekPoints( this, p_intf );
+        CONNECT( THEMIM->getIM(), chapterChanged( bool ), chapters, update() );
+        slider->setChapters( chapters );
+
+        /* Update the position when the IM has changed */
+        CONNECT( THEMIM->getIM(), positionUpdated( float, int64_t, int ),
+                slider, setPosition( float, int64_t, int ) );
+        /* And update the IM, when the position has changed */
+        CONNECT( slider, sliderDragged( float ),
+                 THEMIM->getIM(), sliderUpdate( float ) );
+        CONNECT( THEMIM->getIM(), cachingChanged( float ),
+                 slider, updateBuffering( float ) );
+        /* Give hint to disable slider's interactivity when useless */
+        CONNECT( THEMIM->getIM(), inputCanSeek( bool ),
+                 slider, setSeekable( bool ) );
+        widget = slider;
+        }
+        break;
+    case MENU_BUTTONS:
+        widget = discFrame();
+        widget->hide();
+        break;
+    case TELETEXT_BUTTONS:
+        widget = telexFrame();
+        widget->hide();
+        break;
+    case VOLUME_SPECIAL:
+        b_special = true;
+    case VOLUME:
+        {
+            SoundWidget *snd = new SoundWidget( this, p_intf, b_shiny, b_special );
+            widget = snd;
+        }
+        break;
+    case TIME_LABEL:
+        {
+            TimeLabel *timeLabel = new TimeLabel( p_intf );
+            widget = timeLabel;
+        }
+        break;
+    case SPLITTER:
+        {
+            QFrame *line = new QFrame;
+            line->setFrameShape( QFrame::VLine );
+            line->setFrameShadow( QFrame::Raised );
+            line->setLineWidth( 0 );
+            line->setMidLineWidth( 1 );
+            widget = line;
+        }
+        break;
+    case ADVANCED_CONTROLLER:
+        if( qobject_cast<AdvControlsWidget *>(this) == NULL )
+        {
+            advControls = new AdvControlsWidget( p_intf, this );
+            widget = advControls;
+        }
+        break;
+    case REVERSE_BUTTON:{
+        QToolButton *reverseButton = new QToolButton;
+        setupButton( reverseButton );
+        CONNECT_MAP_SET( reverseButton, REVERSE_ACTION );
+        BUTTON_SET_BAR(  reverseButton );
+        reverseButton->setCheckable( true );
+        /* You should, of COURSE change this to the correct event,
+           when/if we have one, that tells us if trickplay is possible . */
+        CONNECT( this, inputIsTrickPlayable( bool ), reverseButton, setVisible( bool ) );
+        reverseButton->setVisible( false );
+        widget = reverseButton;
+        }
+        break;
+    case SKIP_BACK_BUTTON: {
+        NORMAL_BUTTON( SKIP_BACK );
+        ENABLE_ON_INPUT( SKIP_BACKButton );
+        }
+        break;
+    case SKIP_FW_BUTTON: {
+        NORMAL_BUTTON( SKIP_FW );
+        ENABLE_ON_INPUT( SKIP_FWButton );
+        }
+        break;
+    case QUIT_BUTTON: {
+        NORMAL_BUTTON( QUIT );
+        }
+        break;
+    case RANDOM_BUTTON: {
+        NORMAL_BUTTON( RANDOM );
+        RANDOMButton->setCheckable( true );
+        RANDOMButton->setChecked( var_GetBool( THEPL, "random" ) );
+        CONNECT( THEMIM, randomChanged( bool ),
+                 RANDOMButton, setChecked( bool ) );
+        }
+        break;
+    case LOOP_BUTTON:{
+        LoopButton *loopButton = new LoopButton;
+        setupButton( loopButton );
+        loopButton->setToolTip( qtr( "Click to toggle between loop all, loop one and no loop") );
+        loopButton->setCheckable( true );
+        int i_state = 2 * var_GetBool( THEPL, "loop" ) + var_GetBool( THEPL, "repeat" );
+        loopButton->updateButtonIcons( i_state );
+        CONNECT( THEMIM, repeatLoopChanged( int ), loopButton, updateButtonIcons( int ) );
+        CONNECT( loopButton, clicked(), THEMIM, loopRepeatLoopStatus() );
+        widget = loopButton;
+        }
+        break;
+    case INFO_BUTTON: {
+        NORMAL_BUTTON( INFO );
+        }
+        break;
+    case PLAYBACK_BUTTONS:{
+        widget = new QWidget;
+        DeckButtonsLayout *layout = new DeckButtonsLayout( widget );
+        BrowseButton *prev = new BrowseButton( widget, BrowseButton::Backward );
+        BrowseButton *next = new BrowseButton( widget );
+        RoundButton *play = new RoundButton( widget );
+        layout->setBackwardButton( prev );
+        layout->setForwardButton( next );
+        layout->setRoundButton( play );
+        CONNECT_MAP_SET( prev, PREVIOUS_ACTION );
+        CONNECT_MAP_SET( next, NEXT_ACTION );
+        CONNECT_MAP_SET( play, PLAY_ACTION );
+        }
+        break;
+    case ASPECT_RATIO_COMBOBOX:
+        widget = new AspectRatioComboBox( p_intf );
+        widget->setMinimumHeight( 26 );
+        break;
+    case SPEED_LABEL:
+        widget = new SpeedLabel( p_intf, this );
+        break;
+    case TIME_LABEL_ELAPSED:
+        widget = new TimeLabel( p_intf, TimeLabel::Elapsed );
+        break;
+    case TIME_LABEL_REMAINING:
+        widget = new TimeLabel( p_intf, TimeLabel::Remaining );
+        break;
+    default:
+        msg_Warn( p_intf, "This should not happen %i", button );
+        break;
+    }
+
+    /* Customize Buttons */
+    if( b_flat || b_big )
+    {
+        QFrame *frame = qobject_cast<QFrame *>(widget);
+        if( frame )
+        {
+            QList<QToolButton *> allTButtons = frame->findChildren<QToolButton *>();
+            for( int i = 0; i < allTButtons.count(); i++ )
+                applyAttributes( allTButtons[i], b_flat, b_big );
+        }
+        else
+        {
+            QToolButton *tmpButton = qobject_cast<QToolButton *>(widget);
+            if( tmpButton )
+                applyAttributes( tmpButton, b_flat, b_big );
+        }
+    }
+    return widget;
+}
+#undef NORMAL_BUTTON
+
+void AbstractController::applyAttributes( QToolButton *tmpButton, bool b_flat, bool b_big )
+{
+    if( tmpButton )
+    {
+        if( b_flat )
+            tmpButton->setAutoRaise( b_flat );
+        if( b_big )
+        {
+
+            qreal scalingFactorX = static_cast<qreal>(tmpButton->logicalDpiX()) / DPI_REF_VALUE;
+            qreal scalingFactorY = static_cast<qreal>(tmpButton->logicalDpiY()) / DPI_REF_VALUE;
+
+            tmpButton->setFixedSize( QSize( 32.0*scalingFactorX, 32.0*scalingFactorY ) );
+            tmpButton->setIconSize( QSize( 26.0*scalingFactorX, 26.0*scalingFactorY ) );
+        }
+    }
+}
+
+QFrame *AbstractController::discFrame()
+{
+    /** Disc and Menus handling */
+    QFrame *discFrame = new QFrame( this );
+
+    QHBoxLayout *discLayout = new QHBoxLayout( discFrame );
+    discLayout->setSpacing( 0 ); discLayout->setMargin( 0 );
+
+    QToolButton *prevSectionButton = new QToolButton( discFrame );
+    setupButton( prevSectionButton );
+    BUTTON_SET_BAR2( prevSectionButton, toolbar/dvd_prev,
+            qtr("Previous Chapter/Title" ) );
+    discLayout->addWidget( prevSectionButton );
+
+    QToolButton *menuButton = new QToolButton( discFrame );
+    setupButton( menuButton );
+    discLayout->addWidget( menuButton );
+    BUTTON_SET_BAR2( menuButton, toolbar/dvd_menu, qtr( "Menu" ) );
+
+    QToolButton *nextSectionButton = new QToolButton( discFrame );
+    setupButton( nextSectionButton );
+    discLayout->addWidget( nextSectionButton );
+    BUTTON_SET_BAR2( nextSectionButton, toolbar/dvd_next,
+            qtr("Next Chapter/Title" ) );
+
+    /* Change the navigation button display when the IM
+       navigation changes */
+    CONNECT( THEMIM->getIM(), chapterChanged( bool ),
+            discFrame, setVisible( bool ) );
+    CONNECT( THEMIM->getIM(), titleChanged( bool ),
+            menuButton, setVisible( bool ) );
+    /* Changes the IM navigation when triggered on the nav buttons */
+    CONNECT( prevSectionButton, clicked(), THEMIM->getIM(),
+            sectionPrev() );
+    CONNECT( nextSectionButton, clicked(), THEMIM->getIM(),
+            sectionNext() );
+    CONNECT( menuButton, clicked(), THEMIM->getIM(),
+            sectionMenu() );
+
+    return discFrame;
+}
+
+QFrame *AbstractController::telexFrame()
+{
+    /**
+     * Telextext QFrame
+     **/
+    QFrame *telexFrame = new QFrame( this );
+    QHBoxLayout *telexLayout = new QHBoxLayout( telexFrame );
+    telexLayout->setSpacing( 0 ); telexLayout->setMargin( 0 );
+    CONNECT( THEMIM->getIM(), teletextPossible( bool ),
+             telexFrame, setVisible( bool ) );
+
+    /* On/Off button */
+    QToolButton *telexOn = new QToolButton;
+    setupButton( telexOn );
+    BUTTON_SET_BAR2( telexOn, toolbar/tv, qtr( "Teletext Activation" ) );
+    telexOn->setEnabled( false );
+    telexOn->setCheckable( true );
+
+    telexLayout->addWidget( telexOn );
+
+    /* Teletext Activation and set */
+    CONNECT( telexOn, clicked( bool ),
+             THEMIM->getIM(), activateTeletext( bool ) );
+    CONNECT( THEMIM->getIM(), teletextPossible( bool ),
+             telexOn, setEnabled( bool ) );
+
+    /* Transparency button */
+    QToolButton *telexTransparent = new QToolButton;
+    setupButton( telexTransparent );
+    BUTTON_SET_BAR2( telexTransparent, toolbar/tvtelx,
+                     qtr( "Toggle Transparency " ) );
+    telexTransparent->setEnabled( false );
+    telexTransparent->setCheckable( true );
+    telexLayout->addWidget( telexTransparent );
+
+    /* Transparency change and set */
+    CONNECT( telexTransparent, clicked( bool ),
+            THEMIM->getIM(), telexSetTransparency( bool ) );
+    CONNECT( THEMIM->getIM(), teletextTransparencyActivated( bool ),
+             telexTransparent, setChecked( bool ) );
+
+
+    /* Page setting */
+    QSpinBox *telexPage = new QSpinBox( telexFrame );
+    telexPage->setRange( 100, 899 );
+    telexPage->setValue( 100 );
+    telexPage->setAccelerated( true );
+    telexPage->setWrapping( true );
+    telexPage->setAlignment( Qt::AlignRight );
+    telexPage->setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Minimum );
+    telexPage->setEnabled( false );
+    telexLayout->addWidget( telexPage );
+
+    /* Contextual & Index Buttons */
+    QSignalMapper *contextButtonMapper = new QSignalMapper( this );
+    QToolButton *contextButton = NULL;
+    int i_iconminsize = __MAX( 16, telexOn->minimumHeight() );
+    QPixmap iconPixmap( i_iconminsize, i_iconminsize );
+    iconPixmap.fill( Qt::transparent );
+    QPainter iconPixmapPainter( &iconPixmap );
+    QLinearGradient iconPixmapPainterGradient( iconPixmap.rect().center() / 2,
+                                               iconPixmap.rect().center() );
+
+#define CREATE_CONTEXT_BUTTON(color, key) \
+    iconPixmapPainterGradient.setColorAt( 0, QColor( color ).lighter(150) );\
+    iconPixmapPainterGradient.setColorAt( 1.0, QColor( color ) );\
+    iconPixmapPainter.setBrush( iconPixmapPainterGradient );\
+    iconPixmapPainter.drawEllipse( iconPixmap.rect().adjusted( 4, 4, -5, -5 ) );\
+    contextButton = new QToolButton();\
+    setupButton( contextButton );\
+    contextButton->setIcon( iconPixmap );\
+    contextButton->setEnabled( false );\
+    contextButtonMapper->setMapping( contextButton, key << 16 );\
+    CONNECT( contextButton, clicked(), contextButtonMapper, map() );\
+    CONNECT( contextButtonMapper, mapped( int ),\
+             THEMIM->getIM(), telexSetPage( int ) );\
+    CONNECT( THEMIM->getIM(), teletextActivated( bool ), contextButton, setEnabled( bool ) );\
+    telexLayout->addWidget( contextButton )
+
+    CREATE_CONTEXT_BUTTON("grey", 'i'); /* index */
+    CREATE_CONTEXT_BUTTON("red", 'r');
+    CREATE_CONTEXT_BUTTON("green", 'g');
+    CREATE_CONTEXT_BUTTON("yellow", 'y');
+    CREATE_CONTEXT_BUTTON("blue", 'b');
+
+#undef CREATE_CONTEXT_BUTTON
+
+    /* Page change and set */
+    CONNECT( telexPage, valueChanged( int ),
+            THEMIM->getIM(), telexSetPage( int ) );
+    CONNECT( THEMIM->getIM(), newTelexPageSet( int ),
+            telexPage, setValue( int ) );
+
+    CONNECT( THEMIM->getIM(), teletextActivated( bool ), telexPage, setEnabled( bool ) );
+    CONNECT( THEMIM->getIM(), teletextActivated( bool ), telexTransparent, setEnabled( bool ) );
+    CONNECT( THEMIM->getIM(), teletextActivated( bool ), telexOn, setChecked( bool ) );
+    return telexFrame;
+}
+#undef CONNECT_MAP
+#undef SET_MAPPING
+#undef CONNECT_MAP_SET
+#undef BUTTON_SET_BAR
+#undef BUTTON_SET_BAR2
+#undef ENABLE_ON_VIDEO
+#undef ENABLE_ON_INPUT
+
+#include <QHBoxLayout>
+/*****************************
+ * DA Control Widget !
+ *****************************/
+ControlsWidget::ControlsWidget( intf_thread_t *_p_i,
+                                bool b_advControls,
+                                QWidget *_parent ) :
+                                AbstractController( _p_i, _parent )
+{
+    RTL_UNAFFECTED_WIDGET
+    /* advanced Controls handling */
+    b_advancedVisible = b_advControls;
+#ifdef DEBUG_LAYOUT
+    setStyleSheet( "background: red ");
+#endif
+    setAttribute( Qt::WA_MacBrushedMetal);
+    controlLayout = new QVBoxLayout( this );
+    controlLayout->setContentsMargins( 3, 1, 0, 1 );
+    controlLayout->setSpacing( 0 );
+    QHBoxLayout *controlLayout1 = new QHBoxLayout;
+    controlLayout1->setSpacing( 0 ); controlLayout1->setMargin( 0 );
+
+    QString line1 = getSettings()->value( "MainWindow/MainToolbar1", MAIN_TB1_DEFAULT )
+                                        .toString();
+    parseAndCreate( line1, controlLayout1 );
+
+    QHBoxLayout *controlLayout2 = new QHBoxLayout;
+    controlLayout2->setSpacing( 0 ); controlLayout2->setMargin( 0 );
+    QString line2 = getSettings()->value( "MainWindow/MainToolbar2", MAIN_TB2_DEFAULT )
+                                        .toString();
+    parseAndCreate( line2, controlLayout2 );
+
+    grip = new QSizeGrip( this );
+    controlLayout2->addWidget( grip, 0, Qt::AlignBottom|Qt::AlignRight );
+
+    if( !b_advancedVisible && advControls ) advControls->hide();
+
+    controlLayout->addLayout( controlLayout1 );
+    controlLayout->addLayout( controlLayout2 );
+}
+
+void ControlsWidget::toggleAdvanced()
+{
+    if( !advControls ) return;
+
+    advControls->setVisible( !b_advancedVisible );
+    b_advancedVisible = !b_advancedVisible;
+    emit advancedControlsToggled( b_advancedVisible );
+}
+
+AdvControlsWidget::AdvControlsWidget( intf_thread_t *_p_i, QWidget *_parent ) :
+                                     AbstractController( _p_i, _parent )
+{
+    RTL_UNAFFECTED_WIDGET
+    controlLayout = new QHBoxLayout( this );
+    controlLayout->setMargin( 0 );
+    controlLayout->setSpacing( 0 );
+#ifdef DEBUG_LAYOUT
+    setStyleSheet( "background: orange ");
+#endif
+
+
+    QString line = getSettings()->value( "MainWindow/AdvToolbar", ADV_TB_DEFAULT )
+        .toString();
+    parseAndCreate( line, controlLayout );
+}
+
+InputControlsWidget::InputControlsWidget( intf_thread_t *_p_i, QWidget *_parent ) :
+                                     AbstractController( _p_i, _parent )
+{
+    RTL_UNAFFECTED_WIDGET
+    controlLayout = new QHBoxLayout( this );
+    controlLayout->setMargin( 0 );
+    controlLayout->setSpacing( 0 );
+#ifdef DEBUG_LAYOUT
+    setStyleSheet( "background: green ");
+#endif
+
+    QString line = getSettings()->value( "MainWindow/InputToolbar", INPT_TB_DEFAULT ).toString();
+    parseAndCreate( line, controlLayout );
+}
+/**********************************************************************
+ * Fullscrenn control widget
+ **********************************************************************/
+FullscreenControllerWidget::FullscreenControllerWidget( intf_thread_t *_p_i, QWidget *_parent )
+                           : AbstractController( _p_i, _parent )
+{
+    RTL_UNAFFECTED_WIDGET
+    i_mouse_last_x      = -1;
+    i_mouse_last_y      = -1;
+    b_mouse_over        = false;
+    i_mouse_last_move_x = -1;
+    i_mouse_last_move_y = -1;
+#if HAVE_TRANSPARENCY
+    b_slow_hide_begin   = false;
+    i_slow_hide_timeout = 1;
+#endif
+    b_fullscreen        = false;
+    i_hide_timeout      = 1;
+    i_screennumber      = -1;
+
+    vout.clear();
+
+    setWindowFlags( Qt::ToolTip );
+    setMinimumWidth( FSC_WIDTH );
+    isWideFSC = false;
+
+    setFrameShape( QFrame::StyledPanel );
+    setFrameStyle( QFrame::Sunken );
+    setSizePolicy( QSizePolicy::Minimum, QSizePolicy::Minimum );
+
+    QVBoxLayout *controlLayout2 = new QVBoxLayout( this );
+    controlLayout2->setContentsMargins( 4, 6, 4, 2 );
+
+    /* First line */
+    InputControlsWidget *inputC = new InputControlsWidget( p_intf, this );
+    controlLayout2->addWidget( inputC );
+
+    controlLayout = new QHBoxLayout;
+    QString line = getSettings()->value( "MainWindow/FSCtoolbar", FSC_TB_DEFAULT ).toString();
+    parseAndCreate( line, controlLayout );
+    controlLayout2->addLayout( controlLayout );
+
+    /* hiding timer */
+    p_hideTimer = new QTimer( this );
+    p_hideTimer->setSingleShot( true );
+    CONNECT( p_hideTimer, timeout(), this, hideFSC() );
+
+    /* slow hiding timer */
+#if HAVE_TRANSPARENCY
+    p_slowHideTimer = new QTimer( this );
+    CONNECT( p_slowHideTimer, timeout(), this, slowHideFSC() );
+    f_opacity = var_InheritFloat( p_intf, "qt-fs-opacity" );
+#endif
+
+    i_sensitivity = var_InheritInteger( p_intf, "qt-fs-sensitivity" );
+
+    vlc_mutex_init_recursive( &lock );
+
+    DCONNECT( THEMIM->getIM(), voutListChanged( vout_thread_t **, int ),
+              this, setVoutList( vout_thread_t **, int ) );
+
+    /* First Move */
+    previousPosition = getSettings()->value( "FullScreen/pos" ).toPoint();
+    screenRes = getSettings()->value( "FullScreen/screen" ).toRect();
+    isWideFSC = getSettings()->value( "FullScreen/wide" ).toBool();
+    i_screennumber = var_InheritInteger( p_intf, "qt-fullscreen-screennumber" );
+}
+
+FullscreenControllerWidget::~FullscreenControllerWidget()
+{
+    getSettings()->setValue( "FullScreen/pos", previousPosition );
+    getSettings()->setValue( "FullScreen/screen", screenRes );
+    getSettings()->setValue( "FullScreen/wide", isWideFSC );
+
+    setVoutList( NULL, 0 );
+    vlc_mutex_destroy( &lock );
+}
+
+void FullscreenControllerWidget::restoreFSC()
+{
+    if( !isWideFSC )
+    {
+        /* Restore half-bar and re-centre if needed */
+        setMinimumWidth( FSC_WIDTH );
+        adjustSize();
+
+        QRect currentRes = QApplication::desktop()->screenGeometry( targetScreen() );
+
+        if( currentRes == screenRes &&
+            QApplication::desktop()->screen()->geometry().contains( previousPosition, true ) )
+        {
+            /* Restore to the last known position */
+            move( previousPosition );
+        }
+        else
+        {
+            /* FSC is out of screen or screen resolution changed */
+            msg_Dbg( p_intf, "Recentering the Fullscreen Controller" );
+            centerFSC( targetScreen() );
+            screenRes = currentRes;
+            previousPosition = pos();
+        }
+    }
+    else
+    {
+        /* Dock at the bottom of the screen */
+        updateFullwidthGeometry( targetScreen() );
+    }
+}
+
+void FullscreenControllerWidget::centerFSC( int number )
+{
+    QRect currentRes = QApplication::desktop()->screenGeometry( number );
+
+    /* screen has changed, calculate new position */
+    QPoint pos = QPoint( currentRes.x() + (currentRes.width() / 2) - (width() / 2),
+            currentRes.y() + currentRes.height() - height());
+    move( pos );
+}
+
+/**
+ * Show fullscreen controller
+ */
+void FullscreenControllerWidget::showFSC()
+{
+    restoreFSC();
+
+#if HAVE_TRANSPARENCY
+    setWindowOpacity( f_opacity );
+#endif
+
+    show();
+}
+
+/**
+ * Plane to hide fullscreen controller
+ */
+void FullscreenControllerWidget::planHideFSC()
+{
+    vlc_mutex_lock( &lock );
+    int i_timeout = i_hide_timeout;
+    vlc_mutex_unlock( &lock );
+
+    p_hideTimer->start( i_timeout );
+
+#if HAVE_TRANSPARENCY
+    b_slow_hide_begin = true;
+    i_slow_hide_timeout = i_timeout;
+    p_slowHideTimer->start( i_slow_hide_timeout / 2 );
+#endif
+}
+
+/**
+ * Hidding fullscreen controller slowly
+ * Linux: need composite manager
+ * Windows: it is blinking, so it can be enabled by define TRASPARENCY
+ */
+void FullscreenControllerWidget::slowHideFSC()
+{
+#if HAVE_TRANSPARENCY
+    if( b_slow_hide_begin )
+    {
+        b_slow_hide_begin = false;
+
+        p_slowHideTimer->stop();
+        /* the last part of time divided to 100 pieces */
+        p_slowHideTimer->start( (int)( i_slow_hide_timeout / 2 / ( windowOpacity() * 100 ) ) );
+
+    }
+    else
+    {
+         if ( windowOpacity() > 0.0 )
+         {
+             /* we should use 0.01 because of 100 pieces ^^^
+                but than it cannt be done in time */
+             setWindowOpacity( windowOpacity() - 0.02 );
+         }
+
+         if ( windowOpacity() <= 0.0 )
+             p_slowHideTimer->stop();
+    }
+#endif
+}
+
+void FullscreenControllerWidget::updateFullwidthGeometry( int number )
+{
+    QRect screenGeometry = QApplication::desktop()->screenGeometry( number );
+    setMinimumWidth( screenGeometry.width() );
+    setGeometry( screenGeometry.x(), screenGeometry.y() + screenGeometry.height() - height(), screenGeometry.width(), height() );
+    adjustSize();
+}
+
+void FullscreenControllerWidget::toggleFullwidth()
+{
+    /* Toggle isWideFSC switch */
+    isWideFSC = !isWideFSC;
+
+    restoreFSC();
+}
+
+int FullscreenControllerWidget::targetScreen()
+{
+    if( i_screennumber < 0 || i_screennumber > QApplication::desktop()->numScreens() )
+        return QApplication::desktop()->screenNumber( p_intf->p_sys->p_mi );
+    return i_screennumber;
+}
+
+/**
+ * event handling
+ * events: show, hide, start timer for hiding
+ */
+void FullscreenControllerWidget::customEvent( QEvent *event )
+{
+    bool b_fs;
+
+    switch( (int)event->type() )
+    {
+        /* This is used when the 'i' hotkey is used, to force quick toggle */
+        case IMEvent::FullscreenControlToggle:
+            vlc_mutex_lock( &lock );
+            b_fs = b_fullscreen;
+            vlc_mutex_unlock( &lock );
+
+            if( b_fs )
+            {
+                if( isHidden() )
+                {
+                    p_hideTimer->stop();
+                    showFSC();
+                }
+                else
+                    hideFSC();
+            }
+            break;
+        /* Event called to Show the FSC on mouseChanged() */
+        case IMEvent::FullscreenControlShow:
+            vlc_mutex_lock( &lock );
+            b_fs = b_fullscreen;
+            vlc_mutex_unlock( &lock );
+
+            if( b_fs )
+                showFSC();
+
+            break;
+        /* Start the timer to hide later, called usually with above case */
+        case IMEvent::FullscreenControlPlanHide:
+            if( !b_mouse_over ) // Only if the mouse is not over FSC
+                planHideFSC();
+            break;
+        /* Hide */
+        case IMEvent::FullscreenControlHide:
+            hideFSC();
+            break;
+        default:
+            break;
+    }
+}
+
+/**
+ * On mouse move
+ * moving with FSC
+ */
+void FullscreenControllerWidget::mouseMoveEvent( QMouseEvent *event )
+{
+    if( event->buttons() == Qt::LeftButton )
+    {
+        if( i_mouse_last_x == -1 || i_mouse_last_y == -1 )
+            return;
+
+        int i_moveX = event->globalX() - i_mouse_last_x;
+        int i_moveY = event->globalY() - i_mouse_last_y;
+
+        move( x() + i_moveX, y() + i_moveY );
+
+        i_mouse_last_x = event->globalX();
+        i_mouse_last_y = event->globalY();
+    }
+}
+
+/**
+ * On mouse press
+ * store position of cursor
+ */
+void FullscreenControllerWidget::mousePressEvent( QMouseEvent *event )
+{
+    if( isWideFSC ) return;
+    i_mouse_last_x = event->globalX();
+    i_mouse_last_y = event->globalY();
+    event->accept();
+}
+
+void FullscreenControllerWidget::mouseReleaseEvent( QMouseEvent *event )
+{
+    if( isWideFSC ) return;
+    i_mouse_last_x = -1;
+    i_mouse_last_y = -1;
+    event->accept();
+
+    // Save the new FSC position
+    previousPosition = pos();
+}
+
+/**
+ * On mouse go above FSC
+ */
+void FullscreenControllerWidget::enterEvent( QEvent *event )
+{
+    b_mouse_over = true;
+
+    p_hideTimer->stop();
+#if HAVE_TRANSPARENCY
+    p_slowHideTimer->stop();
+    setWindowOpacity( f_opacity );
+#endif
+    event->accept();
+}
+
+/**
+ * On mouse go out from FSC
+ */
+void FullscreenControllerWidget::leaveEvent( QEvent *event )
+{
+    planHideFSC();
+
+    b_mouse_over = false;
+    event->accept();
+}
+
+/**
+ * When you get pressed key, send it to video output
+ */
+void FullscreenControllerWidget::keyPressEvent( QKeyEvent *event )
+{
+    emit keyPressed( event );
+}
+
+/* */
+static int FullscreenControllerWidgetFullscreenChanged( vlc_object_t *vlc_object,
+                const char *variable, vlc_value_t old_val,
+                vlc_value_t new_val,  void *data )
+{
+    VLC_UNUSED( variable ); VLC_UNUSED( old_val );
+
+    vout_thread_t *p_vout = (vout_thread_t *) vlc_object;
+
+    msg_Dbg( p_vout, "Qt: Fullscreen state changed" );
+    FullscreenControllerWidget *p_fs = (FullscreenControllerWidget *)data;
+
+    p_fs->fullscreenChanged( p_vout, new_val.b_bool, var_GetInteger( p_vout, "mouse-hide-timeout" ) );
+
+    return VLC_SUCCESS;
+}
+/* */
+static int FullscreenControllerWidgetMouseMoved( vlc_object_t *vlc_object, const char *variable,
+                                                 vlc_value_t old_val, vlc_value_t new_val,
+                                                 void *data )
+{
+    VLC_UNUSED( variable ); VLC_UNUSED( old_val );
+
+    vout_thread_t *p_vout = (vout_thread_t *)vlc_object;
+    FullscreenControllerWidget *p_fs = (FullscreenControllerWidget *)data;
+
+    /* Get the value from the Vout - Trust the vout more than Qt */
+    p_fs->mouseChanged( p_vout, new_val.coords.x, new_val.coords.y );
+
+    return VLC_SUCCESS;
+}
+
+/**
+ * It is call to update the list of vout handled by the fullscreen controller
+ */
+void FullscreenControllerWidget::setVoutList( vout_thread_t **pp_vout, int i_vout )
+{
+    QList<vout_thread_t*> del;
+    QList<vout_thread_t*> add;
+
+    QList<vout_thread_t*> set;
+
+    /* */
+    for( int i = 0; i < i_vout; i++ )
+        set += pp_vout[i];
+
+    /* Vout to remove */
+    vlc_mutex_lock( &lock );
+    foreach( vout_thread_t *p_vout, vout )
+    {
+        if( !set.contains( p_vout ) )
+            del += p_vout;
+    }
+    vlc_mutex_unlock( &lock );
+
+    foreach( vout_thread_t *p_vout, del )
+    {
+        var_DelCallback( p_vout, "fullscreen",
+                         FullscreenControllerWidgetFullscreenChanged, this );
+        vlc_mutex_lock( &lock );
+        fullscreenChanged( p_vout, false, 0 );
+        vout.removeAll( p_vout );
+        vlc_mutex_unlock( &lock );
+
+        vlc_object_release( VLC_OBJECT(p_vout) );
+    }
+
+    /* Vout to track */
+    vlc_mutex_lock( &lock );
+    foreach( vout_thread_t *p_vout, set )
+    {
+        if( !vout.contains( p_vout ) )
+            add += p_vout;
+    }
+    vlc_mutex_unlock( &lock );
+
+    foreach( vout_thread_t *p_vout, add )
+    {
+        vlc_object_hold( VLC_OBJECT(p_vout) );
+
+        vlc_mutex_lock( &lock );
+        vout.append( p_vout );
+        var_AddCallback( p_vout, "fullscreen",
+                         FullscreenControllerWidgetFullscreenChanged, this );
+        /* I miss a add and fire */
+        fullscreenChanged( p_vout, var_GetBool( p_vout, "fullscreen" ),
+                           var_GetInteger( p_vout, "mouse-hide-timeout" ) );
+        vlc_mutex_unlock( &lock );
+    }
+}
+/**
+ * Register and unregister callback for mouse moving
+ */
+void FullscreenControllerWidget::fullscreenChanged( vout_thread_t *p_vout,
+        bool b_fs, int i_timeout )
+{
+    /* FIXME - multiple vout (ie multiple mouse position ?) and thread safety if multiple vout ? */
+
+    vlc_mutex_lock( &lock );
+    /* Entering fullscreen, register callback */
+    if( b_fs && !b_fullscreen )
+    {
+        msg_Dbg( p_vout, "Qt: Entering Fullscreen" );
+        b_fullscreen = true;
+        i_hide_timeout = i_timeout;
+        var_AddCallback( p_vout, "mouse-moved",
+                FullscreenControllerWidgetMouseMoved, this );
+    }
+    /* Quitting fullscreen, unregistering callback */
+    else if( !b_fs && b_fullscreen )
+    {
+        msg_Dbg( p_vout, "Qt: Quitting Fullscreen" );
+        b_fullscreen = false;
+        i_hide_timeout = i_timeout;
+        var_DelCallback( p_vout, "mouse-moved",
+                FullscreenControllerWidgetMouseMoved, this );
+
+        /* Force fs hiding */
+        IMEvent *eHide = new IMEvent( IMEvent::FullscreenControlHide, 0 );
+        QApplication::postEvent( this, eHide );
+    }
+    vlc_mutex_unlock( &lock );
+}
+
+/**
+ * Mouse change callback (show/hide the controller on mouse movement)
+ */
+void FullscreenControllerWidget::mouseChanged( vout_thread_t *, int i_mousex, int i_mousey )
+{
+    bool b_toShow;
+
+    /* FIXME - multiple vout (ie multiple mouse position ?) and thread safety if multiple vout ? */
+
+    b_toShow = false;
+    if( ( i_mouse_last_move_x == -1 || i_mouse_last_move_y == -1 ) ||
+        ( abs( i_mouse_last_move_x - i_mousex ) > i_sensitivity ||
+          abs( i_mouse_last_move_y - i_mousey ) > i_sensitivity ) )
+    {
+        i_mouse_last_move_x = i_mousex;
+        i_mouse_last_move_y = i_mousey;
+        b_toShow = true;
+    }
+
+    if( b_toShow )
+    {
+        /* Show event */
+        IMEvent *eShow = new IMEvent( IMEvent::FullscreenControlShow, 0 );
+        QApplication::postEvent( this, eShow );
+
+        /* Plan hide event */
+        IMEvent *eHide = new IMEvent( IMEvent::FullscreenControlPlanHide, 0 );
+        QApplication::postEvent( this, eHide );
+    }
+}
+
diff --git a/modules/gui/qt/components/controller.hpp b/modules/gui/qt/components/controller.hpp
new file mode 100644 (file)
index 0000000..9637908
--- /dev/null
@@ -0,0 +1,317 @@
+/*****************************************************************************
+ * controller.hpp : Controller for the main interface
+ ****************************************************************************
+ * Copyright (C) 2006-2008 the VideoLAN team
+ * $Id$
+ *
+ * Authors: Jean-Baptiste Kempf <jb@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.
+ *****************************************************************************/
+
+#ifndef QVLC_CONTROLLER_H_
+#define QVLC_CONTROLLER_H_
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "qt4.hpp"
+
+#include <QFrame>
+#include <QString>
+#include <QSizeGrip>
+
+#define MAIN_TB1_DEFAULT "64;39;64;38;65"
+#define MAIN_TB2_DEFAULT "0-2;64;3;1;4;64;7;9;64;10;20;19;64-4;37;65;35-4"
+#define ADV_TB_DEFAULT "12;11;13;14"
+#define INPT_TB_DEFAULT "43;33-4;44"
+#define FSC_TB_DEFAULT "0-2;64;3;1;4;64;37;64;38;64;8;65;25;35-4;34"
+
+#define I_PLAY_TOOLTIP N_("Play\nIf the playlist is empty, open a medium")
+
+class QBoxLayout;
+class QHBoxLayout;
+
+class QAbstractButton;
+class QToolButton;
+
+class WidgetListing;
+
+class QSignalMapper;
+class QTimer;
+
+typedef enum buttonType_e
+{
+    PLAY_BUTTON,
+    STOP_BUTTON,
+    OPEN_BUTTON,
+    PREV_SLOW_BUTTON,
+    NEXT_FAST_BUTTON,
+    SLOWER_BUTTON,
+    FASTER_BUTTON,
+    FULLSCREEN_BUTTON,
+    DEFULLSCREEN_BUTTON,
+    EXTENDED_BUTTON,
+    PLAYLIST_BUTTON,
+    SNAPSHOT_BUTTON,
+    RECORD_BUTTON,
+    ATOB_BUTTON,
+    FRAME_BUTTON,
+    REVERSE_BUTTON,
+    SKIP_BACK_BUTTON,
+    SKIP_FW_BUTTON,
+    QUIT_BUTTON,
+    RANDOM_BUTTON,
+    LOOP_BUTTON,
+    INFO_BUTTON,
+    PREVIOUS_BUTTON,
+    NEXT_BUTTON,
+    OPEN_SUB_BUTTON,
+    FULLWIDTH_BUTTON,
+    BUTTON_MAX,
+
+    SPLITTER = 0x20,
+    INPUT_SLIDER,
+    TIME_LABEL,
+    VOLUME,
+    VOLUME_SPECIAL,
+    MENU_BUTTONS,
+    TELETEXT_BUTTONS,
+    ADVANCED_CONTROLLER,
+    PLAYBACK_BUTTONS,
+    ASPECT_RATIO_COMBOBOX,
+    SPEED_LABEL,
+    TIME_LABEL_ELAPSED,
+    TIME_LABEL_REMAINING,
+    SPECIAL_MAX,
+
+    WIDGET_SPACER = 0x40,
+    WIDGET_SPACER_EXTEND,
+    WIDGET_MAX,
+} buttonType_e;
+
+
+static const char* const nameL[BUTTON_MAX] = { N_("Play"), N_("Stop"), N_("Open"),
+    N_("Previous / Backward"), N_("Next / Forward"), N_("Slower"), N_("Faster"), N_("Fullscreen"),
+    N_("De-Fullscreen"), N_("Extended panel"), N_("Playlist"), N_("Snapshot"),
+    N_("Record"), N_("A→B Loop"), N_("Frame By Frame"), N_("Trickplay Reverse"),
+    N_("Step backward" ), N_("Step forward"), N_("Quit"), N_("Random"),
+    N_("Loop / Repeat"), N_("Information"), N_("Previous"), N_("Next"),
+    N_("Open subtitles"), N_("Dock fullscreen controller")
+};
+static const char* const tooltipL[BUTTON_MAX] = { I_PLAY_TOOLTIP,
+    N_("Stop playback"), N_("Open a medium"),
+    N_("Previous media in the playlist, skip backward when held"),
+    N_("Next media in the playlist, skip forward when held"), N_("Slower"), N_("Faster"),
+    N_("Toggle the video in fullscreen"), N_("Toggle the video out fullscreen"),
+    N_("Show extended settings" ), N_( "Toggle playlist" ),
+    N_( "Take a snapshot" ), N_( "Record" ),
+    N_( "Loop from point A to point B continuously." ), N_("Frame by frame"),
+    N_("Reverse"), N_("Step backward"), N_("Step forward"), N_("Quit"),
+    N_("Random"), N_("Change the loop and repeat modes"), N_("Information"),
+    N_("Previous media in the playlist"), N_("Next media in the playlist"),
+    N_("Open subtitle file"),
+    N_("Dock/undock fullscreen controller to/from bottom of screen")
+};
+static const QString iconL[BUTTON_MAX] ={ ":/toolbar/play_b", ":/toolbar/stop_b",
+    ":/toolbar/eject", ":/toolbar/previous_b", ":/toolbar/next_b",
+    ":/toolbar/slower", ":/toolbar/faster", ":/toolbar/fullscreen",
+    ":/toolbar/defullscreen", ":/toolbar/extended", ":/toolbar/playlist",
+    ":/toolbar/snapshot", ":/toolbar/record", ":/toolbar/atob_nob",
+    ":/toolbar/frame", ":/toolbar/reverse", ":/toolbar/skip_back",
+    ":/toolbar/skip_fw", ":/toolbar/clear", ":/buttons/playlist/shuffle_on",
+    ":/buttons/playlist/repeat_all", ":/menu/info",
+    ":/toolbar/previous_b", ":/toolbar/next_b", ":/toolbar/eject", ":/toolbar/space"
+};
+
+enum
+{
+   WIDGET_NORMAL = 0x0,
+   WIDGET_FLAT   = 0x1,
+   WIDGET_BIG    = 0x2,
+   WIDGET_SHINY  = 0x4,
+};
+
+class AdvControlsWidget;
+class AbstractController : public QFrame
+{
+    friend class WidgetListing; /* For ToolBar Edition HACKS */
+
+    Q_OBJECT
+public:
+    AbstractController( intf_thread_t  *_p_i, QWidget *_parent = 0 );
+
+protected:
+    intf_thread_t       *p_intf;
+
+    QSignalMapper       *toolbarActionsMapper;
+    QBoxLayout          *controlLayout;
+    /* Change to BoxLayout if both dir are needed */
+
+    AdvControlsWidget   *advControls;
+
+    void parseAndCreate( const QString& config, QBoxLayout *controlLayout );
+
+    virtual void createAndAddWidget( QBoxLayout *controlLayout, int i_index,
+                                     buttonType_e i_type, int i_option );
+
+    QWidget *createWidget( buttonType_e, int options = WIDGET_NORMAL );
+private:
+    static void setupButton( QAbstractButton * );
+    QFrame *discFrame();
+    QFrame *telexFrame();
+    void applyAttributes( QToolButton *, bool b_flat, bool b_big );
+
+    QHBoxLayout         *buttonGroupLayout;
+protected slots:
+    virtual void setStatus( int );
+
+signals:
+    void inputExists( bool ); /// This might be useful in the IM ?
+    void inputPlaying( bool ); /// This might be useful in the IM ?
+    void inputIsRecordable( bool ); /// same ?
+    void inputIsTrickPlayable( bool ); /// same ?
+};
+
+/* Advanced Button Bar */
+class AdvControlsWidget : public AbstractController
+{
+    Q_OBJECT
+public:
+    AdvControlsWidget( intf_thread_t *, QWidget *_parent = 0 );
+};
+
+/* Slider Bar */
+class InputControlsWidget : public AbstractController
+{
+    Q_OBJECT
+public:
+    InputControlsWidget( intf_thread_t * , QWidget *_parent = 0 );
+};
+
+/* Button Bar */
+class ControlsWidget : public AbstractController
+{
+    Q_OBJECT
+public:
+    /* p_intf, advanced control visible or not, blingbling or not */
+    ControlsWidget( intf_thread_t *_p_i, bool b_advControls,
+                    QWidget *_parent = 0 );
+
+    void setGripVisible( bool b_visible )
+    { grip->setVisible( b_visible ); }
+
+protected:
+    friend class MainInterface;
+
+    bool b_advancedVisible;
+
+private:
+    QSizeGrip *grip;
+
+protected slots:
+    void toggleAdvanced();
+
+signals:
+    void advancedControlsToggled( bool );
+};
+
+
+/* to trying transparency with fullscreen controller on windows enable that */
+/* it can be enabled on-non windows systems,
+   but it will be transparent only with composite manager */
+#define HAVE_TRANSPARENCY 1
+
+/* Default value of opacity for FS controller */
+#define DEFAULT_OPACITY 0.70
+
+/* Used to restore the minimum width after a full-width switch */
+#define FSC_WIDTH 800
+
+/***********************************
+ * Fullscreen controller
+ ***********************************/
+class FullscreenControllerWidget : public AbstractController
+{
+    Q_OBJECT
+public:
+    FullscreenControllerWidget( intf_thread_t *, QWidget *_parent = 0  );
+    virtual ~FullscreenControllerWidget();
+
+    /* Vout */
+    void fullscreenChanged( vout_thread_t *, bool b_fs, int i_timeout );
+    void mouseChanged( vout_thread_t *, int i_mousex, int i_mousey );
+    void toggleFullwidth();
+    void updateFullwidthGeometry( int number );
+    int targetScreen();
+
+signals:
+    void keyPressed( QKeyEvent * );
+
+public slots:
+    void setVoutList( vout_thread_t **, int );
+
+protected:
+    friend class MainInterface;
+
+    void mouseMoveEvent( QMouseEvent *event ) Q_DECL_OVERRIDE;
+    void mousePressEvent( QMouseEvent *event ) Q_DECL_OVERRIDE;
+    void mouseReleaseEvent( QMouseEvent *event ) Q_DECL_OVERRIDE;
+    void enterEvent( QEvent *event ) Q_DECL_OVERRIDE;
+    void leaveEvent( QEvent *event ) Q_DECL_OVERRIDE;
+    void keyPressEvent( QKeyEvent *event ) Q_DECL_OVERRIDE;
+
+    void customEvent( QEvent *event ) Q_DECL_OVERRIDE;
+
+private slots:
+    void showFSC();
+    void planHideFSC();
+    void hideFSC() { hide(); }
+    void slowHideFSC();
+    void restoreFSC();
+    void centerFSC( int );
+
+private:
+    QTimer *p_hideTimer;
+#if HAVE_TRANSPARENCY
+    QTimer *p_slowHideTimer;
+    bool b_slow_hide_begin;
+    int  i_slow_hide_timeout;
+    float f_opacity;
+#endif
+
+    int i_mouse_last_x, i_mouse_last_y;
+    bool b_mouse_over;
+    int i_screennumber;
+    QRect screenRes;
+    QRect previousScreenRes;
+    QPoint previousPosition;
+
+    /* List of vouts currently tracked */
+    QList<vout_thread_t *> vout;
+
+    /* Shared variable between FSC and VLC (protected by a lock) */
+    vlc_mutex_t lock;
+    bool        b_fullscreen;
+    int         i_hide_timeout;  /* FSC hiding timeout, same as mouse hiding timeout */
+    int i_mouse_last_move_x;
+    int i_mouse_last_move_y;
+
+    bool isWideFSC;
+    int i_sensitivity;
+};
+
+#endif
diff --git a/modules/gui/qt/components/controller_widget.cpp b/modules/gui/qt/components/controller_widget.cpp
new file mode 100644 (file)
index 0000000..a37ad56
--- /dev/null
@@ -0,0 +1,293 @@
+/*****************************************************************************
+ * controller_widget.cpp : Controller Widget for the controllers
+ ****************************************************************************
+ * Copyright (C) 2006-2008 the VideoLAN team
+ * $Id$
+ *
+ * Authors: Jean-Baptiste Kempf <jb@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.
+ *****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "controller_widget.hpp"
+#include "controller.hpp"
+
+#include "input_manager.hpp"         /* Get notification of Volume Change */
+#include "util/input_slider.hpp"     /* SoundSlider */
+
+#include <math.h>
+
+#include <QLabel>
+#include <QHBoxLayout>
+#include <QMenu>
+#include <QWidgetAction>
+#include <QMouseEvent>
+
+SoundWidget::SoundWidget( QWidget *_parent, intf_thread_t * _p_intf,
+                          bool b_shiny, bool b_special )
+                         : QWidget( _parent ), p_intf( _p_intf),
+                           b_is_muted( false ), b_ignore_valuechanged( false )
+{
+    /* We need a layout for this widget */
+    QHBoxLayout *layout = new QHBoxLayout( this );
+    layout->setSpacing( 0 ); layout->setMargin( 0 );
+
+    /* We need a Label for the pix */
+    volMuteLabel = new QLabel;
+    volMuteLabelSize = QSize(16.0*logicalDpiX()/DPI_REF_VALUE, 16.0*logicalDpiY()/DPI_REF_VALUE);
+    volMuteLabel->setPixmap( QPixmap( ":/toolbar/volume-medium" ).scaled(volMuteLabelSize) );
+
+    /* We might need a subLayout too */
+    QVBoxLayout *subLayout;
+
+    volMuteLabel->installEventFilter( this );
+
+    /* Normal View, click on icon mutes */
+    if( !b_special )
+    {
+        volumeMenu = NULL; subLayout = NULL;
+        volumeControlWidget = NULL;
+
+        /* And add the label */
+        layout->addWidget( volMuteLabel, 0, b_shiny? Qt::AlignBottom : Qt::AlignCenter );
+    }
+    else
+    {
+        /* Special view, click on button shows the slider */
+        b_shiny = false;
+
+        volumeControlWidget = new QFrame( this );
+        subLayout = new QVBoxLayout( volumeControlWidget );
+        subLayout->setContentsMargins( 4, 4, 4, 4 );
+        volumeMenu = new QMenu( this );
+
+        QWidgetAction *widgetAction = new QWidgetAction( volumeControlWidget );
+        widgetAction->setDefaultWidget( volumeControlWidget );
+        volumeMenu->addAction( widgetAction );
+
+        /* And add the label */
+        layout->addWidget( volMuteLabel );
+    }
+
+    /* Slider creation: shiny or clean */
+    if( b_shiny )
+    {
+        volumeSlider = new SoundSlider( this,
+            config_GetFloat( p_intf, "volume-step" ),
+            var_InheritString( p_intf, "qt-slider-colours" ),
+            var_InheritInteger( p_intf, "qt-max-volume") );
+    }
+    else
+    {
+        volumeSlider = new QSlider( NULL );
+        volumeSlider->setAttribute( Qt::WA_MacSmallSize);
+        volumeSlider->setOrientation( b_special ? Qt::Vertical
+                                                : Qt::Horizontal );
+        volumeSlider->setMaximum( 200 );
+    }
+
+    volumeSlider->setFocusPolicy( Qt::NoFocus );
+    if( b_special )
+        subLayout->addWidget( volumeSlider );
+    else
+        layout->addWidget( volumeSlider, 0, b_shiny? Qt::AlignBottom : Qt::AlignCenter );
+
+    /* Set the volume from the config */
+    float volume = playlist_VolumeGet( THEPL );
+    libUpdateVolume( (volume >= 0.f) ? volume : 1.f );
+    /* Sync mute status */
+    if( playlist_MuteGet( THEPL ) > 0 )
+        updateMuteStatus( true );
+
+    /* Volume control connection */
+    volumeSlider->setTracking( true );
+    CONNECT( volumeSlider, valueChanged( int ), this, valueChangedFilter( int ) );
+    CONNECT( this, valueReallyChanged( int ), this, userUpdateVolume( int ) );
+    CONNECT( THEMIM, volumeChanged( float ), this, libUpdateVolume( float ) );
+    CONNECT( THEMIM, soundMuteChanged( bool ), this, updateMuteStatus( bool ) );
+}
+
+void SoundWidget::refreshLabels()
+{
+    int i_sliderVolume = volumeSlider->value();
+
+    if( b_is_muted )
+    {
+        volMuteLabel->setPixmap( QPixmap(":/toolbar/volume-muted" ).scaled(volMuteLabelSize) );
+        volMuteLabel->setToolTip(qfu(vlc_pgettext("Tooltip|Unmute", "Unmute")));
+        return;
+    }
+
+    if( i_sliderVolume < VOLUME_MAX / 3 )
+        volMuteLabel->setPixmap( QPixmap( ":/toolbar/volume-low" ).scaled(volMuteLabelSize) );
+    else if( i_sliderVolume > (VOLUME_MAX * 2 / 3 ) )
+        volMuteLabel->setPixmap( QPixmap( ":/toolbar/volume-high" ).scaled(volMuteLabelSize) );
+    else volMuteLabel->setPixmap( QPixmap( ":/toolbar/volume-medium" ).scaled(volMuteLabelSize) );
+    volMuteLabel->setToolTip( qfu(vlc_pgettext("Tooltip|Mute", "Mute")) );
+}
+
+/* volumeSlider changed value event slot */
+void SoundWidget::userUpdateVolume( int i_sliderVolume )
+{
+    /* Only if volume is set by user action on slider */
+    setMuted( false );
+    playlist_VolumeSet( THEPL, i_sliderVolume / 100.f );
+    refreshLabels();
+}
+
+/* libvlc changed value event slot */
+void SoundWidget::libUpdateVolume( float volume )
+{
+    long i_volume = lroundf(volume * 100.f);
+    if( i_volume != volumeSlider->value()  )
+    {
+        b_ignore_valuechanged = true;
+        volumeSlider->setValue( i_volume );
+        b_ignore_valuechanged = false;
+    }
+    refreshLabels();
+}
+
+void SoundWidget::valueChangedFilter( int i_val )
+{
+    /* valueChanged is also emitted when the lib setValue() */
+    if ( !b_ignore_valuechanged ) emit valueReallyChanged( i_val );
+}
+
+/* libvlc mute/unmute event slot */
+void SoundWidget::updateMuteStatus( bool mute )
+{
+    b_is_muted = mute;
+
+    SoundSlider *soundSlider = qobject_cast<SoundSlider *>(volumeSlider);
+    if( soundSlider )
+        soundSlider->setMuted( mute );
+    refreshLabels();
+}
+
+void SoundWidget::showVolumeMenu( QPoint pos )
+{
+    volumeMenu->setFixedHeight( volumeMenu->sizeHint().height() );
+    volumeMenu->exec( QCursor::pos() - pos - QPoint( 0, volumeMenu->height()/2 )
+                          + QPoint( width(), height() /2) );
+}
+
+void SoundWidget::setMuted( bool mute )
+{
+    b_is_muted = mute;
+    playlist_t *p_playlist = THEPL;
+    playlist_MuteSet( p_playlist, mute );
+}
+
+bool SoundWidget::eventFilter( QObject *obj, QEvent *e )
+{
+    VLC_UNUSED( obj );
+    if( e->type() == QEvent::MouseButtonPress )
+    {
+        QMouseEvent *event = static_cast<QMouseEvent*>(e);
+        if( event->button() == Qt::LeftButton )
+        {
+            if( volumeSlider->orientation() ==  Qt::Vertical )
+            {
+                showVolumeMenu( event->pos() );
+            }
+            else
+            {
+                setMuted( !b_is_muted );
+            }
+            e->accept();
+            return true;
+        }
+    }
+    e->ignore();
+    return false;
+}
+
+/**
+ * Play Button
+ **/
+void PlayButton::updateButtonIcons( bool b_playing )
+{
+    setIcon( b_playing ? QIcon( ":/toolbar/pause_b" ) : QIcon( ":/toolbar/play_b" ) );
+    setToolTip( b_playing ? qtr( "Pause the playback" )
+                          : qtr( I_PLAY_TOOLTIP ) );
+}
+
+void AtoB_Button::updateButtonIcons( bool timeA, bool timeB )
+{
+    if( !timeA && !timeB)
+    {
+        setIcon( QIcon( ":/toolbar/atob_nob" ) );
+        setToolTip( qtr( "Loop from point A to point B continuously\n"
+                         "Click to set point A" ) );
+    }
+    else if( timeA && !timeB )
+    {
+        setIcon( QIcon( ":/toolbar/atob_noa" ) );
+        setToolTip( qtr( "Click to set point B" ) );
+    }
+    else if( timeA && timeB )
+    {
+        setIcon( QIcon( ":/toolbar/atob" ) );
+        setToolTip( qtr( "Stop the A to B loop" ) );
+    }
+}
+
+void LoopButton::updateButtonIcons( int value )
+{
+    setChecked( value != NORMAL );
+    setIcon( ( value == REPEAT_ONE ) ? QIcon( ":/buttons/playlist/repeat_one" )
+                                     : QIcon( ":/buttons/playlist/repeat_all" ) );
+}
+
+void AspectRatioComboBox::updateRatios()
+{
+    /* Clear the list before updating */
+    clear();
+    vlc_value_t val_list, text_list;
+    vout_thread_t* p_vout = THEMIM->getVout();
+
+    /* Disable if there is no vout */
+    if( p_vout == NULL )
+    {
+        addItem( qtr("Aspect Ratio") );
+        setDisabled( true );
+        return;
+    }
+
+    var_Change( p_vout, "aspect-ratio", VLC_VAR_GETCHOICES, &val_list, &text_list );
+    for( int i = 0; i < val_list.p_list->i_count; i++ )
+        addItem( qfu( text_list.p_list->p_values[i].psz_string ),
+                 QString( val_list.p_list->p_values[i].psz_string ) );
+    setEnabled( true );
+    var_FreeList( &val_list, &text_list );
+    vlc_object_release( p_vout );
+}
+
+void AspectRatioComboBox::updateAspectRatio( int x )
+{
+    vout_thread_t* p_vout = THEMIM->getVout();
+    if( p_vout && x >= 0 )
+    {
+        var_SetString( p_vout, "aspect-ratio", qtu( itemData(x).toString() ) );
+    }
+    if( p_vout )
+        vlc_object_release( p_vout );
+}
+
diff --git a/modules/gui/qt/components/controller_widget.hpp b/modules/gui/qt/components/controller_widget.hpp
new file mode 100644 (file)
index 0000000..d16e943
--- /dev/null
@@ -0,0 +1,129 @@
+/*****************************************************************************
+ * controller_widget.hpp : Controller Widget for the controllers
+ ****************************************************************************
+ * Copyright (C) 2006-2008 the VideoLAN team
+ * $Id$
+ *
+ * Authors: Jean-Baptiste Kempf <jb@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.
+ *****************************************************************************/
+
+#ifndef VLC_QT_CONTROLLER_WIDGET_HPP_
+#define VLC_QT_CONTROLLER_WIDGET_HPP_
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "qt4.hpp"
+#include "input_manager.hpp"
+#include <vlc_vout.h>                       /* vout_thread_t for aspect ratio combobox */
+
+#include <QWidget>
+#include <QToolButton>
+#include <QComboBox>
+
+class QLabel;
+class QFrame;
+class QAbstractSlider;
+
+/**
+ * SPECIAL Widgets that are a bit more than just a ToolButton
+ * and have an icon/behaviour that changes depending on the context:
+ * - playButton
+ * - A->B Button
+ * - Teletext group buttons
+ * - Sound Widget group
+ **/
+class PlayButton : public QToolButton
+{
+    Q_OBJECT
+public slots:
+    void updateButtonIcons( bool );
+};
+
+class LoopButton : public QToolButton
+{
+    Q_OBJECT
+public slots:
+    void updateButtonIcons( int );
+};
+
+class AtoB_Button : public QToolButton
+{
+    Q_OBJECT
+private slots:
+    void updateButtonIcons( bool, bool );
+};
+
+class AspectRatioComboBox : public QComboBox
+{
+    Q_OBJECT
+public:
+    AspectRatioComboBox( intf_thread_t* _p_intf ) : p_intf( _p_intf )
+    {
+        CONNECT( THEMIM->getIM(), voutChanged( bool ),
+                 this, updateRatios() );
+        CONNECT( this, currentIndexChanged( int ),
+                 this, updateAspectRatio( int ) );
+        updateRatios();
+    }
+
+public slots:
+    void updateRatios();
+    void updateAspectRatio( int );
+
+private:
+    intf_thread_t* p_intf;
+};
+
+#define VOLUME_MAX 200
+class SoundWidget : public QWidget
+{
+    Q_OBJECT
+
+public:
+    SoundWidget( QWidget *parent, intf_thread_t  *_p_i, bool,
+                 bool b_special = false );
+    void setMuted( bool );
+
+protected:
+    bool eventFilter( QObject *obj, QEvent *e ) Q_DECL_OVERRIDE;
+
+private:
+    intf_thread_t       *p_intf;
+    QLabel              *volMuteLabel;
+    QSize               volMuteLabelSize;
+    QAbstractSlider     *volumeSlider;
+    QFrame              *volumeControlWidget;
+    QMenu               *volumeMenu;
+
+    bool                b_is_muted;
+    bool                b_ignore_valuechanged;
+
+protected slots:
+    void userUpdateVolume( int );
+    void libUpdateVolume( float );
+    void updateMuteStatus( bool );
+    void refreshLabels( void );
+    void showVolumeMenu( QPoint pos );
+    void valueChangedFilter( int );
+
+signals:
+    void valueReallyChanged( int );
+};
+
+#endif
diff --git a/modules/gui/qt/components/epg/EPGChannels.cpp b/modules/gui/qt/components/epg/EPGChannels.cpp
new file mode 100644 (file)
index 0000000..902832d
--- /dev/null
@@ -0,0 +1,85 @@
+/*****************************************************************************
+ * EPGChannels.cpp: EPGChannels
+ ****************************************************************************
+ * Copyright © 2009-2010 VideoLAN
+ *
+ * Authors: Adrien Maglo <magsoft@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 "qt4.hpp"
+
+#include <vlc_epg.h>
+
+#include "EPGChannels.hpp"
+#include "EPGView.hpp"
+
+#include <QPainter>
+#include <QFont>
+#include <QPaintEvent>
+
+EPGChannels::EPGChannels( QWidget *parent, EPGView *m_epgView )
+    : QWidget( parent ), m_epgView( m_epgView ), m_offset( 0 )
+{
+    setContentsMargins( 0, 0, 0, 0 );
+}
+
+void EPGChannels::setOffset( int offset )
+{
+    m_offset = offset;
+    update();
+}
+
+void EPGChannels::addChannel( QString channelName )
+{
+    if ( !channelList.contains( channelName ) )
+    {
+        channelList << channelName;
+        channelList.sort();
+        update();
+    }
+}
+
+void EPGChannels::removeChannel( QString channelName )
+{
+    if ( channelList.removeOne( channelName ) ) update();
+}
+
+void EPGChannels::paintEvent( QPaintEvent *event )
+{
+    Q_UNUSED( event );
+
+    QPainter p( this );
+
+    /* Draw the top and the bottom lines. */
+    p.drawLine( 0, 0, width() - 1, 0 );
+
+    unsigned int i=0;
+    foreach( QString text, channelList )
+    {
+        /* try to remove the " [Program xxx]" end */
+        int i_idx_channel = text.lastIndexOf(" [");
+        if (i_idx_channel > 0)
+            text = text.left( i_idx_channel );
+
+        p.drawText( 0, - m_offset + ( i++ + 0.5 ) * TRACKS_HEIGHT - 4,
+                    width(), height(), Qt::AlignLeft, text );
+
+        int i_width = fontMetrics().width( text );
+        if( width() < i_width )
+            setMinimumWidth( i_width );
+    }
+}
diff --git a/modules/gui/qt/components/epg/EPGChannels.hpp b/modules/gui/qt/components/epg/EPGChannels.hpp
new file mode 100644 (file)
index 0000000..7ed6cbd
--- /dev/null
@@ -0,0 +1,52 @@
+/*****************************************************************************
+ * EPGChannels.hpp : EPGChannels
+ ****************************************************************************
+ * Copyright © 2009-2010 VideoLAN
+ *
+ * Authors: Adrien Maglo <magsoft@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.
+ *****************************************************************************/
+
+#ifndef EPGCHANNELS_HPP
+#define EPGCHANNELS_HPP
+
+#include "qt4.hpp"
+
+#include <QWidget>
+
+class EPGView;
+
+class EPGChannels : public QWidget
+{
+    Q_OBJECT
+public:
+    EPGChannels( QWidget *parent, EPGView *m_epgView );
+
+public slots:
+    void setOffset( int offset );
+    void addChannel( QString );
+    void removeChannel( QString );
+
+protected:
+    void paintEvent( QPaintEvent *event ) Q_DECL_OVERRIDE;
+
+private:
+    EPGView *m_epgView;
+    int m_offset;
+    QStringList channelList;
+};
+
+#endif // EPGCHANNELS_HPP
diff --git a/modules/gui/qt/components/epg/EPGItem.cpp b/modules/gui/qt/components/epg/EPGItem.cpp
new file mode 100644 (file)
index 0000000..b526bb5
--- /dev/null
@@ -0,0 +1,238 @@
+/*****************************************************************************
+ * EPGItem.cpp: EPGItem
+ ****************************************************************************
+ * Copyright © 2009-2010 VideoLAN
+ * $Id$
+ *
+ * Authors: Ludovic Fauvet <etix@l0cal.com>
+ *
+ * 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 <QTransform>
+#include <QFont>
+#include <QFontMetrics>
+#include <QDateTime>
+#include <QFocusEvent>
+#include <QStyleOptionGraphicsItem>
+#include <QGraphicsSceneHoverEvent>
+#include <QStyle>
+
+#include "EPGItem.hpp"
+#include "EPGView.hpp"
+
+#include "qt4.hpp"
+
+EPGItem::EPGItem( vlc_epg_event_t *data, EPGView *view )
+    : m_view( view )
+{
+    setData( data );
+    m_current = false;
+    m_boundingRect.setHeight( TRACKS_HEIGHT );
+    setFlags( QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsFocusable);
+    setAcceptHoverEvents( true );
+}
+
+QRectF EPGItem::boundingRect() const
+{
+    return m_boundingRect;
+}
+
+void EPGItem::paint( QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget*)
+{
+    QPen pen;
+    QColor gradientColor;
+
+    // Draw in view's coordinates
+    painter->setWorldMatrixEnabled( false );
+
+    // Draw high-quality items
+    //painter->setRenderHint( QPainter::Antialiasing );
+
+    // Get the transformations required to map the text on the viewport
+    QTransform viewPortTransform = m_view->viewportTransform();
+    QRectF mapped = deviceTransform( viewPortTransform ).mapRect( boundingRect() );
+
+    QLinearGradient gradient( mapped.topLeft(), mapped.bottomLeft() );
+
+    bool b_simultaneous = playsAt( m_view->baseTime() );
+    if ( m_current || b_simultaneous )
+        gradientColor.setRgb( 244, 125, 0 , b_simultaneous ? 192 : 255 );
+    else
+        gradientColor.setRgb( 201, 217, 242 );
+
+    gradient.setColorAt( 0.0, gradientColor.lighter( 120 ) );
+    gradient.setColorAt( 1.0, gradientColor );
+
+    pen.setColor( option->state & QStyle::State_MouseOver || hasFocus()
+                  ? QColor( 0, 0, 0 ) : QColor( 192, 192, 192 ) );
+
+    pen.setStyle( option->state & QStyle::State_MouseOver && !hasFocus()
+                  ? Qt::DashLine : Qt::SolidLine );
+
+    painter->setBrush( QBrush( gradient ) );
+    painter->setPen( pen );
+    mapped.adjust( 1, 2, -1, -2 );
+    painter->drawRoundedRect( mapped, 10, 10 );
+
+    /* Draw text */
+
+    // Setup the font
+    QFont f = painter->font();
+
+    // Get the font metrics
+    QFontMetrics fm = painter->fontMetrics();
+
+    // Adjust the drawing rect
+    mapped.adjust( 6, 6, -6, -6 );
+
+    painter->setPen( Qt::black );
+    /* Draw the title. */
+    painter->drawText( mapped, Qt::AlignTop | Qt::AlignLeft, fm.elidedText( m_name, Qt::ElideRight, mapped.width() ) );
+
+    if ( m_rating > 0 && mapped.width() > 40 )
+    {
+        QRectF iconsRect = QRectF( mapped.bottomRight(), mapped.bottomRight() );
+        iconsRect.adjust( -20, -20, 0, 0 );
+        painter->save();
+        painter->setBrush( Qt::white );
+        f.setPixelSize( 8 );
+        painter->setFont( f );
+        painter->drawRect( iconsRect );
+        painter->drawText( iconsRect, Qt::AlignCenter, QString("%1+").arg( m_rating ) );
+        painter->restore();
+    }
+
+    mapped.adjust( 0, 20, 0, 0 );
+
+    QDateTime m_end = m_start.addSecs( m_duration );
+    f.setPixelSize( 10 );
+    f.setItalic( true );
+    painter->setFont( f );
+
+    /* Draw the hours. */
+    painter->drawText( mapped, Qt::AlignTop | Qt::AlignLeft,
+                       fm.elidedText( start().toString( "hh:mm" ) + " - " +
+                                      m_end.toString( "hh:mm" ),
+                                      Qt::ElideRight, mapped.width() ) );
+}
+
+const QDateTime& EPGItem::start() const
+{
+    return m_start;
+}
+
+QDateTime EPGItem::end() const
+{
+    return QDateTime( m_start ).addSecs( m_duration );
+}
+
+int EPGItem::duration() const
+{
+    return m_duration;
+}
+
+void EPGItem::setRow( unsigned int i_row_ )
+{
+    i_row = i_row_;
+    updatePos();
+}
+
+bool EPGItem::setData( vlc_epg_event_t *data )
+{
+    QDateTime newtime = QDateTime::fromTime_t( data->i_start );
+    QString newname = qfu( data->psz_name );
+    QString newdesc = qfu( data->psz_description );
+    QString newshortdesc = qfu( data->psz_short_description );
+
+    if ( m_start != newtime ||
+         m_name != newname ||
+         m_description != newdesc ||
+         m_shortDescription != newshortdesc ||
+         m_duration != data->i_duration )
+    {
+        m_start = newtime;
+        m_name = newname;
+        setToolTip( newname );
+        m_description = newdesc;
+        m_shortDescription = newshortdesc;
+        setDuration( data->i_duration );
+        setRating( data->i_rating );
+        update();
+        return true;
+    }
+    return false;
+}
+
+void EPGItem::setCurrent( bool b_current )
+{
+    m_current = b_current;
+}
+
+bool EPGItem::endsBefore( const QDateTime &ref ) const
+{
+    return m_start.addSecs( m_duration ) < ref;
+}
+
+bool EPGItem::playsAt( const QDateTime & ref ) const
+{
+    return (m_start <= ref) && !endsBefore( ref );
+}
+
+void EPGItem::setDuration( int duration )
+{
+    m_duration = duration;
+    m_boundingRect.setWidth( duration );
+}
+
+void EPGItem::setRating( uint8_t i_rating )
+{
+    m_rating = i_rating;
+}
+
+QString EPGItem::description() const
+{
+    if( m_description.isEmpty() )
+        return m_shortDescription;
+
+    QString text( m_description );
+    if( !m_shortDescription.isEmpty() )
+        text += QString(" - ") += m_shortDescription;
+    return text;
+}
+
+void EPGItem::updatePos()
+{
+    int x = m_view->startTime().secsTo( m_start );
+    setPos( x, i_row * TRACKS_HEIGHT );
+}
+
+void EPGItem::hoverEnterEvent ( QGraphicsSceneHoverEvent * event )
+{
+    event->accept();
+    scene()->update();
+}
+
+void EPGItem::hoverLeaveEvent ( QGraphicsSceneHoverEvent * event )
+{ /* required to redraw our background without flaws */
+    hoverEnterEvent( event );
+}
+
+void EPGItem::focusInEvent( QFocusEvent * event )
+{
+    event->accept();
+    m_view->focusItem( this );
+    update();
+}
diff --git a/modules/gui/qt/components/epg/EPGItem.hpp b/modules/gui/qt/components/epg/EPGItem.hpp
new file mode 100644 (file)
index 0000000..261e7a1
--- /dev/null
@@ -0,0 +1,80 @@
+/*****************************************************************************
+ * EPGItem.hpp : EPGItem
+ ****************************************************************************
+ * Copyright © 2009-2010 VideoLAN
+ * $Id$
+ *
+ * Authors: Ludovic Fauvet <etix@l0cal.com>
+ *
+ * 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.
+ *****************************************************************************/
+
+#ifndef EPGITEM_H
+#define EPGITEM_H
+
+#include "qt4.hpp"
+
+#include <vlc_epg.h>
+#include <QGraphicsItem>
+#include <QDateTime>
+
+class QPainter;
+class QString;
+class EPGView;
+
+class EPGItem : public QGraphicsItem
+{
+public:
+    EPGItem( vlc_epg_event_t *data, EPGView *view );
+
+    QRectF boundingRect() const Q_DECL_OVERRIDE;
+    void paint( QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0 ) Q_DECL_OVERRIDE;
+
+    const QDateTime& start() const;
+    QDateTime end() const;
+
+    int duration() const;
+    const QString& name() const { return m_name; }
+    QString description() const;
+    int rating() const { return m_rating; }
+    bool setData( vlc_epg_event_t * );
+    void setRow( unsigned int );
+    void setCurrent( bool );
+    void setDuration( int duration );
+    void setRating( uint8_t i_rating );
+    void updatePos();
+    bool endsBefore( const QDateTime & ) const;
+    bool playsAt( const QDateTime & ) const;
+
+protected:
+    void focusInEvent( QFocusEvent * event ) Q_DECL_OVERRIDE;
+    void hoverEnterEvent ( QGraphicsSceneHoverEvent * ) Q_DECL_OVERRIDE;
+    void hoverLeaveEvent ( QGraphicsSceneHoverEvent * ) Q_DECL_OVERRIDE;
+
+private:
+    EPGView     *m_view;
+    QRectF      m_boundingRect;
+    unsigned int i_row;
+
+    QDateTime   m_start;
+    int         m_duration;
+    QString     m_name;
+    QString     m_description;
+    QString     m_shortDescription;
+    bool        m_current;
+    uint8_t     m_rating;
+};
+
+#endif // EPGITEM_H
diff --git a/modules/gui/qt/components/epg/EPGRuler.cpp b/modules/gui/qt/components/epg/EPGRuler.cpp
new file mode 100644 (file)
index 0000000..bd7ccac
--- /dev/null
@@ -0,0 +1,119 @@
+/*****************************************************************************
+ * EPGRuler.cpp: EPGRuler
+ ****************************************************************************
+ * Copyright © 2009-2010 VideoLAN
+ * $Id$
+ *
+ * Authors: Ludovic Fauvet <etix@l0cal.com>
+ *
+ * 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 "EPGRuler.hpp"
+
+class QPaintEvent;
+#include <QPainter>
+#include <QDateTime>
+#include <QPoint>
+#include <QRect>
+#include <QSize>
+#include <QPalette>
+#include <QColor>
+
+EPGRuler::EPGRuler( QWidget* parent )
+    : QWidget( parent )
+{
+    setContentsMargins( 0, 0, 0, 0 );
+    setMinimumHeight( height() );
+    setMaximumHeight( height() );
+    m_offset = 0;
+}
+
+void EPGRuler::setScale( double scale )
+{
+    m_scale = scale;
+    update();
+}
+
+void EPGRuler::setStartTime( const QDateTime& startTime )
+{
+    m_startTime = startTime;
+    update();
+}
+
+void EPGRuler::setDuration( int duration )
+{
+    m_duration = duration;
+    update();
+}
+
+void EPGRuler::setOffset( int offset )
+{
+    m_offset = offset;
+    update();
+}
+
+void EPGRuler::paintEvent( QPaintEvent *event )
+{
+    Q_UNUSED( event );
+    const QSize margin( 0, contentsMargins().top() );
+    const QSize header( 0, maximumHeight() - contentsMargins().top() );
+    const int spacing = m_scale * 3600;
+    QPainter p( this );
+
+    QDateTime localStartTime;
+    localStartTime = m_startTime.addSecs( m_offset / m_scale );
+
+    QDateTime diff( localStartTime );
+    diff.setTime( QTime( localStartTime.time().hour(), 0, 0, 0 ) );
+
+    int secondsToHour = localStartTime.secsTo( diff );
+
+    /* draw hour blocks, with right bound being hourmark */
+    QPoint here( secondsToHour * m_scale, margin.height() );
+    QPoint previous( -1, 0 );
+    QDateTime current( localStartTime.addSecs( secondsToHour ) );
+    current = current.addSecs( -3600 );
+
+    QColor fillColor;
+    while ( here.rx() < width() + spacing )
+    {
+        QRect area( QPoint( previous.x() + 1, margin.height() ), here );
+        area.adjust( 0, 0, 0, header.height() );
+        QString timeString = current.toString( "hh'h'" );
+        /* Show Day */
+        if ( current.time().hour() == 0 )
+            timeString += current.date().toString( " ddd dd" );
+
+        if ( m_startTime.date().daysTo( current.date() ) % 2 == 0 )
+            fillColor = palette().color( QPalette::Window );
+        else
+            fillColor = palette().color( QPalette::Dark );
+        p.fillRect( area, fillColor );
+        p.drawLine( area.topRight(), area.bottomRight() );
+        p.drawText( area, Qt::AlignLeft, timeString );
+        previous = here;
+        here.rx() += spacing;
+        current = current.addSecs( 3600 );
+    }
+
+    /* draw current time line */
+    here.rx() = localStartTime.secsTo( QDateTime::currentDateTime() ) * m_scale;
+    if ( here.x() <= width() && here.x() >= 0 )
+    {
+        p.setPen( QPen( QColor( 255, 0 , 0, 128 ) ) );
+        p.drawLine( here, QPoint( here.x(), here.y() + header.height() ) );
+    }
+}
diff --git a/modules/gui/qt/components/epg/EPGRuler.hpp b/modules/gui/qt/components/epg/EPGRuler.hpp
new file mode 100644 (file)
index 0000000..2c69f12
--- /dev/null
@@ -0,0 +1,56 @@
+/*****************************************************************************
+ * EPGRuler.hpp: EPGRuler
+ ****************************************************************************
+ * Copyright © 2009-2010 VideoLAN
+ * $Id$
+ *
+ * Authors: Ludovic Fauvet <etix@l0cal.com>
+ *
+ * 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.
+ *****************************************************************************/
+
+#ifndef EPGRULER_H
+#define EPGRULER_H
+
+#include "qt4.hpp"
+
+#include <QWidget>
+#include <QDateTime>
+
+class EPGRuler : public QWidget
+{
+    Q_OBJECT
+
+public:
+    EPGRuler( QWidget* parent = 0 );
+    virtual ~EPGRuler() { }
+
+public slots:
+    void setScale( double scale );
+    void setStartTime( const QDateTime& startTime );
+    void setDuration( int duration );
+    void setOffset( int offset );
+
+protected:
+    void paintEvent( QPaintEvent *event ) Q_DECL_OVERRIDE;
+
+private:
+    qreal m_scale;
+    int m_duration;
+    int m_offset;
+    QDateTime m_startTime;
+};
+
+#endif // EPGRULER_H
diff --git a/modules/gui/qt/components/epg/EPGView.cpp b/modules/gui/qt/components/epg/EPGView.cpp
new file mode 100644 (file)
index 0000000..b5b3128
--- /dev/null
@@ -0,0 +1,344 @@
+/*****************************************************************************
+ * EPGView.cpp: EPGView
+ ****************************************************************************
+ * Copyright © 2009-2010 VideoLAN
+ * $Id$
+ *
+ * Authors: Ludovic Fauvet <etix@l0cal.com>
+ *
+ * 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 "qt4.hpp"
+
+#include <vlc_epg.h>
+
+#include "EPGView.hpp"
+#include "EPGItem.hpp"
+
+#include <QDateTime>
+#include <QMatrix>
+#include <QPaintEvent>
+#include <QRectF>
+
+EPGGraphicsScene::EPGGraphicsScene( QObject *parent ) : QGraphicsScene( parent )
+{}
+
+void EPGGraphicsScene::drawBackground( QPainter *painter, const QRectF &rect)
+{
+    EPGView *epgView = qobject_cast<EPGView *>(parent());
+
+    /* day change */
+    QDateTime rectstarttime = epgView->startTime().addSecs( rect.left() );
+    QDateTime nextdaylimit = QDateTime( rectstarttime.date() );
+    QRectF area( rect );
+    while( area.left() < width() )
+    {
+        nextdaylimit = nextdaylimit.addDays( 1 );
+        area.setRight( epgView->startTime().secsTo( nextdaylimit ) );
+
+        if ( epgView->startTime().date().daysTo( nextdaylimit.date() ) % 2 != 0 )
+            painter->fillRect( area, palette().color( QPalette::Base ) );
+        else
+            painter->fillRect( area, palette().color( QPalette::AlternateBase ) );
+
+        area.setLeft( area.right() + 1 );
+    }
+
+    /* channels lines */
+    painter->setPen( QPen( QColor( 224, 224, 224 ) ) );
+    for( int y = rect.top() + TRACKS_HEIGHT ; y < rect.bottom() ; y += TRACKS_HEIGHT )
+       painter->drawLine( QLineF( rect.left(), y, rect.right(), y ) );
+
+    /* current hour line */
+    int x = epgView->startTime().secsTo( epgView->baseTime() );
+    painter->setPen( QPen( QColor( 255, 192, 192 ) ) );
+    painter->drawLine( QLineF( x, rect.top(), x, rect.bottom() ) );
+}
+
+EPGView::EPGView( QWidget *parent ) : QGraphicsView( parent )
+{
+    setContentsMargins( 0, 0, 0, 0 );
+    setFrameStyle( QFrame::Box );
+    setAlignment( Qt::AlignLeft | Qt::AlignTop );
+
+    m_startTime = QDateTime::currentDateTime();
+
+    EPGGraphicsScene *EPGscene = new EPGGraphicsScene( this );
+
+    setScene( EPGscene );
+}
+
+void EPGView::setScale( double scaleFactor )
+{
+    m_scaleFactor = scaleFactor;
+    QMatrix matrix;
+    matrix.scale( scaleFactor, 1 );
+    setMatrix( matrix );
+}
+
+void EPGView::updateStartTime()
+{
+    mutex.lock();
+    foreach( EPGEventByTimeQMap *epgItemByTime, epgitemsByChannel.values() )
+    {
+        foreach( EPGItem *epgItem, epgItemByTime->values() )
+        {
+            epgItem->updatePos();
+        }
+    }
+    mutex.unlock();
+}
+
+void EPGView::updateChannels()
+{
+    /* Make sure our items goes to the correct row */
+    unsigned int channelIndex = 0;
+    mutex.lock();
+    foreach( EPGEventByTimeQMap *epgItemByTime, epgitemsByChannel.values() )
+    {
+        foreach( EPGItem *epgItem, epgItemByTime->values() )
+            epgItem->setRow( channelIndex );
+        channelIndex++;
+    }
+    mutex.unlock();
+}
+
+const QDateTime& EPGView::startTime() const
+{
+    return m_startTime;
+}
+
+const QDateTime& EPGView::baseTime() const
+{
+    return m_baseTime;
+}
+
+bool EPGView::hasValidData() const
+{
+    return !epgitemsByChannel.isEmpty();
+}
+
+static void cleanOverlapped( EPGEventByTimeQMap *epgItemByTime, EPGItem *epgItem, QGraphicsScene *scene )
+{
+    QDateTime epgItemTime = epgItem->start();
+    QDateTime epgItemTimeEnd = epgItem->end();
+    /* Clean overlapped programs */
+    foreach(const QDateTime existingTimes, epgItemByTime->keys())
+    {
+        if ( existingTimes > epgItemTimeEnd ) break; /* Can't overlap later items */
+        if ( existingTimes != epgItemTime )
+        {
+            EPGItem *otherEPGItem = epgItemByTime->value( existingTimes );
+            if ( otherEPGItem->playsAt( epgItemTime.addSecs( 1 ) )
+                || /* add/minus one sec because next one can start at prev end min */
+                 otherEPGItem->playsAt( epgItemTimeEnd.addSecs( -1 ) ) )
+            {
+                epgItemByTime->remove( otherEPGItem->start() );
+                scene->removeItem( otherEPGItem );
+                delete otherEPGItem;
+            }
+        }
+    }
+}
+
+bool EPGView::addEPGEvent( vlc_epg_event_t *eventdata, QString channelName, bool b_current )
+{
+    /* Init our nested map if required */
+    EPGEventByTimeQMap *epgItemByTime;
+    EPGItem *epgItem;
+    bool b_refresh_channels = false;
+
+    QDateTime eventStart = QDateTime::fromTime_t( eventdata->i_start );
+    if ( eventStart.addSecs( eventdata->i_duration ) < m_baseTime )
+        return false; /* EPG feed sent expired item */
+    if ( eventStart < m_startTime )
+    {
+        m_startTime = eventStart;
+        emit startTimeChanged( m_startTime );
+    }
+
+    mutex.lock();
+    if ( !epgitemsByChannel.contains( channelName ) )
+    {
+        epgItemByTime = new EPGEventByTimeQMap();
+        epgitemsByChannel.insert( channelName, epgItemByTime );
+        emit channelAdded( channelName );
+        b_refresh_channels = true;
+    } else {
+        epgItemByTime = epgitemsByChannel.value( channelName );
+    }
+
+    if ( epgItemByTime->contains( eventStart ) )
+    {
+        /* Update our existing programs */
+        epgItem = epgItemByTime->value( eventStart );
+        epgItem->setCurrent( b_current );
+        if ( epgItem->setData( eventdata ) ) /* updates our entry */
+            cleanOverlapped( epgItemByTime, epgItem, scene() );
+        mutex.unlock();
+        return false;
+    } else {
+        /* Insert a new program entry */
+        epgItem = new EPGItem( eventdata, this );
+        cleanOverlapped( epgItemByTime, epgItem, scene() );
+        /* Effectively insert our new program */
+        epgItem->setCurrent( b_current );
+        epgItemByTime->insert( eventStart, epgItem );
+        scene()->addItem( epgItem );
+        /* update only our row (without calling the updatechannels()) */
+        epgItem->setRow( epgitemsByChannel.keys().indexOf( channelName ) );
+
+        /* First Insert, needs to focus by default then */
+        if ( epgitemsByChannel.keys().count() == 1 &&
+             epgItemByTime->count() == 1 )
+            focusItem( epgItem );
+    }
+    mutex.unlock();
+
+    /* Update rows on each item */
+    if ( b_refresh_channels ) updateChannels();
+
+    return true;
+}
+
+void EPGView::removeEPGEvent( vlc_epg_event_t *eventdata, QString channelName )
+{
+    EPGEventByTimeQMap *epgItemByTime;
+    QDateTime eventStart = QDateTime::fromTime_t( eventdata->i_start );
+    EPGItem *epgItem;
+    bool b_update_channels = false;
+
+    mutex.lock();
+    if ( epgitemsByChannel.contains( channelName ) )
+    {
+        epgItemByTime = epgitemsByChannel.value( channelName );
+
+        if ( epgItemByTime->contains( eventStart ) )
+        { /* delete our EPGItem */
+            epgItem = epgItemByTime->value( eventStart );
+            epgItemByTime->remove( eventStart );
+            scene()->removeItem( epgItem );
+            delete epgItem;
+        }
+
+        if ( epgItemByTime->keys().isEmpty() )
+        { /* Now unused channel */
+     &