diff options
| author | Arno <arno@disconnect.de> | 2017-02-25 08:31:41 +0100 | 
|---|---|---|
| committer | Arno <arno@disconnect.de> | 2017-02-25 08:31:41 +0100 | 
| commit | ffa50a24296688d1c6e9f4de2315bbd494f86cf6 (patch) | |
| tree | dc8907443a6830456e0b896a075f0b39fcbb9ed1 | |
| parent | 1530584c9b942d07e331323867072b6a9809119b (diff) | |
| download | BeetPlayer-ffa50a24296688d1c6e9f4de2315bbd494f86cf6.tar.gz BeetPlayer-ffa50a24296688d1c6e9f4de2315bbd494f86cf6.tar.bz2 BeetPlayer-ffa50a24296688d1c6e9f4de2315bbd494f86cf6.zip | |
Rethink GUI
While figuring out how to populate the album view, I realized that I
don't want to view my music by albums, only by artist, maybe by genre...
So I removed the QComboBox for the different sort orders and
concentrated on the filter, which is a good thing (tm). Just make the
filter find anything you need. Name/Title is already implemented. Have to
think about genre/year...
| -rw-r--r-- | BeetPlayer.pro | 6 | ||||
| -rw-r--r-- | beetplayerproxy.cpp | 19 | ||||
| -rw-r--r-- | beetplayerproxy.h | 15 | ||||
| -rw-r--r-- | playerwidget.cpp | 60 | ||||
| -rw-r--r-- | playerwidget.h | 14 | 
5 files changed, 68 insertions, 46 deletions
| diff --git a/BeetPlayer.pro b/BeetPlayer.pro index 5e319f0..dc6e019 100644 --- a/BeetPlayer.pro +++ b/BeetPlayer.pro @@ -28,13 +28,15 @@ SOURCES += main.cpp\      configurationdialog.cpp \      indexerwidget.cpp \      globals.cpp \ -    playerwidget.cpp +    playerwidget.cpp \ +    beetplayerproxy.cpp  HEADERS  += beetplayer.h \      configurationdialog.h \      indexerwidget.h \      globals.h \ -    playerwidget.h +    playerwidget.h \ +    beetplayerproxy.h  LIBS += -ltag diff --git a/beetplayerproxy.cpp b/beetplayerproxy.cpp new file mode 100644 index 0000000..115bd3a --- /dev/null +++ b/beetplayerproxy.cpp @@ -0,0 +1,19 @@ +#include <QModelIndex> +#include "beetplayerproxy.h" + +#include <QDebug> + +BeetPlayerProxy::BeetPlayerProxy(QObject *parent) : QSortFilterProxyModel(parent) { +} + +bool BeetPlayerProxy::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const{ +    QRegExp filter = filterRegExp(); +    QModelIndex curIdx = sourceModel()->index(source_row, 0, source_parent); +    while(curIdx.isValid()){ +        if(curIdx.data().toString().contains(filter)){ +            return true; +        } +        curIdx = curIdx.parent(); +    } +    return false; +} diff --git a/beetplayerproxy.h b/beetplayerproxy.h new file mode 100644 index 0000000..b50b972 --- /dev/null +++ b/beetplayerproxy.h @@ -0,0 +1,15 @@ +#ifndef BEETPLAYERPROXY_H +#define BEETPLAYERPROXY_H + +#include <QSortFilterProxyModel> + +class BeetPlayerProxy : public QSortFilterProxyModel { +    Q_OBJECT +    public: +        BeetPlayerProxy(QObject *parent = 0); + +    protected: +        virtual bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const; +}; + +#endif // BEETPLAYERPROXY_H diff --git a/playerwidget.cpp b/playerwidget.cpp index e46990e..5df9951 100644 --- a/playerwidget.cpp +++ b/playerwidget.cpp @@ -1,4 +1,3 @@ -#include <QComboBox>  #include <QGroupBox>  #include <QLineEdit>  #include <QPushButton> @@ -9,54 +8,43 @@  #include <QSplitter>  #include <QStandardItemModel>  #include <QStandardItem> -#include <QSortFilterProxyModel>  #include <QHBoxLayout>  #include <QVBoxLayout>  #include <QSqlDatabase>  #include <QSqlQuery>  #include "playerwidget.h" +#include "beetplayerproxy.h"  PlayerWidget::PlayerWidget(QWidget *parent) : QWidget(parent){      setupGui();  }  void PlayerWidget::setupGui(){ +    //THE view +    mView = new QTreeView; +    mViewModel = new QStandardItemModel; +    mViewProxy = new BeetPlayerProxy; +    mViewProxy->setSourceModel(mViewModel); +    mView->setModel(mViewProxy); +      //filter      QGroupBox *filterGB = new QGroupBox(tr("Filter"));      mFilter = new QLineEdit;      connect(mFilter, SIGNAL(returnPressed()), this, SLOT(doFilter()));      QPushButton *filterB = new QPushButton(tr("Go!"));      connect(filterB, SIGNAL(clicked()), this, SLOT(doFilter())); +    QPushButton *clearFilterB = new QPushButton(tr("Clear")); +    connect(clearFilterB, SIGNAL(clicked()), this, SLOT(clearFilter()));      QHBoxLayout *filterLayout = new QHBoxLayout;      filterLayout->addWidget(mFilter);      filterLayout->addWidget(filterB); +    filterLayout->addWidget(clearFilterB);      filterGB->setLayout(filterLayout); -    //show by -    QGroupBox *sortByGB = new QGroupBox(tr("Show by")); -    mSortBy = new QComboBox; -    mSortBy->addItems(QStringList() << tr("Artists") << tr("Albums") << tr("Genres")); -    connect(mSortBy, SIGNAL(currentIndexChanged(QString)), this, SLOT(populateBy(QString))); -    QPushButton *refreshSortB = new QPushButton(tr("Refresh")); -    connect(refreshSortB, SIGNAL(clicked()), this, SLOT(refreshSort())); -    QHBoxLayout *sortByL = new QHBoxLayout; -    sortByL->addWidget(mSortBy); -    sortByL->addWidget(refreshSortB); -    sortByL->setStretchFactor(mSortBy, 3); -    sortByGB->setLayout(sortByL); - -    //THE view -    mView = new QTreeView; -    mViewModel = new QStandardItemModel; -    mViewProxy = new QSortFilterProxyModel; -    mViewProxy->setSourceModel(mViewModel); -    mView->setModel(mViewProxy); -      //left widget      QWidget *leftWidget = new QWidget;      QVBoxLayout *leftWidgetL = new QVBoxLayout; -    leftWidgetL->addWidget(sortByGB);      leftWidgetL->addWidget(filterGB);      leftWidgetL->addWidget(mView);      leftWidget->setLayout(leftWidgetL); @@ -110,20 +98,10 @@ void PlayerWidget::setupGui(){      QVBoxLayout *mainLayout = new QVBoxLayout;      mainLayout->addWidget(splitter);      setLayout(mainLayout); -    refreshSort(); -} - -void PlayerWidget::populateBy(QString selector){ -    if(selector == tr("Artists")){ -        populateByArtist(); -    } +    populate();  } -void PlayerWidget::refreshSort(){ -    populateBy(mSortBy->currentText()); -} - -void PlayerWidget::populateByArtist(){ +void PlayerWidget::populate(){      //prepare Queries      QSqlDatabase db = QSqlDatabase::database("beetplayerdb");      QSqlQuery artistsQ(db); @@ -131,7 +109,7 @@ void PlayerWidget::populateByArtist(){      QSqlQuery albumQ(db);      albumQ.prepare("SELECT DISTINCT(songs.ialbums_id), talbum_name, siyear FROM songs, albums WHERE songs.iartists_id = :artistid AND songs.ialbums_id = albums.ialbums_id ORDER BY siyear ASC");      QSqlQuery songQ(db); -    songQ.prepare("SELECT sipos, ttitle, tfullpath FROM songs WHERE ialbums_id = :alid AND iartists_id = :arid ORDER BY sipos ASC"); +    songQ.prepare("SELECT sipos, ttitle, tfullpath, igenres_id FROM songs WHERE ialbums_id = :alid AND iartists_id = :arid ORDER BY sipos ASC");      //reset view+model      mView->setSortingEnabled(false); @@ -170,8 +148,18 @@ void PlayerWidget::populateByArtist(){                  curSong->setData(Song, TypeRole);                  curSong->setData(songQ.value(0), IdRole);                  curSong->setData(songQ.value(2), FullPathRole); +                curSong->setData(songQ.value(3), GenreRole);                  curAlbum->appendRow(curSong);              }          }      }  } + +void PlayerWidget::doFilter(){ +    mViewProxy->setFilterRegExp(QRegExp(mFilter->text())); +} + +void PlayerWidget::clearFilter(){ +    mFilter->setText(QString()); +    doFilter(); +} diff --git a/playerwidget.h b/playerwidget.h index e6e20d5..c9206cd 100644 --- a/playerwidget.h +++ b/playerwidget.h @@ -7,33 +7,31 @@ class QTreeView;  class QStandardItemModel;  class QSortFilterProxyModel;  class QLineEdit; -class QComboBox;  class QLabel;  class QSlider;  class QTextEdit;  class QMediaPlayer; +class BeetPlayerProxy;  class PlayerWidget : public QWidget {      Q_OBJECT      public:          enum ItemType { Artist, Album, Song }; -        enum CustomRoles { TypeRole = Qt::UserRole + 1, IdRole = Qt::UserRole + 2, FullPathRole = Qt::UserRole + 3 }; +        enum CustomRoles { TypeRole = Qt::UserRole + 1, IdRole = Qt::UserRole + 2, FullPathRole = Qt::UserRole + 3, GenreRole = Qt::UserRole + 4 };          explicit PlayerWidget(QWidget *parent = 0);      public slots: -        //void doFilter(); -        void populateBy(QString selector); -        void refreshSort(); +        void populate(); +        void doFilter(); +        void clearFilter();      private:          void setupGui(); -        void populateByArtist(); -        QComboBox *mSortBy;          QLineEdit *mFilter;          QMediaPlayer *mPlayer;          QTreeView *mView;          QStandardItemModel *mViewModel; -        QSortFilterProxyModel *mViewProxy; +        BeetPlayerProxy *mViewProxy;          QLabel *mNowPlayingL;          QSlider *mSlider;          QTextEdit *mCurrentTE; | 
