From aa24b367b7fe1ee42ab09e418db7e708bdf13e25 Mon Sep 17 00:00:00 2001 From: craig Date: Thu, 8 Mar 2012 17:43:43 +0000 Subject: [PATCH] Use QTreeView for grouped style - fixes *many* issues with QListView --- widgets/playqueueview.cpp | 49 +++++++++++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 12 deletions(-) diff --git a/widgets/playqueueview.cpp b/widgets/playqueueview.cpp index 000b3dd9d..1056ea848 100644 --- a/widgets/playqueueview.cpp +++ b/widgets/playqueueview.cpp @@ -52,7 +52,34 @@ enum Type { AlbumTrack }; -class PlayQueueListView : public ListView +/* + * QScrollView seems to have *many* issues when items are hidden! And sometimes when not... + * 1. scrollTo() is broken when we have hidden items (see https://bugreports.qt-project.org/browse/QTBUG-21115) + * 2. The model using beginRemoveRows() seems to cause the view to scroll back to the top! + * + * So, as a work-around, just use a treeview! + */ +// #define USE_LISTVIEW_FOR_LIST + +#ifdef USE_LISTVIEW_FOR_LIST +#define LIST_PARENT ListView +#define FIX_SCROLL_TO +#define ROW_HIDDEN(A) isRowHidden(A) +#define SET_ROW_HIDDEN(A, B) setRowHidden(A, B) +#define LIST_DEFAULTS setUniformItemSizes(false); +#else +#define LIST_PARENT TreeView +#define ROW_HIDDEN(A) isRowHidden(A, QModelIndex()) +#define SET_ROW_HIDDEN(A, B) setRowHidden(A, QModelIndex(), B) +#define LIST_DEFAULTS \ + setRootIsDecorated(false); \ + setHeaderHidden(true); \ + setIndentation(0); \ + setItemsExpandable(false); \ + setExpandsOnDoubleClick(false); +#endif + +class PlayQueueListView : public LIST_PARENT { public: PlayQueueListView(QWidget *parent=0); @@ -350,7 +377,7 @@ private: }; PlayQueueListView::PlayQueueListView(QWidget *parent) - : ListView(parent) + : LIST_PARENT(parent) , autoCollapsingEnabled(false) , filterActive(false) , currentAlbum(Song::constNullKey) @@ -361,7 +388,7 @@ PlayQueueListView::PlayQueueListView(QWidget *parent) setDragDropMode(QAbstractItemView::DragDrop); setSelectionMode(QAbstractItemView::ExtendedSelection); setDropIndicatorShown(true); - setUniformItemSizes(false); + LIST_DEFAULTS setSelectionBehavior(SelectRows); setItemDelegate(new PlayQueueDelegate(this)); } @@ -379,7 +406,7 @@ void PlayQueueListView::setFilterActive(bool f) if (filterActive && model()) { quint32 count=model()->rowCount(); for (quint32 i=0; iindex(i, 0).data(PlayQueueView::Role_Key).toUInt(); bool hide=key==lastKey && key!=currentAlbum && (( autoCollapsingEnabled && !controlledAlbums.contains(key)) || ( !autoCollapsingEnabled && controlledAlbums.contains(key))); - setRowHidden(i, hide); + SET_ROW_HIDDEN(i, hide); #ifdef FIX_SCROLL_TO if (hide && iindex(i, 0).data(PlayQueueView::Role_Key).toUInt(); if (indexKey==key) { - setRowHidden(i, toBeHidden); + SET_ROW_HIDDEN(i, toBeHidden); } else { break; } @@ -510,7 +535,7 @@ void PlayQueueListView::toggle(const QModelIndex &idx) // are selected. QModelIndexList PlayQueueListView::selectedIndexes() const { - QModelIndexList indexes = ListView::selectedIndexes(); + QModelIndexList indexes = LIST_PARENT::selectedIndexes(); QModelIndexList allIndexes; quint32 rowCount=model()->rowCount(); @@ -545,7 +570,7 @@ void PlayQueueListView::dropEvent(QDropEvent *event) quint32 dropRowAdjust=0; PlayQueueModel *m=qobject_cast(model()); if (m && viewport()->rect().contains(event->pos())) { - QModelIndex idx=ListView::indexAt(event->pos()); + QModelIndex idx=LIST_PARENT::indexAt(event->pos()); if (idx.isValid() && AlbumHeader==getType(idx)) { QRect rect(visualRect(idx)); if (event->pos().y()>(rect.y()+(rect.height()/2))) { @@ -571,7 +596,7 @@ void PlayQueueListView::dropEvent(QDropEvent *event) } } - ListView::dropEvent(event); + LIST_PARENT::dropEvent(event); m->setDropAdjust(0); } @@ -588,7 +613,7 @@ void PlayQueueListView::coverRetrieved(const QString &artist, const QString &alb QModelIndex index=model()->index(i, 0); quint16 key=index.data(PlayQueueView::Role_Key).toUInt(); - if (key!=lastKey && !isRowHidden(i)) { + if (key!=lastKey && !ROW_HIDDEN(i)) { Song song=index.data(PlayQueueView::Role_Song).value(); if (song.albumArtist()==artist && song.album==album) { dataChanged(index, index);