[vlc-devel] [PATCH 1/2] qt: enable windowed playlist

Abel Tesfaye abeltesfaye45 at gmail.com
Wed Jul 3 08:48:02 CEST 2019


Both patches are resends.

On Wed, 3 Jul 2019 at 09:47, Abel Tesfaye <abeltesfaye45 at gmail.com> wrote:

> From: Abel Tesfaye <Abeltesfaye45 at gmail.com>
>
> fixes #22173
> ---
>  modules/gui/qt/main_interface.cpp             | 14 +++++++
>  modules/gui/qt/main_interface.hpp             |  9 +++++
>  modules/gui/qt/qml/BannerSources.qml          | 16 +++++---
>  modules/gui/qt/qml/MainInterface.qml          | 15 ++++++++
>  .../gui/qt/qml/mediacenter/MCMainDisplay.qml  | 38 ++++++++-----------
>  modules/gui/qt/qml/menus/ViewMenu.qml         | 11 ++++++
>  modules/gui/qt/qml/player/ControlBar.qml      |  2 +
>  modules/gui/qt/qml/player/ModalControlBar.qml |  3 --
>  modules/gui/qt/qml/player/Player.qml          | 30 +++++++--------
>  9 files changed, 91 insertions(+), 47 deletions(-)
>
> diff --git a/modules/gui/qt/main_interface.cpp
> b/modules/gui/qt/main_interface.cpp
> index 029a9f9d0b..b6c9219d53 100644
> --- a/modules/gui/qt/main_interface.cpp
> +++ b/modules/gui/qt/main_interface.cpp
> @@ -537,6 +537,20 @@ void MainInterface::setVideoOnTop( bool on_top )
>      }
>  }
>
> +void MainInterface::setPlaylistDocked( bool docked )
> +{
> +    b_playlistDocked = docked;
> +
> +    emit playlistDockedChanged(docked);
> +}
> +
> +void MainInterface::setPlaylistVisible( bool visible )
> +{
> +    playlistVisible = visible;
> +
> +    emit playlistVisibleChanged(visible);
> +}
> +
>  void MainInterface::setInterfaceAlwaysOnTop( bool on_top )
>  {
>      b_interfaceOnTop = on_top;
> diff --git a/modules/gui/qt/main_interface.hpp
> b/modules/gui/qt/main_interface.hpp
> index 3ceb91b40f..61a11ec4bf 100644
> --- a/modules/gui/qt/main_interface.hpp
> +++ b/modules/gui/qt/main_interface.hpp
> @@ -63,6 +63,8 @@ class MainInterface : public QVLCMW
>  {
>      Q_OBJECT
>
> +    Q_PROPERTY(bool playlistDocked READ isPlaylistDocked WRITE
> setPlaylistDocked NOTIFY playlistDockedChanged)
> +    Q_PROPERTY(bool playlistVisible READ isPlaylistVisible WRITE
> setPlaylistVisible NOTIFY playlistVisibleChanged)
>      Q_PROPERTY(bool interfaceAlwaysOnTop READ isInterfaceAlwaysOnTop
> WRITE setInterfaceAlwaysOnTop NOTIFY interfaceAlwaysOnTopChanged)
>      Q_PROPERTY(bool interfaceFullScreen READ isInterfaceFullScreen WRITE
> setInterfaceFullScreen NOTIFY interfaceFullScreenChanged)
>      Q_PROPERTY(bool hasEmbededVideo READ hasEmbededVideo NOTIFY
> hasEmbededVideoChanged)
> @@ -111,6 +113,8 @@ public:
>          RAISE_AUDIOVIDEO,
>      };
>      bool isInterfaceFullScreen() { return b_interfaceFullScreen; }
> +    bool isPlaylistDocked() { return b_playlistDocked; }
> +    bool isPlaylistVisible() { return playlistVisible; }
>      bool isInterfaceAlwaysOnTop() { return b_interfaceOnTop; }
>      bool hasEmbededVideo() { return m_hasEmbededVideo; }
>      QList<QQmlError> qmlErrors() const;
> @@ -171,6 +175,7 @@ protected:
>      bool                 b_videoFullScreen;     ///< --fullscreen
>      bool                 b_hideAfterCreation;
>      bool                 b_minimalView;         ///< Minimal video
> +    bool                 b_playlistDocked;
>      bool                 b_interfaceFullScreen;
>      bool                 b_interfaceOnTop;      ///keep UI on top
>      bool                 b_pauseOnMinimize;
> @@ -196,6 +201,8 @@ public slots:
>      void showUpdateSystrayMenu();
>      void hideUpdateSystrayMenu();
>      void toggleInterfaceFullScreen();
> +    void setPlaylistDocked( bool );
> +    void setPlaylistVisible( bool );
>      void setInterfaceAlwaysOnTop( bool );
>
>      void emitBoss();
> @@ -242,6 +249,8 @@ signals:
>      void askPopupMenu( bool show );
>      void kc_pressed(); /* easter eggs */
>
> +    void playlistDockedChanged(bool);
> +    void playlistVisibleChanged(bool);
>      void interfaceAlwaysOnTopChanged(bool);
>      void interfaceFullScreenChanged(bool);
>      void hasEmbededVideoChanged(bool);
> diff --git a/modules/gui/qt/qml/BannerSources.qml
> b/modules/gui/qt/qml/BannerSources.qml
> index 67d99dae57..e6acb42c93 100644
> --- a/modules/gui/qt/qml/BannerSources.qml
> +++ b/modules/gui/qt/qml/BannerSources.qml
> @@ -352,7 +352,7 @@ Utils.NavigableFocusScope {
>                              size: VLCStyle.icon_normal
>                              text: VLCIcons.playlist
>
> -                            onClicked: root.toogleMenu()
> +                            onClicked: rootWindow.playlistVisible =
> !rootWindow.playlistVisible
>
>                              KeyNavigation.right: menu_selector
>                              KeyNavigation.up: buttonView
> @@ -364,14 +364,17 @@ Utils.NavigableFocusScope {
>                              size: VLCStyle.icon_normal
>                              text: VLCIcons.menu
>
> +                            KeyNavigation.left: playlist_btn
> +                            KeyNavigation.right: playlist
> +
>                              onClicked: mainMenu.openBelow(this)
>
> -                            Menus.MainDropdownMenu {
> -                                id: mainMenu
> -                                onClosed: menu_selector.forceActiveFocus()
> +                        Menus.MainDropdownMenu {
> +                            id: mainMenu
> +                            onClosed: {
> +                                if (mainMenu.activeFocus)
> +                                    menu_selector.forceActiveFocus()
>                              }
> -
> -                            KeyNavigation.up: buttonView
>                          }
>                      }
>                  }
> @@ -413,3 +416,4 @@ Utils.NavigableFocusScope {
>              defaultKeyAction(event, 0)
>      }
>  }
> +}
> diff --git a/modules/gui/qt/qml/MainInterface.qml
> b/modules/gui/qt/qml/MainInterface.qml
> index 0d23bc068b..e898d9a5d3 100644
> --- a/modules/gui/qt/qml/MainInterface.qml
> +++ b/modules/gui/qt/qml/MainInterface.qml
> @@ -27,11 +27,26 @@ import "qrc:///style/"
>  import "qrc:///player/" as Player
>  import "qrc:///about/" as AB
>  import "qrc:///dialogs/" as DG
> +import "qrc:///playlist/" as PL
> +import QtQuick.Window 2.11
>
>  Rectangle {
>      id: root
>      color: "transparent"
>
> +    Window {
> +        id: playlistWindow
> +        visible: !rootWindow.playlistDocked && rootWindow.playlistVisible
> +        title: qsTr("Playlist")
> +        color: VLCStyle.colors.bg
> +        onClosing: rootWindow.playlistVisible = false
> +        PL.PlaylistListView {
> +            id: playlistView
> +            focus: true
> +            anchors.fill: parent
> +        }
> +    }
> +
>      PlaylistControllerModel {
>          id: mainPlaylistController
>          playlistPtr: mainctx.playlist
> diff --git a/modules/gui/qt/qml/mediacenter/MCMainDisplay.qml
> b/modules/gui/qt/qml/mediacenter/MCMainDisplay.qml
> index a7cfaa2252..25b78d4cde 100644
> --- a/modules/gui/qt/qml/mediacenter/MCMainDisplay.qml
> +++ b/modules/gui/qt/qml/mediacenter/MCMainDisplay.qml
> @@ -88,7 +88,7 @@ Utils.NavigableFocusScope {
>              focus: true
>              id: medialibId
>              anchors.fill: parent
> -            onActionRight: playlist.show()
> +            onActionRight: rootWindow.playlistVisible = true
>
>              ColumnLayout {
>                  id: column
> @@ -135,8 +135,6 @@ Utils.NavigableFocusScope {
>                      onActionRight: root.actionRight(index)
>                      onActionUp: root.actionUp(index)
>                      onActionCancel: root.actionCancel(index)
> -
> -                    onToogleMenu: playlist.toggleState()
>                  }
>
>                  Utils.StackViewExt {
> @@ -169,7 +167,11 @@ Utils.NavigableFocusScope {
>                          focus: false
>                          expandHorizontally: true
>
> -                        state: "hidden"
> +                        state: (rootWindow.playlistDocked &&
> rootWindow.playlistVisible) ? "visible" : "hidden"
> +                        onVisibleChanged: {
> +                            if (playlist.visible)
> +                                playlist.forceActiveFocus()
> +                        }
>                          component: Rectangle {
>                              color:
> VLCStyle.colors.setColorAlpha(VLCStyle.colors.banner, 0.9)
>                              width: root.width/3
> @@ -186,28 +188,18 @@ Utils.NavigableFocusScope {
>                                      id: playlistView
>                                      focus: true
>                                      anchors.fill: parent
> -                                    onActionLeft: playlist.quit()
> -                                    onActionCancel: playlist.quit()
> -                                    onActionUp: {
> -                                        playlist.state = "hidden"
> -                                        sourcesBanner.forceActiveFocus()
> -                                    }
> +                                    onActionLeft:
> playlist.closeAndFocus(stackView.currentItem)
> +                                    onActionCancel:
> playlist.closeAndFocus(stackView.currentItem)
> +                                    onActionUp:
> playlist.closeAndFocus(sourcesBanner)
>                                  }
>                              }
>                          }
> -                        function toggleState() {
> -                            if (state === "hidden")
> -                                show()
> -                            else
> -                                quit()
> -                        }
> -                        function quit() {
> -                            state = "hidden"
> -                            stackView.currentItem.forceActiveFocus()
> -                        }
> -                        function show() {
> -                            state = "visible"
> -                            playlist.forceActiveFocus()
> +                        function closeAndFocus(item){
> +                            if (!item)
> +                                return
> +
> +                            rootWindow.playlistVisible = false
> +                            item.forceActiveFocus()
>                          }
>                      }
>                  }
> diff --git a/modules/gui/qt/qml/menus/ViewMenu.qml
> b/modules/gui/qt/qml/menus/ViewMenu.qml
> index 7a58605092..f8fd0abf2b 100644
> --- a/modules/gui/qt/qml/menus/ViewMenu.qml
> +++ b/modules/gui/qt/qml/menus/ViewMenu.qml
> @@ -22,6 +22,17 @@ import "qrc:///style/"
>  import "qrc:///utils/" as Utils
>
>  Utils.MenuExt {
> +    id: viewMenu
> +    Action {
> +        text: qsTr("Play&list")
> +        onTriggered: rootWindow.playlistVisible =
> !rootWindow.playlistVisible
> +    }
> +    Action {
> +        text: qsTr("Docked Playlist")
> +        checkable: true
> +        checked: rootWindow.playlistDocked
> +        onTriggered: rootWindow.playlistDocked =
> !rootWindow.playlistDocked
> +    }
>      Action {
>          text: qsTr("&Always on Top")
>          checkable: true
> diff --git a/modules/gui/qt/qml/player/ControlBar.qml
> b/modules/gui/qt/qml/player/ControlBar.qml
> index 76399d488d..6d17375e13 100644
> --- a/modules/gui/qt/qml/player/ControlBar.qml
> +++ b/modules/gui/qt/qml/player/ControlBar.qml
> @@ -26,6 +26,7 @@ import org.videolan.vlc 0.1
>  import "qrc:///style/"
>  import "qrc:///utils/" as Utils
>  import "qrc:///menus/" as Menus
> +import "qrc:///playlist/" as PL
>
>
>  Utils.NavigableFocusScope {
> @@ -121,6 +122,7 @@ Utils.NavigableFocusScope {
>                                  if (buttonindex > 0)
>                                      buttonloader.item.KeyNavigation.left
> = buttonrow.children[buttonindex-1].item
>
> +
>                              }
>                          }
>                      }
> diff --git a/modules/gui/qt/qml/player/ModalControlBar.qml
> b/modules/gui/qt/qml/player/ModalControlBar.qml
> index d534c8cdd0..a8e0d5ebeb 100644
> --- a/modules/gui/qt/qml/player/ModalControlBar.qml
> +++ b/modules/gui/qt/qml/player/ModalControlBar.qml
> @@ -26,8 +26,6 @@ import "qrc:///utils/" as Utils
>
>  Utils.NavigableFocusScope {
>      id: root
> -    signal showPlaylist();
> -
>      property bool showPlaylistButton: false
>
>      property bool forceNoAutoHide: false
> @@ -41,7 +39,6 @@ Utils.NavigableFocusScope {
>              showPlaylistButton: root.showPlaylistButton
>
>              onShowTrackBar: root.state = "tracks"
> -            onShowPlaylist: root.showPlaylist()
>
>              onActionUp: root.actionUp(index)
>              onActionDown: root.actionDown(index)
> diff --git a/modules/gui/qt/qml/player/Player.qml
> b/modules/gui/qt/qml/player/Player.qml
> index 403b8650ed..7beb818947 100644
> --- a/modules/gui/qt/qml/player/Player.qml
> +++ b/modules/gui/qt/qml/player/Player.qml
> @@ -125,7 +125,11 @@ Utils.NavigableFocusScope {
>          }
>          focus: false
>          expandHorizontally: true
> -
> +        state: (rootWindow.playlistDocked && rootWindow.playlistVisible)
> ? "visible" : "hidden"
> +        onVisibleChanged: {
> +            if (playlistpopup.visible)
> +                playlistpopup.forceActiveFocus()
> +        }
>          component: Rectangle {
>              color: VLCStyle.colors.setColorAlpha(VLCStyle.colors.banner,
> 0.8)
>              width: root.width/4
> @@ -135,18 +139,22 @@ Utils.NavigableFocusScope {
>                  id: playlistView
>                  focus: true
>                  anchors.fill: parent
> -                onActionLeft: playlistpopup.quit()
> -                onActionCancel: playlistpopup.quit()
> +                onActionLeft: playlistpopup.closeAndFocus(controlBarView)
> +                onActionCancel:
> playlistpopup.closeAndFocus(controlBarView)
>              }
>          }
> -        function quit() {
> -            state = "hidden"
> -            controlBarView.focus = true
> -        }
>          onStateChanged: {
>              if (state === "hidden")
>                  toolbarAutoHide.restart()
>          }
> +
> +        function closeAndFocus(item){
> +            if (!item)
> +                return
> +
> +            rootWindow.playlistVisible = false
> +            item.forceActiveFocus()
> +        }
>      }
>
>
> @@ -193,14 +201,6 @@ Utils.NavigableFocusScope {
>                      onActionLeft: root.actionLeft(index)
>                      onActionRight: root.actionRight(index)
>                      onActionCancel: root.actionCancel(index)
> -                    onShowPlaylist: {
> -                        if (playlistpopup.state === "visible") {
> -                            playlistpopup.state = "hidden"
> -                        } else {
> -                            playlistpopup.state = "visible"
> -                            playlistpopup.focus = true
> -                        }
> -                    }
>
>                      //unhandled keys are forwarded to the vout window
>                      Keys.forwardTo: videoSurface
> --
> 2.21.0
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20190703/64c0dcf5/attachment.html>


More information about the vlc-devel mailing list