b1bbf8535fd2d68e9672a2302d43587c2de4c08a
[vlc.git] / modules / gui / qt4 / recents.cpp
1 /*****************************************************************************
2  * recents.cpp : Recents MRL (menu)
3  *****************************************************************************
4  * Copyright © 2006-2008 the VideoLAN team
5  * $Id$
6  *
7  * Authors: Ludovic Fauvet <etix@l0cal.com>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * ( at your option ) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22  *****************************************************************************/
23
24
25 #include "recents.hpp"
26 #include "dialogs_provider.hpp"
27
28 #include <QList>
29 #include <QString>
30 #include <QAction>
31 #include <QSettings>
32 #include <QRegExp>
33 #include <QSignalMapper>
34
35 RecentsMRL* RecentsMRL::instance = NULL;
36
37 RecentsMRL::RecentsMRL( intf_thread_t *_p_intf ) : p_intf( _p_intf )
38 {
39     stack = new QList<QString>;
40     signalMapper = new QSignalMapper(this);
41     CONNECT( signalMapper,
42             mapped(const QString & ),
43             DialogsProvider::getInstance( p_intf ),
44             playMRL( const QString & ) );
45
46     isActive = config_GetInt( p_intf, "qt-recentplay" );
47     filter = new QRegExp(
48             qfu( config_GetPsz( p_intf, "qt-recentplay-filter" ) ),
49             Qt::CaseInsensitive );
50
51     load();
52     if ( !isActive ) clear();
53 }
54
55 RecentsMRL::~RecentsMRL()
56 {
57     delete stack;
58 }
59
60 void RecentsMRL::addRecent( const QString &mrl )
61 {
62     if ( !isActive || filter->indexIn( mrl ) >= 0 )
63         return;
64
65     msg_Dbg( p_intf, "Adding a new MRL to recent ones: %s", qtu( mrl ) );
66     if( stack->contains( mrl ) )
67     {
68         stack->removeOne( mrl );
69         stack->prepend( mrl );
70     }
71     else
72     {
73         stack->prepend( mrl );
74         if( stack->size() > RECENTS_LIST_SIZE )
75             stack->takeLast();
76     }
77     emit updated();
78     save();
79 }
80
81 void RecentsMRL::clear()
82 {
83     if ( stack->isEmpty() )
84         return;
85     stack->clear();
86     emit updated();
87     save();
88 }
89
90 QList<QString> RecentsMRL::recents()
91 {
92     return QList<QString>(*stack);
93 }
94
95 void RecentsMRL::load()
96 {
97     QStringList list = getSettings()->value( "RecentsMRL/list" ).toStringList();
98
99     for( int i = 0; i < list.size(); ++i )
100     {
101         if (filter->indexIn( list.at(i) ) == -1)
102             stack->append( list.at(i) );
103     }
104 }
105
106 void RecentsMRL::save()
107 {
108     QStringList list;
109
110     for( int i = 0; i < stack->size(); ++i )
111         list << stack->at(i);
112
113     getSettings()->setValue( "RecentsMRL/list", list );
114 }
115