~shanx-shashank/mixxx/effects_parametricEq

« back to all changes in this revision

Viewing changes to mixxx/src/library/rhythmbox/rhythmboxplaylistmodel.cpp

  • Committer:
  • Date: 2013-01-04 06:33:52 UTC
  • Revision ID: shanx.shashank@gmail.com-20130104063352-h0mbeu93luln05uc
Rolling back merge: COs wont let go of segfaults :(

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include <QtCore>
 
2
#include <QtGui>
 
3
#include <QtSql>
 
4
 
 
5
#include "library/trackcollection.h"
 
6
#include "library/rhythmbox/rhythmboxplaylistmodel.h"
 
7
#include "track/beatfactory.h"
 
8
#include "track/beats.h"
 
9
 
 
10
RhythmboxPlaylistModel::RhythmboxPlaylistModel(QObject* parent,
 
11
                                         TrackCollection* pTrackCollection)
 
12
        : BaseSqlTableModel(parent, pTrackCollection,
 
13
                            pTrackCollection->getDatabase(),
 
14
                            "mixxx.db.model.rhythmbox_playlist"),
 
15
          m_pTrackCollection(pTrackCollection),
 
16
          m_database(m_pTrackCollection->getDatabase()) {
 
17
    connect(this, SIGNAL(doSearch(const QString&)),
 
18
            this, SLOT(slotSearch(const QString&)));
 
19
}
 
20
 
 
21
RhythmboxPlaylistModel::~RhythmboxPlaylistModel() {
 
22
}
 
23
 
 
24
TrackPointer RhythmboxPlaylistModel::getTrack(const QModelIndex& index) const {
 
25
    QString artist = index.sibling(
 
26
        index.row(), fieldIndex("artist")).data().toString();
 
27
    QString title = index.sibling(
 
28
        index.row(), fieldIndex("title")).data().toString();
 
29
    QString album = index.sibling(
 
30
        index.row(), fieldIndex("album")).data().toString();
 
31
    QString year = index.sibling(
 
32
        index.row(), fieldIndex("year")).data().toString();
 
33
    QString genre = index.sibling(
 
34
        index.row(), fieldIndex("genre")).data().toString();
 
35
    float bpm = index.sibling(
 
36
        index.row(), fieldIndex("bpm")).data().toString().toFloat();
 
37
    QString location = index.sibling(
 
38
        index.row(), fieldIndex("location")).data().toString();
 
39
 
 
40
    if (location.isEmpty()) {
 
41
        // Track is lost
 
42
        return TrackPointer();
 
43
    }
 
44
 
 
45
    TrackDAO& track_dao = m_pTrackCollection->getTrackDAO();
 
46
    int track_id = track_dao.getTrackId(location);
 
47
    bool track_already_in_library = track_id >= 0;
 
48
    if (track_id < 0) {
 
49
        // Add Track to library
 
50
        track_id = track_dao.addTrack(location, true);
 
51
    }
 
52
 
 
53
    TrackPointer pTrack;
 
54
 
 
55
    if (track_id < 0) {
 
56
        // Add Track to library failed, create a transient TrackInfoObject
 
57
        pTrack = TrackPointer(new TrackInfoObject(location), &QObject::deleteLater);
 
58
    } else {
 
59
        pTrack = track_dao.getTrack(track_id);
 
60
    }
 
61
 
 
62
    // If this track was not in the Mixxx library it is now added and will be
 
63
    // saved with the metadata from iTunes. If it was already in the library
 
64
    // then we do not touch it so that we do not over-write the user's metadata.
 
65
    if (!track_already_in_library) {
 
66
        pTrack->setArtist(artist);
 
67
        pTrack->setTitle(title);
 
68
        pTrack->setAlbum(album);
 
69
        pTrack->setYear(year);
 
70
        pTrack->setGenre(genre);
 
71
        pTrack->setBpm(bpm);
 
72
    }
 
73
    return pTrack;
 
74
}
 
75
 
 
76
void RhythmboxPlaylistModel::search(const QString& searchText) {
 
77
    // qDebug() << "RhythmboxPlaylistModel::search()" << searchText
 
78
    //          << QThread::currentThread();
 
79
    emit(doSearch(searchText));
 
80
}
 
81
 
 
82
void RhythmboxPlaylistModel::slotSearch(const QString& searchText) {
 
83
    BaseSqlTableModel::search(searchText);
 
84
}
 
85
 
 
86
bool RhythmboxPlaylistModel::isColumnInternal(int column) {
 
87
    if (column == fieldIndex("track_id")) {
 
88
        return true;
 
89
    }
 
90
    return false;
 
91
}
 
92
 
 
93
Qt::ItemFlags RhythmboxPlaylistModel::flags(const QModelIndex &index) const {
 
94
    return readOnlyFlags(index);
 
95
}
 
96
 
 
97
void RhythmboxPlaylistModel::setPlaylist(QString playlist_path) {
 
98
    int playlistId = -1;
 
99
    QSqlQuery finder_query(m_database);
 
100
    finder_query.prepare("SELECT id from rhythmbox_playlists where name=:name");
 
101
    finder_query.bindValue(":name", playlist_path);
 
102
 
 
103
    if (!finder_query.exec()) {
 
104
        qDebug() << "SQL Error in RhythmboxPlaylistModel.cpp: line"
 
105
                 << __LINE__ << " " << finder_query.lastError();
 
106
        return;
 
107
    }
 
108
 
 
109
    while (finder_query.next()) {
 
110
        playlistId = finder_query.value(
 
111
            finder_query.record().indexOf("id")).toInt();
 
112
    }
 
113
 
 
114
    QString playlistID = "Rhythmboxplaylist_" + QString("%1").arg(playlistId);
 
115
    // Escape the playlist name
 
116
    QSqlDriver* driver = m_pTrackCollection->getDatabase().driver();
 
117
    QSqlField playlistNameField("name", QVariant::String);
 
118
    playlistNameField.setValue(playlistID);
 
119
 
 
120
    QStringList columns;
 
121
    columns << "track_id";
 
122
    columns << "position";
 
123
 
 
124
    QSqlQuery query(m_database);
 
125
    QString queryString = QString(
 
126
        "CREATE TEMPORARY VIEW IF NOT EXISTS %1 AS "
 
127
        "SELECT %2 FROM %3 WHERE playlist_id = %4")
 
128
            .arg(driver->formatValue(playlistNameField),
 
129
                 columns.join(","),
 
130
                 "rhythmbox_playlist_tracks",
 
131
                 QString::number(playlistId));
 
132
    query.prepare(queryString);
 
133
 
 
134
    if (!query.exec()) {
 
135
        qDebug() << "Error creating temporary view for rhythmbox playlists. "
 
136
                 << "RhythmboxPlaylistModel --> line: "
 
137
                 << __LINE__ << " " << query.lastError();
 
138
        qDebug() << "Executed Query: " <<  query.executedQuery();
 
139
        return;
 
140
    }
 
141
 
 
142
    setTable(playlistID, columns[0], columns,
 
143
             m_pTrackCollection->getTrackSource("rhythmbox"));
 
144
    setDefaultSort(fieldIndex("position"), Qt::AscendingOrder);
 
145
    initHeaderData();
 
146
    setSearch("");
 
147
}
 
148
 
 
149
bool RhythmboxPlaylistModel::isColumnHiddenByDefault(int column) {
 
150
    Q_UNUSED(column);
 
151
    return false;
 
152
}
 
153
 
 
154
 
 
155
TrackModel::CapabilitiesFlags RhythmboxPlaylistModel::getCapabilities() const {
 
156
    // See src/library/trackmodel.h for the list of TRACKMODELCAPS
 
157
    return TRACKMODELCAPS_NONE
 
158
            | TRACKMODELCAPS_ADDTOPLAYLIST
 
159
            | TRACKMODELCAPS_ADDTOCRATE
 
160
            | TRACKMODELCAPS_ADDTOAUTODJ
 
161
            | TRACKMODELCAPS_LOADTODECK
 
162
            | TRACKMODELCAPS_LOADTOSAMPLER;
 
163
}