diff --git a/res/skins/Deere/style.qss b/res/skins/Deere/style.qss index 6b370309c3ce..d8ec8ba9c584 100644 --- a/res/skins/Deere/style.qss +++ b/res/skins/Deere/style.qss @@ -2049,6 +2049,7 @@ QToolTip, WLibrarySidebar QMenu, WLibrarySidebar QMenu::item, WTrackTableViewHeader QMenu, +WTrackTableViewHeader QMenu::item, WTrackTableViewHeader QMenu QCheckBox, WLibraryTextBrowser QMenu, WLibraryTextBrowser QMenu::item, @@ -2105,6 +2106,7 @@ WSearchLineEdit QAbstractScrollArea, #MainMenu QMenu::indicator:unchecked:selected, WLibrarySidebar QMenu::item:selected, WLibrarySidebar QMenu::indicator:unchecked:selected, + WTrackTableViewHeader QMenu::item:selected, WTrackTableViewHeader QMenu QCheckBox:selected, WTrackTableViewHeader QMenu QCheckBox:focus, WTrackTableViewHeader QMenu QCheckBox:hover, diff --git a/res/skins/LateNight/style.qss b/res/skins/LateNight/style.qss index 6cccc0ca1fef..43046640cae4 100644 --- a/res/skins/LateNight/style.qss +++ b/res/skins/LateNight/style.qss @@ -172,7 +172,6 @@ WSearchLineEdit::item:selected, } WLibrarySidebar QMenu::indicator, - WTrackTableViewHeader QMenu::indicator, WTrackMenu QMenu QCheckBox::indicator, WEffectChainPresetButton QMenu QCheckBox::indicator { /* Note that the border is added to the base size of 0.7em x 0.7em @@ -205,8 +204,6 @@ WSearchLineEdit::item:selected, background-color: transparent; } - WSearchRelatedTracksMenu #SearchSelectedAction::indicator { - } WSearchRelatedTracksMenu #SearchSelectedAction::indicator:disabled { image: url(skins:LateNight/palemoon/buttons/btn__search_disabled.svg); } diff --git a/res/skins/LateNight/style_classic.qss b/res/skins/LateNight/style_classic.qss index d86a6b623f6b..e27b4f5ed187 100644 --- a/res/skins/LateNight/style_classic.qss +++ b/res/skins/LateNight/style_classic.qss @@ -2580,6 +2580,7 @@ QToolTip, WLibrarySidebar QMenu, WLibrarySidebar QMenu::item, WTrackTableViewHeader QMenu, +/*WTrackTableViewHeader QMenu::item,*/ WTrackTableViewHeader QMenu QCheckBox, WLibraryTextBrowser QMenu, WLibraryTextBrowser QMenu::item, @@ -2623,8 +2624,9 @@ WEffectSelector, /* ::indicator:!checked won't work. use 'unchecked' */ #MainMenu QMenu::indicator:unchecked:selected, WLibrarySidebar QMenu::item:selected, -WTrackTableViewHeader QMenu QCheckBox:selected, +WTrackTableViewHeader QMenu::item:selected, WTrackTableViewHeader QMenu QCheckBox:focus, +WTrackTableViewHeader QMenu QCheckBox:selected, WTrackTableViewHeader QMenu QCheckBox:hover, WTrackMenu::item:selected, WTrackMenu QMenu::item:selected, diff --git a/res/skins/LateNight/style_palemoon.qss b/res/skins/LateNight/style_palemoon.qss index aa9e5bcd1290..f3caf48b9a6d 100644 --- a/res/skins/LateNight/style_palemoon.qss +++ b/res/skins/LateNight/style_palemoon.qss @@ -3055,6 +3055,7 @@ QToolTip, WLibrarySidebar QMenu, WLibrarySidebar QMenu::item, WTrackTableViewHeader QMenu, +WTrackTableViewHeader QMenu::item, WTrackTableViewHeader QMenu QCheckBox, WLibraryTextBrowser QMenu, WLibraryTextBrowser QMenu::item, @@ -3094,6 +3095,7 @@ WSearchLineEdit::item { /* ::indicator:!checked won't work. use 'unchecked' */ #MainMenu QMenu::indicator:unchecked:selected, WLibrarySidebar QMenu::item:selected, +WTrackTableViewHeader QMenu::item:selected, WTrackTableViewHeader QMenu QCheckBox:selected, WTrackTableViewHeader QMenu QCheckBox:focus, WTrackTableViewHeader QMenu QCheckBox:hover, diff --git a/res/skins/Shade/style.qss b/res/skins/Shade/style.qss index 942fb8470ecd..f0a14387f898 100644 --- a/res/skins/Shade/style.qss +++ b/res/skins/Shade/style.qss @@ -101,6 +101,7 @@ QToolTip, WLibrarySidebar QMenu, WLibrarySidebar QMenu::item, WTrackTableViewHeader QMenu, +WTrackTableViewHeader QMenu::item, WTrackTableViewHeader QMenu QCheckBox, WLibraryTextBrowser QMenu, WTrackMenu, @@ -154,6 +155,7 @@ WBeatSpinBox, #MainMenu QMenu::indicator:unchecked:selected, WLibrarySidebar QMenu::item:selected, WLibrarySidebar QMenu::indicator:unchecked:selected, +WTrackTableViewHeader QMenu::item:selected, WTrackTableViewHeader QMenu QCheckBox:selected, WTrackTableViewHeader QMenu QCheckBox:focus, WTrackTableViewHeader QMenu QCheckBox:hover, diff --git a/res/skins/Shade/style_dark.qss b/res/skins/Shade/style_dark.qss index bfb776cff531..1b152656cd25 100644 --- a/res/skins/Shade/style_dark.qss +++ b/res/skins/Shade/style_dark.qss @@ -6,6 +6,7 @@ QToolTip, WLibrarySidebar QMenu, WLibrarySidebar QMenu::item, WTrackTableViewHeader QMenu, +WTrackTableViewHeader QMenu::item, WTrackTableViewHeader QMenu QCheckBox, WLibraryTextBrowser QMenu, WLibraryTextBrowser QMenu::item, @@ -55,9 +56,10 @@ WEffectSelector::indicator:unchecked, #MainMenu QMenu::indicator:unchecked:selected, WLibrarySidebar QMenu::item:selected, WLibrarySidebar QMenu::indicator:unchecked:selected, -WTrackTableViewHeader QMenu:selected, -WTrackTableViewHeader QMenu:focus, -WTrackTableViewHeader QMenu:hover, +WTrackTableViewHeader QMenu::item:selected, +WTrackTableViewHeader QMenu QCheckBox:selected, +WTrackTableViewHeader QMenu QCheckBox:focus, +WTrackTableViewHeader QMenu QCheckBox:hover, WLibraryTextBrowser QMenu::item:selected, WTrackMenu::item:selected, WTrackMenu QMenu::item:selected, diff --git a/res/skins/Shade/style_summer_sunset.qss b/res/skins/Shade/style_summer_sunset.qss index 560377cda8cd..0682c70b7bf1 100644 --- a/res/skins/Shade/style_summer_sunset.qss +++ b/res/skins/Shade/style_summer_sunset.qss @@ -6,6 +6,7 @@ QToolTip, WLibrarySidebar QMenu, WLibrarySidebar QMenu::item, WTrackTableViewHeader QMenu, +WTrackTableViewHeader QMenu::item, WTrackTableViewHeader QMenu QCheckBox, QTextBrowser QMenu, QTextBrowser QMenu::item, @@ -65,6 +66,7 @@ WBeatSpinBox, #MainMenu QMenu::indicator:unchecked:selected, WLibrarySidebar QMenu::item:selected, WLibrarySidebar QMenu::indicator:unchecked:selected, +WTrackTableViewHeader QMenu::item:selected, WTrackTableViewHeader QMenu QCheckBox:selected, WTrackTableViewHeader QMenu QCheckBox:focus, WTrackTableViewHeader QMenu QCheckBox:hover, diff --git a/res/skins/Tango/style.qss b/res/skins/Tango/style.qss index 6cc1bbe05589..74ad94f56b8d 100644 --- a/res/skins/Tango/style.qss +++ b/res/skins/Tango/style.qss @@ -2307,6 +2307,7 @@ QToolTip, WLibrarySidebar QMenu, WLibrarySidebar QMenu::item, WTrackTableViewHeader QMenu, +WTrackTableViewHeader QMenu::item, WTrackTableViewHeader QMenu QCheckBox, WLibraryTextBrowser QMenu, WLibraryTextBrowser QMenu::item, @@ -2377,6 +2378,7 @@ WSearchLineEdit QAbstractScrollArea, /* ::indicator:!checked won't work. use 'unchecked' */ #MainMenu QMenu::indicator:unchecked:selected, WLibrarySidebar QMenu::item:selected, +WTrackTableViewHeader QMenu::item:selected, WTrackTableViewHeader QMenu QCheckBox:selected, WTrackTableViewHeader QMenu QCheckBox:focus, WTrackTableViewHeader QMenu QCheckBox:hover, diff --git a/res/skins/default.qss b/res/skins/default.qss index 898d6617c82e..b014f3b7e102 100644 --- a/res/skins/default.qss +++ b/res/skins/default.qss @@ -151,10 +151,6 @@ WLibraryTextBrowser QMenu::icon { padding: 0em 0em 0em 2em; } -/* Column checkboxes in the table header menu */ -WTrackTableViewHeader QMenu::indicator { - margin: 0 -1em 0 0.25em; -} /* Column checkboxes in the table header menu */ WTrackTableViewHeader QMenu QCheckBox, diff --git a/src/library/autodj/dlgautodj.cpp b/src/library/autodj/dlgautodj.cpp index 9034b04c379d..7b9f31552765 100644 --- a/src/library/autodj/dlgautodj.cpp +++ b/src/library/autodj/dlgautodj.cpp @@ -31,8 +31,7 @@ DlgAutoDJ::DlgAutoDJ(WLibrary* parent, m_pTrackTableView(new WTrackTableView(this, m_pConfig, pLibrary, - parent->getTrackTableBackgroundColorOpacity(), - /*no sorting*/ false)), + parent->getTrackTableBackgroundColorOpacity())), m_bShowButtonText(parent->getShowButtonText()), m_pAutoDJTableModel(nullptr) { setupUi(this); diff --git a/src/library/baseexternalplaylistmodel.cpp b/src/library/baseexternalplaylistmodel.cpp index 9619bd799dcb..9e8a7c1493ae 100644 --- a/src/library/baseexternalplaylistmodel.cpp +++ b/src/library/baseexternalplaylistmodel.cpp @@ -193,7 +193,8 @@ TrackModel::Capabilities BaseExternalPlaylistModel::getCapabilities() const { Capability::AddToAutoDJ | Capability::LoadToDeck | Capability::LoadToPreviewDeck | - Capability::LoadToSampler; + Capability::LoadToSampler | + Capability::Sorting; } QString BaseExternalPlaylistModel::modelKey(bool noSearch) const { diff --git a/src/library/baseexternaltrackmodel.cpp b/src/library/baseexternaltrackmodel.cpp index 2fa6749a6a91..c919e7a65dad 100644 --- a/src/library/baseexternaltrackmodel.cpp +++ b/src/library/baseexternaltrackmodel.cpp @@ -131,5 +131,6 @@ TrackModel::Capabilities BaseExternalTrackModel::getCapabilities() const { Capability::AddToAutoDJ | Capability::LoadToDeck | Capability::LoadToPreviewDeck | - Capability::LoadToSampler; + Capability::LoadToSampler | + Capability::Sorting; } diff --git a/src/library/library.cpp b/src/library/library.cpp index 1b784ff4b3d4..b4feee7f104c 100644 --- a/src/library/library.cpp +++ b/src/library/library.cpp @@ -386,8 +386,7 @@ void Library::bindLibraryWidget( WTrackTableView* pTrackTableView = new WTrackTableView(m_pLibraryWidget, m_pConfig, this, - m_pLibraryWidget->getTrackTableBackgroundColorOpacity(), - true); + m_pLibraryWidget->getTrackTableBackgroundColorOpacity()); pTrackTableView->installEventFilter(pKeyboard); connect(this, &Library::showTrackModel, diff --git a/src/library/librarytablemodel.cpp b/src/library/librarytablemodel.cpp index aec9a8777d68..6145f5c52d3f 100644 --- a/src/library/librarytablemodel.cpp +++ b/src/library/librarytablemodel.cpp @@ -99,5 +99,6 @@ TrackModel::Capabilities LibraryTableModel::getCapabilities() const { Capability::ResetPlayed | Capability::RemoveFromDisk | Capability::Analyze | - Capability::Properties; + Capability::Properties | + Capability::Sorting; } diff --git a/src/library/missing_hidden/dlghidden.cpp b/src/library/missing_hidden/dlghidden.cpp index 0943a182eb32..415841789bc9 100644 --- a/src/library/missing_hidden/dlghidden.cpp +++ b/src/library/missing_hidden/dlghidden.cpp @@ -22,8 +22,7 @@ DlgHidden::DlgHidden( this, pConfig, pLibrary, - parent->getTrackTableBackgroundColorOpacity(), - true)) { + parent->getTrackTableBackgroundColorOpacity())) { setupUi(this); m_pTrackTableView->installEventFilter(pKeyboard); diff --git a/src/library/missing_hidden/dlgmissing.cpp b/src/library/missing_hidden/dlgmissing.cpp index 736fb4842cdc..0770f48101de 100644 --- a/src/library/missing_hidden/dlgmissing.cpp +++ b/src/library/missing_hidden/dlgmissing.cpp @@ -22,8 +22,7 @@ DlgMissing::DlgMissing( this, pConfig, pLibrary, - parent->getTrackTableBackgroundColorOpacity(), - true)) { + parent->getTrackTableBackgroundColorOpacity())) { setupUi(this); m_pTrackTableView->installEventFilter(pKeyboard); diff --git a/src/library/missing_hidden/hiddentablemodel.cpp b/src/library/missing_hidden/hiddentablemodel.cpp index 49e27764100a..5d147907ebef 100644 --- a/src/library/missing_hidden/hiddentablemodel.cpp +++ b/src/library/missing_hidden/hiddentablemodel.cpp @@ -105,7 +105,8 @@ TrackModel::Capabilities HiddenTableModel::getCapabilities() const { Capability::LoadToPreviewDeck | Capability::ResetPlayed | Capability::Analyze | - Capability::Properties; + Capability::Properties | + Capability::Sorting; } QString HiddenTableModel::modelKey(bool noSearch) const { diff --git a/src/library/missing_hidden/missingtablemodel.cpp b/src/library/missing_hidden/missingtablemodel.cpp index 400f3fc4d274..73b541679726 100644 --- a/src/library/missing_hidden/missingtablemodel.cpp +++ b/src/library/missing_hidden/missingtablemodel.cpp @@ -88,7 +88,9 @@ Qt::ItemFlags MissingTableModel::flags(const QModelIndex &index) const { } TrackModel::Capabilities MissingTableModel::getCapabilities() const { - return Capability::Purge | Capability::Properties; + return Capability::Purge | + Capability::Properties | + Capability::Sorting; } QString MissingTableModel::modelKey(bool noSearch) const { diff --git a/src/library/playlisttablemodel.cpp b/src/library/playlisttablemodel.cpp index 90ae39fbd984..fb9e0f0b77b8 100644 --- a/src/library/playlisttablemodel.cpp +++ b/src/library/playlisttablemodel.cpp @@ -401,8 +401,9 @@ TrackModel::Capabilities PlaylistTableModel::getCapabilities() const { m_pTrackCollectionManager->internalCollection() ->getPlaylistDAO() .getPlaylistIdFromName(AUTODJ_TABLE)) { - // Only allow Add to AutoDJ if we aren't currently showing the AutoDJ queue. - caps |= Capability::AddToAutoDJ | Capability::RemovePlaylist; + // Only allow Add to AutoDJ and sorting if we aren't currently showing + // the AutoDJ queue. + caps |= Capability::AddToAutoDJ | Capability::RemovePlaylist | Capability::Sorting; } else { caps |= Capability::Remove; } diff --git a/src/library/recording/dlgrecording.cpp b/src/library/recording/dlgrecording.cpp index a68360974657..279f737c26fa 100644 --- a/src/library/recording/dlgrecording.cpp +++ b/src/library/recording/dlgrecording.cpp @@ -21,8 +21,7 @@ DlgRecording::DlgRecording( this, pConfig, pLibrary, - parent->getTrackTableBackgroundColorOpacity(), - true)), + parent->getTrackTableBackgroundColorOpacity())), m_browseModel(this, pLibrary->trackCollectionManager(), pRecordingManager), m_proxyModel(&m_browseModel, true), m_bytesRecordedStr("--"), diff --git a/src/library/trackmodel.h b/src/library/trackmodel.h index 3ef3c67d4058..ff448127cad5 100644 --- a/src/library/trackmodel.h +++ b/src/library/trackmodel.h @@ -52,6 +52,7 @@ class TrackModel { RemoveFromDisk = 1u << 16u, Analyze = 1u << 17u, Properties = 1u << 18u, + Sorting = 1u << 19u, }; Q_DECLARE_FLAGS(Capabilities, Capability) diff --git a/src/library/trackset/crate/cratetablemodel.cpp b/src/library/trackset/crate/cratetablemodel.cpp index 076c54488162..79a9ccf8534d 100644 --- a/src/library/trackset/crate/cratetablemodel.cpp +++ b/src/library/trackset/crate/cratetablemodel.cpp @@ -134,7 +134,8 @@ TrackModel::Capabilities CrateTableModel::getCapabilities() const { Capability::Hide | Capability::RemoveFromDisk | Capability::Analyze | - Capability::Properties; + Capability::Properties | + Capability::Sorting; if (m_selectedCrate.isValid()) { Crate crate; diff --git a/src/widget/wanalysislibrarytableview.cpp b/src/widget/wanalysislibrarytableview.cpp index 13832666137e..fbdb9be8b7e4 100644 --- a/src/widget/wanalysislibrarytableview.cpp +++ b/src/widget/wanalysislibrarytableview.cpp @@ -10,8 +10,7 @@ WAnalysisLibraryTableView::WAnalysisLibraryTableView( : WTrackTableView(parent, pConfig, pLibrary, - trackTableBackgroundColorOpacity, - true) { + trackTableBackgroundColorOpacity) { setDragDropMode(QAbstractItemView::DragOnly); setDragEnabled(true); //Always enable drag for now (until we have a model that doesn't support this.) } diff --git a/src/widget/wtracktableview.cpp b/src/widget/wtracktableview.cpp index 1c85aa65b5f5..b1f4a03557cf 100644 --- a/src/widget/wtracktableview.cpp +++ b/src/widget/wtracktableview.cpp @@ -40,12 +40,11 @@ const ConfigKey kVScrollBarPosConfigKey{ } // anonymous namespace -WTrackTableView::WTrackTableView(QWidget* parent, +WTrackTableView::WTrackTableView(QWidget* pParent, UserSettingsPointer pConfig, Library* pLibrary, - double backgroundColorOpacity, - bool sorting) - : WLibraryTableView(parent, pConfig), + double backgroundColorOpacity) + : WLibraryTableView(pParent, pConfig), m_pConfig(pConfig), m_pLibrary(pLibrary), m_backgroundColorOpacity(backgroundColorOpacity), @@ -53,7 +52,7 @@ WTrackTableView::WTrackTableView(QWidget* parent, m_focusBorderColor(Qt::white), m_trackPlayedColor(QColor(kDefaultTrackPlayedColor)), m_trackMissingColor(QColor(kDefaultTrackMissingColor)), - m_sorting(sorting), + m_sorting(false), m_selectionChangedSinceLastGuiTick(true), m_loadCachedOnly(false) { // Connect slots and signals to make the world go 'round. @@ -175,6 +174,8 @@ void WTrackTableView::loadTrackModel(QAbstractItemModel* model, bool restoreStat return; } + m_sorting = pTrackModel->hasCapabilities(TrackModel::Capability::Sorting); + // If the model has not changed there's no need to exchange the headers // which would cause a small GUI freeze if (getTrackModel() == pTrackModel) { @@ -192,10 +193,10 @@ void WTrackTableView::loadTrackModel(QAbstractItemModel* model, bool restoreStat setVisible(false); // Save the previous track model's header state - WTrackTableViewHeader* oldHeader = + WTrackTableViewHeader* pOldheader = qobject_cast(horizontalHeader()); - if (oldHeader) { - oldHeader->saveHeaderState(); + if (pOldheader) { + pOldheader->saveHeaderState(); } // rryan 12/2009 : Due to a bug in Qt, in order to switch to a model with @@ -203,7 +204,7 @@ void WTrackTableView::loadTrackModel(QAbstractItemModel* model, bool restoreStat // header. Also, for some reason the WTrackTableView has to be hidden or // else problems occur. Since we parent the WtrackTableViewHeader's to the // WTrackTableView, they are automatically deleted. - auto* header = new WTrackTableViewHeader(Qt::Horizontal, this); + auto* pHeader = new WTrackTableViewHeader(Qt::Horizontal, this); // WTF(rryan) The following saves on unnecessary work on the part of // WTrackTableHeaderView. setHorizontalHeader() calls setModel() on the @@ -229,17 +230,17 @@ void WTrackTableView::loadTrackModel(QAbstractItemModel* model, bool restoreStat setHorizontalHeader(tempHeader); setModel(model); - setHorizontalHeader(header); - header->setSectionsMovable(true); - header->setSectionsClickable(true); + setHorizontalHeader(pHeader); + pHeader->setSectionsMovable(true); + pHeader->setSectionsClickable(true); // Setting this to true would render all column labels BOLD as soon as the // tableview is focused -- and would not restore the previous style when // it's unfocused. This can not be overwritten with qss, so it can screw up // the skin design. Also, due to selectionModel()->selectedRows() it is not // even useful to indicate the focused column because all columns are highlighted. - header->setHighlightSections(false); - header->setSortIndicatorShown(m_sorting); - header->setDefaultAlignment(Qt::AlignLeft); + pHeader->setHighlightSections(false); + pHeader->setSortIndicatorShown(m_sorting); + pHeader->setDefaultAlignment(Qt::AlignLeft); // Initialize all column-specific things for (int i = 0; i < model->columnCount(); ++i) { @@ -263,7 +264,7 @@ void WTrackTableView::loadTrackModel(QAbstractItemModel* model, bool restoreStat // contain a potential large number of NULL values. This will hide the // key column by default unless the user brings it to front if (pTrackModel->isColumnHiddenByDefault(i) && - !header->hasPersistedHeaderState()) { + !pHeader->hasPersistedHeaderState()) { //qDebug() << "Hiding column" << i; horizontalHeader()->hideSection(i); } @@ -279,6 +280,10 @@ void WTrackTableView::loadTrackModel(QAbstractItemModel* model, bool restoreStat this, &WTrackTableView::slotSortingChanged, Qt::AutoConnection); + connect(pHeader, + &WTrackTableViewHeader::shuffle, + this, + &WTrackTableView::slotRandomSorting); Qt::SortOrder sortOrder; TrackModel::SortColumnId sortColumn = @@ -1768,6 +1773,15 @@ void WTrackTableView::slotSortingChanged(int headerSection, Qt::SortOrder order) } } +void WTrackTableView::slotRandomSorting() { + // There's no need to remove the shuffle feature of the Preview column + // (and replace it with a dedicated randomize slot to BaseSqltableModel), + // so we simply abuse that column. + auto previewCol = TrackModel::SortColumnId::Preview; + m_pSortColumn->set(static_cast(previewCol)); + applySortingIfVisible(); +} + bool WTrackTableView::hasFocus() const { return QWidget::hasFocus(); } diff --git a/src/widget/wtracktableview.h b/src/widget/wtracktableview.h index b88330c05db0..8ea734ba77a7 100644 --- a/src/widget/wtracktableview.h +++ b/src/widget/wtracktableview.h @@ -26,11 +26,10 @@ class WTrackTableView : public WLibraryTableView { Q_OBJECT public: WTrackTableView( - QWidget* parent, + QWidget* pParent, UserSettingsPointer pConfig, Library* pLibrary, - double backgroundColorOpacity, - bool sorting); + double backgroundColorOpacity); ~WTrackTableView() override; void contextMenuEvent(QContextMenuEvent * event) override; QString columnNameOfIndex(const QModelIndex& index) const; @@ -143,6 +142,7 @@ class WTrackTableView : public WLibraryTableView { void slotScrollValueChanged(int); void slotSortingChanged(int headerSection, Qt::SortOrder order); + void slotRandomSorting(); void keyNotationChanged(); protected: diff --git a/src/widget/wtracktableviewheader.cpp b/src/widget/wtracktableviewheader.cpp index 1c5cfc27d602..06fcb9104b92 100644 --- a/src/widget/wtracktableviewheader.cpp +++ b/src/widget/wtracktableviewheader.cpp @@ -110,9 +110,9 @@ void WTrackTableViewHeader::contextMenuEvent(QContextMenuEvent* event) { } void WTrackTableViewHeader::setModel(QAbstractItemModel* model) { - TrackModel* oldTrackModel = getTrackModel(); + TrackModel* pOldTrackModel = getTrackModel(); - if (dynamic_cast(oldTrackModel) == model) { + if (dynamic_cast(pOldTrackModel) == model) { // If the models are the same, do nothing but the redundant call. QHeaderView::setModel(model); return; @@ -131,9 +131,9 @@ void WTrackTableViewHeader::setModel(QAbstractItemModel* model) { QHeaderView::setModel(model); // Now build actions for the new TrackModel - TrackModel* trackModel = dynamic_cast(model); + TrackModel* pTrackModel = dynamic_cast(model); - if (!trackModel) { + if (!pTrackModel) { return; } @@ -158,7 +158,7 @@ void WTrackTableViewHeader::setModel(QAbstractItemModel* model) { // * toggle and close by pressing Return on a selected box int columns = model->columnCount(); for (int i = 0; i < columns; ++i) { - if (trackModel->isColumnInternal(i)) { + if (pTrackModel->isColumnInternal(i)) { continue; } @@ -177,7 +177,7 @@ void WTrackTableViewHeader::setModel(QAbstractItemModel* model) { // due to database schema evolution we gonna hide all columns that may // contain a potential large number of NULL values. Here we uncheck // the items that are hidden by default (e.g., key column). - if (!hasPersistedHeaderState() && trackModel->isColumnHiddenByDefault(i)) { + if (!hasPersistedHeaderState() && pTrackModel->isColumnHiddenByDefault(i)) { pCheckBox->setChecked(false); } else { pCheckBox->setChecked(!isSectionHidden(i)); @@ -204,6 +204,19 @@ void WTrackTableViewHeader::setModel(QAbstractItemModel* model) { } } + m_menu.addSeparator(); + + // Only show the shuffle action in models that allow sorting. + if (pTrackModel->hasCapabilities(TrackModel::Capability::Sorting)) { + auto pShuffleAction = make_parented(tr("Shuffle Tracks"), &m_menu); + connect(pShuffleAction, + &QAction::triggered, + this, + &WTrackTableViewHeader::shuffle, + /*signal-to-signal*/ Qt::DirectConnection); + m_menu.addAction(pShuffleAction); + } + // Safety check against someone getting stuck with all columns hidden // (produces an empty library table). Just re-show them all. if (hiddenCount() == columns) { @@ -214,24 +227,24 @@ void WTrackTableViewHeader::setModel(QAbstractItemModel* model) { } void WTrackTableViewHeader::saveHeaderState() { - TrackModel* track_model = getTrackModel(); - if (!track_model) { + TrackModel* pTrackModel = getTrackModel(); + if (!pTrackModel) { return; } // Convert the QByteArray to a Base64 string and save it. HeaderViewState view_state(*this); - track_model->setModelSetting("header_state_pb", view_state.saveState()); + pTrackModel->setModelSetting("header_state_pb", view_state.saveState()); //qDebug() << "Saving old header state:" << result << headerState; } void WTrackTableViewHeader::restoreHeaderState() { - TrackModel* track_model = getTrackModel(); + TrackModel* pTrackModel = getTrackModel(); - if (!track_model) { + if (!pTrackModel) { return; } - QString headerStateString = track_model->getModelSetting("header_state_pb"); + QString headerStateString = pTrackModel->getModelSetting("header_state_pb"); if (headerStateString.isNull()) { loadDefaultHeaderState(); } else { @@ -260,11 +273,11 @@ void WTrackTableViewHeader::loadDefaultHeaderState() { } bool WTrackTableViewHeader::hasPersistedHeaderState() { - TrackModel* track_model = getTrackModel(); - if (!track_model) { + TrackModel* pTrackModel = getTrackModel(); + if (!pTrackModel) { return false; } - QString headerStateString = track_model->getModelSetting("header_state_pb"); + QString headerStateString = pTrackModel->getModelSetting("header_state_pb"); return !headerStateString.isNull(); } diff --git a/src/widget/wtracktableviewheader.h b/src/widget/wtracktableviewheader.h index 54d46c5495b2..526302e5510a 100644 --- a/src/widget/wtracktableviewheader.h +++ b/src/widget/wtracktableviewheader.h @@ -66,6 +66,9 @@ class WTrackTableViewHeader : public QHeaderView { /** returns false if the header state is stored in the database (on first time usgae) **/ bool hasPersistedHeaderState(); + signals: + void shuffle(); + private slots: void showOrHideColumn(int);