From ed17f0735520a182c56cc909b909dfb08b9e67d0 Mon Sep 17 00:00:00 2001
From: Christian Muehlhaeuser <muesli@gmail.com>
Date: Fri, 16 Nov 2012 11:00:47 +0100
Subject: [PATCH] * Query-based CTOR for MetadataEditor.

---
 .../filemetadata/MetadataEditor.cpp           | 223 ++++++++++++------
 src/libtomahawk/filemetadata/MetadataEditor.h |  12 +-
 2 files changed, 168 insertions(+), 67 deletions(-)

diff --git a/src/libtomahawk/filemetadata/MetadataEditor.cpp b/src/libtomahawk/filemetadata/MetadataEditor.cpp
index 20998f5ec..a4a30be22 100644
--- a/src/libtomahawk/filemetadata/MetadataEditor.cpp
+++ b/src/libtomahawk/filemetadata/MetadataEditor.cpp
@@ -24,6 +24,7 @@
 #include <QtCore/QFileInfo>
 #include <QtCore/QFile>
 
+#include "Source.h"
 #include "Result.h"
 #include "Artist.h"
 #include "Album.h"
@@ -38,102 +39,175 @@
 #include "utils/Closure.h"
 
 
+MetadataEditor::MetadataEditor( const Tomahawk::query_ptr& query, const Tomahawk::playlistinterface_ptr& interface, QWidget* parent )
+    : QDialog( parent )
+{
+    init( interface );
+
+    loadQuery( query );
+}
+
+
 MetadataEditor::MetadataEditor( const Tomahawk::result_ptr& result, const Tomahawk::playlistinterface_ptr& interface, QWidget* parent )
     : QDialog( parent )
-    , ui( new Ui::MetadataEditor )
-    , m_result( result )
-    , m_interface( interface )
-    , m_index( 0 )
 {
-    ui->setupUi( this );
-    setWindowTitle( QString( result->track() + tr( " - Properties" ) ) );
-    setAttribute( Qt::WA_DeleteOnClose );
-
-    NewClosure( ui->buttonBox, SIGNAL( accepted() ),
-                this, SLOT( writeMetadata( bool ) ), true )->setAutoDelete( false );
-
-    connect( ui->buttonBox, SIGNAL( rejected() ), SLOT( close() ) );
-    connect( ui->forwardPushButton, SIGNAL( clicked() ), SLOT( loadNextResult() ) );
-    connect( ui->previousPushButton, SIGNAL( clicked() ), SLOT( loadPreviousResult() ) );
+    init( interface );
 
     loadResult( result );
 }
 
 
+void
+MetadataEditor::init( const Tomahawk::playlistinterface_ptr& interface )
+{
+    ui = new Ui::MetadataEditor();
+    ui->setupUi( this );
+
+    setAttribute( Qt::WA_DeleteOnClose );
+
+    m_interface = interface;
+    m_index = 0;
+    m_editable = false;
+
+    NewClosure( ui->buttonBox, SIGNAL( accepted() ), this, SLOT( writeMetadata( bool ) ), true )->setAutoDelete( false );
+
+    connect( ui->buttonBox, SIGNAL( rejected() ), SLOT( close() ) );
+    connect( ui->forwardPushButton, SIGNAL( clicked() ), SLOT( loadNextResult() ) );
+    connect( ui->previousPushButton, SIGNAL( clicked() ), SLOT( loadPreviousResult() ) );
+}
+
+
 void
 MetadataEditor::writeMetadata( bool closeDlg )
 {
-    QFileInfo fi( QUrl( m_result->url() ).toLocalFile() );
-
-    bool changed = false;
-    QByteArray fileName = QFile::encodeName( fi.canonicalFilePath() );
-    const char *encodedName = fileName.constData();
-
-    TagLib::FileRef f( encodedName );
-    Tomahawk::Tag* tag = Tomahawk::Tag::fromFile( f );
-
-    if ( title() != m_result->track() )
+    if ( m_result )
     {
-        tag->setTitle( title() );
-        m_result->setTrack( title() );
+        QFileInfo fi( QUrl( m_result->url() ).toLocalFile() );
 
-        changed = true;
-    }
+        bool changed = false;
+        QByteArray fileName = QFile::encodeName( fi.canonicalFilePath() );
+        const char *encodedName = fileName.constData();
 
-    Tomahawk::artist_ptr newArtist = Tomahawk::Artist::get( artist(), true );
-    if ( newArtist != m_result->artist() )
-    {
-        tag->setArtist( artist() );
-        m_result->setArtist( newArtist );
+        TagLib::FileRef f( encodedName );
+        Tomahawk::Tag* tag = Tomahawk::Tag::fromFile( f );
 
-        changed = true;
+        if ( title() != m_result->track() )
+        {
+            tDebug() << Q_FUNC_INFO << "Track changed" << title() << m_result->track();
 
-    }
+            tag->setTitle( title() );
+            m_result->setTrack( title() );
 
-    Tomahawk::album_ptr newAlbum = Tomahawk::Album::get( newArtist, album(), true );
-    if ( newAlbum != m_result->album() )
-    {
-        tag->setAlbum( album() );
-        m_result->setAlbum( newAlbum );
+            changed = true;
+        }
 
-        changed = true;
-    }
+        Tomahawk::artist_ptr newArtist = Tomahawk::Artist::get( artist(), true );
+        if ( newArtist != m_result->artist() )
+        {
+            tDebug() << Q_FUNC_INFO << "Artist changed" << artist() << m_result->artist();
 
-    if ( albumPos() != (int)m_result->albumpos() )
-    {
-        tag->setTrack( albumPos() );
-        m_result->setAlbumPos( albumPos() );
+            tag->setArtist( artist() );
+            m_result->setArtist( newArtist );
 
-        changed = true;
-    }
+            changed = true;
+        }
 
-    if ( year() != m_result->year() )
-    {
-        tag->setYear( year() );
-        m_result->setYear( year() );
+        Tomahawk::album_ptr newAlbum = Tomahawk::Album::get( newArtist, album(), true );
+        if ( newAlbum != m_result->album() )
+        {
+            tDebug() << Q_FUNC_INFO << "Album changed" << album() << newAlbum->id() << m_result->album()->name() << m_result->album()->id() << newAlbum.data() << m_result->album().data();
+            if ( newAlbum->id() != m_result->album()->id() )
+            {
+                tag->setAlbum( album() );
+                m_result->setAlbum( newAlbum );
 
-        changed = true;
-    }
+                changed = true;
+            }
+            else
+                Q_ASSERT( false );
+        }
 
-    if ( changed )
-    {
-        f.save();
+        // FIXME: Ugly workaround for the min value of 0
+        if ( albumPos() != 0 && albumPos() != (int)m_result->albumpos() )
+        {
+            tag->setTrack( albumPos() );
+            m_result->setAlbumPos( albumPos() );
 
-        m_editFiles.append( fileName );
-        m_result->doneEditing();
+            tDebug() << Q_FUNC_INFO << "Albumpos changed";
+            changed = true;
+        }
 
-        tDebug() << Q_FUNC_INFO << m_result->toString();
-        tDebug() << Q_FUNC_INFO << m_result->toQuery()->toString();
+        // FIXME: Ugly workaround for the min value of 1900
+        if ( year() != 1900 && year() != m_result->year() )
+        {
+            tag->setYear( year() );
+            m_result->setYear( year() );
+
+            tDebug() << Q_FUNC_INFO << "Year changed";
+            changed = true;
+        }
+
+        if ( changed )
+        {
+            f.save();
+
+            m_editFiles.append( fileName );
+            m_result->doneEditing();
+
+            tDebug() << Q_FUNC_INFO << m_result->toString();
+            tDebug() << Q_FUNC_INFO << m_result->toQuery()->toString();
+        }
     }
 
     if ( closeDlg )
     {
-        ScanManager::instance()->runFileScan( m_editFiles, false );
+        if ( m_editFiles.count() )
+            ScanManager::instance()->runFileScan( m_editFiles, false );
+
         close();
     }
 }
 
 
+void
+MetadataEditor::loadQuery( const Tomahawk::query_ptr& query )
+{
+    if ( query.isNull() )
+        return;
+
+    if ( query->numResults() )
+    {
+        loadResult( query->results().first() );
+        return;
+    }
+
+    m_result = Tomahawk::result_ptr();
+    m_query = query;
+    setEditable( false );
+
+    setTitle( query->displayQuery()->track() );
+    setArtist( query->displayQuery()->artist() );
+    setAlbum( query->displayQuery()->album() );
+    setAlbumPos( query->displayQuery()->albumpos() );
+    setDuration( query->displayQuery()->duration() );
+    setYear( 0 );
+    setBitrate( 0 );
+
+    setFileName( QString() );
+    setFileSize( 0 );
+
+    setWindowTitle( QString( query->track() + " - " + tr( "Properties" ) ) );
+
+    if ( m_interface )
+    {
+        m_index = m_interface->indexOfQuery( query );
+
+        if ( m_index >= 0 )
+            enablePushButtons();
+    }
+}
+
+
 void
 MetadataEditor::loadResult( const Tomahawk::result_ptr& result )
 {
@@ -141,6 +215,8 @@ MetadataEditor::loadResult( const Tomahawk::result_ptr& result )
         return;
 
     m_result = result;
+    setEditable( result->collection()->source()->isLocal() );
+
     setTitle( result->track() );
     setArtist( result->artist()->name() );
     setAlbum( result->album()->name() );
@@ -153,6 +229,8 @@ MetadataEditor::loadResult( const Tomahawk::result_ptr& result )
     setFileName( fi.fileName() );
     setFileSize( TomahawkUtils::filesizeToString( fi.size() ) );
 
+    setWindowTitle( QString( result->track() + " - " + tr( "Properties" ) ) );
+
     if ( m_interface )
     {
         m_index = m_interface->indexOfResult( result );
@@ -185,8 +263,8 @@ MetadataEditor::loadNextResult()
 
     m_index++;
 
-    if ( m_interface->itemAt( m_index )->numResults() )
-        loadResult( m_interface->itemAt( m_index )->results().first() );
+    if ( m_interface->itemAt( m_index ) )
+        loadQuery( m_interface->itemAt( m_index ) );
 }
 
 
@@ -197,8 +275,8 @@ MetadataEditor::loadPreviousResult()
 
     m_index--;
 
-    if ( m_interface->itemAt( m_index )->numResults() )
-        loadResult( m_interface->itemAt( m_index )->results().first() );
+    if ( m_interface->itemAt( m_index ) )
+        loadQuery( m_interface->itemAt( m_index ) );
 }
 
 
@@ -263,3 +341,16 @@ MetadataEditor::setFileSize( const QString& size )
 {
     ui->fileSizeLineEdit->setText( size );
 }
+
+
+void
+MetadataEditor::setEditable( bool editable )
+{
+    ui->artistLineEdit->setReadOnly( !editable );
+    ui->albumLineEdit->setReadOnly( !editable );
+    ui->titleLineEdit->setReadOnly( !editable );
+    ui->albumPosSpinBox->setReadOnly( !editable );
+    ui->yearSpinBox->setReadOnly( !editable );
+
+    m_editable = editable;
+}
diff --git a/src/libtomahawk/filemetadata/MetadataEditor.h b/src/libtomahawk/filemetadata/MetadataEditor.h
index c80a67773..ecacf679a 100644
--- a/src/libtomahawk/filemetadata/MetadataEditor.h
+++ b/src/libtomahawk/filemetadata/MetadataEditor.h
@@ -24,20 +24,23 @@
 #include <QtGui/QSpinBox>
 
 #include "ui_MetadataEditor.h"
+#include "Query.h"
 #include "Result.h"
 #include "Typedefs.h"
 
 class QString;
 
-
 class MetadataEditor : public QDialog
 {
 Q_OBJECT
 
 public:
+    MetadataEditor( const Tomahawk::query_ptr& query, const Tomahawk::playlistinterface_ptr& interface, QWidget* parent = 0 );
     MetadataEditor( const Tomahawk::result_ptr& result, const Tomahawk::playlistinterface_ptr& interface, QWidget* parent = 0 );
     ~MetadataEditor() {};
 
+    void init( const Tomahawk::playlistinterface_ptr& interface );
+
 protected:
     QString title() const { return ui->titleLineEdit->text(); }
     QString artist() const { return ui->artistLineEdit->text(); }
@@ -45,7 +48,9 @@ protected:
     int albumPos() const { return ui->albumPosSpinBox->value(); }
     int year() const { return ui->yearSpinBox->value(); }
     int bitrate() const { return ui->bitrateSpinBox->value(); }
+
     void loadResult( const Tomahawk::result_ptr& result );
+    void loadQuery( const Tomahawk::query_ptr& query );
 
 private slots:
     void writeMetadata( bool closeDlg = false );
@@ -66,14 +71,19 @@ private slots:
     void setFileName( const QString& fn );
     void setFileSize( const QString& size );
 
+    void setEditable( bool editable );
+
 private:
     Ui::MetadataEditor* ui;
 
     Tomahawk::result_ptr m_result;
+    Tomahawk::query_ptr m_query;
+
     Tomahawk::playlistinterface_ptr m_interface;
     QStringList m_editFiles;
 
     int m_index;
+    bool m_editable;
 };
 
 #endif // METADATAEDITOR_H