]> git.sesse.net Git - vlc/blobdiff - modules/gui/qt4/components/controller.hpp
Qt: return playlist model and views to "now playing" root if current root is deleted
[vlc] / modules / gui / qt4 / components / controller.hpp
index bfd536228dfdc0912b9b04735bde215c83c7ba28..c9e097993797caa3f52fd28e666cbd3e36f89010 100644 (file)
@@ -1,12 +1,10 @@
 /*****************************************************************************
- * interface_widgets.hpp : Custom widgets for the main interface
+ * Controller.hpp : Controller for the main interface
  ****************************************************************************
- * Copyright (C) 2006 the VideoLAN team
+ * Copyright (C) 2006-2008 the VideoLAN team
  * $Id$
  *
- * Authors: Clément Stenac <zorglub@videolan.org>
- *          Jean-Baptiste Kempf <jb@videolan.org>
- *          Rafaël Carré <funman@videolanorg>
+ * 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
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  *****************************************************************************/
 
-#ifndef _CONTROLLER_H_
-#define _CONTROLLER_H_
+#ifndef QVLC_CONTROLLER_H_
+#define QVLC_CONTROLLER_H_
 
 #ifdef HAVE_CONFIG_H
 # include "config.h"
 #endif
 
-#include <vlc_common.h>
-#include <vlc_interface.h>
-
 #include "qt4.hpp"
-#include "main_interface.hpp"
-#include "input_manager.hpp"
 
-#include <QWidget>
 #include <QFrame>
-#include <QToolButton>
+#include <QString>
+
+#define MAIN_TB1_DEFAULT "64;39;64;38;65"
+#define MAIN_TB2_DEFAULT "0-2;64;3;1;4;64;7;10;9;64-4;20;19;64-4;37;65;35-4"
+#define ADV_TB_DEFAULT "12;11;13;14"
+#define INPT_TB_DEFAULT "5-1;15-1;33;6-1"
+#define FSC_TB_DEFAULT "0-2;64;3;1;4;64;37;64;38;64;8;65;35-4;34"
+
+#define I_PLAY_TOOLTIP N_("Play\nIf the playlist is empty, open a medium")
 
 class QPixmap;
 class QLabel;
+
 class QGridLayout;
+class QHBoxLayout;
+class QBoxLayout;
 
-class InputSlider;
 class QAbstractSlider;
-
 class QAbstractButton;
+class InputSlider;
+class QToolButton;
 
 class VolumeClickHandler;
+class WidgetListing;
+
 class QSignalMapper;
+class QTimer;
 
 typedef enum buttonType_e
 {
     PLAY_BUTTON,
-    PAUSE_BUTTON,
     STOP_BUTTON,
     OPEN_BUTTON,
     PREVIOUS_BUTTON,
@@ -64,140 +69,125 @@ typedef enum buttonType_e
     SLOWER_BUTTON,
     FASTER_BUTTON,
     FULLSCREEN_BUTTON,
+    DEFULLSCREEN_BUTTON,
     EXTENDED_BUTTON,
     PLAYLIST_BUTTON,
     SNAPSHOT_BUTTON,
     RECORD_BUTTON,
     ATOB_BUTTON,
-#if 0
     FRAME_BUTTON,
-#endif
+    REVERSE_BUTTON,
+    SKIP_BACK_BUTTON,
+    SKIP_FW_BUTTON,
+    QUIT_BUTTON,
+    RANDOM_BUTTON,
+    LOOP_BUTTON,
+    INFO_BUTTON,
+    BUTTON_MAX,
+
+    SPLITTER = 0x20,
     INPUT_SLIDER,
-    VOLUME_SLIDER,
+    TIME_LABEL,
+    VOLUME,
+    VOLUME_SPECIAL,
     MENU_BUTTONS,
     TELETEXT_BUTTONS,
-    VOLUME,
+    ADVANCED_CONTROLLER,
+    SPECIAL_MAX,
+
+    WIDGET_SPACER = 0x40,
+    WIDGET_SPACER_EXTEND,
+    WIDGET_MAX,
 } buttonType_e;
 
-typedef enum actionType_e
+
+static const char* const nameL[BUTTON_MAX] = { N_("Play"), N_("Stop"), N_("Open"),
+    N_("Previous"), N_("Next"), 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 mode"), N_("Information") };
+static const char* const tooltipL[BUTTON_MAX] = { I_PLAY_TOOLTIP,
+    N_("Stop playback"), N_("Open a medium"),
+    N_("Previous media in the playlist"),
+    N_("Next media in the playlist"), N_("Slower"), N_("Faster"),
+    N_("Toggle the video in fullscreen"), N_("Toggle the video out fullscreen"),
+    N_("Show extended settings" ), N_( "Show 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") };
+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" };
+
+enum
 {
-    PLAY_ACTION,
-    PAUSE_ACTION,
-    STOP_ACTION,
-    PREVIOUS_ACTION,
-    NEXT_ACTION,
-    SLOWER_ACTION,
-    FASTER_ACTION,
-    FULLSCREEN_ACTION,
-    EXTENDED_ACTION,
-    PLAYLIST_ACTION,
-    SNAPSHOT_ACTION,
-    RECORD_ACTION,
-    ATOB_ACTION
-} actionType_e;
+   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 );
-    virtual ~AbstractController()  {};
+    AbstractController( intf_thread_t  *_p_i, QWidget *_parent = 0 );
 
 protected:
     intf_thread_t       *p_intf;
 
     QSignalMapper       *toolbarActionsMapper;
-    QGridLayout         *controlLayout;
+    QHBoxLayout         *controlLayout;
+    /* Change to BoxLayout if both dir are needed */
 
-    QWidget *createWidget( buttonType_e, bool b_flat = false,
-                           bool b_big = false, bool b_shiny = false );
-    void setupButton( QAbstractButton * );
+    AdvControlsWidget   *advControls;
 
-private:
-    QWidget *discFrame();
-    QWidget *telexFrame();
+    void parseAndCreate( const QString& config, QBoxLayout *controlLayout );
 
-private slots:
-    void doAction( int );
+    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 );
 protected slots:
-    void play();
-    void stop();
-    void prev();
-    void next();
-    void fullscreen();
-    void extSettings();
-    void faster();
-    void slower();
-    void playlist();
-    void snapshot();
-    void record();
-#if 0
-    void frame();
-#endif
-
     virtual void setStatus( int );
 
 signals:
     void inputExists( bool ); /// This might be usefull in the IM ?
     void inputPlaying( bool ); /// This might be usefull in the IM ?
     void inputIsRecordable( bool ); /// same ?
+    void inputIsTrickPlayable( bool ); /// same ?
+    void sizeChanged();
 };
 
-class PlayButton : public QToolButton
-{
-    Q_OBJECT
-private slots:
-    void updateButton( bool );
-};
-
-class AtoB_Button : public QToolButton
-{
-    Q_OBJECT
-private slots:
-    void setIcons( bool, bool );
-};
-
-class TeletextController : public QWidget
-{
-    Q_OBJECT
-    friend class AbstractController;
-private:
-    QToolButton         *telexTransparent, *telexOn;
-    QSpinBox            *telexPage;
-
-private slots:
-    void enableTeletextButtons( bool );
-    void toggleTeletextTransparency( bool );
-};
-
-class SoundWidget : public QWidget
+/* Advanced Button Bar */
+class AdvControlsWidget : public AbstractController
 {
     Q_OBJECT
-    friend class VolumeClickHandler;
-
 public:
-    SoundWidget( intf_thread_t  *_p_i, bool );
-
-private:
-    intf_thread_t       *p_intf;
-    QLabel              *volMuteLabel;
-    QAbstractSlider     *volumeSlider;
-    VolumeClickHandler  *hVolLabel;
-    bool                 b_my_volume;
-
-protected slots:
-    void updateVolume( int );
-    void updateVolume( void );
+    AdvControlsWidget( intf_thread_t *, QWidget *_parent = 0 );
 };
 
-/* Advanced Button Bar */
-class AdvControlsWidget : public AbstractController
+/* Slider Bar */
+class InputControlsWidget : public AbstractController
 {
     Q_OBJECT
 public:
-    AdvControlsWidget( intf_thread_t * );
-    virtual ~AdvControlsWidget();
+    InputControlsWidget( intf_thread_t * , QWidget *_parent = 0 );
 };
 
 /* Button Bar */
@@ -206,13 +196,13 @@ 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 );
+    ControlsWidget( intf_thread_t *_p_i, bool b_advControls,
+                    QWidget *_parent = 0 );
     virtual ~ControlsWidget();
 
 protected:
     friend class MainInterface;
 
-    AdvControlsWidget   *advControls;
     bool                 b_advancedVisible;
 
 protected slots:
@@ -222,23 +212,14 @@ signals:
     void advancedControlsToggled( bool );
 };
 
-/* on WIN32 hide() for fullscreen controller doesnt work, so it have to be
-   done by trick with setting the opacity of window */
-#ifdef WIN32
-    #define WIN32TRICK
-#endif
 
 /* 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 */
-#ifndef WIN32
-    #define HAVE_TRANSPARENCY 1
-#else
-    #define HAVE_TRANSPARENCY 0
-#endif
+#define HAVE_TRANSPARENCY 1
 
 /* Default value of opacity for FS controller */
-#define DEFAULT_OPACITY 0.75
+#define DEFAULT_OPACITY 0.70
 
 /***********************************
  * Fullscreen controller
@@ -247,23 +228,25 @@ class FullscreenControllerWidget : public AbstractController
 {
     Q_OBJECT
 public:
-    FullscreenControllerWidget( intf_thread_t * );
+    FullscreenControllerWidget( intf_thread_t *, QWidget *_parent = 0  );
     virtual ~FullscreenControllerWidget();
 
     /* Vout */
-    vout_thread_t *p_vout;
-    void attachVout( vout_thread_t *p_vout );
-    void detachVout();
     void fullscreenChanged( vout_thread_t *, bool b_fs, int i_timeout );
+    void mouseChanged( vout_thread_t *, int i_mousex, int i_mousey );
 
-    int i_mouse_last_move_x;
-    int i_mouse_last_move_y;
+signals:
+    void keyPressed( QKeyEvent * );
+
+public slots:
+    void setVoutList( vout_thread_t **, int );
 
 protected:
     friend class MainInterface;
 
     virtual void mouseMoveEvent( QMouseEvent *event );
     virtual void mousePressEvent( QMouseEvent *event );
+    virtual void mouseReleaseEvent( QMouseEvent *event );
     virtual void enterEvent( QEvent *event );
     virtual void leaveEvent( QEvent *event );
     virtual void keyPressEvent( QKeyEvent *event );
@@ -271,8 +254,9 @@ protected:
 private slots:
     void showFSC();
     void planHideFSC();
-    void hideFSC();
+    void hideFSC() { hide(); }
     void slowHideFSC();
+    void centerFSC( int );
 
 private:
     virtual void customEvent( QEvent *event );
@@ -287,15 +271,17 @@ private:
     int i_mouse_last_x, i_mouse_last_y;
     bool b_mouse_over;
     int i_screennumber;
+    QRect screenRes;
 
-#ifdef WIN32TRICK
-    bool b_fscHidden;
-#endif
+    /* 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;
 };
 
 #endif