[vlc-devel] [PATCH 06/17] qt: Create PlaylistsDialog
Benjamin Arnaud
benjamin.arnaud at videolabs.io
Fri Feb 19 10:25:30 UTC 2021
---
modules/gui/qt/Makefile.am | 2 +
.../gui/qt/dialogs/playlists/playlists.cpp | 224 ++++++++++++++++++
.../gui/qt/dialogs/playlists/playlists.hpp | 78 ++++++
po/POTFILES.in | 2 +
4 files changed, 306 insertions(+)
create mode 100644 modules/gui/qt/dialogs/playlists/playlists.cpp
create mode 100644 modules/gui/qt/dialogs/playlists/playlists.hpp
diff --git a/modules/gui/qt/Makefile.am b/modules/gui/qt/Makefile.am
index 6057040f99..7de2b03424 100644
--- a/modules/gui/qt/Makefile.am
+++ b/modules/gui/qt/Makefile.am
@@ -114,6 +114,7 @@ libqt_plugin_la_SOURCES = \
gui/qt/dialogs/sout/sout_widgets.hpp \
gui/qt/dialogs/toolbar/toolbareditor.cpp gui/qt/dialogs/toolbar/toolbareditor.hpp \
gui/qt/dialogs/vlm/vlm.cpp gui/qt/dialogs/vlm/vlm.hpp \
+ gui/qt/dialogs/playlists/playlists.cpp gui/qt/dialogs/playlists/playlists.hpp \
gui/qt/maininterface/compositor.hpp \
gui/qt/maininterface/compositor.cpp \
gui/qt/maininterface/compositor_dummy.hpp \
@@ -314,6 +315,7 @@ nodist_libqt_plugin_la_SOURCES = \
gui/qt/dialogs/sout/sout.moc.cpp \
gui/qt/dialogs/sout/sout_widgets.moc.cpp \
gui/qt/dialogs/toolbar/toolbareditor.moc.cpp \
+ gui/qt/dialogs/playlists/playlists.moc.cpp \
gui/qt/maininterface/compositor_dummy.moc.cpp \
gui/qt/maininterface/interface_window_handler.moc.cpp \
gui/qt/maininterface/main_interface.moc.cpp \
diff --git a/modules/gui/qt/dialogs/playlists/playlists.cpp b/modules/gui/qt/dialogs/playlists/playlists.cpp
new file mode 100644
index 0000000000..0bff47f81a
--- /dev/null
+++ b/modules/gui/qt/dialogs/playlists/playlists.cpp
@@ -0,0 +1,224 @@
+/*****************************************************************************
+ * playlists.cpp : Playlists
+ ****************************************************************************
+ * Copyright (C) 2021 the VideoLAN team
+ *
+ * Authors: Benjamin Arnaud <bunjee at omega.gg>
+ *
+ * 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 "playlists.hpp"
+
+// VLC includes
+#include <vlc_media_library.h>
+#include <maininterface/main_interface.hpp>
+#include <medialibrary/mlplaylistlistmodel.hpp>
+#include <medialibrary/mlqmltypes.hpp>
+
+// Qt includes
+#include <QGroupBox>
+#include <QVBoxLayout>
+#include <QTreeView>
+#include <QLabel>
+#include <QLineEdit>
+#include <QDialogButtonBox>
+#include <QPushButton>
+
+//-------------------------------------------------------------------------------------------------
+// Ctor / dtor
+//-------------------------------------------------------------------------------------------------
+
+PlaylistsDialog::PlaylistsDialog(intf_thread_t * _p_intf) : QVLCFrame(_p_intf)
+{
+ MainInterface * mainInterface = p_intf->p_sys->p_mi;
+
+ assert(mainInterface->hasMediaLibrary());
+
+ setWindowFlags(Qt::Tool);
+
+ setWindowRole("vlc-playlists");
+
+ setWindowTitle(qtr("Add to Playlist"));
+
+ setWindowOpacity(var_InheritFloat(p_intf, "qt-opacity"));
+
+ //---------------------------------------------------------------------------------------------
+ // Existing Playlists
+
+ QGroupBox * groupBox = new QGroupBox(qtr("Existing Playlist"));
+
+ m_playlists = new QTreeView(this);
+
+ connect(m_playlists, &QTreeView::clicked, this, &PlaylistsDialog::onClicked);
+ connect(m_playlists, &QTreeView::doubleClicked, this, &PlaylistsDialog::onDoubleClicked);
+
+ m_model = new MLPlaylistListModel(vlc_ml_instance_get(_p_intf), m_playlists);
+
+ m_model->setMl(mainInterface->getMediaLibrary());
+
+ m_playlists->setModel(m_model);
+
+ QVBoxLayout * layoutPlaylists = new QVBoxLayout(groupBox);
+
+ layoutPlaylists->addWidget(m_playlists);
+
+ //---------------------------------------------------------------------------------------------
+ // New Playlist
+
+ QLabel * labelNew = new QLabel(this);
+
+ labelNew->setText(qtr("New Playlist"));
+
+ // FIXME: Add and configure a QValidator.
+ m_lineEdit = new QLineEdit(this);
+
+ connect(m_lineEdit, &QLineEdit::textEdited, this, &PlaylistsDialog::onTextEdited);
+
+ QHBoxLayout * layoutNew = new QHBoxLayout;
+
+ layoutNew->addWidget(labelNew);
+ layoutNew->addWidget(m_lineEdit);
+
+ //---------------------------------------------------------------------------------------------
+ // Buttons
+
+ QDialogButtonBox * buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok |
+ QDialogButtonBox::Cancel,
+ Qt::Horizontal, this);
+
+ m_button = buttonBox->button(QDialogButtonBox::Ok);
+
+ m_button->setEnabled(false);
+
+ connect(buttonBox, &QDialogButtonBox::accepted, this, &PlaylistsDialog::onAccepted);
+ connect(buttonBox, &QDialogButtonBox::rejected, this, &PlaylistsDialog::close);
+
+ m_label = new QLabel(this);
+
+ QHBoxLayout * layoutButtons = new QHBoxLayout;
+
+ layoutButtons->addWidget(m_label);
+ layoutButtons->addWidget(buttonBox);
+
+ //---------------------------------------------------------------------------------------------
+
+ QVBoxLayout * layout = new QVBoxLayout(this);
+
+ layout->addWidget(groupBox);
+ layout->addLayout(layoutNew);
+ layout->addLayout(layoutButtons);
+
+ // FIXME: Is this the right default size ?
+ restoreWidgetPosition("Playlists", QSize(320, 320));
+
+ updateGeometry();
+}
+
+PlaylistsDialog::~PlaylistsDialog() /* override */
+{
+ saveWidgetPosition("Playlists");
+}
+
+//-------------------------------------------------------------------------------------------------
+// Interface
+//-------------------------------------------------------------------------------------------------
+
+/* Q_INVOKABLE */ void PlaylistsDialog::setMedias(const QVariantList & medias)
+{
+ m_ids = medias;
+
+ m_label->setText(qtr("%1 Media(s)").arg(m_ids.count()));
+}
+
+//-------------------------------------------------------------------------------------------------
+// Events
+//-------------------------------------------------------------------------------------------------
+
+void PlaylistsDialog::hideEvent(QHideEvent *) /* override */
+{
+ // NOTE: We clear the lineEdit when hiding the dialog.
+ m_lineEdit->clear();
+}
+
+void PlaylistsDialog::keyPressEvent(QKeyEvent * event) /* override */
+{
+ int key = event->key();
+
+ // FIXME: For some reason we have to do this manually on here. Shouldn't QDialogButtonBox do
+ // this automatically ?
+ if (key == Qt::Key_Return || key == Qt::Key_Enter)
+ {
+ if (m_button->isEnabled())
+ onAccepted();
+
+ return;
+ }
+
+ QVLCFrame::keyPressEvent(event);
+}
+
+//-------------------------------------------------------------------------------------------------
+// Private slots
+//-------------------------------------------------------------------------------------------------
+
+void PlaylistsDialog::onClicked()
+{
+ // NOTE: We clear the lineEdit when the list is selected.
+ m_lineEdit->clear();
+
+ m_button->setEnabled(true);
+}
+
+void PlaylistsDialog::onDoubleClicked()
+{
+ if (m_button->isEnabled() == false)
+ return;
+
+ onAccepted();
+}
+
+//-------------------------------------------------------------------------------------------------
+
+void PlaylistsDialog::onTextEdited()
+{
+ // NOTE: We clear the list selection when we edit the 'new playlist' field.
+ m_playlists->clearSelection();
+
+ if (m_lineEdit->text().isEmpty())
+ m_button->setEnabled(false);
+ else
+ m_button->setEnabled(true);
+}
+
+void PlaylistsDialog::onAccepted()
+{
+ MLItemId id;
+
+ QString text = m_lineEdit->text();
+
+ if (text.isEmpty())
+ id = m_model->getItemId(m_playlists->currentIndex().row());
+ else
+ id = m_model->create(text);
+
+ m_model->append(id, m_ids);
+
+ close();
+}
diff --git a/modules/gui/qt/dialogs/playlists/playlists.hpp b/modules/gui/qt/dialogs/playlists/playlists.hpp
new file mode 100644
index 0000000000..3d33f988ff
--- /dev/null
+++ b/modules/gui/qt/dialogs/playlists/playlists.hpp
@@ -0,0 +1,78 @@
+/*****************************************************************************
+ * playlists.hpp : playlists
+ ****************************************************************************
+ * Copyright (C) 2021 the VideoLAN team
+ *
+ * Authors: Benjamin Arnaud <bunjee at omega.gg>
+ *
+ * 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_PLAYLISTS_H_
+#define QVLC_PLAYLISTS_H_ 1
+
+// VLC includes
+#include <widgets/native/qvlcframe.hpp>
+#include <util/singleton.hpp>
+
+// Forward declarations
+class MLPlaylistListModel;
+class QTreeView;
+class QLineEdit;
+class QLabel;
+class QPushButton;
+
+class PlaylistsDialog : public QVLCFrame, public Singleton<PlaylistsDialog>
+{
+ Q_OBJECT
+
+private: // Ctor / dtor
+ PlaylistsDialog(intf_thread_t *);
+
+ ~PlaylistsDialog() override;
+
+public: // Interface
+ Q_INVOKABLE void setMedias(const QVariantList & medias);
+
+protected: // Events
+ void hideEvent(QHideEvent * event) override;
+
+ void keyPressEvent(QKeyEvent * event) override;
+
+private slots:
+ void onClicked ();
+ void onDoubleClicked();
+
+ void onTextEdited();
+
+ void onAccepted();
+
+private:
+ QVariantList m_ids;
+
+ MLPlaylistListModel * m_model;
+
+ QTreeView * m_playlists;
+ QLineEdit * m_lineEdit;
+
+ QLabel * m_label;
+
+ QPushButton * m_button;
+
+private:
+ friend class Singleton<PlaylistsDialog>;
+};
+
+#endif
diff --git a/po/POTFILES.in b/po/POTFILES.in
index a7870b93d0..7e525cd659 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -760,6 +760,8 @@ modules/gui/qt/dialogs/dialogs_provider.cpp
modules/gui/qt/dialogs/dialogs_provider.hpp
modules/gui/qt/dialogs/extensions/extensions_manager.cpp
modules/gui/qt/dialogs/extensions/extensions_manager.hpp
+modules/gui/qt/dialogs/playlists/playlists.cpp
+modules/gui/qt/dialogs/playlists/playlists.hpp
modules/gui/qt/maininterface/main_interface.cpp
modules/gui/qt/maininterface/main_interface.hpp
modules/gui/qt/maininterface/main_interface_win32.cpp
--
2.25.1
More information about the vlc-devel
mailing list