<!DOCTYPE html><html><head><title></title><style type="text/css">p.MsoNormal,p.MsoNoSpacing{margin:0}</style></head><body><div><br></div><div><br></div><div>On Wed, Apr 24, 2019, at 12:17, Abel Tesfaye wrote:<br></div><blockquote type="cite" id="qt"><div dir="ltr"><div>Hello,<br></div><div><br></div><div>If the ML is an optional component then wouldn't the recents.cpp/hpp implementation be required as a fallback(incase ML isn't available)?<br></div></div></blockquote><div><br></div><div>I think so yes.<br></div><div><br></div><div>Here is my config:<br></div><div>Debian testing with Qt 5.11.3 on gnome-shell (via X11). But pierre could not reproduce it either with a similar config.<br></div><div> <br></div><blockquote type="cite" id="qt"><div dir="ltr"><div><br></div><div>Thanks<br></div></div><div><br></div><div class="qt-gmail_quote"><div class="qt-gmail_attr" dir="ltr">On Wed, 24 Apr 2019 at 11:32, Hugo Beauzée-Luyssen <<a href="mailto:hugo@beauzee.fr">hugo@beauzee.fr</a>> wrote:<br></div><blockquote style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0.8ex;border-left-color:rgb(204, 204, 204);border-left-style:solid;border-left-width:1px;padding-left:1ex;" class="qt-gmail_quote"><div>On Wed, Apr 24, 2019, at 10:03 AM, Thomas Guillem wrote:<br></div><div> > Hello Abel,<br></div><div> > <br></div><div> > I'm OK with your patches bug I got 2 issues (that could be fixed <br></div><div> > afterward in seperate commits)<br></div><div> >  <br></div><div> > - Entries are disapearing when I hover them with my mouse pointer, cf. <br></div><div> > <a rel="noreferrer" href="https://gllm.fr/~tom/vlc/vlc-recents-bug.png">https://gllm.fr/~tom/vlc/vlc-recents-bug.png</a> It seems that I'm the only <br></div><div> > one with this issue (Pierre could not reproduce it).<br></div><div> > <br></div><div> > - The name of the media should be displayed instead of the URI.<br></div><div> > <br></div><div> > Regards,<br></div><div> > <br></div><div> > On Tue, Apr 23, 2019, at 12:59, Abel Tesfaye wrote:<br></div><div> > > The sub menu located at media -> open recent media used to be empty. <br></div><div> > > This commit fixed that.<br></div><div> > > ---<br></div><div> > >  modules/gui/qt/Makefile.am                    |  3 +<br></div><div> > >  .../gui/qt/components/player_controller.cpp   |  3 +<br></div><div> > >  .../gui/qt/components/recent_media_model.cpp  | 97 +++++++++++++++++++<br></div><div> > >  .../gui/qt/components/recent_media_model.hpp  | 69 +++++++++++++<br></div><div> > >  modules/gui/qt/dialogs_provider.cpp           |  2 -<br></div><div> > >  modules/gui/qt/main_interface.cpp             |  3 +-<br></div><div> > >  modules/gui/qt/qml/menus/MainDropdownMenu.qml |  3 +-<br></div><div> > >  modules/gui/qt/qml/menus/MediaMenu.qml        | 36 ++++++-<br></div><div> > >  modules/gui/qt/recents.cpp                    |  1 +<br></div><div> > >  modules/gui/qt/recents.hpp                    |  9 +-<br></div><div> > >  10 files changed, 218 insertions(+), 8 deletions(-)<br></div><div> > >  create mode 100644 modules/gui/qt/components/recent_media_model.cpp<br></div><div> > >  create mode 100644 modules/gui/qt/components/recent_media_model.hpp<br></div><div> > > <br></div><div> > > diff --git a/modules/gui/qt/Makefile.am b/modules/gui/qt/Makefile.am<br></div><div> > > index 5f1498e7ad..203ded3d90 100644<br></div><div> > > --- a/modules/gui/qt/Makefile.am<br></div><div> > > +++ b/modules/gui/qt/Makefile.am<br></div><div> > > @@ -103,6 +103,8 @@ libqt_plugin_la_SOURCES = \<br></div><div> > >     gui/qt/components/controller.cpp gui/qt/components/controller.hpp \<br></div><div> > >     gui/qt/components/controller_widget.cpp \<br></div><div> > >     gui/qt/components/controller_widget.hpp \<br></div><div> > > +   gui/qt/components/recent_media_model.cpp  \<br></div><div> > > +   gui/qt/components/recent_media_model.hpp \<br></div><div> > >     gui/qt/components/voutwindow/videosurface.cpp \<br></div><div> > >     gui/qt/components/voutwindow/videosurface.hpp \<br></div><div> > >     gui/qt/components/voutwindow/qvoutwindow.cpp \<br></div><div> > > @@ -253,6 +255,7 @@ nodist_libqt_plugin_la_SOURCES = \<br></div><div> > >     gui/qt/components/controller.moc.cpp \<br></div><div> > >     gui/qt/components/controller_widget.moc.cpp \<br></div><div> > >     gui/qt/components/custom_menus.moc.cpp \<br></div><div> > > +   gui/qt/components/recent_media_model.moc.cpp \<br></div><div> > >     gui/qt/components/voutwindow/videosurface.moc.cpp \<br></div><div> > >     gui/qt/components/voutwindow/qvoutwindow.moc.cpp \<br></div><div> > >     gui/qt/components/voutwindow/qvoutwindowdummy.moc.cpp \<br></div><div> > > diff --git a/modules/gui/qt/components/player_controller.cpp <br></div><div> > > b/modules/gui/qt/components/player_controller.cpp<br></div><div> > > index 5a445d174c..cd8fc33b45 100644<br></div><div> > > --- a/modules/gui/qt/components/player_controller.cpp<br></div><div> > > +++ b/modules/gui/qt/components/player_controller.cpp<br></div><div> > > @@ -202,6 +202,9 @@ static  void <br></div><div> > > on_player_current_media_changed(vlc_player_t *, input_item_t *new_m<br></div><div> > >          that->UpdateName( newMediaPtr.get() );<br></div><div> > >          that->UpdateArt( newMediaPtr.get() );<br></div><div> > >          that->UpdateMeta( newMediaPtr.get() );<br></div><div> > > +<br></div><div> > > +        RecentsMRL::getInstance( that->p_intf )->addRecent( <br></div><div> > > newMediaPtr.get()->psz_uri );<br></div><div> > > +<br></div><div> > >          emit q->inputChanged( newMediaPtr != nullptr );<br></div><div> > >      });<br></div><div> > >  }<br></div><div> > > diff --git a/modules/gui/qt/components/recent_media_model.cpp <br></div><div> > > b/modules/gui/qt/components/recent_media_model.cpp<br></div><div> > > new file mode 100644<br></div><div> > > index 0000000000..447409ce20<br></div><div> > > --- /dev/null<br></div><div> > > +++ b/modules/gui/qt/components/recent_media_model.cpp<br></div><div> > > @@ -0,0 +1,97 @@<br></div><div> > > +/*****************************************************************************<br></div><div> > > + * Copyright (C) 2019 VLC authors and VideoLAN<br></div><div> > > + *<br></div><div> > > + * This program is free software; you can redistribute it and/or modify<br></div><div> > > + * it under the terms of the GNU General Public License as published by<br></div><div> > > + * the Free Software Foundation; either version 2 of the License, or<br></div><div> > > + * ( at your option ) any later version.<br></div><div> > > + *<br></div><div> > > + * This program is distributed in the hope that it will be useful,<br></div><div> > > + * but WITHOUT ANY WARRANTY; without even the implied warranty of<br></div><div> > > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the<br></div><div> > > + * GNU General Public License for more details.<br></div><div> > > + *<br></div><div> > > + * You should have received a copy of the GNU General Public License<br></div><div> > > + * along with this program; if not, write to the Free Software<br></div><div> > > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA <br></div><div> > > 02110-1301, USA.<br></div><div> > > + <br></div><div> > > *****************************************************************************/<br></div><div> > > +<br></div><div> > > +#include "recent_media_model.hpp"<br></div><div> > > +#include <cassert><br></div><div> > > +<br></div><div> > > +namespace {<br></div><div> > > +    enum Roles<br></div><div> > > +    {<br></div><div> > > +        MRLRole = Qt::UserRole<br></div><div> > > +    };<br></div><div> > > +}<br></div><div> > > +<br></div><div> > > +VLCRecentMediaModel::VLCRecentMediaModel(intf_thread_t *p_intf,QObject <br></div><div> > > *parent)<br></div><div> > > +    : QAbstractListModel(parent)<br></div><div> > > +{<br></div><div> > > +    assert(p_intf);<br></div><div> > > +    rmrl = RecentsMRL::getInstance(p_intf);<br></div><div> > > +<br></div><div> > > +    connect(rmrl, SIGNAL(saved()), this, SLOT(update()));<br></div><div> > > +    connect(this, SIGNAL(limitChanged()), this, SLOT(update()));<br></div><div> > > +<br></div><div> > > +    update();<br></div><div> > > +}<br></div><div> > > +<br></div><div> > > +int VLCRecentMediaModel::rowCount(QModelIndex const & ) const<br></div><div> > > +{<br></div><div> > > +    return items.count();<br></div><div> > > +}<br></div><div> > > +<br></div><div> > > +QVariant VLCRecentMediaModel::data(QModelIndex const &index, const int <br></div><div> > > role) const<br></div><div> > > +{<br></div><div> > > +    if (!index.isValid())<br></div><div> > > +        return {};<br></div><div> > > +    switch (role)<br></div><div> > > +    {<br></div><div> > > +        case MRLRole :<br></div><div> > > +            return QVariant::fromValue(items[index.row()]);<br></div><div> > > +        default :<br></div><div> > > +            return {};<br></div><div> > > +    }<br></div><div> > > +}<br></div><div> > > +<br></div><div> > > +QHash<int, QByteArray> VLCRecentMediaModel::roleNames() const<br></div><div> > > +{<br></div><div> > > +    QHash<int, QByteArray> roleNames;<br></div><div> > > +    roleNames.insert(MRLRole, "mrl");<br></div><div> > > +    return roleNames;<br></div><div> > > +}<br></div><div> > > +<br></div><div> > > +void VLCRecentMediaModel::clear()<br></div><div> > > +{<br></div><div> > > +    if (!items.isEmpty())<br></div><div> > > +    {<br></div><div> > > +        rmrl->clear();<br></div><div> > > +        update();<br></div><div> > > +    }<br></div><div> > > +}<br></div><div> > > +<br></div><div> > > +void VLCRecentMediaModel::update()<br></div><div> > > +{<br></div><div> > > +    beginResetModel();<br></div><div> > > +    items = rmrl->recentList().mid(0,i_limit);<br></div><div> > > +    endResetModel();<br></div><div> > > +}<br></div><div> > > +<br></div><div> > > +QStringList VLCRecentMediaModel::getItems()<br></div><div> > > +{<br></div><div> > > +    return items;<br></div><div> > > +}<br></div><div> > > +<br></div><div> > > +int VLCRecentMediaModel::getLimit() const<br></div><div> > > +{<br></div><div> > > +    return i_limit; <br></div><div> > > +}<br></div><div> > > +<br></div><div> > > +void VLCRecentMediaModel::setLimit(int l)<br></div><div> > > +{<br></div><div> > > +    i_limit = l;<br></div><div> > > +    update();<br></div><div> > > +    emit limitChanged();<br></div><div> > > +}<br></div><div> > > diff --git a/modules/gui/qt/components/recent_media_model.hpp <br></div><div> > > b/modules/gui/qt/components/recent_media_model.hpp<br></div><div> > > new file mode 100644<br></div><div> > > index 0000000000..c37fae9b77<br></div><div> > > --- /dev/null<br></div><div> > > +++ b/modules/gui/qt/components/recent_media_model.hpp<br></div><div> > > @@ -0,0 +1,69 @@<br></div><div> > > +/*****************************************************************************<br></div><div> > > + * Copyright (C) 2019 VLC authors and VideoLAN<br></div><div> > > + *<br></div><div> > > + * This program is free software; you can redistribute it and/or modify<br></div><div> > > + * it under the terms of the GNU General Public License as published by<br></div><div> > > + * the Free Software Foundation; either version 2 of the License, or<br></div><div> > > + * ( at your option ) any later version.<br></div><div> > > + *<br></div><div> > > + * This program is distributed in the hope that it will be useful,<br></div><div> > > + * but WITHOUT ANY WARRANTY; without even the implied warranty of<br></div><div> > > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the<br></div><div> > > + * GNU General Public License for more details.<br></div><div> > > + *<br></div><div> > > + * You should have received a copy of the GNU General Public License<br></div><div> > > + * along with this program; if not, write to the Free Software<br></div><div> > > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA <br></div><div> > > 02110-1301, USA.<br></div><div> > > + <br></div><div> > > *****************************************************************************/<br></div><div> > > +<br></div><div> > > +#ifndef VLC_RECENT_MEDIA_MODEL_HPP<br></div><div> > > +#define VLC_RECENT_MEDIA_MODEL_HPP<br></div><div> > > +<br></div><div> > > +#ifdef HAVE_CONFIG_H<br></div><div> > > +<br></div><div> > > +# include "config.h"<br></div><div> > > +<br></div><div> > > +#endif<br></div><div> > > +<br></div><div> > > +#include "qt.hpp"<br></div><div> > > +#include <QAbstractListModel><br></div><div> > > +<br></div><div> > > +#include <QObject><br></div><div> > > +#include <QStringList><br></div><div> > > +#include "recents.hpp"<br></div><div> > > +<br></div><div> > > +class VLCRecentMediaModel : public QAbstractListModel<br></div><div> > > +{<br></div><div> > > +    Q_OBJECT<br></div><div> > > +    Q_PROPERTY(int limit READ getLimit WRITE setLimit NOTIFY <br></div><div> > > limitChanged)<br></div><div> > > +<br></div><div> > > +public:<br></div><div> > > +    VLCRecentMediaModel(intf_thread_t *p_intf,QObject * parent = <br></div><div> > > nullptr);<br></div><div> > > +<br></div><div> > > +    Q_INVOKABLE void clear();<br></div><div> > > +<br></div><div> > > +    Q_INVOKABLE int rowCount(QModelIndex const &parent = {}) const  <br></div><div> > > override;<br></div><div> > > +<br></div><div> > > +    QVariant data(QModelIndex const &index, const int role = <br></div><div> > > Qt::DisplayRole) const  override;<br></div><div> > > +<br></div><div> > > +    QHash<int, QByteArray> roleNames() const override;<br></div><div> > > +<br></div><div> > > +    QStringList items;<br></div><div> > > +<br></div><div> > > +    void setLimit(int l);<br></div><div> > > +    int getLimit() const;<br></div><div> > > +<br></div><div> > > +private:<br></div><div> > > +    RecentsMRL *rmrl;<br></div><div> > > +    int i_limit = 10;<br></div><div> > > +<br></div><div> > > +signals:<br></div><div> > > +    void limitChanged();<br></div><div> > > +<br></div><div> > > +public slots:<br></div><div> > > +    void update();<br></div><div> > > +    QStringList getItems();<br></div><div> > > +<br></div><div> > > +};<br></div><div> > > +<br></div><div> > > +#endif // VLC_RECENT_MEDIA_MODEL_HPP<br></div><div> > > diff --git a/modules/gui/qt/dialogs_provider.cpp <br></div><div> > > b/modules/gui/qt/dialogs_provider.cpp<br></div><div> > > index 17d6b35a44..58c88a7c1f 100644<br></div><div> > > --- a/modules/gui/qt/dialogs_provider.cpp<br></div><div> > > +++ b/modules/gui/qt/dialogs_provider.cpp<br></div><div> > > @@ -566,8 +566,6 @@ QString DialogsProvider::getDirectoryDialog( <br></div><div> > > intf_thread_t *p_intf )<br></div><div> > >      dir = qfu( uri );<br></div><div> > >      free( uri );<br></div><div> > >  <br></div><div> > > -    RecentsMRL::getInstance( p_intf )->addRecent( dir );<br></div><div> > > -<br></div><div> > >      return dir;<br></div><div> > >  }<br></div><div> > >  <br></div><div> > > diff --git a/modules/gui/qt/main_interface.cpp <br></div><div> > > b/modules/gui/qt/main_interface.cpp<br></div><div> > > index 7f135f93ba..ac56e3bc2d 100644<br></div><div> > > --- a/modules/gui/qt/main_interface.cpp<br></div><div> > > +++ b/modules/gui/qt/main_interface.cpp<br></div><div> > > @@ -51,6 +51,7 @@<br></div><div> > >  #include "components/mediacenter/mlgenremodel.hpp"<br></div><div> > >  #include "components/mediacenter/mlvideomodel.hpp"<br></div><div> > >  #include "components/mediacenter/mlnetworkmodel.hpp"<br></div><div> > > +#include "components/recent_media_model.hpp"<br></div><div> > >  <br></div><div> > >  #include "components/navigation_history.hpp"<br></div><div> > >  #include "components/aboutmodel.hpp"<br></div><div> > > @@ -63,7 +64,6 @@<br></div><div> > >  #include "util/qmleventfilter.hpp"<br></div><div> > >  <br></div><div> > >  #include "menus.hpp"                            // Menu creation<br></div><div> > > -#include "recents.hpp"                          // RecentItems when DnD<br></div><div> > >  <br></div><div> > >  #include <QCloseEvent><br></div><div> > >  #include <QKeyEvent><br></div><div> > > @@ -379,6 +379,7 @@ void MainInterface::createMainWidget( QSettings * )<br></div><div> > >      rootCtx->setContextProperty( "rootQMLView", mediacenterView);<br></div><div> > >      rootCtx->setContextProperty( "rootWindow", this);<br></div><div> > >      rootCtx->setContextProperty( "dialogProvider", <br></div><div> > > DialogsProvider::getInstance());<br></div><div> > > +    rootCtx->setContextProperty( "recentsMedias",  new <br></div><div> > > VLCRecentMediaModel( p_intf, this ));<br></div><div> > >  <br></div><div> > >      if (b_hasMedialibrary)<br></div><div> > >      {<br></div><div> > > diff --git a/modules/gui/qt/qml/menus/MainDropdownMenu.qml <br></div><div> > > b/modules/gui/qt/qml/menus/MainDropdownMenu.qml<br></div><div> > > index 4ea0025281..8df4e56c20 100644<br></div><div> > > --- a/modules/gui/qt/qml/menus/MainDropdownMenu.qml<br></div><div> > > +++ b/modules/gui/qt/qml/menus/MainDropdownMenu.qml<br></div><div> > > @@ -21,7 +21,8 @@ import QtQuick.Controls 2.4<br></div><div> > >  import "qrc:///utils/" as Utils<br></div><div> > >  <br></div><div> > >  //main menus, to be used as a dropdown menu<br></div><div> > > -Utils.MenuExt {<br></div><div> > > +Utils.MenuExt {    <br></div><div> > > +    id: mainDropdownMenu<br></div><div> > >      //make the menu modal, as we are not attached to a QQuickWindow<br></div><div> > >      modal: true<br></div><div> > >      closePolicy: Popup.CloseOnPressOutside | Popup.CloseOnEscape<br></div><div> > > diff --git a/modules/gui/qt/qml/menus/MediaMenu.qml <br></div><div> > > b/modules/gui/qt/qml/menus/MediaMenu.qml<br></div><div> > > index 8414b14f8b..8f95dc19ee 100644<br></div><div> > > --- a/modules/gui/qt/qml/menus/MediaMenu.qml<br></div><div> > > +++ b/modules/gui/qt/qml/menus/MediaMenu.qml<br></div><div> > > @@ -30,7 +30,41 @@ Utils.MenuExt {<br></div><div> > >      Action { text: qsTr("Open &Capture Device...");       onTriggered: <br></div><div> > > dialogProvider.openCaptureDialog();         <br></div><div> > > icon.source:"qrc:/type/capture-card.svg"; shortcut: "Ctrl+C" }<br></div><div> > >      Action { text: qsTr("Open &Location from clipboard"); onTriggered: <br></div><div> > > dialogProvider.openUrlDialog();                                         <br></div><div> > >               shortcut: "Ctrl+V" }<br></div><div> > >  <br></div><div> > > -    /* FIXME recent */<br></div><div> > > +<br></div><div> > > +    Utils.MenuExt {<br></div><div> > > +        id: recentsMenu<br></div><div> > > +        title: qsTr("Open &Recent Media")<br></div><div> > > +        property bool hasData: true<br></div><div> > > +        onAboutToShow:{<br></div><div> > > +            recentsMenu.hasData = Boolean(recentsMedias.rowCount())<br></div><div> > > +        }<br></div><div> > > +        Instantiator {<br></div><div> > > +            model: recentsMedias<br></div><div> > > +            Utils.MenuItemExt {<br></div><div> > > +                text: mrl<br></div><div> > > +                onTriggered:{<br></div><div> > > +                    mainDropdownMenu.close() //needed since menuItem <br></div><div> > > isn't a direct child of a menu<br></div><div> > > +                    mainPlaylistController.append([mrl], true)<br></div><div> > > +                }<br></div><div> > > +<br></div><div> > > +                Shortcut {<br></div><div> > > +                    sequence: "Ctrl+" + (index + 1)<br></div><div> > > +                    onActivated:  mainPlaylistController.append([mrl], <br></div><div> > > true)<br></div><div> > > +                    context: Qt.ApplicationShortcut<br></div><div> > > +                }<br></div><div> > > +            }<br></div><div> > > +            onObjectAdded: recentsMenu.insertItem(recentsMenu.count - <br></div><div> > > 2, object)<br></div><div> > > +            onObjectRemoved: recentsMenu.removeItem(object)<br></div><div> > > +        }<br></div><div> > > +<br></div><div> > > +        MenuSeparator{}<br></div><div> > > +<br></div><div> > > +        Utils.MenuItemExt {<br></div><div> > > +            text: qsTr("Clear")<br></div><div> > > +            enabled: recentsMenu.hasData<br></div><div> > > +            onTriggered:recentsMedias.clear()<br></div><div> > > +        }<br></div><div> > > +    }<br></div><div> > >  <br></div><div> > >      Action { text: qsTr("Save Playlist to &File...");     onTriggered: <br></div><div> > > dialogProvider.savePlayingToPlaylist();     icon.source: "";            <br></div><div> > >           shortcut: "Ctrl+Y" }<br></div><div> > >      Action { text: qsTr("Conve&rt / Save..." );           onTriggered: <br></div><div> > > dialogProvider.openAndTranscodingDialogs(); icon.source: "";            <br></div><div> > >           shortcut: "Ctrl+R" }<br></div><div> > > diff --git a/modules/gui/qt/recents.cpp b/modules/gui/qt/recents.cpp<br></div><div> > > index 0857bbba76..4ba7d38fb1 100644<br></div><div> > > --- a/modules/gui/qt/recents.cpp<br></div><div> > > +++ b/modules/gui/qt/recents.cpp<br></div><div> > > @@ -158,6 +158,7 @@ void RecentsMRL::save()<br></div><div> > >  {<br></div><div> > >      getSettings()->setValue( "RecentsMRL/list", recents );<br></div><div> > >      getSettings()->setValue( "RecentsMRL/times", times );<br></div><div> > > +    emit saved();<br></div><div> > >  }<br></div><div> > >  <br></div><div> > >  void RecentsMRL::playMRL( const QString &mrl )<br></div><div> > > diff --git a/modules/gui/qt/recents.hpp b/modules/gui/qt/recents.hpp<br></div><div> > > index 86215f21ff..bb2286ca2c 100644<br></div><div> > > --- a/modules/gui/qt/recents.hpp<br></div><div> > > +++ b/modules/gui/qt/recents.hpp<br></div><div> > > @@ -54,16 +54,16 @@ class RecentsMRL : public QObject, public <br></div><div> > > Singleton<RecentsMRL><br></div><div> > >      friend class Singleton<RecentsMRL>;<br></div><div> > >  <br></div><div> > >  public:<br></div><div> > > +    <br></div><div> > >      void addRecent( const QString & );<br></div><div> > > -    QStringList recentList();<br></div><div> > >      QSignalMapper *signalMapper;<br></div><div> > >  <br></div><div> > >      vlc_tick_t time( const QString &mrl );<br></div><div> > >      void setTime( const QString &mrl, const vlc_tick_t time );<br></div><div> > > +    virtual ~RecentsMRL();<br></div><div> > >  <br></div><div> > >  private:<br></div><div> > >      RecentsMRL( intf_thread_t* _p_intf );<br></div><div> > > -    virtual ~RecentsMRL();<br></div><div> > >  <br></div><div> > >      intf_thread_t *p_intf;<br></div><div> > >  <br></div><div> > > @@ -74,8 +74,11 @@ private:<br></div><div> > >  <br></div><div> > >      void load();<br></div><div> > >      void save();<br></div><div> > > -<br></div><div> > > +     <br></div><div> > > +signals:<br></div><div> > > +       void saved();<br></div><div> > >  public slots:<br></div><div> > > +    QStringList recentList();<br></div><div> > >      void clear();<br></div><div> > >      void playMRL( const QString & );<br></div><div> > >  };<br></div><div> <br></div><div> Hi,<br></div><div> <br></div><div> Thanks for your patch!<br></div><div> <br></div><div> I agree that this feature needs to be reintroduced, although I think it should use the media library history instead, and removed the recents.cpp/hpp previous implementation.<br></div><div> <br></div><div> Regards,<br></div><div> <br></div><div> -- <br></div><div>   Hugo Beauzée-Luyssen<br></div><div>   <a href="mailto:hugo@beauzee.fr">hugo@beauzee.fr</a><br></div><div> _______________________________________________<br></div><div> vlc-devel mailing list<br></div><div> To unsubscribe or modify your subscription options:<br></div><div> <a rel="noreferrer" href="https://mailman.videolan.org/listinfo/vlc-devel">https://mailman.videolan.org/listinfo/vlc-devel</a><br></div></blockquote></div><div>_______________________________________________<br></div><div>vlc-devel mailing list<br></div><div>To unsubscribe or modify your subscription options:<br></div><div>https://mailman.videolan.org/listinfo/vlc-devel<br></div></blockquote><div><br></div></body></html>