[vlc-devel] [PATCH] Implemented a TODO Import/Export feature in Bookmarks dialog
Thomas Guillem
thomas at gllm.fr
Tue Apr 2 17:22:26 CEST 2019
Hello,
The bookmark feature will be soon dropped from QT when we will merge the new UI. It can be found here: https://github.com/tguillem/vlc/commits/qml/39
There is an open task to implement it into the new medialibrary
On Tue, Apr 2, 2019, at 16:49, Abel Tesfaye wrote:
> I found an un-implemented function in the bookmarks dialog(made by
> Antoine Lejeune: phytos ~11 years ago) which I guess is supposed to
> export the bookmarks to a file. I implemented the function plus added
> an import feature.
> ---
> modules/gui/qt/dialogs/bookmarks.cpp | 171
> ++++++++++++++++++++++++++++++++---
> modules/gui/qt/dialogs/bookmarks.hpp | 6 +-
> 2 files changed, 164 insertions(+), 13 deletions(-)
>
> diff --git a/modules/gui/qt/dialogs/bookmarks.cpp
> b/modules/gui/qt/dialogs/bookmarks.cpp
> index 78d50b3..85ac73b 100644
> --- a/modules/gui/qt/dialogs/bookmarks.cpp
> +++ b/modules/gui/qt/dialogs/bookmarks.cpp
> @@ -32,6 +32,13 @@
> #include <QPushButton>
> #include <QDialogButtonBox>
> #include <QModelIndexList>
> +#include <QFile>
> +#include <QFileDialog>
> +#include <QJsonArray>
> +#include <QJsonDocument>
> +#include <QJsonObject>
> +#include <QJsonValue>
> +#include <QMessageBox>
>
> BookmarksDialog::BookmarksDialog( intf_thread_t *_p_intf ):QVLCFrame(
> _p_intf )
> {
> @@ -53,11 +60,15 @@ BookmarksDialog::BookmarksDialog( intf_thread_t
> *_p_intf ):QVLCFrame( _p_intf )
> clearButton = new QPushButton( qtr( "Clear" ) );
> clearButton->setToolTip( qtr( "Delete all the bookmarks" ) );
> buttonsBox->addButton( clearButton, QDialogButtonBox::ResetRole );
> -#if 0
> - QPushButton *extractButton = new QPushButton( qtr( "Extract" ) );
> - extractButton->setToolTip( qtr() );
> - buttonsBox->addButton( extractButton, QDialogButtonBox::ActionRole
> );
> -#endif
> + exportButton = new QPushButton(qtr("Export"));
> + exportButton->setToolTip(
> + qtr("Exports all bookmarks into a VLCBookmark file"));
> + buttonsBox->addButton(exportButton, QDialogButtonBox::ResetRole);
> + importButton = new QPushButton(qtr("Import"));
> + importButton->setToolTip(qtr("Imports bookmarks from a VLCBookmark
> file"));
> + buttonsBox->addButton(importButton, QDialogButtonBox::ResetRole);
> +
> +
> /* ?? Feels strange as Qt guidelines will put reject on top */
> buttonsBox->addButton( new QPushButton( qtr( "&Close" ) ),
> QDialogButtonBox::RejectRole);
> @@ -96,10 +107,9 @@ BookmarksDialog::BookmarksDialog( intf_thread_t
> *_p_intf ):QVLCFrame( _p_intf )
> BUTTONACT( addButton, add() );
> BUTTONACT( delButton, del() );
> BUTTONACT( clearButton, clear() );
> + BUTTONACT(exportButton, exportBookmarks());
> + BUTTONACT(importButton, importBookmarks());
>
> -#if 0
> - BUTTONACT( extractButton, extract() );
> -#endif
> CONNECT( buttonsBox, rejected(), this, close() );
> updateButtons();
>
> @@ -114,8 +124,11 @@ BookmarksDialog::~BookmarksDialog()
>
> void BookmarksDialog::updateButtons()
> {
> - clearButton->setEnabled( bookmarksList->model()->rowCount() > 0 );
> - delButton->setEnabled( bookmarksList->selectionModel()->hasSelection() );
> + bool isListPopulated = bookmarksList->model()->rowCount() > 0;
> + clearButton->setEnabled(isListPopulated);
> + exportButton->setEnabled(isListPopulated);
> +
> + delButton->setEnabled(bookmarksList->selectionModel()->hasSelection());
> }
>
> void BookmarksDialog::update()
> @@ -266,9 +279,143 @@ clear:
> free( pp_bookmarks );
> }
>
> -void BookmarksDialog::extract()
> +void BookmarksDialog::alert(QString msg)
> {
> - // TODO
> + QMessageBox Msgbox;
> + Msgbox.setText(msg);
> + Msgbox.exec();
> +}
> +
> +void BookmarksDialog::importBookmarks()
> +{
> + input_thread_t *p_input = THEMIM->getInput();
> + if (!p_input)
> + return;
> +
> + QString openVLCBFileName = QFileDialog::getOpenFileName(
> + this, "Open VLC Bookmark File", "./",
> + "VLC Bookmark Files (*.VLCBookmark *.VLCB);;All files(*)");
> +
> + if (openVLCBFileName.length() < 1)
> + return;
> + clear();
> + seekpoint_t bookmark;
> +
> + QString inStr;
> + QFile file;
> +
> + file.setFileName(openVLCBFileName);
> + if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
> + {
> + alert("Could not open file");
> + return;
> + }
> +
> + inStr = file.readAll();
> + file.close();
> +
> + QJsonDocument jsonDocument =
> QJsonDocument::fromJson(inStr.toUtf8());
> +
> + if (!jsonDocument.isObject())
> + {
> + alert("Error parsing object from file");
> + return;
> + }
> +
> + QJsonObject jsonObject = jsonDocument.object();
> +
> + if (!jsonObject["bookmarks"].isArray())
> + {
> + alert("Error parsing bookmarks array");
> + return;
> + }
> +
> + QJsonArray bookmarkArray = jsonObject["bookmarks"].toArray();
> +
> + for (int i_index = 0; i_index < bookmarkArray.size(); i_index++)
> + {
> + const QJsonValue &value = bookmarkArray[i_index];
> +
> + if (!value.isObject())
> + {
> + alert("Error parsing bookmark at index: " + i_index);
> + return;
> + }
> + QJsonObject bookmarkObject = value.toObject();
> +
> + QString bookmarkDescription = "";
> + vlc_tick_t seekTime = 0;
> +
> + bookmarkDescription = bookmarkObject["description"].toString();
> + seekTime = bookmarkObject["time"].toInt();
> +
> + QByteArray raw = bookmarkDescription.toUtf8();
> +
> + bookmark.psz_name = raw.data();
> + bookmark.i_time_offset = seekTime;
> +
> + input_Control(p_input, INPUT_ADD_BOOKMARK, &bookmark);
> + }
> +}
> +
> +void BookmarksDialog::exportBookmarks()
> +{
> + input_thread_t *p_input = THEMIM->getInput();
> + if (!p_input)
> + return;
> +
> + QString saveVLCBFileName = QFileDialog::getSaveFileName(
> + this, "Save VLC Bookmark File",
> + "./" + THEMIM->getIM()->getName() + "_bookmarks.VLCB",
> + "VLC Bookmark Files (*.VLCBookmark *.VLCB);;All files(*)");
> +
> + if (saveVLCBFileName.length() < 1)
> + return;
> +
> + QFile file;
> +
> + file.setFileName(saveVLCBFileName);
> + if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
> + {
> + alert("Could not open file");
> + return;
> + }
> +
> + QJsonArray bookmarkArray;
> +
> + bookmarksList->selectAll();
> + QModelIndexList selected =
> bookmarksList->selectionModel()->selectedRows();
> + if (selected.empty())
> + {
> + alert("No bookmark to export!");
> + return;
> + }
> +
> + seekpoint_t **pp_bookmarks;
> + seekpoint_t bookmark;
> + int i_index;
> +
> + if (input_Control(p_input, INPUT_GET_BOOKMARKS, &pp_bookmarks,
> &i_index) != VLC_SUCCESS)
> + return;
> +
> + for (int i_index = 0; i_index < selected.size(); i_index++)
> + {
> + bookmark = (*pp_bookmarks[i_index]);
> +
> + QJsonObject bookmarkObject;
> + bookmarkObject.insert("description", bookmark.psz_name);
> + bookmarkObject.insert("time", (long
> long)bookmark.i_time_offset);
> +
> + bookmarkArray.push_back(bookmarkObject);
> + }
> +
> + QJsonObject outObject;
> + outObject.insert("bookmarks", bookmarkArray);
> +
> + QJsonDocument jsonDocument(outObject);
> +
> + file.write(jsonDocument.toJson());
> + file.close();
> }
>
> void BookmarksDialog::activateItem( QModelIndex index )
> diff --git a/modules/gui/qt/dialogs/bookmarks.hpp
> b/modules/gui/qt/dialogs/bookmarks.hpp
> index 2551dd6..9b37cb5 100644
> --- a/modules/gui/qt/dialogs/bookmarks.hpp
> +++ b/modules/gui/qt/dialogs/bookmarks.hpp
> @@ -43,6 +43,8 @@ private:
> QTreeWidget *bookmarksList;
> QPushButton *clearButton;
> QPushButton *delButton;
> + QPushButton *exportButton;
> + QPushButton *importButton;
> bool b_ignore_updates;
>
> private slots:
> @@ -51,9 +53,11 @@ private slots:
> void del();
> void clear();
> void edit( QTreeWidgetItem *item, int column );
> - void extract();
> + void exportBookmarks();
> + void importBookmarks();
> void activateItem( QModelIndex index );
> void updateButtons();
> + void alert(QString);
>
> friend class Singleton<BookmarksDialog>;
> };
> --
> 2.7.4
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
More information about the vlc-devel
mailing list