array: fix up types in vlc_array_*()
[vlc.git] / modules / gui / qt / dialogs / fingerprintdialog.cpp
1 /*****************************************************************************
2  * fingerprintdialog.cpp: Fingerprinter Dialog
3  *****************************************************************************
4  * Copyright (C) 2012 VLC authors and VideoLAN
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU Lesser General Public License as published by
8  * the Free Software Foundation; either version 2.1 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
19  *****************************************************************************/
20
21 #include "fingerprintdialog.hpp"
22 #include "ui/fingerprintdialog.h"
23
24 #include "adapters/chromaprint.hpp"
25 #include <vlc_url.h>
26
27 #include <QLabel>
28 #include <QListWidgetItem>
29 #include <new>
30
31 FingerprintDialog::FingerprintDialog(QWidget *parent, intf_thread_t *p_intf,
32                                      input_item_t *p_item ) :
33     QDialog(parent),
34     ui(new Ui::FingerprintDialog), p_r( NULL )
35 {
36     ui->setupUi(this);
37
38     ui->stackedWidget->setCurrentWidget( ui->wait );
39
40     ui->buttonBox->addButton( "&Close",
41                               QDialogButtonBox::RejectRole );
42
43     ui->buttonsBox->addButton( "&Apply this identity to the file",
44                                 QDialogButtonBox::AcceptRole );
45
46     ui->buttonsBox->addButton( "&Discard all identities",
47                                 QDialogButtonBox::RejectRole );
48
49     CONNECT( ui->buttonsBox, accepted(), this, applyIdentity() );
50     CONNECT( ui->buttonBox, rejected(), this, close() );
51     CONNECT( ui->buttonsBox, rejected(), this, close() );
52
53     t = new (std::nothrow) Chromaprint( p_intf );
54     if ( t )
55     {
56         CONNECT( t, finished(), this, handleResults() );
57         t->enqueue( p_item );
58     }
59 }
60
61 void FingerprintDialog::applyIdentity()
62 {
63     Q_ASSERT( p_r );
64     if ( ui->recordsList->currentIndex().isValid() )
65         t->apply( p_r, ui->recordsList->currentIndex().row() );
66     emit metaApplied( p_r->p_item );
67     close();
68 }
69
70 void FingerprintDialog::handleResults()
71 {
72     p_r = t->fetchResults();
73
74     if ( ! p_r )
75     {
76         ui->stackedWidget->setCurrentWidget( ui->error );
77         return;
78     }
79
80     if ( vlc_array_count( & p_r->results.metas_array ) == 0 )
81     {
82         fingerprint_request_Delete( p_r );
83         p_r = NULL;
84         ui->stackedWidget->setCurrentWidget( ui->error );
85         return;
86     }
87
88     ui->stackedWidget->setCurrentWidget( ui->results );
89
90     for ( size_t i = 0; i< vlc_array_count( & p_r->results.metas_array ) ; i++ )
91     {
92         vlc_meta_t *p_meta =
93                 (vlc_meta_t *) vlc_array_item_at_index( & p_r->results.metas_array, i );
94         QListWidgetItem *item = new QListWidgetItem();
95         ui->recordsList->addItem( item );
96         QString mb_id( vlc_meta_GetExtra( p_meta, "musicbrainz-id" ) );
97         QLabel *label = new QLabel(
98                     QString( "<h3 style=\"margin: 0\"><a style=\"text-decoration:none\" href=\"%1\">%2</a></h3>"
99                              "<span style=\"padding-left:20px\">%3</span>" )
100                     .arg( QString( "http://mb.videolan.org/recording/%1" ).arg( mb_id ) )
101                     .arg( qfu( vlc_meta_Get( p_meta, vlc_meta_Title ) ) )
102                     .arg( qfu( vlc_meta_Get( p_meta, vlc_meta_Artist ) ) )
103         );
104         label->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred );
105         label->setOpenExternalLinks( true );
106         item->setSizeHint( label->sizeHint() );
107         ui->recordsList->setItemWidget( item, label );
108     }
109     ui->recordsList->setCurrentIndex( ui->recordsList->model()->index( 0, 0 ) );
110 }
111
112 FingerprintDialog::~FingerprintDialog()
113 {
114     if ( t ) delete t;
115     if ( p_r ) fingerprint_request_Delete( p_r );
116     delete ui;
117 }