From c68223374982b786e15123ff0407ce7567ab04cc Mon Sep 17 00:00:00 2001 From: Thomas Frauendorfer Date: Sun, 14 Dec 2008 23:55:56 +0100 Subject: [PATCH] OTHER: scroll playlist to current entry --- lib/playlistmodel.cpp | 2 ++ lib/playlistmodel.h | 5 ++++- src/playlist/playlistview.cpp | 17 +++++++++++++++-- src/playlist/playlistview.h | 7 +++++-- src/settingsdialog.cpp | 13 +++++++++++++ src/settingsdialog.h | 1 + 6 files changed, 40 insertions(+), 5 deletions(-) diff --git a/lib/playlistmodel.cpp b/lib/playlistmodel.cpp index d331702..54f82fe 100644 --- a/lib/playlistmodel.cpp +++ b/lib/playlistmodel.cpp @@ -121,6 +121,7 @@ PlaylistModel::handle_update_pos (const Xmms::Dict &posdict) if (changed_pl == m_name) { uint32_t pos = posdict.get ("position"); m_current_pos = pos; + emit currentPosChanged (index (pos, 0)); emit dataChanged(index (pos, 0), index (pos, m_columns.size ())); } return true; @@ -130,6 +131,7 @@ bool PlaylistModel::handle_update_pos (const uint32_t &pos) { m_current_pos = pos; + emit currentPosChanged (index (pos, 0)); emit dataChanged(index (pos, 0), index (pos, m_columns.size ())); return true; } diff --git a/lib/playlistmodel.h b/lib/playlistmodel.h index 65d9e2c..3f915af 100644 --- a/lib/playlistmodel.h +++ b/lib/playlistmodel.h @@ -65,7 +65,9 @@ class PlaylistModel : public QAbstractItemModel bool dropMimeData (const QMimeData * data, Qt::DropAction action, int row, int column, const QModelIndex & parent); Qt::DropActions supportedDropActions () const; QStringList mimeTypes () const; - + + QModelIndex currentPos () {return index (m_current_pos, 0);} + /** * Set the columns that should be shown in the view. * @param columns A list of property keys. i.e. "artist", "album" @@ -122,6 +124,7 @@ class PlaylistModel : public QAbstractItemModel signals: void entryMoved (const QModelIndex &, const QModelIndex &); + void currentPosChanged (QModelIndex); public slots: void got_connection (XClient *); diff --git a/src/playlist/playlistview.cpp b/src/playlist/playlistview.cpp index c017de9..41462cd 100644 --- a/src/playlist/playlistview.cpp +++ b/src/playlist/playlistview.cpp @@ -166,10 +166,21 @@ PlaylistView::removeSelected () { } void -PlaylistView::setModel (QAbstractItemModel *model) { - QListView::setModel (model); +PlaylistView::setModel (PlaylistModel *plmodel) { + if (model ()) disconnect (model (), 0, this, SLOT (currentPosChanged (QModelIndex))); + QListView::setModel (plmodel); setModelColumn(0); updateGeometry(); + connect (plmodel, SIGNAL (currentPosChanged (QModelIndex)), + this, SLOT (currentPosChanged (QModelIndex))); +} + +void +PlaylistView::currentPosChanged (QModelIndex index) { + QSettings s; + if (s.value ("playlist/scrolltocurrent", true).toBool ()) { + scrollTo (index); + } } void @@ -228,6 +239,8 @@ PlaylistView::settingsChanged () } m_fontmetrics = new QFontMetrics (*m_font); update (); + // Scroll to current pos, if enabled + currentPosChanged (qobject_cast(model())->currentPos ()); } void diff --git a/src/playlist/playlistview.h b/src/playlist/playlistview.h index 6d6c810..b252089 100644 --- a/src/playlist/playlistview.h +++ b/src/playlist/playlistview.h @@ -20,6 +20,7 @@ #include #include "entryinfo.h" class Skin; +class PlaylistModel; #include #include @@ -50,7 +51,9 @@ class PlaylistView : public QListView { PlaylistView (QWidget *parent); ~PlaylistView () {} - void setModel (QAbstractItemModel *model); + void setModel (QAbstractItemModel *model) + {qWarning ("Trying to set wrong model in PlaylistView"); return;}; + void setModel (PlaylistModel *model); public slots: void contextMenuEvent (QContextMenuEvent *e); @@ -62,7 +65,7 @@ class PlaylistView : public QListView { void showEntryInfo (void); void settingsChanged (void); void setPixmaps (Skin *skin); - + void currentPosChanged (QModelIndex); protected: void mouseDoubleClickEvent (QMouseEvent *event); diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp index 3d56fe3..9a0d3ce 100644 --- a/src/settingsdialog.cpp +++ b/src/settingsdialog.cpp @@ -311,6 +311,18 @@ SettingsTabPlaylist::SettingsTabPlaylist (QWidget *parent) : QWidget (parent) l = new QLabel (tr ("Use remote filebrowsing"), c); h->addWidget (l, 1); + c = new QWidget (dummy); + h = new QHBoxLayout (c); + vbox->addWidget (c, 1); + + m_scroll_view = new QCheckBox (c); + if (!s.contains ("scrolltocurrent")) + s.setValue ("scrolltocurrent", true); + m_scroll_view->setCheckState (s.value ("scrolltocurrent").toBool () ? Qt::Checked : Qt::Unchecked); + h->addWidget (m_scroll_view); + l = new QLabel (tr ("Scroll playlist to current entry"), c); + h->addWidget (l, 1); + s.endGroup (); } @@ -321,6 +333,7 @@ SettingsTabPlaylist::saveSettings (void) s.setValue ("playlist/fontsize", m_fontsize->value ()); s.setValue ("playlist/shadedsize", m_shadesize->value ()); s.setValue ("playlist/useremote", m_remote_fs->checkState () == Qt::Checked); + s.setValue ("playlist/scrolltocurrent", m_scroll_view->checkState () == Qt::Checked); //TODO: Check if we really changed something return true; } diff --git a/src/settingsdialog.h b/src/settingsdialog.h index b362ea3..a6669a8 100644 --- a/src/settingsdialog.h +++ b/src/settingsdialog.h @@ -51,6 +51,7 @@ class SettingsTabPlaylist : public QWidget { QSpinBox *m_fontsize; QSpinBox *m_shadesize; QCheckBox *m_remote_fs; + QCheckBox *m_scroll_view; }; class SettingsTabMain : public QWidget {