Changeset 17


Ignore:
Timestamp:
12/30/07 20:55:36 (4 years ago)
Author:
sander
Message:

Lots of updates, the music library is now being showed in the tree view. Though it doesn't actually do anything yet.

Files:
4 added
11 edited

Legend:

Unmodified
Added
Removed
  • QtMPC.pro

    r4 r17  
    44 
    55TEMPLATE = app 
    6 TARGET =  
     6TARGET = 
    77DEPENDPATH += . gui lib 
    88INCLUDEPATH += . lib 
    99CONFIG += qt debug 
    1010QT += network 
     11#DEFINES += QT_NO_DEBUG_OUTPUT 
    1112 
    1213# Input 
    1314HEADERS += gui/main_window.h \ 
     15        gui/musiclibraryitem.h \ 
     16        gui/musiclibrarymodel.h \ 
    1417        gui/playlisttablemodel.h \ 
    1518        lib/mpdconnection.h \ 
     
    2225SOURCES += main.cpp \ 
    2326        gui/main_window.cpp \ 
     27        gui/musiclibraryitem.cpp \ 
     28        gui/musiclibrarymodel.cpp \ 
    2429        gui/playlisttablemodel.cpp \ 
    2530        lib/mpdconnection.cpp \ 
  • gui/main_window.cpp

    r12 r17  
    77    setupUi(this); 
    88 
    9     mpd_status = NULL; 
     9    //mpd_status = NULL; 
    1010    slidingVolume = false; 
    1111 
     
    1818    } 
    1919 
     20    libraryTreeView->setModel(&musicLibraryModel); 
     21 
    2022    playlistTableView->setModel(&playlistModel); 
    2123    playlistTableView->verticalHeader()->hide(); 
     
    2325 
    2426    // MPD 
    25     connect(&mpd, SIGNAL(statusUpdated(MPDStatus *)), this, SLOT(updateStatus(MPDStatus *))); 
     27    connect(&mpd, SIGNAL(statusUpdated(const MPDStatus &)), this, SLOT(updateStatus(const MPDStatus &))); 
    2628    connect(&mpd, SIGNAL(playlistUpdated(QList<Song *> *)), &playlistModel, SLOT(updateSongs(QList<Song *> *))); 
    2729    connect(&mpd, SIGNAL(currentSongUpdated(Song *)), this, SLOT(updateCurrentSong(Song *))); 
     30    connect(&mpd, SIGNAL(musicLibraryUpdated(QList<MusicLibraryItem *> *)), &musicLibraryModel, SLOT(updateLibrary(QList<MusicLibraryItem *> *))); 
    2831 
    2932    // GUI 
     
    4245 
    4346    mpd.getStatus(); 
     47    mpd.listAllInfo(); 
    4448 
    4549    statusTimer.start(1000); 
     
    7377void MainWindow::playPauseTrack() 
    7478{ 
    75     if(mpd_status->state == MPDStatus::State_Playing) { 
     79    if(mpd_status.state == MPDStatus::State_Playing) { 
    7680        mpd.setPause(true); 
    77     } else if(mpd_status->state == MPDStatus::State_Paused) { 
     81    } else if(mpd_status.state == MPDStatus::State_Paused) { 
    7882        mpd.setPause(false); 
    7983    } else { 
     
    103107} 
    104108 
    105 void MainWindow::updateStatus(MPDStatus *status) 
     109void MainWindow::updateStatus(const MPDStatus &status) 
    106110{ 
    107111    QString timeElapsedFormattedString; 
    108112 
    109     positionSlider->setMaximum(status->time_total); 
    110     positionSlider->setValue(status->time_elapsed); 
     113    positionSlider->setMaximum(status.time_total); 
     114    positionSlider->setValue(status.time_elapsed); 
    111115 
    112116    if(!slidingVolume) 
    113         volumeSlider->setValue(status->volume); 
    114  
    115     // Time elapsed 
    116     timeElapsedFormattedString += QString::number(floor(status->time_elapsed / 60.0)); 
    117     timeElapsedFormattedString += ":"; 
    118     if(status->time_elapsed % 60 < 10) { 
    119         timeElapsedFormattedString += "0"; 
    120     } 
    121     timeElapsedFormattedString += QString::number(status->time_elapsed % 60); 
    122  
    123     timeElapsedFormattedString += " / "; 
    124  
    125     // Time total 
    126     timeElapsedFormattedString += QString::number(floor(status->time_total / 60.0)); 
    127     timeElapsedFormattedString += ":"; 
    128     if(status->time_total % 60 < 10) { 
    129         timeElapsedFormattedString += "0"; 
    130     } 
    131     timeElapsedFormattedString += QString::number(status->time_total % 60); 
     117        volumeSlider->setValue(status.volume); 
     118 
     119    if(status.time_total == -1) { 
     120        timeElapsedFormattedString = "00:00 / 00:00"; 
     121    } else { 
     122        // Time elapsed 
     123        timeElapsedFormattedString += QString::number(floor(status.time_elapsed / 60.0)); 
     124        timeElapsedFormattedString += ":"; 
     125        if(status.time_elapsed % 60 < 10) { 
     126            timeElapsedFormattedString += "0"; 
     127        } 
     128        timeElapsedFormattedString += QString::number(status.time_elapsed % 60); 
     129 
     130        timeElapsedFormattedString += " / "; 
     131 
     132        // Time total 
     133        timeElapsedFormattedString += QString::number(floor(status.time_total / 60.0)); 
     134        timeElapsedFormattedString += ":"; 
     135        if(status.time_total % 60 < 10) { 
     136            timeElapsedFormattedString += "0"; 
     137        } 
     138        timeElapsedFormattedString += QString::number(status.time_total % 60); 
     139    } 
    132140 
    133141    songTimeElapsedLabel->setText(timeElapsedFormattedString); 
    134142 
    135     switch(status->state) { 
     143    switch(status.state) { 
    136144        case MPDStatus::State_Playing: 
    137145            playPauseTrackButton->setText("Pause"); 
     
    140148            stopTrackButton->setEnabled(true); 
    141149            break; 
     150        case MPDStatus::State_Inactive: 
    142151        case MPDStatus::State_Stopped: 
    143152            playPauseTrackButton->setText("Play"); 
     
    157166 
    158167    // Check if song has changed and update if needed 
    159     if(mpd_status == NULL || mpd_status->song_id != status->song_id) { 
     168    if(mpd_status.state == MPDStatus::State_Inactive || mpd_status.song_id != status.song_id) { 
    160169        mpd.currentSong(); 
    161170    } 
    162171 
    163172    // Check if playlist has changed and update if needed 
    164     if(mpd_status == NULL || mpd_status->playlist < status->playlist) { 
     173    if(mpd_status.state == MPDStatus::State_Inactive || mpd_status.playlist < status.playlist) { 
    165174        mpd.playListInfo(); 
    166175    } 
    167176 
    168177    // Update status info 
    169     if(mpd_status != NULL) { 
    170         delete mpd_status; 
    171     } 
    172178    mpd_status = status; 
    173179} 
  • gui/main_window.h

    r11 r17  
    66 
    77#include "ui_main_window.h" 
     8#include "gui/musiclibrarymodel.h" 
    89#include "gui/playlisttablemodel.h" 
    910#include "lib/mpdconnection.h" 
     
    2021    private: 
    2122        MPDConnection mpd; 
    22         MPDStatus *mpd_status; 
     23        MPDStatus mpd_status; 
    2324        QTimer statusTimer; 
    2425        PlaylistTableModel playlistModel; 
     26        MusicLibraryModel musicLibraryModel; 
    2527        bool slidingVolume; 
    2628 
     
    3436        void setVolume(); 
    3537        void updateCurrentSong(Song *song); 
    36         void updateStatus(MPDStatus *status); 
     38        void updateStatus(const MPDStatus &status); 
    3739        void playlistItemActivated(const QModelIndex &); 
    3840        void removeFromPlaylist(); 
  • lib/mpdconnection.cpp

    r11 r17  
    1717} 
    1818 
    19 /*MPDConnection::~MPDConnection() 
    20 { 
    21     qDebug("Closing MPDConnection..."); 
    22 }*/ 
     19MPDConnection::~MPDConnection() 
     20{ 
     21    sock.disconnectFromHost(); 
     22    quit(); 
     23 
     24    while(isRunning()) 
     25        msleep(100); 
     26} 
    2327 
    2428void MPDConnection::run() 
     
    6973 
    7074    if(hostname.isEmpty() || port == 0) { 
    71         qDebug("MPDConnection: no hostname and/or port supplied."); 
     75        qWarning("MPDConnection: no hostname and/or port supplied."); 
    7276        return false; 
    7377    } 
     
    104108            return true; 
    105109        } else { 
    106             qDebug("Couldn't connect"); 
     110            qWarning("Couldn't connect"); 
    107111            return false; 
    108112        } 
     
    152156 */ 
    153157 
     158void MPDConnection::listAllInfo() 
     159{ 
     160    QByteArray *data; 
     161 
     162    sendCommand("listallinfo"); 
     163    data = readFromSocket(); 
     164 
     165    emit musicLibraryUpdated(MPDParseUtils::parseLibraryItems(data)); 
     166 
     167    delete data; 
     168} 
     169 
     170void MPDConnection::lsInfo() 
     171{ 
     172    QByteArray *data; 
     173 
     174    sendCommand("lsinfo"); 
     175    data = readFromSocket(); 
     176 
     177    emit musicLibraryUpdated(MPDParseUtils::parseLibraryItems(data)); 
     178 
     179    delete data; 
     180} 
     181 
     182 
    154183/* 
    155184 * Playlist commands 
     
    369398{ 
    370399    QByteArray *data; 
     400    MPDStatus status; 
    371401 
    372402    sendCommand("status"); 
    373403    data = readFromSocket(); 
    374  
    375     emit statusUpdated(MPDParseUtils::parseStatus(data)); 
     404    MPDParseUtils::parseStatus(data, status); 
     405 
     406    emit statusUpdated(status); 
    376407 
    377408    delete data; 
  • lib/mpdconnection.h

    r11 r17  
    66#include <QTcpSocket> 
    77 
     8#include "gui/musiclibraryitem.h" 
    89#include "mpdstatus.h" 
    910#include "song.h" 
     
    1617        MPDConnection(QObject *parent = 0); 
    1718        MPDConnection(const QString &host, const quint16 port, QObject *parent = 0); 
    18         //~MPDConnection(); 
     19        ~MPDConnection(); 
    1920        void run(); 
    2021        bool connectToMPD(); 
     
    2627 
    2728        // Database 
     29        void listAllInfo(); 
     30        void lsInfo(); 
    2831        // TODO 
    2932 
    3033        // Playlist 
     34        void currentSong(); 
     35        void playListInfo(); 
    3136        void removeSongs(const QList<qint32> &items); 
    3237        // TODO 
     
    5661 
    5762    public slots: 
    58         // Playlist 
    59         void currentSong(); 
    60         void playListInfo(); 
    61  
    6263        // Miscellaneous 
    6364        void getStatus(); 
    6465 
    65     protected: 
     66    private: 
    6667        QString hostname; 
    6768        quint16 port; 
     
    6970        QTcpSocket sock; 
    7071        bool connected; 
     72        QMutex mutex; 
    7173 
    7274        bool commandOk(); 
    7375        void sendCommand(const QByteArray &command); 
    74  
    75     private: 
    76         QMutex mutex; 
    7776 
    7877    private slots: 
     
    8079 
    8180    signals: 
     81        void musicLibraryUpdated(QList<MusicLibraryItem *> *items); 
    8282        void currentSongUpdated(Song *song); 
    8383        void playlistUpdated(QList<Song *> *songs); 
    84         void statusUpdated(MPDStatus *status); 
     84        void statusUpdated(const MPDStatus &status); 
    8585}; 
    8686 
  • lib/mpdparseutils.cpp

    r7 r17  
    44 
    55 
    6 MPDStatus * MPDParseUtils::parseStatus(const QByteArray * const data) 
     6void MPDParseUtils::parseStatus(const QByteArray * const data, MPDStatus &destStatus) 
    77{ 
    8     MPDStatus *status = new MPDStatus; 
    9  
    108    QList<QByteArray> lines = data->split('\n'); 
    119    QList<QByteArray> tokens; 
     
    1513 
    1614        if(tokens.at(0) == "volume") { 
    17             status->volume = tokens.at(1).toUInt(); 
     15            destStatus.volume = tokens.at(1).toUInt(); 
    1816        } else if(tokens.at(0) == "repeat") { 
    1917            if(tokens.at(1) == "1") { 
    20                 status->repeat = true; 
     18                destStatus.repeat = true; 
    2119            } else { 
    22                 status->repeat = false; 
     20                destStatus.repeat = false; 
    2321            } 
    2422        } else if(tokens.at(0) == "random") { 
    2523            if(tokens.at(1) == "1") { 
    26                 status->random = "1"; 
     24                destStatus.random = "1"; 
    2725            } else { 
    28                 status->random = "0"; 
     26                destStatus.random = "0"; 
    2927            } 
    3028        } else if(tokens.at(0) == "playlist") { 
    31             status->playlist = tokens.at(1).toUInt(); 
     29            destStatus.playlist = tokens.at(1).toUInt(); 
    3230        } else if(tokens.at(0) == "playlistlength") { 
    33             status->playlistlength = tokens.at(1).toInt(); 
     31            destStatus.playlistlength = tokens.at(1).toInt(); 
    3432        } else if(tokens.at(0) == "playlistqueue") { 
    35             status->playlistqueue = tokens.at(1).toInt(); 
     33            destStatus.playlistqueue = tokens.at(1).toInt(); 
    3634        } else if(tokens.at(0) == "xfade") { 
    37             status->xfade = tokens.at(1).toInt(); 
     35            destStatus.xfade = tokens.at(1).toInt(); 
    3836        } else if(tokens.at(0) == "state") { 
    3937            if(tokens.at(1).contains("play")) { 
    40                 status->state = MPDStatus::State_Playing; 
     38                destStatus.state = MPDStatus::State_Playing; 
    4139            } else if(tokens.at(1).contains("stop")) { 
    42                 status->state = MPDStatus::State_Stopped; 
     40                destStatus.state = MPDStatus::State_Stopped; 
    4341            } else { 
    44                 status->state = MPDStatus::State_Paused; 
     42                destStatus.state = MPDStatus::State_Paused; 
    4543            } 
    4644        } else if(tokens.at(0) == "song") { 
    47             status->song = tokens.at(1).toInt(); 
     45            destStatus.song = tokens.at(1).toInt(); 
    4846        } else if(tokens.at(0) == "songid") { 
    49             status->song_id = tokens.at(1).toInt(); 
     47            destStatus.song_id = tokens.at(1).toInt(); 
    5048        } else if(tokens.at(0) == "time") { 
    51             status->time_elapsed = tokens.at(1).toInt(); 
    52             status->time_total = tokens.at(2).toInt(); 
     49            destStatus.time_elapsed = tokens.at(1).toInt(); 
     50            destStatus.time_total = tokens.at(2).toInt(); 
    5351        } else if(tokens.at(0) == "bitrate") { 
    54             status->bitrate = tokens.at(1).toUInt(); 
     52            destStatus.bitrate = tokens.at(1).toUInt(); 
    5553        } else if(tokens.at(0) == "audio") { 
    5654        } else if(tokens.at(0) == "updating_db") { 
    57             status->updating_db = tokens.at(1).toInt(); 
     55            destStatus.updating_db = tokens.at(1).toInt(); 
    5856        } else if(tokens.at(0) == "error") { 
    59             status->error = tokens.at(1); 
     57            destStatus.error = tokens.at(1); 
    6058        } 
    6159    } 
    62  
    63     return status; 
    6460} 
    6561 
     
    7773            song->file = tokens.at(1); 
    7874        } else if(tokens.at(0) == "Time") { 
     75            song->time = tokens.at(1).toUInt(); 
    7976        } else if(tokens.at(0) == "Album") { 
    80             song->album = tokens.at(1); 
     77            for(qint32 j = 1; j < tokens.size(); j++) { 
     78                if(j != 1 && j != tokens.size() - 1) 
     79                    song->album += ":"; 
     80                song->album += tokens.at(j); 
     81            } 
    8182        } else if(tokens.at(0) == "Artist") { 
    82             song->artist = tokens.at(1); 
     83            for(qint32 j = 1; j < tokens.size(); j++) { 
     84                if(j != 1 && j != tokens.size() - 1) 
     85                    song->artist += ":"; 
     86                song->artist += tokens.at(j); 
     87            } 
    8388        } else if(tokens.at(0) == "Title") { 
    84             song->title = tokens.at(1); 
     89            for(qint32 j = 1; j < tokens.size(); j++) { 
     90                if(j != 1 && j != tokens.size() - 1) 
     91                    song->title += ":"; 
     92                song->title += tokens.at(j); 
     93            } 
    8594        } else if(tokens.at(0) == "Track") { 
     95            song->track = tokens.at(1).toInt(); 
    8696        } else if(tokens.at(0) == "Pos") { 
    8797        } else if(tokens.at(0) == "Id") { 
     
    111121    return songs; 
    112122} 
     123 
     124QList<MusicLibraryItem *> * MPDParseUtils::parseLibraryItems(const QByteArray * const data) 
     125{ 
     126    QList<MusicLibraryItem *> *artists = new QList<MusicLibraryItem *>; 
     127    QByteArray currentItem; 
     128    MusicLibraryItem *artistItem, *albumItem, *songItem; 
     129    Song *currentSong; 
     130    bool found = false; 
     131 
     132    QList<QByteArray> lines = data->split('\n'); 
     133 
     134    for(qint32 i = 0; i < lines.size(); i++) { 
     135        currentItem += lines.at(i); 
     136        currentItem += "\n"; 
     137        if(i == lines.size() - 1 || lines.at(i + 1).startsWith("file:")) { 
     138            currentSong = parseSong(&currentItem); 
     139            currentItem.clear(); 
     140 
     141            if(currentSong->isEmpty()) { 
     142                delete currentSong; 
     143                continue; 
     144            } 
     145 
     146            currentSong->fillEmptyFields(); 
     147 
     148            // Check if artist already exists 
     149            for(qint32 i = 0; i < artists->size(); i++) { 
     150                if(artists->at(i)->data(0) == currentSong->artist) { 
     151                    artistItem = artists->at(i); 
     152                    found = true; 
     153                } 
     154            } 
     155 
     156            if(!found) { 
     157                artistItem = new MusicLibraryItem(currentSong->artist, MusicLibraryItem::Type_Artist); 
     158                artists->append(artistItem); 
     159            } 
     160 
     161            found = false; 
     162 
     163            // Check if album already exists 
     164            for(qint32 i = 0; i < artistItem->childCount(); i++) { 
     165                if(artistItem->child(i)->data(0) == currentSong->album) { 
     166                    albumItem = artistItem->child(i); 
     167                    found = true; 
     168                } 
     169            } 
     170 
     171            if(!found) { 
     172                albumItem = new MusicLibraryItem(currentSong->album, MusicLibraryItem::Type_Album, artistItem); 
     173                artistItem->appendChild(albumItem); 
     174            } 
     175 
     176            found = false; 
     177 
     178            // Add song to album (possibly in track order) 
     179            songItem = new MusicLibraryItem(currentSong->title, MusicLibraryItem::Type_Song, albumItem); 
     180            songItem->setFile(currentSong->file); 
     181            albumItem->appendChild(songItem); 
     182 
     183            delete currentSong; 
     184        } 
     185    } 
     186 
     187    return artists; 
     188} 
  • lib/mpdparseutils.h

    r4 r17  
    44#include "mpdstatus.h" 
    55#include "song.h" 
     6#include "gui/musiclibraryitem.h" 
    67 
    78class MPDParseUtils 
    89{ 
    910    public: 
    10         static MPDStatus * parseStatus(const QByteArray * const data); 
     11        static void parseStatus(const QByteArray * const data, MPDStatus &destStatus); 
    1112        static Song * parseSong(const QByteArray * const data); 
    1213        static QList<Song *> * parseSongs(const QByteArray * const data); 
     14        static QList<MusicLibraryItem *> * parseLibraryItems(const QByteArray * const data); 
    1315}; 
    1416 
  • lib/mpdstatus.cpp

    r3 r17  
    1010    playlistqueue = -1; 
    1111    xfade = 0; 
    12     state = MPDStatus::State_Stopped; 
     12    state = MPDStatus::State_Inactive; 
    1313    song = -1; 
    1414    song_id = -1; 
  • lib/mpdstatus.h

    r3 r17  
    1010    public: 
    1111        enum State { 
     12            State_Inactive, 
    1213            State_Playing, 
    1314            State_Stopped, 
  • lib/song.cpp

    r15 r17  
    55    id = -1; 
    66    time = 0; 
    7     track = 0; 
     7    track = -1; 
    88    pos = 0; 
    99} 
     10 
     11bool Song::isEmpty() const 
     12{ 
     13    return (artist.isEmpty() && album.isEmpty() && title.isEmpty()); 
     14} 
     15 
     16void Song::fillEmptyFields() 
     17{ 
     18    if(artist.isEmpty()) 
     19        artist = "<Unknown>"; 
     20 
     21    if(album.isEmpty()) 
     22        album = "<Unknown>"; 
     23 
     24    if(title.isEmpty()) 
     25        title = "<Unknown>"; 
     26} 
  • lib/song.h

    r15 r17  
    1414        QString artist; 
    1515        QString title; 
    16         quint32 track; 
     16        qint32 track; 
    1717        quint32 pos; 
    1818 
    1919        Song(); 
     20        bool isEmpty() const; 
     21        void fillEmptyFields(); 
    2022}; 
    2123 
Note: See TracChangeset for help on using the changeset viewer.