From f9cc91553643a583d27c0b27cb87d0c4990dc297 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Locqueville?= Date: Thu, 18 Jan 2024 15:53:37 +0100 Subject: [PATCH 01/37] Correct inaccurate tooltip help The tooltip help regarding the playback rate change buttons stated that those raise/lower pitch. If keylock is disabled, this is true, though incomplete, since the buttons also affect playback speed. If keylock is enabled, this is false, since pitch is left unchanged, and only playback speed changes. This commit replaces the tooltip text about pitch change with text about playback speed. It also copies the clarification: "(affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected." over from the Speed Control fader tooltip, to prevent further confusion. --- src/skin/legacy/tooltips.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/skin/legacy/tooltips.cpp b/src/skin/legacy/tooltips.cpp index 388f8b49da8e..3ed93ef43dbf 100644 --- a/src/skin/legacy/tooltips.cpp +++ b/src/skin/legacy/tooltips.cpp @@ -325,27 +325,27 @@ void Tooltips::addStandardTooltips() { QString changeAmount = tr("Change the step-size in the Preferences -> Decks menu."); add("rate_perm_up_rate_perm_up_small") - << tr("Raise Pitch") - << QString("%1: %2").arg(leftClick, tr("Sets the pitch higher.")) - << QString("%1: %2").arg(rightClick, tr("Sets the pitch higher in small steps.")) + << tr("Speed Up") + << QString("%1: %2").arg(leftClick, tr("Raises the track playback speed (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected.")) + << QString("%1: %2").arg(rightClick, tr("Raises playback speed in small steps.")) << changeAmount; add("rate_perm_down_rate_perm_down_small") - << tr("Lower Pitch") - << QString("%1: %2").arg(leftClick, tr("Sets the pitch lower.")) - << QString("%1: %2").arg(rightClick, tr("Sets the pitch lower in small steps.")) + << tr("Slow Down") + << QString("%1: %2").arg(leftClick, tr("Lowers the track playback speed (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected.")) + << QString("%1: %2").arg(rightClick, tr("Lowers playback speed in small steps.")) << changeAmount; add("rate_temp_up_rate_temp_up_small") - << tr("Raise Pitch Temporary (Nudge)") - << QString("%1: %2").arg(leftClick, tr("Holds the pitch higher while active.")) - << QString("%1: %2").arg(rightClick, tr("Holds the pitch higher (small amount) while active.")) + << tr("Speed Up Temporarily (Nudge)") + << QString("%1: %2").arg(leftClick, tr("Holds playback speed higher while active (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected.")) + << QString("%1: %2").arg(rightClick, tr("Holds playback speed higher (small amount) while active.")) << changeAmount; add("rate_temp_down_rate_temp_down_small") - << tr("Lower Pitch Temporary (Nudge)") - << QString("%1: %2").arg(leftClick, tr("Holds the pitch lower while active.")) - << QString("%1: %2").arg(rightClick, tr("Holds the pitch lower (small amount) while active.")) + << tr("Slow Down Temporarily (Nudge)") + << QString("%1: %2").arg(leftClick, tr("Holds playback speed lower while active (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected.")) + << QString("%1: %2").arg(rightClick, tr("Holds playback speed lower (small amount) while active.")) << changeAmount; add("filterLow") From ff0698bdac162071928dd0e636300ccb97e576f9 Mon Sep 17 00:00:00 2001 From: ronso0 Date: Mon, 4 Mar 2024 18:18:53 +0100 Subject: [PATCH 02/37] implemet TODO for LoadSelectedtrackAndPlay --- src/widget/wtracktableview.cpp | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/widget/wtracktableview.cpp b/src/widget/wtracktableview.cpp index 0332b90fe4b0..cade11c76850 100644 --- a/src/widget/wtracktableview.cpp +++ b/src/widget/wtracktableview.cpp @@ -1001,19 +1001,17 @@ void WTrackTableView::loadSelectedTrackToGroup(const QString& group, bool play) m_pConfig->getValue(kConfigKeyAllowTrackLoadToPlayingDeck); } // If the track load override is disabled, check to see if a track is - // playing before trying to load it - if (!allowLoadTrackIntoPlayingDeck) { - // TODO(XXX): Check for other than just the first preview deck. - if (group != "[PreviewDeck1]" && - ControlObject::get(ConfigKey(group, "play")) > 0.0) { - return; - } + // playing before trying to load it. + // Always load to preview deck. + if (!allowLoadTrackIntoPlayingDeck && + !PlayerManager::isPreviewDeckGroup(group) && + ControlObject::get(ConfigKey(group, "play")) > 0.0) { + return; } auto index = indices.at(0); auto* trackModel = getTrackModel(); TrackPointer pTrack; - if (trackModel && - (pTrack = trackModel->getTrack(index))) { + if (trackModel && (pTrack = trackModel->getTrack(index))) { emit loadTrackToPlayer(pTrack, group, play); } } From aa7dfca2525820fb6df9f5c68ec7dba2401983cd Mon Sep 17 00:00:00 2001 From: m0dB <79429057+m0dB@users.noreply.github.com> Date: Sat, 14 Oct 2023 19:39:10 +0200 Subject: [PATCH 03/37] replace addTracks with addTracksWithTrackIds (which addTracks now calls) so we can also add tracks based on ids directly --- src/library/playlisttablemodel.cpp | 20 ++++++++++--------- src/library/playlisttablemodel.h | 4 +++- src/library/trackmodel.h | 8 ++++++++ .../trackset/crate/cratetablemodel.cpp | 15 +++++++++----- src/library/trackset/crate/cratetablemodel.h | 4 +++- src/library/trackset/tracksettablemodel.cpp | 12 +++++++++++ 6 files changed, 47 insertions(+), 16 deletions(-) diff --git a/src/library/playlisttablemodel.cpp b/src/library/playlisttablemodel.cpp index 3c563657d8d5..38ca47d17f6c 100644 --- a/src/library/playlisttablemodel.cpp +++ b/src/library/playlisttablemodel.cpp @@ -189,29 +189,31 @@ void PlaylistTableModel::selectPlaylist(int playlistId) { setSort(defaultSortColumn(), defaultSortOrder()); } -int PlaylistTableModel::addTracks(const QModelIndex& index, - const QList& locations) { - if (locations.isEmpty()) { +int PlaylistTableModel::addTracksWithTrackIds(const QModelIndex& insertionIndex, + const QList& trackIds, + int* pOutInsertionPos) { + if (trackIds.isEmpty()) { return 0; } - QList trackIds = m_pTrackCollectionManager->resolveTrackIdsFromLocations( - locations); - const int positionColumn = fieldIndex(ColumnCache::COLUMN_PLAYLISTTRACKSTABLE_POSITION); - int position = index.sibling(index.row(), positionColumn).data().toInt(); + int position = index(insertionIndex.row(), positionColumn).data().toInt(); // Handle weird cases like a drag and drop to an invalid index if (position <= 0) { position = rowCount() + 1; } + if (pOutInsertionPos) { + *pOutInsertionPos = position; + } + int tracksAdded = m_pTrackCollectionManager->internalCollection()->getPlaylistDAO().insertTracksIntoPlaylist( trackIds, m_iPlaylistId, position); - if (locations.size() - tracksAdded > 0) { + if (trackIds.size() - tracksAdded > 0) { qDebug() << "PlaylistTableModel::addTracks could not add" - << locations.size() - tracksAdded + << trackIds.size() - tracksAdded << "to playlist" << m_iPlaylistId; } return tracksAdded; diff --git a/src/library/playlisttablemodel.h b/src/library/playlisttablemodel.h index 0443bd53577e..c663f88bd4c6 100644 --- a/src/library/playlisttablemodel.h +++ b/src/library/playlisttablemodel.h @@ -25,7 +25,9 @@ class PlaylistTableModel final : public TrackSetTableModel { /// This function should only be used by AUTODJ void removeTracks(const QModelIndexList& indices) final; /// Returns the number of successful additions. - int addTracks(const QModelIndex& index, const QList& locations) final; + int addTracksWithTrackIds(const QModelIndex& index, + const QList& trackIds, + int* pOutInsertionPos) final; bool isLocked() final; /// Get the total duration of all tracks referenced by the given model indices diff --git a/src/library/trackmodel.h b/src/library/trackmodel.h index c811114709ad..87a2a5a64e49 100644 --- a/src/library/trackmodel.h +++ b/src/library/trackmodel.h @@ -154,6 +154,14 @@ class TrackModel { Q_UNUSED(locations); return 0; } + virtual int addTracksWithTrackIds(const QModelIndex& index, + const QList& tracks, + int* pOutInsertionPos) { + Q_UNUSED(index); + Q_UNUSED(tracks); + Q_UNUSED(pOutInsertionPos); + return 0; + } virtual void moveTrack(const QModelIndex& sourceIndex, const QModelIndex& destIndex) { Q_UNUSED(sourceIndex); diff --git a/src/library/trackset/crate/cratetablemodel.cpp b/src/library/trackset/crate/cratetablemodel.cpp index 60eb14eed341..5603db80b506 100644 --- a/src/library/trackset/crate/cratetablemodel.cpp +++ b/src/library/trackset/crate/cratetablemodel.cpp @@ -150,17 +150,22 @@ TrackModel::Capabilities CrateTableModel::getCapabilities() const { return caps; } -int CrateTableModel::addTracks( - const QModelIndex& index, const QList& locations) { +int CrateTableModel::addTracksWithTrackIds( + const QModelIndex& index, const QList& trackIds, int* pOutInsertionPos) { Q_UNUSED(index); + + if (!pOutInsertionPos) { + // crate insertion is not done by position, and no duplicates will be added,. + // 0 indicates this to the caller. + *pOutInsertionPos = 0; + } + // If a track is dropped but it isn't in the library, then add it because // the user probably dropped a file from outside Mixxx into this crate. - QList trackIds = - m_pTrackCollectionManager->resolveTrackIdsFromLocations(locations); if (!m_pTrackCollectionManager->internalCollection()->addCrateTracks( m_selectedCrate, trackIds)) { qWarning() << "CrateTableModel::addTracks could not add" - << locations.size() << "tracks to crate" << m_selectedCrate; + << trackIds.size() << "tracks to crate" << m_selectedCrate; return 0; } diff --git a/src/library/trackset/crate/cratetablemodel.h b/src/library/trackset/crate/cratetablemodel.h index 32760e32fb4a..ed7061fc5bdc 100644 --- a/src/library/trackset/crate/cratetablemodel.h +++ b/src/library/trackset/crate/cratetablemodel.h @@ -19,7 +19,9 @@ class CrateTableModel final : public TrackSetTableModel { void removeTracks(const QModelIndexList& indices) final; /// Returns the number of unsuccessful additions. - int addTracks(const QModelIndex& index, const QList& locations) final; + int addTracksWithTrackIds(const QModelIndex& index, + const QList& tracks, + int* pOutInsertionPos) final; Capabilities getCapabilities() const final; QString modelKey(bool noSearch) const override; diff --git a/src/library/trackset/tracksettablemodel.cpp b/src/library/trackset/tracksettablemodel.cpp index f27bd25efaea..ca893c6d6f96 100644 --- a/src/library/trackset/tracksettablemodel.cpp +++ b/src/library/trackset/tracksettablemodel.cpp @@ -26,3 +26,15 @@ bool TrackSetTableModel::isColumnInternal(int column) { column == fieldIndex(ColumnCache::COLUMN_LIBRARYTABLE_COVERART_DIGEST) || column == fieldIndex(ColumnCache::COLUMN_LIBRARYTABLE_COVERART_HASH); } + +int TrackSetTableModel::addTracks(const QModelIndex& index, + const QList& locations) { + if (locations.isEmpty()) { + return 0; + } + + QList trackIds = m_pTrackCollectionManager->resolveTrackIdsFromLocations( + locations); + + return addTracksWithTrackIds(index, trackIds, nullptr); +} From 3e72119df6720ebb346555e11ac19e0e4bfaac6d Mon Sep 17 00:00:00 2001 From: m0dB <79429057+m0dB@users.noreply.github.com> Date: Sat, 14 Oct 2023 19:40:19 +0200 Subject: [PATCH 04/37] shortkeys for track list management (between library, playlists, crates and autodj) --- CMakeLists.txt | 1 + src/coreservices.cpp | 4 + src/library/autodj/autodjfeature.cpp | 10 ++ src/library/autodj/autodjfeature.h | 3 + src/library/autodj/dlgautodj.cpp | 4 + src/library/autodj/dlgautodj.h | 1 + src/library/basetracktablemodel.cpp | 49 ++++++++ src/library/basetracktablemodel.h | 4 + src/library/dao/playlistdao.cpp | 10 ++ src/library/dao/playlistdao.h | 2 + src/library/library.cpp | 20 +++- src/library/library.h | 2 + src/library/libraryfeature.h | 27 +++++ src/library/libraryview.h | 3 + src/library/sidebarmodel.cpp | 66 ++++++++++- src/library/sidebarmodel.h | 5 + src/library/trackmodel.h | 10 ++ src/library/trackset/baseplaylistfeature.cpp | 2 +- src/library/trackset/baseplaylistfeature.h | 2 +- src/library/trackset/basetracksetfeature.cpp | 5 + src/library/trackset/basetracksetfeature.h | 1 + src/library/trackset/tracksettablemodel.h | 2 + src/util/clipboard.cpp | 24 ++++ src/util/clipboard.h | 16 +++ src/widget/wlibrary.cpp | 15 +++ src/widget/wlibrary.h | 8 ++ src/widget/wlibrarysidebar.cpp | 36 +++++- src/widget/wlibrarytableview.h | 2 + src/widget/wlibrarytextbrowser.cpp | 10 ++ src/widget/wlibrarytextbrowser.h | 4 + src/widget/wtracktableview.cpp | 117 +++++++++++++++++-- src/widget/wtracktableview.h | 7 ++ 32 files changed, 453 insertions(+), 19 deletions(-) create mode 100644 src/util/clipboard.cpp create mode 100644 src/util/clipboard.h diff --git a/CMakeLists.txt b/CMakeLists.txt index f40833ba72e8..79efb48f1de7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1141,6 +1141,7 @@ add_library(mixxx-lib STATIC EXCLUDE_FROM_ALL src/track/trackref.cpp src/util/battery/battery.cpp src/util/cache.cpp + src/util/clipboard.cpp src/util/cmdlineargs.cpp src/util/color/color.cpp src/util/color/colorpalette.cpp diff --git a/src/coreservices.cpp b/src/coreservices.cpp index c0e1ccc10fed..3a66ab5decc5 100644 --- a/src/coreservices.cpp +++ b/src/coreservices.cpp @@ -30,6 +30,7 @@ #include "skin/skincontrols.h" #include "soundio/soundmanager.h" #include "sources/soundsourceproxy.h" +#include "util/clipboard.h" #include "util/db/dbconnectionpooled.h" #include "util/font.h" #include "util/logger.h" @@ -335,6 +336,7 @@ void CoreServices::initialize(QApplication* pApp) { emit initializationProgressUpdate(50, tr("library")); CoverArtCache::createInstance(); + Clipboard::createInstance(); m_pTrackCollectionManager = std::make_shared( this, @@ -580,6 +582,8 @@ void CoreServices::finalize() { // CoverArtCache is fairly independent of everything else. CoverArtCache::destroy(); + Clipboard::destroy(); + // PlayerManager depends on Engine, SoundManager, VinylControlManager, and Config // The player manager has to be deleted before the library to ensure // that all modified track metadata of loaded tracks is saved. diff --git a/src/library/autodj/autodjfeature.cpp b/src/library/autodj/autodjfeature.cpp index 59525f24a389..cdca01516af8 100644 --- a/src/library/autodj/autodjfeature.cpp +++ b/src/library/autodj/autodjfeature.cpp @@ -14,6 +14,8 @@ #include "moc_autodjfeature.cpp" #include "sources/soundsourceproxy.h" #include "track/track.h" +#include "util/clipboard.h" +#include "util/dnd.h" #include "widget/wlibrary.h" #include "widget/wlibrarysidebar.h" @@ -161,6 +163,14 @@ void AutoDJFeature::activate() { emit enableCoverArtDisplay(true); } +void AutoDJFeature::clear() { + m_playlistDao.clearAutoDJQueue(); +} + +void AutoDJFeature::paste() { + emit pasteFromSidebar(); +} + bool AutoDJFeature::dropAccept(const QList& urls, QObject* pSource) { // If a track is dropped onto the Auto DJ tree node, but the track isn't in the // library, then add the track to the library before adding it to the diff --git a/src/library/autodj/autodjfeature.h b/src/library/autodj/autodjfeature.h index 8a9a9d2a4fd1..70451a49d7af 100644 --- a/src/library/autodj/autodjfeature.h +++ b/src/library/autodj/autodjfeature.h @@ -32,6 +32,9 @@ class AutoDJFeature : public LibraryFeature { QVariant title() override; + void clear() override; + void paste() override; + bool dropAccept(const QList& urls, QObject* pSource) override; bool dragMoveAccept(const QUrl& url) override; diff --git a/src/library/autodj/dlgautodj.cpp b/src/library/autodj/dlgautodj.cpp index 4c8e3ced1495..43c0dbb94fe2 100644 --- a/src/library/autodj/dlgautodj.cpp +++ b/src/library/autodj/dlgautodj.cpp @@ -390,6 +390,10 @@ void DlgAutoDJ::setFocus() { m_pTrackTableView->setFocus(); } +void DlgAutoDJ::pasteFromSidebar() { + m_pTrackTableView->pasteFromSidebar(); +} + void DlgAutoDJ::keyPressEvent(QKeyEvent* pEvent) { // If we receive key events either the mode selector or the spinbox are focused. // Return, Enter and Escape move focus back to the previously focused diff --git a/src/library/autodj/dlgautodj.h b/src/library/autodj/dlgautodj.h index a9cc19a8f75f..a2d976dc7743 100644 --- a/src/library/autodj/dlgautodj.h +++ b/src/library/autodj/dlgautodj.h @@ -28,6 +28,7 @@ class DlgAutoDJ : public QWidget, public Ui::DlgAutoDJ, public LibraryView { void onShow() override; bool hasFocus() const override; void setFocus() override; + void pasteFromSidebar() override; void onSearch(const QString& text) override; void activateSelectedTrack() override; void loadSelectedTrackToGroup(const QString& group, bool play) override; diff --git a/src/library/basetracktablemodel.cpp b/src/library/basetracktablemodel.cpp index 274c206b4f14..7c608a0b97f1 100644 --- a/src/library/basetracktablemodel.cpp +++ b/src/library/basetracktablemodel.cpp @@ -21,6 +21,7 @@ #include "moc_basetracktablemodel.cpp" #include "track/track.h" #include "util/assert.h" +#include "util/clipboard.h" #include "util/datetime.h" #include "util/db/sqlite.h" #include "util/logger.h" @@ -380,6 +381,54 @@ int BaseTrackTableModel::columnCount(const QModelIndex& parent) const { return countValidColumnHeaders(); } +void BaseTrackTableModel::cutTracks(const QModelIndexList& indices) { + copyTracks(indices); + removeTracks(indices); +} + +void BaseTrackTableModel::copyTracks(const QModelIndexList& indices) const { + Clipboard::start(); + for (const QModelIndex& index : indices) { + if (index.isValid()) { + Clipboard::add(QUrl::fromLocalFile(getTrackLocation(index))); + } + } + Clipboard::finish(); +} + +QList BaseTrackTableModel::pasteTracks(const QModelIndex& insertionIndex) { + int insertionPos = 0; + const QList urls = Clipboard::urls(); + const QList trackIds = m_pTrackCollectionManager->resolveTrackIdsFromUrls(urls, false); + if (!trackIds.isEmpty()) { + addTracksWithTrackIds(insertionIndex, trackIds, &insertionPos); + } + + QList rows; + for (const auto& trackId : trackIds) { + const auto trackRows = getTrackRows(trackId); + for (int trackRow : trackRows) { + if (insertionPos == 0) { + rows.append(trackRow); + } else { + int pos = + index( + trackRow, + fieldIndex(ColumnCache:: + COLUMN_PLAYLISTTRACKSTABLE_POSITION)) + .data() + .toInt(); + // trackRows includes all instances in the table of the pasted + // tracks. We only want to select the ones we just inserted + if (pos >= insertionPos && pos < insertionPos + trackIds.size()) { + rows.append(trackRow); + } + } + } + } + return rows; +} + bool BaseTrackTableModel::isColumnHiddenByDefault( int column) { return column == fieldIndex(ColumnCache::COLUMN_LIBRARYTABLE_ALBUMARTIST) || diff --git a/src/library/basetracktablemodel.h b/src/library/basetracktablemodel.h index b5d82568d1e6..e46cc2569c8c 100644 --- a/src/library/basetracktablemodel.h +++ b/src/library/basetracktablemodel.h @@ -81,6 +81,10 @@ class BaseTrackTableModel : public QAbstractTableModel, public TrackModel { return m_columnCache.fieldIndex(fieldName); } + void cutTracks(const QModelIndexList& indices) override; + void copyTracks(const QModelIndexList& indices) const override; + QList pasteTracks(const QModelIndex& index) override; + bool isColumnHiddenByDefault( int column) override; diff --git a/src/library/dao/playlistdao.cpp b/src/library/dao/playlistdao.cpp index 192c0002ae4d..ede2f4eb5699 100644 --- a/src/library/dao/playlistdao.cpp +++ b/src/library/dao/playlistdao.cpp @@ -796,6 +796,16 @@ int PlaylistDAO::insertTracksIntoPlaylist(const QList& trackIds, return tracksAdded; } +void PlaylistDAO::clearAutoDJQueue() { + const int iAutoDJPlaylistId = getPlaylistIdFromName(AUTODJ_TABLE); + // If the first track is already loaded to the player, + // alter the playlist only below the first track + const int position = + (m_pAutoDJProcessor && m_pAutoDJProcessor->nextTrackLoaded()) ? 2 : 1; + + removeTracksFromPlaylist(iAutoDJPlaylistId, position); +} + void PlaylistDAO::addPlaylistToAutoDJQueue(const int playlistId, AutoDJSendLoc loc) { //qDebug() << "Adding tracks from playlist " << playlistId << " to the Auto-DJ Queue"; diff --git a/src/library/dao/playlistdao.h b/src/library/dao/playlistdao.h index 58660626c276..3eb6def5ec25 100644 --- a/src/library/dao/playlistdao.h +++ b/src/library/dao/playlistdao.h @@ -107,6 +107,8 @@ class PlaylistDAO : public QObject, public virtual DAO { bool insertTrackIntoPlaylist(TrackId trackId, int playlistId, int position); // Inserts a list of tracks into playlist int insertTracksIntoPlaylist(const QList& trackIds, const int playlistId, int position); + // Remove all tracks from the Auto-DJ Queue + void clearAutoDJQueue(); // Add a playlist to the Auto-DJ Queue void addPlaylistToAutoDJQueue(const int playlistId, AutoDJSendLoc loc); // Add a list of tracks to the Auto-DJ Queue diff --git a/src/library/library.cpp b/src/library/library.cpp index 77bd315e1b4b..a4a70f1ca05a 100644 --- a/src/library/library.cpp +++ b/src/library/library.cpp @@ -389,6 +389,10 @@ void Library::bindLibraryWidget( &Library::showTrackModel, pTrackTableView, &WTrackTableView::loadTrackModel); + connect(this, + &Library::pasteFromSidebar, + m_pLibraryWidget, + &WLibrary::pasteFromSidebar); connect(pTrackTableView, &WTrackTableView::loadTrack, this, @@ -399,6 +403,10 @@ void Library::bindLibraryWidget( &Library::slotLoadTrackToPlayer); m_pLibraryWidget->registerView(m_sTrackViewName, pTrackTableView); + connect(m_pLibraryWidget, + &WLibrary::setLibraryFocus, + m_pLibraryControl, + &LibraryControl::setLibraryFocus); connect(this, &Library::switchToView, m_pLibraryWidget, @@ -461,6 +469,10 @@ void Library::addFeature(LibraryFeature* feature) { } m_features.push_back(feature); m_pSidebarModel->addLibraryFeature(feature); + connect(feature, + &LibraryFeature::pasteFromSidebar, + this, + &Library::slotPasteFromSidebar); connect(feature, &LibraryFeature::showTrackModel, this, @@ -516,8 +528,12 @@ void Library::onPlayerManagerTrackAnalyzerIdle() { } } +void Library::slotPasteFromSidebar() { + emit pasteFromSidebar(); +} + void Library::slotShowTrackModel(QAbstractItemModel* model) { - //qDebug() << "Library::slotShowTrackModel" << model; + // qDebug() << "Library::slotShowTrackModel" << model; TrackModel* trackModel = dynamic_cast(model); VERIFY_OR_DEBUG_ASSERT(trackModel) { return; @@ -528,7 +544,7 @@ void Library::slotShowTrackModel(QAbstractItemModel* model) { } void Library::slotSwitchToView(const QString& view) { - //qDebug() << "Library::slotSwitchToView" << view; + // qDebug() << "Library::slotSwitchToView" << view; emit switchToView(view); } diff --git a/src/library/library.h b/src/library/library.h index fe9bf0056c13..5bd8a703f684 100644 --- a/src/library/library.h +++ b/src/library/library.h @@ -114,6 +114,7 @@ class Library: public QObject { void slotRequestAddDir(const QString& directory); void slotRequestRemoveDir(const QString& directory, LibraryRemovalType removalType); void slotRequestRelocateDir(const QString& previousDirectory, const QString& newDirectory); + void slotPasteFromSidebar(); void onSkinLoadFinished(); signals: @@ -124,6 +125,7 @@ class Library: public QObject { void restoreSearch(const QString&); void search(const QString& text); void disableSearch(); + void pasteFromSidebar(); // emit this signal to enable/disable the cover art widget void enableCoverArtDisplay(bool); void selectTrack(const TrackId&); diff --git a/src/library/libraryfeature.h b/src/library/libraryfeature.h index 5ba3ffa7da25..5f7cc5dea366 100644 --- a/src/library/libraryfeature.h +++ b/src/library/libraryfeature.h @@ -68,6 +68,32 @@ class LibraryFeature : public QObject { return false; } + virtual void clear() { + } + virtual void clearChild(const QModelIndex& index) { + Q_UNUSED(index); + } + virtual void cut() { + } + virtual void cutChild(const QModelIndex& index) { + Q_UNUSED(index); + } + virtual void copy() const { + } + virtual void copyChild(const QModelIndex& index) const { + Q_UNUSED(index); + } + virtual void paste() { + } + virtual void pasteChild(const QModelIndex& index) { + Q_UNUSED(index); + } + virtual void selectAll() { + } + virtual void selectAllChild(const QModelIndex& index) { + Q_UNUSED(index); + } + // Reimplement this to register custom views with the library widget. virtual void bindLibraryWidget(WLibrary* /* libraryWidget */, KeyboardEventFilter* /* keyboard */) {} @@ -135,6 +161,7 @@ class LibraryFeature : public QObject { void restoreModelState(); void restoreSearch(const QString&); void disableSearch(); + void pasteFromSidebar(); // emit this signal before you parse a large music collection, e.g., iTunes, Traktor. // The second arg indicates if the feature should be "selected" when loading starts void featureIsLoading(LibraryFeature*, bool selectFeature); diff --git a/src/library/libraryview.h b/src/library/libraryview.h index eec640e636ad..ac6061b5ac85 100644 --- a/src/library/libraryview.h +++ b/src/library/libraryview.h @@ -22,6 +22,9 @@ class LibraryView { /// Reimplement if LibraryView should be able to search virtual void onSearch(const QString& text) {Q_UNUSED(text);} + virtual void pasteFromSidebar() { + } + /// If applicable, requests that the LibraryView load the selected /// track. Does nothing otherwise. virtual void activateSelectedTrack() { diff --git a/src/library/sidebarmodel.cpp b/src/library/sidebarmodel.cpp index 1dd2786fbc4f..4826e34fea9c 100644 --- a/src/library/sidebarmodel.cpp +++ b/src/library/sidebarmodel.cpp @@ -148,6 +148,66 @@ QModelIndex SidebarModel::getFeatureRootIndex(LibraryFeature* pFeature) { return ind; } +void SidebarModel::clear(const QModelIndex& index) { + if (index.internalPointer() == this) { + m_sFeatures[index.row()]->clear(); + } else { + TreeItem* tree_item = (TreeItem*)index.internalPointer(); + if (tree_item) { + LibraryFeature* feature = tree_item->feature(); + feature->clearChild(index); + } + } +} + +void SidebarModel::cut(const QModelIndex& index) { + if (index.internalPointer() == this) { + m_sFeatures[index.row()]->cut(); + } else { + TreeItem* tree_item = (TreeItem*)index.internalPointer(); + if (tree_item) { + LibraryFeature* feature = tree_item->feature(); + feature->cutChild(index); + } + } +} + +void SidebarModel::copy(const QModelIndex& index) const { + if (index.internalPointer() == this) { + m_sFeatures[index.row()]->copy(); + } else { + TreeItem* tree_item = (TreeItem*)index.internalPointer(); + if (tree_item) { + LibraryFeature* feature = tree_item->feature(); + feature->copyChild(index); + } + } +} + +void SidebarModel::paste(const QModelIndex& index) { + if (index.internalPointer() == this) { + m_sFeatures[index.row()]->paste(); + } else { + TreeItem* tree_item = (TreeItem*)index.internalPointer(); + if (tree_item) { + LibraryFeature* feature = tree_item->feature(); + feature->pasteChild(index); + } + } +} + +void SidebarModel::selectAll(const QModelIndex& index) { + if (index.internalPointer() == this) { + m_sFeatures[index.row()]->selectAll(); + } else { + TreeItem* tree_item = (TreeItem*)index.internalPointer(); + if (tree_item) { + LibraryFeature* feature = tree_item->feature(); + feature->selectAllChild(index); + } + } +} + QModelIndex SidebarModel::parent(const QModelIndex& index) const { //qDebug() << "SidebarModel::parent index=" << index.getData(); if (index.isValid()) { @@ -475,7 +535,7 @@ QModelIndex SidebarModel::translateIndex( } void SidebarModel::slotDataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight) { - //qDebug() << "slotDataChanged topLeft:" << topLeft << "bottomRight:" << bottomRight; + // qDebug() << "slotDataChanged topLeft:" << topLeft << "bottomRight:" << bottomRight; QModelIndex topLeftTranslated = translateSourceIndex(topLeft); QModelIndex bottomRightTranslated = translateSourceIndex(bottomRight); emit dataChanged(topLeftTranslated, bottomRightTranslated); @@ -499,8 +559,8 @@ void SidebarModel::slotRowsInserted(const QModelIndex& parent, int start, int en Q_UNUSED(parent); Q_UNUSED(start); Q_UNUSED(end); - //qDebug() << "slotRowsInserted" << parent << start << end; - //QModelIndex newParent = translateSourceIndex(parent); + // qDebug() << "slotRowsInserted" << parent << start << end; + // QModelIndex newParent = translateSourceIndex(parent); endInsertRows(); } diff --git a/src/library/sidebarmodel.h b/src/library/sidebarmodel.h index c0d7a6ca0633..7d942de3d321 100644 --- a/src/library/sidebarmodel.h +++ b/src/library/sidebarmodel.h @@ -47,6 +47,11 @@ class SidebarModel : public QAbstractItemModel { } QModelIndex getFeatureRootIndex(LibraryFeature* pFeature); + void clear(const QModelIndex& index); + void cut(const QModelIndex& index); + void copy(const QModelIndex& index) const; + void selectAll(const QModelIndex& index); + void paste(const QModelIndex& index); public slots: void pressed(const QModelIndex& index); void clicked(const QModelIndex& index); diff --git a/src/library/trackmodel.h b/src/library/trackmodel.h index 87a2a5a64e49..53bf53ddbc92 100644 --- a/src/library/trackmodel.h +++ b/src/library/trackmodel.h @@ -140,6 +140,16 @@ class TrackModel { virtual void removeTracks(const QModelIndexList& indices) { Q_UNUSED(indices); } + virtual void cutTracks(const QModelIndexList& indices) { + Q_UNUSED(indices); + } + virtual void copyTracks(const QModelIndexList& indices) const { + Q_UNUSED(indices); + } + virtual QList pasteTracks(const QModelIndex& index) { + Q_UNUSED(index); + return QList(); + } virtual void hideTracks(const QModelIndexList& indices) { Q_UNUSED(indices); } diff --git a/src/library/trackset/baseplaylistfeature.cpp b/src/library/trackset/baseplaylistfeature.cpp index ac81372e6878..ea93b3d77f8c 100644 --- a/src/library/trackset/baseplaylistfeature.cpp +++ b/src/library/trackset/baseplaylistfeature.cpp @@ -165,7 +165,7 @@ void BasePlaylistFeature::connectPlaylistDAO() { &BasePlaylistFeature::slotPlaylistTableRenamed); } -int BasePlaylistFeature::playlistIdFromIndex(const QModelIndex& index) { +int BasePlaylistFeature::playlistIdFromIndex(const QModelIndex& index) const { TreeItem* item = static_cast(index.internalPointer()); if (item == nullptr) { return kInvalidPlaylistId; diff --git a/src/library/trackset/baseplaylistfeature.h b/src/library/trackset/baseplaylistfeature.h index 761f94305bee..c8c6edad16e3 100644 --- a/src/library/trackset/baseplaylistfeature.h +++ b/src/library/trackset/baseplaylistfeature.h @@ -86,7 +86,7 @@ class BasePlaylistFeature : public BaseTrackSetFeature { virtual void decorateChild(TreeItem* pChild, int playlistId) = 0; virtual void addToAutoDJ(PlaylistDAO::AutoDJSendLoc loc); - int playlistIdFromIndex(const QModelIndex& index); + int playlistIdFromIndex(const QModelIndex& index) const; // Get the QModelIndex of a playlist based on its id. Returns QModelIndex() // on failure. QModelIndex indexFromPlaylistId(int playlistId); diff --git a/src/library/trackset/basetracksetfeature.cpp b/src/library/trackset/basetracksetfeature.cpp index a50b9b94019e..7f95f7990358 100644 --- a/src/library/trackset/basetracksetfeature.cpp +++ b/src/library/trackset/basetracksetfeature.cpp @@ -13,6 +13,11 @@ BaseTrackSetFeature::BaseTrackSetFeature( m_pSidebarModel(make_parented(this)) { } +void BaseTrackSetFeature::pasteChild( + const QModelIndex&) { + emit pasteFromSidebar(); +} + void BaseTrackSetFeature::activate() { emit switchToView(m_rootViewName); emit disableSearch(); diff --git a/src/library/trackset/basetracksetfeature.h b/src/library/trackset/basetracksetfeature.h index 6869d97ac466..c647f9d046fa 100644 --- a/src/library/trackset/basetracksetfeature.h +++ b/src/library/trackset/basetracksetfeature.h @@ -14,6 +14,7 @@ class BaseTrackSetFeature : public LibraryFeature { const QString& rootViewName, const QString& iconName); + void pasteChild(const QModelIndex& index) override; signals: void analyzeTracks(const QList&); diff --git a/src/library/trackset/tracksettablemodel.h b/src/library/trackset/tracksettablemodel.h index 649d33ef325e..94202c9a853a 100644 --- a/src/library/trackset/tracksettablemodel.h +++ b/src/library/trackset/tracksettablemodel.h @@ -11,4 +11,6 @@ class TrackSetTableModel : public BaseSqlTableModel { const char* settingsNamespace); bool isColumnInternal(int column) override; + + int addTracks(const QModelIndex& index, const QList& locations) final; }; diff --git a/src/util/clipboard.cpp b/src/util/clipboard.cpp new file mode 100644 index 000000000000..c92619a34c5a --- /dev/null +++ b/src/util/clipboard.cpp @@ -0,0 +1,24 @@ +#include "clipboard.h" + +#include +#include +#include + +void Clipboard::start() { + instance()->m_urls.clear(); +} + +void Clipboard::add(const QUrl& url) { + instance()->m_urls.append(url); +} + +void Clipboard::finish() { + QMimeData* data = new QMimeData; + data->setUrls(instance()->m_urls); + QApplication::clipboard()->setMimeData(data); +} + +QList Clipboard::urls() { + const QMimeData* data = QApplication::clipboard()->mimeData(); + return data ? data->urls() : QList(); +} diff --git a/src/util/clipboard.h b/src/util/clipboard.h new file mode 100644 index 000000000000..fee83879eded --- /dev/null +++ b/src/util/clipboard.h @@ -0,0 +1,16 @@ +#pragma once + +#include +#include + +#include "util/singleton.h" + +class Clipboard : public Singleton { + QList m_urls; + + public: + static QList urls(); + static void start(); + static void finish(); + static void add(const QUrl& url); +}; diff --git a/src/widget/wlibrary.cpp b/src/widget/wlibrary.cpp index e3aadc6f54d6..d660668c67b4 100644 --- a/src/widget/wlibrary.cpp +++ b/src/widget/wlibrary.cpp @@ -76,6 +76,14 @@ void WLibrary::switchToView(const QString& name) { } } +void WLibrary::pasteFromSidebar() { + QWidget* current = currentWidget(); + LibraryView* view = dynamic_cast(current); + if (view) { + view->pasteFromSidebar(); + } +} + void WLibrary::search(const QString& name) { auto lock = lockMutex(&m_mutex); QWidget* current = currentWidget(); @@ -142,3 +150,10 @@ bool WLibrary::event(QEvent* pEvent) { } return QStackedWidget::event(pEvent); } + +void WLibrary::keyPressEvent(QKeyEvent* event) { + if (event->key() == Qt::Key_Left && event->modifiers() & Qt::ControlModifier) { + emit setLibraryFocus(FocusWidget::Sidebar); + } + QStackedWidget::keyPressEvent(event); +} diff --git a/src/widget/wlibrary.h b/src/widget/wlibrary.h index 531915975a6e..0b99e6d90a7d 100644 --- a/src/widget/wlibrary.h +++ b/src/widget/wlibrary.h @@ -4,6 +4,9 @@ #include #include +#include "library/library_decl.h" +#include "library/libraryview.h" +#include "skin/legacy/skincontext.h" #include "util/compatibility/qmutex.h" #include "widget/wbasewidget.h" @@ -48,17 +51,22 @@ class WLibrary : public QStackedWidget, public WBaseWidget { return m_bShowButtonText; } + signals: + FocusWidget setLibraryFocus(FocusWidget newFocus); + public slots: // Show the view registered with the given name. Does nothing if the current // view is the specified view, or if the name does not specify any // registered view. void switchToView(const QString& name); void slotSelectTrackInActiveTrackView(const TrackId& trackId); + void pasteFromSidebar(); void search(const QString&); protected: bool event(QEvent* pEvent) override; + void keyPressEvent(QKeyEvent* event) override; private: QT_RECURSIVE_MUTEX m_mutex; diff --git a/src/widget/wlibrarysidebar.cpp b/src/widget/wlibrarysidebar.cpp index c13ac5c7b483..a31909fe8f91 100644 --- a/src/widget/wlibrarysidebar.cpp +++ b/src/widget/wlibrarysidebar.cpp @@ -239,12 +239,36 @@ void WLibrarySidebar::keyPressEvent(QKeyEvent* event) { // TODO(XXX) Should first keyEvent ensure previous item has focus? I.e. if the selected // item is not focused, require second press to perform the desired action. - // make the selected item the navigation starting point + SidebarModel* sidebarModel = qobject_cast(model()); + QModelIndexList selectedIndices = selectionModel()->selectedRows(); + if (sidebarModel && !selectedIndices.isEmpty()) { + QModelIndex index = selectedIndices.at(0); + if (event->matches(QKeySequence::Delete) || event->key() == Qt::Key_Backspace) { + sidebarModel->clear(index); + return; + } + if (event->matches(QKeySequence::Cut)) { + sidebarModel->cut(index); + return; + } + if (event->matches(QKeySequence::Copy)) { + sidebarModel->copy(index); + return; + } + if (event->matches(QKeySequence::Paste)) { + sidebarModel->paste(index); + return; + } + if (event->matches(QKeySequence::SelectAll)) { + sidebarModel->selectAll(index); + return; + } + } + focusSelectedIndex(); switch (event->key()) { case Qt::Key_Return: - focusSelectedIndex(); toggleSelectedItem(); return; case Qt::Key_Down: @@ -268,6 +292,14 @@ void WLibrarySidebar::keyPressEvent(QKeyEvent* event) { emit pressed(selIndex); return; } + case Qt::Key_Right: { + if (event->modifiers() & Qt::ControlModifier) { + emit setLibraryFocus(FocusWidget::TracksTable); + } else { + QTreeView::keyPressEvent(event); + } + return; + } case Qt::Key_Left: { // If an expanded item is selected let QTreeView collapse it QModelIndex selIndex = selectedIndex(); diff --git a/src/widget/wlibrarytableview.h b/src/widget/wlibrarytableview.h index 7e0e8351dd35..04759b2a1f43 100644 --- a/src/widget/wlibrarytableview.h +++ b/src/widget/wlibrarytableview.h @@ -4,6 +4,7 @@ #include #include +#include "library/library_decl.h" #include "library/libraryview.h" #include "preferences/usersettings.h" #include "track/track_decl.h" @@ -61,6 +62,7 @@ class WLibraryTableView : public QTableView, public virtual LibraryView { void trackSelected(TrackPointer pTrack); void onlyCachedCoverArt(bool); void scrollValueChanged(int); + FocusWidget setLibraryFocus(FocusWidget newFocus); public slots: void setTrackTableFont(const QFont& font); diff --git a/src/widget/wlibrarytextbrowser.cpp b/src/widget/wlibrarytextbrowser.cpp index 82d35ed6e5b9..ebc6484079e9 100644 --- a/src/widget/wlibrarytextbrowser.cpp +++ b/src/widget/wlibrarytextbrowser.cpp @@ -1,5 +1,7 @@ #include "widget/wlibrarytextbrowser.h" +#include + #include "moc_wlibrarytextbrowser.cpp" WLibraryTextBrowser::WLibraryTextBrowser(QWidget* parent) @@ -13,3 +15,11 @@ bool WLibraryTextBrowser::hasFocus() const { void WLibraryTextBrowser::setFocus() { QWidget::setFocus(); } + +void WLibraryTextBrowser::keyPressEvent(QKeyEvent* event) { + if (event->key() == Qt::Key_Left && event->modifiers() & Qt::ControlModifier) { + event->ignore(); + return; + } + QTextBrowser::keyPressEvent(event); +} diff --git a/src/widget/wlibrarytextbrowser.h b/src/widget/wlibrarytextbrowser.h index 206664f0693f..264ad90f2e6c 100644 --- a/src/widget/wlibrarytextbrowser.h +++ b/src/widget/wlibrarytextbrowser.h @@ -2,6 +2,7 @@ #include +#include "library/library_decl.h" #include "library/libraryview.h" class WLibraryTextBrowser : public QTextBrowser, public LibraryView { @@ -11,4 +12,7 @@ class WLibraryTextBrowser : public QTextBrowser, public LibraryView { void onShow() override {} bool hasFocus() const override; void setFocus() override; + void keyPressEvent(QKeyEvent* event) override; + signals: + FocusWidget setLibraryFocus(FocusWidget newFocus); }; diff --git a/src/widget/wtracktableview.cpp b/src/widget/wtracktableview.cpp index 0332b90fe4b0..10f409b5b5b9 100644 --- a/src/widget/wtracktableview.cpp +++ b/src/widget/wtracktableview.cpp @@ -139,6 +139,11 @@ void WTrackTableView::slotGuiTick50ms(double /*unused*/) { } } +// slot +void WTrackTableView::pasteFromSidebar() { + pasteTracks(QModelIndex()); +} + // slot void WTrackTableView::loadTrackModel(QAbstractItemModel* model, bool restoreState) { qDebug() << "WTrackTableView::loadTrackModel()" << model; @@ -819,6 +824,66 @@ TrackModel* WTrackTableView::getTrackModel() const { return trackModel; } +namespace { +QModelIndex calculateCutIndex(const QModelIndex& currentIndex, + const QModelIndexList& removedIndices) { + if (removedIndices.empty()) { + return QModelIndex(); + } + const int row = currentIndex.row(); + int rowAfterRemove = row; + for (const auto& removeIndex : removedIndices) { + if (removeIndex.row() < row) { + rowAfterRemove--; + } + } + return currentIndex.siblingAtRow(rowAfterRemove); +} +} // namespace + +void WTrackTableView::removeSelectedTracks() { + const QModelIndexList indices = selectionModel()->selectedRows(); + const QModelIndex newIndex = calculateCutIndex(currentIndex(), indices); + getTrackModel()->removeTracks(indices); + setCurrentIndex(newIndex); +} + +void WTrackTableView::cutSelectedTracks() { + const QModelIndexList indices = selectionModel()->selectedRows(); + const QModelIndex newIndex = calculateCutIndex(currentIndex(), indices); + getTrackModel()->cutTracks(indices); + setCurrentIndex(newIndex); +} + +void WTrackTableView::copySelectedTracks() { + const QModelIndexList indices = selectionModel()->selectedRows(); + getTrackModel()->copyTracks(indices); +} + +void WTrackTableView::pasteTracks(const QModelIndex& index) { + const QList rows = getTrackModel()->pasteTracks(index); + if (rows.empty()) { + return; + } + for (const auto row : rows) { + selectionModel()->select(model()->index(row, 0), + QItemSelectionModel::Select | QItemSelectionModel::Rows); + } + + updateGeometries(); + + const auto lastVisibleRow = rowAt(height()); + + // Use selectRow to scroll to the first or last pasted row. We would use + // scrollTo but this is broken. This solution was already used elsewhere + // in this way. + if (rows.back() > lastVisibleRow) { + selectRow(rows.back()); + } else { + selectRow(rows.front()); + } +} + void WTrackTableView::keyPressEvent(QKeyEvent* event) { switch (event->key()) { case kPropertiesShortcutKey: { @@ -839,16 +904,41 @@ void WTrackTableView::keyPressEvent(QKeyEvent* event) { m_pTrackMenu->slotShowDlgTrackInfo(); } } - } break; + return; + } case kHideRemoveShortcutKey: { if (event->modifiers() == kHideRemoveShortcutModifier) { hideOrRemoveSelectedTracks(); - return; } - } break; + return; + } default: - QTableView::keyPressEvent(event); + break; + } + TrackModel* trackModel = getTrackModel(); + if (trackModel && !trackModel->isLocked()) { + if (event->matches(QKeySequence::Delete) || event->key() == Qt::Key_Backspace) { + removeSelectedTracks(); + return; + } + if (event->matches(QKeySequence::Cut)) { + cutSelectedTracks(); + return; + } + if (event->matches(QKeySequence::Copy)) { + copySelectedTracks(); + return; + } + if (event->matches(QKeySequence::Paste)) { + pasteTracks(currentIndex()); + return; + } + if (event->key() == Qt::Key_Escape) { + clearSelection(); + setCurrentIndex(QModelIndex()); + } } + QTableView::keyPressEvent(event); } void WTrackTableView::resizeEvent(QResizeEvent* event) { @@ -1208,12 +1298,23 @@ void WTrackTableView::doSortByColumn(int headerSection, Qt::SortOrder sortOrder) sortByColumn(headerSection, sortOrder); + selectTracksById(selectedTrackIds, prevColum); + + // This seems to be broken since at least Qt 5.12: no scrolling is issued + // scrollTo(first, QAbstractItemView::EnsureVisible); + horizontalScrollBar()->setValue(savedHScrollBarPos); +} + +void WTrackTableView::selectTracksById(const QList& trackIds, int prevColum) { + TrackModel* trackModel = getTrackModel(); + QAbstractItemModel* itemModel = model(); + QItemSelectionModel* currentSelection = selectionModel(); currentSelection->reset(); // remove current selection // Find previously selected tracks and store respective rows for reselection. QMap selectedRows; - for (const auto& trackId : selectedTrackIds) { + for (const auto& trackId : trackIds) { // TODO(rryan) slowly fixing the issues with BaseSqlTableModel. This // code is broken for playlists because it assumes each trackid is in // the table once. This will erroneously select all instances of the @@ -1252,10 +1353,6 @@ void WTrackTableView::doSortByColumn(int headerSection, Qt::SortOrder sortOrder) QModelIndex tl = itemModel->index(i.key(), 0); currentSelection->select(tl, QItemSelectionModel::Rows | QItemSelectionModel::Select); } - - // This seems to be broken since at least Qt 5.12: no scrolling is issued - //scrollTo(first, QAbstractItemView::EnsureVisible); - horizontalScrollBar()->setValue(savedHScrollBarPos); } void WTrackTableView::applySortingIfVisible() { @@ -1326,7 +1423,7 @@ bool WTrackTableView::hasFocus() const { } void WTrackTableView::setFocus() { - QWidget::setFocus(); + QWidget::setFocus(Qt::OtherFocusReason); } QString WTrackTableView::getModelStateKey() const { diff --git a/src/widget/wtracktableview.h b/src/widget/wtracktableview.h index a786f0d43c3a..bd98055569ba 100644 --- a/src/widget/wtracktableview.h +++ b/src/widget/wtracktableview.h @@ -34,6 +34,7 @@ class WTrackTableView : public WLibraryTableView { void onShow() override; bool hasFocus() const override; void setFocus() override; + void pasteFromSidebar() override; void keyPressEvent(QKeyEvent* event) override; void resizeEvent(QResizeEvent* event) override; void activateSelectedTrack() override; @@ -47,6 +48,12 @@ class WTrackTableView : public WLibraryTableView { TrackId getCurrentTrackId() const; bool setCurrentTrackId(const TrackId& trackId, int column = 0, bool scrollToTrack = false); + void removeSelectedTracks(); + void cutSelectedTracks(); + void copySelectedTracks(); + void pasteTracks(const QModelIndex& index); + void selectTracksById(const QList& tracks, int prevColumn); + double getBackgroundColorOpacity() const { return m_backgroundColorOpacity; } From 7420341ba9d5eb34a5d9cf89f7297244ed304bb1 Mon Sep 17 00:00:00 2001 From: ronso0 Date: Mon, 4 Mar 2024 18:19:40 +0100 Subject: [PATCH 05/37] make [PreviewDeckN],LoadSelectedTrackAndPlay toggle play/pause if the track is already loaded --- src/mixer/playermanager.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/mixer/playermanager.cpp b/src/mixer/playermanager.cpp index 552873426aa1..a4f0f1ea15e5 100644 --- a/src/mixer/playermanager.cpp +++ b/src/mixer/playermanager.cpp @@ -696,6 +696,16 @@ void PlayerManager::slotLoadTrackToPlayer(TrackPointer pTrack, const QString& gr // so clone another playing deck instead of loading the selected track clone = true; } + } else if (isPreviewDeckGroup(group) && play) { + // This extends/overrides the behaviour of [PreviewDeckN],LoadSelectedTrackAndPlay: + // if the track is already loaded, toggle play/pause. + if (pTrack == pPlayer->getLoadedTrack()) { + auto* pPlay = + ControlObject::getControl(ConfigKey(group, QStringLiteral("play"))); + double newPlay = pPlay->toBool() ? 0.0 : 1.0; + pPlay->set(newPlay); + return; + } } if (clone) { From 9245fdfee77b205c7415eb6eb4cc9c713911e51c Mon Sep 17 00:00:00 2001 From: ronso0 Date: Tue, 5 Mar 2024 00:50:28 +0100 Subject: [PATCH 06/37] keyboard sheet: remove hidden unused objects, sort objects into correct layers --- .../ic_template_keyboard_mapping_sheet.svg | 1358 ++++++----------- 1 file changed, 472 insertions(+), 886 deletions(-) diff --git a/res/images/templates/ic_template_keyboard_mapping_sheet.svg b/res/images/templates/ic_template_keyboard_mapping_sheet.svg index 948f5dfa1397..eeeb817e636d 100644 --- a/res/images/templates/ic_template_keyboard_mapping_sheet.svg +++ b/res/images/templates/ic_template_keyboard_mapping_sheet.svg @@ -28,14 +28,14 @@ inkscape:pagecheckerboard="0" inkscape:deskcolor="#d1d1d1" inkscape:zoom="4.7711688" - inkscape:cx="514.23459" - inkscape:cy="159.18531" + inkscape:cx="366.89123" + inkscape:cy="166.52104" inkscape:window-width="1920" inkscape:window-height="1056" inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="1" - inkscape:current-layer="layer2" + inkscape:current-layer="layer1" showguides="true" />Mixxx Keyboard mapping sheet templateEach control inside Mixxx is identified by a unique string. These strings are used in the keyboard mappings, the MIDI mappings, and inside Mixxx to gain access to the controls. The following is a list of controls that can be used in any of the above contexts. * for de-de keyboard layout - für Deutsche Tastatur * for en-us keyboard layout * for en-us keyboard layoutMixxx Keyboard mapping sheet templateAutoDJAutoDJ Date: Tue, 5 Mar 2024 00:52:50 +0100 Subject: [PATCH 07/37] keyboard sheet: preview load+play -> load+play/pause with icon --- res/Mixxx-Keyboard-Shortcuts.pdf | Bin 353869 -> 353234 bytes .../ic_template_keyboard_mapping_sheet.svg | 83 +++++++++++++----- 2 files changed, 61 insertions(+), 22 deletions(-) diff --git a/res/Mixxx-Keyboard-Shortcuts.pdf b/res/Mixxx-Keyboard-Shortcuts.pdf index 382779418205be025c5d9df26386e1457dcb1b02..312a18101254319dd2fb93afd9dab939a5218ef6 100644 GIT binary patch delta 58763 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%0DRG5(|E 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 delta 58630 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 G{{H~+_?RdF diff --git a/res/images/templates/ic_template_keyboard_mapping_sheet.svg b/res/images/templates/ic_template_keyboard_mapping_sheet.svg index eeeb817e636d..8d3316c89b15 100644 --- a/res/images/templates/ic_template_keyboard_mapping_sheet.svg +++ b/res/images/templates/ic_template_keyboard_mapping_sheet.svg @@ -7,7 +7,7 @@ id="svg1180" sodipodi:docname="ic_template_keyboard_mapping_sheet.svg" inkscape:version="1.3.2 (1:1.3.2+202311252150+091e20ef0f)" - inkscape:export-filename="../../Mixxx-Keyboard-Shortcuts.png" + inkscape:export-filename="../../Mixxx-Keyboard-Shortcuts.pdf" inkscape:export-xdpi="148.322" inkscape:export-ydpi="148.322" xml:space="preserve" @@ -7616,15 +7616,15 @@ transform="translate(-104.13769,-29.069125)">double + id="tspan4">double click
clickstopload+ playstop
load+ Date: Tue, 5 Mar 2024 01:33:02 +0100 Subject: [PATCH 08/37] remove unused /res/Mixxx-Keyboard-Shortcuts.png --- res/Mixxx-Keyboard-Shortcuts.png | Bin 231649 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 res/Mixxx-Keyboard-Shortcuts.png diff --git a/res/Mixxx-Keyboard-Shortcuts.png b/res/Mixxx-Keyboard-Shortcuts.png deleted file mode 100644 index a757fadfb12a6a837aab3c156c0176b5e7adaf6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 231649 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

O)p+()zJf;Q=?&DzO0$qq0Ppiw>Kij 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 +
  1. + Fix Tango waveform splitter + #12939 +
  2. Experimental iOs support @@ -370,6 +404,62 @@ #12663 +

    + Experimental WebAssembly support +

    +
      +
    • + CMakeLists: Add support for targeting Emscripten/WebAssembly + #12918 +
    • +
    • + CMakeLists: Emit better errors for exotic target platforms + #12910 +
    • +
    • + Build: Add + PORTMIDI + flag for compiling with(out) PortMidi + #12913 +
    • +
    • + DesktopHelper: Compile out process-spawning on WASM too + #12916 +
    • +
    • + MixxxApplication: Use + QWasmIntegrationPlugin + when targeting WebAssembly + #12915 +
    • +
    • + CMakeLists: Enable asyncify when targeting WASM + #12921 +
    • +
    • + Resources: Bundle resources for preloading when targeting Emscripten/WASM + #12922 +
    • +
    • + CMakeLists: Add + WASM_ASSERTIONS + option + #12931 +
    • +
    • + VersionStore: Recognize Emscripten/WebAssembly + #12940 +
    • +
    • + OpenGLWindow: Fix sizing on Wasm by setting + Qt::FramelessWindowHint + #12945 +
    • +
    • + CMakeLists: Require WebGL 2.0 when building for Wasm + #12952 +
    • +

    Misc Refactorings

    @@ -519,11 +609,42 @@ fix: typo ;) #12726 +
  3. + refactor: avoid temporary qlist allocation on midi sysex receive + #12843 +
  4. +
  5. + SoundSourceMP3: fix unused function warning + #12847 +
  6. +
  7. + update libkeyfinder to 2.2.8 + #12853 +
  8. +
  9. + feat(ci): add eslint rule prefer-template + #12889 +
  10. +
  11. + Labeler: Add + qml + to labeler config + #12911 +
  12. +
  13. + WTrackMenu: Add missing wcoverartlabel.h include + #12924 +
  14. +
  15. + Fix clazy complains and naming + #12935 +
  16. Update to latest vcpkg dependencies #11649 #12512 #12067 + #12898
  17. GitHub actions updates @@ -562,7 +683,7 @@ - +

    Controller Mappings From 6c6345fa3eb0250d39aeb3937acc9a3e82796b30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Mon, 18 Mar 2024 08:43:28 +0100 Subject: [PATCH 33/37] Update CHANGELOG --- CHANGELOG.md | 5 +++++ res/linux/org.mixxx.Mixxx.metainfo.xml | 25 +++++++++++++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6341b3c4f386..613b6a0a64aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ * fixes around cratetablemodel, remove tracks + don't allow pasting tracks into locked playlists/crates or History [#12926](https://github.com/mixxxdj/mixxx/pull/12926) * Tootips: Improve `rate_up/down` tooltips, pitch vs. speed [#12590](https://github.com/mixxxdj/mixxx/pull/12590) * Shortkeys for track list management [#12020](https://github.com/mixxxdj/mixxx/pull/12020) +* Track menu: rephrase "Reset" to "Clear" [#12955](https://github.com/mixxxdj/mixxx/pull/12955) ### Controller Mappings @@ -28,6 +29,7 @@ * Send sysex to all handlers [#12827](https://github.com/mixxxdj/mixxx/pull/12827) * Add control for showing a deck's track menu [#10825](https://github.com/mixxxdj/mixxx/pull/10825) +* Removed old examples HID keyboard and HID trackpad [#12977](https://github.com/mixxxdj/mixxx/pull/12977) ### Experimental QML Skin @@ -139,6 +141,9 @@ * Labeler: Add `qml` to labeler config [#12911](https://github.com/mixxxdj/mixxx/pull/12911) * WTrackMenu: Add missing wcoverartlabel.h include [#12924](https://github.com/mixxxdj/mixxx/pull/12924) * Fix clazy complains and naming [#12935](https://github.com/mixxxdj/mixxx/pull/12935) +* src/library: sort files into sub-directories [#12956](https://github.com/mixxxdj/mixxx/pull/12956) +* CMakeLists: Fix deduplication trap with `--preload-file` [#12944](https://github.com/mixxxdj/mixxx/pull/12944) +* Add CI runner that allows cleaning up the download server [#12957](https://github.com/mixxxdj/mixxx/pull/12957) * Update to latest vcpkg dependencies [#11649](https://github.com/mixxxdj/mixxx/pull/11649) [#12512](https://github.com/mixxxdj/mixxx/pull/12512) diff --git a/res/linux/org.mixxx.Mixxx.metainfo.xml b/res/linux/org.mixxx.Mixxx.metainfo.xml index c6f941180308..ac1cc4d7c35a 100644 --- a/res/linux/org.mixxx.Mixxx.metainfo.xml +++ b/res/linux/org.mixxx.Mixxx.metainfo.xml @@ -96,7 +96,7 @@ Do not edit it manually. --> - +

    Features @@ -169,6 +169,10 @@ Shortkeys for track list management #12020

  18. +
  19. + Track menu: rephrase "Reset" to "Clear" + #12955 +
  20. Controller Mappings @@ -191,6 +195,10 @@ Add control for showing a deck's track menu #10825 +

  21. + Removed old examples HID keyboard and HID trackpad + #12977 +
  22. Experimental QML Skin @@ -639,6 +647,19 @@ Fix clazy complains and naming #12935 +

  23. + src/library: sort files into sub-directories + #12956 +
  24. +
  25. + CMakeLists: Fix deduplication trap with + --preload-file + #12944 +
  26. +
  27. + Add CI runner that allows cleaning up the download server + #12957 +
  28. Update to latest vcpkg dependencies #11649 @@ -683,7 +704,7 @@ - +

    Controller Mappings From 99a28be44f5655d14094039ef976c253c5818ec0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Mon, 18 Mar 2024 09:02:28 +0100 Subject: [PATCH 34/37] Don't require push for download_cleanup.yml --- .github/workflows/download_cleanup.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/download_cleanup.yml b/.github/workflows/download_cleanup.yml index 064a3f35d799..76f1fc5a69c9 100644 --- a/.github/workflows/download_cleanup.yml +++ b/.github/workflows/download_cleanup.yml @@ -9,7 +9,7 @@ jobs: steps: - name: "Set up SSH Agent" - if: github.event_name == 'push' && env.SSH_PRIVATE_KEY != null + if: env.SSH_PRIVATE_KEY != null env: SSH_AUTH_SOCK: /tmp/ssh_agent.sock SSH_PRIVATE_KEY: ${{ secrets.DOWNLOADS_HOSTGATOR_DOT_MIXXX_DOT_ORG_KEY }} From 2d7768effb388b5e95434efaba92eb25966c10aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Mon, 18 Mar 2024 13:16:36 +0100 Subject: [PATCH 35/37] download_cleanup.yml: move snapshot dir to destination path --- .github/workflows/download_cleanup.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/download_cleanup.yml b/.github/workflows/download_cleanup.yml index 76f1fc5a69c9..397cffeb48e5 100644 --- a/.github/workflows/download_cleanup.yml +++ b/.github/workflows/download_cleanup.yml @@ -25,10 +25,10 @@ jobs: if: env.SSH_AUTH_SOCK != null run: | mkdir empty_folder - echo snapshots/build-checks-fix/* >> include_file.txt - echo snapshots/build-checks-fix >> include_file.txt - rsync --verbose --times --recursive --include-from=include_file.txt --exclude=* --delete "empty_folder/" "${SSH_USER}@${SSH_HOST}:${DESTDIR}/" + echo build-checks-fix/ >> include_file.txt + echo build-checks-fix/* >> include_file.txt + rsync --verbose --archive --times --recursive --delete --include-from=include_file.txt --exclude=* "empty_folder/" "${SSH_USER}@${SSH_HOST}:${DESTDIR}/" env: - DESTDIR: public_html/downloads + DESTDIR: public_html/downloads/snapshots SSH_HOST: downloads-hostgator.mixxx.org SSH_USER: mixxx From 238ff87781e0e535ddc657b9d4c3e4d9c1602b18 Mon Sep 17 00:00:00 2001 From: ronso0 Date: Mon, 18 Mar 2024 16:39:05 +0100 Subject: [PATCH 36/37] Track widgets: set `show_track_menu` only for main decks ... only for those BaseTrackPlayer created the ControlPushButtons --- src/skin/legacy/legacyskinparser.cpp | 12 +++++--- src/widget/wtrackproperty.cpp | 42 +++++++++++++++++----------- src/widget/wtrackproperty.h | 4 ++- src/widget/wtrackwidgetgroup.cpp | 35 +++++++++++++---------- src/widget/wtrackwidgetgroup.h | 4 ++- 5 files changed, 60 insertions(+), 37 deletions(-) diff --git a/src/skin/legacy/legacyskinparser.cpp b/src/skin/legacy/legacyskinparser.cpp index eeb9d716cfdf..10f53326ab5d 100644 --- a/src/skin/legacy/legacyskinparser.cpp +++ b/src/skin/legacy/legacyskinparser.cpp @@ -1081,17 +1081,20 @@ QWidget* LegacySkinParser::parseTrackProperty(const QDomElement& node) { return nullptr; } + bool isMainDeck = PlayerManager::isDeckGroup(group); WTrackProperty* pTrackProperty = new WTrackProperty( m_pParent, m_pConfig, m_pLibrary, - group); + group, + isMainDeck); setupLabelWidget(node, pTrackProperty); // Ensure 'show_track_menu' control is created for each main deck and // valueChangeRequest hook is set up. - // Only the first WTrackProperty that is created connects the signals. - if (PlayerManager::isDeckGroup(group)) { + if (isMainDeck) { + // Only the first WTrackProperty that is created connects the signals, + // for later attempts this returns false. if (pPlayer->isTrackMenuControlAvailable()) { connect(pPlayer, &BaseTrackPlayer::trackMenuChangeRequest, @@ -1143,7 +1146,8 @@ QWidget* LegacySkinParser::parseTrackWidgetGroup(const QDomElement& node) { m_pParent, m_pConfig, m_pLibrary, - group); + group, + PlayerManager::isDeckGroup(group)); commonWidgetSetup(node, pGroup); pGroup->setup(node, *m_pContext); pGroup->Init(); diff --git a/src/widget/wtrackproperty.cpp b/src/widget/wtrackproperty.cpp index 4ac2a10ed467..4e86d8e52de5 100644 --- a/src/widget/wtrackproperty.cpp +++ b/src/widget/wtrackproperty.cpp @@ -15,11 +15,13 @@ WTrackProperty::WTrackProperty( QWidget* pParent, UserSettingsPointer pConfig, Library* pLibrary, - const QString& group) + const QString& group, + bool isMainDeck) : WLabel(pParent), m_group(group), m_pConfig(pConfig), - m_pLibrary(pLibrary) { + m_pLibrary(pLibrary), + m_isMainDeck(isMainDeck) { setAcceptDrops(true); } @@ -120,22 +122,28 @@ void WTrackProperty::contextMenuEvent(QContextMenuEvent* event) { } void WTrackProperty::ensureTrackMenuIsCreated() { - if (m_pTrackMenu.get() == nullptr) { - m_pTrackMenu = make_parented( - this, m_pConfig, m_pLibrary, WTrackMenu::kDeckTrackMenuFeatures); - - // When a track menu for this deck is shown/hidden via contextMenuEvent - // or pushbutton, it emits trackMenuVisible(bool). - // The pushbutton is created in BaseTrackPlayer which, on value change requests, - // also emits a signal which is connected to our slotShowTrackMenuChangeRequest(). - connect(m_pTrackMenu, - &WTrackMenu::trackMenuVisible, - this, - [this](bool visible) { - ControlObject::set(ConfigKey(m_group, kShowTrackMenuKey), - visible ? 1.0 : 0.0); - }); + if (m_pTrackMenu.get() != nullptr) { + return; + } + + m_pTrackMenu = make_parented( + this, m_pConfig, m_pLibrary, WTrackMenu::kDeckTrackMenuFeatures); + + // The show control exists only for main decks. + if (!m_isMainDeck) { + return; } + // When a track menu for this deck is shown/hidden via contextMenuEvent + // or pushbutton, it emits trackMenuVisible(bool). + // The pushbutton is created in BaseTrackPlayer which, on value change requests, + // also emits a signal which is connected to our slotShowTrackMenuChangeRequest(). + connect(m_pTrackMenu, + &WTrackMenu::trackMenuVisible, + this, + [this](bool visible) { + ControlObject::set(ConfigKey(m_group, kShowTrackMenuKey), + visible ? 1.0 : 0.0); + }); } /// This slot handles show/hide requests originating from both pushbutton changes diff --git a/src/widget/wtrackproperty.h b/src/widget/wtrackproperty.h index 286a2d539d77..fe80c93ab64b 100644 --- a/src/widget/wtrackproperty.h +++ b/src/widget/wtrackproperty.h @@ -18,7 +18,8 @@ class WTrackProperty : public WLabel, public TrackDropTarget { QWidget* pParent, UserSettingsPointer pConfig, Library* pLibrary, - const QString& group); + const QString& group, + bool isMainDeck); ~WTrackProperty() override; void setup(const QDomNode& node, const SkinContext& context) override; @@ -48,6 +49,7 @@ class WTrackProperty : public WLabel, public TrackDropTarget { const QString m_group; const UserSettingsPointer m_pConfig; Library* m_pLibrary; + const bool m_isMainDeck; TrackPointer m_pCurrentTrack; QString m_property; diff --git a/src/widget/wtrackwidgetgroup.cpp b/src/widget/wtrackwidgetgroup.cpp index d3d2a66eb466..e7e817b6e1aa 100644 --- a/src/widget/wtrackwidgetgroup.cpp +++ b/src/widget/wtrackwidgetgroup.cpp @@ -18,12 +18,14 @@ constexpr int kDefaultTrackColorAlpha = 255; WTrackWidgetGroup::WTrackWidgetGroup(QWidget* pParent, UserSettingsPointer pConfig, Library* pLibrary, - const QString& group) + const QString& group, + bool isMainDeck) : WWidgetGroup(pParent), m_group(group), m_pConfig(pConfig), m_pLibrary(pLibrary), - m_trackColorAlpha(kDefaultTrackColorAlpha) { + m_trackColorAlpha(kDefaultTrackColorAlpha), + m_isMainDeck(isMainDeck) { setAcceptDrops(true); } @@ -116,17 +118,22 @@ void WTrackWidgetGroup::contextMenuEvent(QContextMenuEvent* event) { } void WTrackWidgetGroup::ensureTrackMenuIsCreated() { - if (m_pTrackMenu.get() == nullptr) { - m_pTrackMenu = make_parented( - this, m_pConfig, m_pLibrary, WTrackMenu::kDeckTrackMenuFeatures); - - // See WTrackProperty for info - connect(m_pTrackMenu, - &WTrackMenu::trackMenuVisible, - this, - [this](bool visible) { - ControlObject::set(ConfigKey(m_group, kShowTrackMenuKey), - visible ? 1.0 : 0.0); - }); + if (m_pTrackMenu.get() != nullptr) { + return; } + m_pTrackMenu = make_parented( + this, m_pConfig, m_pLibrary, WTrackMenu::kDeckTrackMenuFeatures); + + // The show control exists onlyfor main decks. + // See WTrackProperty for info + if (!m_isMainDeck) { + return; + } + connect(m_pTrackMenu, + &WTrackMenu::trackMenuVisible, + this, + [this](bool visible) { + ControlObject::set(ConfigKey(m_group, kShowTrackMenuKey), + visible ? 1.0 : 0.0); + }); } diff --git a/src/widget/wtrackwidgetgroup.h b/src/widget/wtrackwidgetgroup.h index 698aada2fbaa..a7be56a429b3 100644 --- a/src/widget/wtrackwidgetgroup.h +++ b/src/widget/wtrackwidgetgroup.h @@ -15,7 +15,8 @@ class WTrackWidgetGroup : public WWidgetGroup, public TrackDropTarget { WTrackWidgetGroup(QWidget* pParent, UserSettingsPointer pConfig, Library* pLibrary, - const QString& group); + const QString& group, + bool isMainDeck); ~WTrackWidgetGroup() override; void setup(const QDomNode& node, const SkinContext& context) override; @@ -49,6 +50,7 @@ class WTrackWidgetGroup : public WWidgetGroup, public TrackDropTarget { TrackPointer m_pCurrentTrack; QColor m_trackColor; int m_trackColorAlpha; + const bool m_isMainDeck; parented_ptr m_pTrackMenu; }; From f9d5b7fad95a3714316fd939063f140953c5087a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Tue, 19 Mar 2024 08:40:29 +0100 Subject: [PATCH 37/37] Fix capitals in CHANGELOG Co-authored-by: JoergAtGithub <64457745+JoergAtGithub@users.noreply.github.com> --- CHANGELOG.md | 14 +++++++------- res/linux/org.mixxx.Mixxx.metainfo.xml | 18 +++++++++--------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 613b6a0a64aa..7baa6c425127 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,13 +13,13 @@ * Playlist feature: add 'Shuffle playlist' sidebar action [#12498](https://github.com/mixxxdj/mixxx/pull/12498) * New built-in effect: Glitch [#11329](https://github.com/mixxxdj/mixxx/pull/11329) * Fullscreen toggle rework [#11566](https://github.com/mixxxdj/mixxx/pull/11566) -* Playlists: Uupdate of playlist labels after adding tracks [#12866](https://github.com/mixxxdj/mixxx/pull/12866) [#12761](https://github.com/mixxxdj/mixxx/issues/12761) -* Tracks: custom text color for played tracks (qss) [#12744](https://github.com/mixxxdj/mixxx/pull/12744) [#5911](https://github.com/mixxxdj/mixxx/issues/5911) [#12912](https://github.com/mixxxdj/mixxx/pull/12912) -* History: show track count and duration in sidebar [#12811](https://github.com/mixxxdj/mixxx/pull/12811) [#12788](https://github.com/mixxxdj/mixxx/issues/12788) +* Playlists: Update of playlist labels after adding tracks [#12866](https://github.com/mixxxdj/mixxx/pull/12866) [#12761](https://github.com/mixxxdj/mixxx/issues/12761) +* Tracks: Custom text color for played tracks (qss) [#12744](https://github.com/mixxxdj/mixxx/pull/12744) [#5911](https://github.com/mixxxdj/mixxx/issues/5911) [#12912](https://github.com/mixxxdj/mixxx/pull/12912) +* History: Show track count and duration in sidebar [#12811](https://github.com/mixxxdj/mixxx/pull/12811) [#12788](https://github.com/mixxxdj/mixxx/issues/12788) * fixes around cratetablemodel, remove tracks + don't allow pasting tracks into locked playlists/crates or History [#12926](https://github.com/mixxxdj/mixxx/pull/12926) * Tootips: Improve `rate_up/down` tooltips, pitch vs. speed [#12590](https://github.com/mixxxdj/mixxx/pull/12590) * Shortkeys for track list management [#12020](https://github.com/mixxxdj/mixxx/pull/12020) -* Track menu: rephrase "Reset" to "Clear" [#12955](https://github.com/mixxxdj/mixxx/pull/12955) +* Track menu: Rephrase "Reset" to "Clear" [#12955](https://github.com/mixxxdj/mixxx/pull/12955) ### Controller Mappings @@ -134,14 +134,14 @@ * fix/History: remove obsolete placeholder playlists [#12494](https://github.com/mixxxdj/mixxx/pull/12494) * Add missing Taglib dependency [#12830](https://github.com/mixxxdj/mixxx/pull/12830) * fix: typo ;) [#12726](https://github.com/mixxxdj/mixxx/pull/12726) -* refactor: avoid temporary qlist allocation on midi sysex receive [#12843](https://github.com/mixxxdj/mixxx/pull/12843) +* refactor: Avoid temporary qlist allocation on midi sysex receive [#12843](https://github.com/mixxxdj/mixxx/pull/12843) * SoundSourceMP3: fix unused function warning [#12847](https://github.com/mixxxdj/mixxx/pull/12847) * update libkeyfinder to 2.2.8 [#12853](https://github.com/mixxxdj/mixxx/pull/12853) -* feat(ci): add eslint rule prefer-template [#12889](https://github.com/mixxxdj/mixxx/pull/12889) +* feat(ci): Add eslint rule prefer-template [#12889](https://github.com/mixxxdj/mixxx/pull/12889) * Labeler: Add `qml` to labeler config [#12911](https://github.com/mixxxdj/mixxx/pull/12911) * WTrackMenu: Add missing wcoverartlabel.h include [#12924](https://github.com/mixxxdj/mixxx/pull/12924) * Fix clazy complains and naming [#12935](https://github.com/mixxxdj/mixxx/pull/12935) -* src/library: sort files into sub-directories [#12956](https://github.com/mixxxdj/mixxx/pull/12956) +* src/library: Sort files into sub-directories [#12956](https://github.com/mixxxdj/mixxx/pull/12956) * CMakeLists: Fix deduplication trap with `--preload-file` [#12944](https://github.com/mixxxdj/mixxx/pull/12944) * Add CI runner that allows cleaning up the download server [#12957](https://github.com/mixxxdj/mixxx/pull/12957) * Update to latest vcpkg dependencies diff --git a/res/linux/org.mixxx.Mixxx.metainfo.xml b/res/linux/org.mixxx.Mixxx.metainfo.xml index ac1cc4d7c35a..1a9711247f89 100644 --- a/res/linux/org.mixxx.Mixxx.metainfo.xml +++ b/res/linux/org.mixxx.Mixxx.metainfo.xml @@ -96,7 +96,7 @@ Do not edit it manually. --> - +

    Features @@ -140,18 +140,18 @@ #11566

  29. - Playlists: Uupdate of playlist labels after adding tracks + Playlists: Update of playlist labels after adding tracks #12866 #12761
  30. - Tracks: custom text color for played tracks (qss) + Tracks: Custom text color for played tracks (qss) #12744 #5911 #12912
  31. - History: show track count and duration in sidebar + History: Show track count and duration in sidebar #12811 #12788
  32. @@ -170,7 +170,7 @@ #12020
  33. - Track menu: rephrase "Reset" to "Clear" + Track menu: Rephrase "Reset" to "Clear" #12955
  34. @@ -618,7 +618,7 @@ #12726
  35. - refactor: avoid temporary qlist allocation on midi sysex receive + refactor: Avoid temporary qlist allocation on midi sysex receive #12843
  36. @@ -630,7 +630,7 @@ #12853
  37. - feat(ci): add eslint rule prefer-template + feat(ci): Add eslint rule prefer-template #12889
  38. @@ -648,7 +648,7 @@ #12935
  39. - src/library: sort files into sub-directories + src/library: Sort files into sub-directories #12956
  40. @@ -704,7 +704,7 @@ - +

    Controller Mappings

  41. WDM4a!@;ePTM=7w#byDpX3WbFWzqwl7l<-s*80z-~^u?B(2Nyya8xV;OYFb z&*&i2I~5Jj+YU}k0MwGue>T%+W)+=xiyF`15oiVxCV?+=Ct)AhFd$wG?>}DG|5Hf^ z#LWH~a=uA2$$Ovuv%7HtDNFsrL2?OHT@mnLAP~!m5#qkWdd`khzJK2ohmwrdwdp-s z!Y!(22-Kz`^k%`SK!ytp2b_6e4!k)nDfySGHA#@7{rVz;$K0HYOHr|joSCquHuK}o zTP@2J#rg!?+AjN>y+~0EmPqss6ePAVEu5g?Dm`r#6-P%SqXL2M!hd;b-|A1A@ZSaE z{spalwgfmzAjy^e@*?Xq_@W`P_Sk52ZA~1F-=lmC8s}FlV^F$fUS*jrSl+C1q#2VL zW9M`qC^JHahf`B|xM}J1aCiC|>RxclNP(X=VxG7k&0Ra#cLUe@L#_47S#|&LchGMJ z=tftwGo`id4r0Is4sJuR@hHtYGW-KgjI#GJgSompiq|_!E0eRwC!tU(0e2)3GeZH>$Wz@65=RkS#e&4mXugnDu1o;mGBcs?fF7&)}4 zHg4C}0Jd!Lr;EVPTJyrfxlcm)!~0v#SBI%w_15Wp=?TtTKR7*bo?;t}C!ONNpY5Ro zJ1mPdrZ*5$U4GtL3$bPG35#mEkwH%Wm;OOY!;BapHH;4@&0NFMzDJjaEp)jJ} zB+VXUbvU@R@4M3R1h6iEW2u_92$pgryan__>9b=ky{u+-Vw-Xgr0M=6&h;$dmOO^~ zXIi2i32E>A(|{?Bh1hPl|;z)F>yi!=> zQ1l;qW$|T%55Pl8R;ByUWRVI;*Bh4yh1oymLJrAtSh6yHBTD!PmZ<{A5$O0)d+)Xl z)sHOm0!FTrZaZ4>Klz;5jKc_7|#-~a0Azlq`Ey1TtR z<2cYx|EX^X9vcFq&vi-&Vr6($8{MqyR&QTO@(*=K{Dc$z&Ytg_W2We6HFLO*}%H_mrxo+n+!FuXc+*!mv|bFhyB1g?)|2#3F&PICG** zQEMdc^mhZ19MsccX7j>0YwSkfU;YAc7xNUMY^6)g1A~$f6 zYiIkw%p9^56#$q@YitJHPj|GIM29v#YQq&^wP(-A+ zptW<(rJs0U$@K%tgY)~w@<&&y+}|ixwqmpO_Gc6pVplIQr7M2+LQis-b@Q5%><*aD zeh2oI1OE*E<4nsvqYO-TkM{$TfbIk!R%hGjXrPsP$tj+;vf_H5!PPZ_U+XoRiJqRm zzOkyB^M#pNQMG-&Rj_nK{W7PcbmVt4$^>vIPf8+*nqgWq3Y1tA|7AS=vwdDv~c2`cI|Ge ziuZlsMm5MZ*=%eos`jQNz*)~~IcIaJ+1SW&Cn8!=O-;Sfvv6owvtAT!uq$A(9nh8N z>6zY%RuS@9S?J5AIe(k~oyw`KEi=ewas6-=6BCN-bYK=t;&DD+q1TC~3OHO%4(BEp z1}Zwq_FJ?%ZaWd*oJ0rK*86__vb)I=v2F*cx8wQ0^B1dKX*_gvvZ-bz5{wz{cQF{M zvr$obQDqLujV)CZv#Q{ahEpE6P_FCfxY7nFERE6e#{V_`_%Sq04kBPwG)xxZdgl8Z zzUpJ}#_^dP(2QM0)QKex2@1lMFCv+V$3?VX+QSGOFcSx}=b!YRpVO!^ZEjT@?amWxS2Lxp68|H$4W@ny@%mSEkFTM7_fOm4(sE$u) zVlo&?*<_Sk>*M0GA5Y5OT`W|rLjLtnoQTPl^1PL(Y*CaP7)jlm;G>@@1#h&xZ%{x* z*Mj{QK<>Etr)|7`oy_|B#!|5s7-P-8JppIj^70~#^|@a@OCG!DD$Lg<`U7^)o14T$ zI3#g0>~4AS={n0|6&DxF1#e*-=;`VG8GKG(ue#niqiZ04<DLbJY1188dK_PbHnU#%ee^A~_Z>F|2- z0x(h`G~|nYb@jwV!SsR#*b}zH6@O32TIm-O(?VXt!0R%k=qr8o@Y$LA5%n(5SywJES zpF0ieU^c;Ry|B;+NABj7u>(Lsz@)s34^cY6m?^cfUBQE`V`gTi?&OQ<))w7Ipl4*r zLR5;cEabO0*nTb=xc>sYKrRD4?4LYT_Egh(%Uh}d>rcaIYrW5=1Xn7zB(KimW<7j= zcDI~4et4Oe==1)}+S?1L$WIS`52fh@XA5ce;9xZLuPks9s!bDGMr9yq6%y=^ zcy`L9RIJoyAuTAVprEr%=m|PXujtKV*Pdqniw|vXjE|;Z}w7(z+e(bHcZz;tj`odB&V6n$4pTUuJQBI}MI zEW@qd7DeqV>=GFsWE_1|5gxtiqMe;{hX!6|vw$che9<3sl`oOV>H1DaQWv#)9;468 zMMRj?*Aq=4@p8YtbQc^K{=d*=WbSWQICR}!R{^p3+{C%TMq+2uHb%wd^~#Y;!JqV|^t9RbHmbE$}zi<*aEy*YcM=9Gm)=YqhFycs{bNP+p$+d?KQ& zwS1_NG`m^k4L(X44Q{v$a?SEMnS~SwHoK~d7w23+H$(r-8x?u|7(9ez5*}wm?)#<& zE>Ctm=c|cRtl)v*n*}k(4+X(FIp9r#{*kFn>u1c{pd5Es28Nz5BH+!VK^}ZN&svik z-p^eceRGyCdo=zsdp!^>!)>u4QwVYi**Mi#3Jkpn8-LD7i(_@`7NVd1lh!UTSy@9T z|GPUsxlsN~l_Oo(o3ZO=V}@$^oeSKj~> zMV+#v<-!-MS}(+c)=?J>;aCvx` zj&8H5MZ5@HI&&Ww7_?q8eb3LyJ6z_`gC6jkB30#6*u6f{Zq71TX=5=L6to%5TTvx> z4G+;~vv0@W=1iQdx3=ot;Bx{VrL!n`>?^d+y+0)&(fZUT4eOrui7HaARGAgl0U9^Y z8u9KY>Wtqv0FZ0du;q!@IIe{;ERAX>0Q03|Ara1Z4$ucbgE4AYS&3ZJd=sfbonm+l#=)AP*4uX2qP9plYLu5xce6VsEBOyqm6t^F2-H!xxzCpK zxq6gT9A&g&Damc(hKev%T(>|lhg5%c;9=Dq9FTg0= z*V%a|94Wx|NA&3f6XJU`E5ZkwmA_Q%V@OC|Uct`ZhsVpVgK?=`Z~;M0nKsN+jFa>Y zM@VLpU;nET__dcS)$Hi!CvT~kBvS}8AW-Kg!&)rIc!0B$1VEcfPy6UtB;X`Pw(bdPP+?G)TZ*L^KRHKcg+lM~Z!%THrIKh`_<* zDw-ADBxU;HcTVrrAB23?I$C%R(62*+4VWw$Qp4-=7Ef>fMl1}Nm;(@NFsE}w-1>hH z2-dO8Dx;wblXE4{vHJ_B758Hh%X6MdMuxotOvKO6IQjy0|`jNt(MF^FQ$|8YZp%_drV0t$qETp-$$Po6w%AGNywc z+9DxKnT<>P&DJ7E5=P(GTGI*q<=N%snVChr_N-TG;yi0~$BvLUZRk6n29nTqfq+H( z9j`t0n~ToATa(-L2reNFaU{e)ttiGq9P`j&HNt_LUH)8jXp1S#7Sx#nzSx zwnAs>acdY94H(+0>h&xgJG2=VHSo+i$o`ADuZ6{h*781TUEKcA~rclMZDO3|;ws*0TfoX_Q zG!rs<`aAYG8coOZ%;#6)EWgjA@$R^XTSE#`d)^`^lL14b}Ib8Y_lhUVFkM7H%xM!s~t!Zr~1X z7@nLxTk?`cw#jI0ht}?nj8jCT1f2rX=SB?w?**XqjNb0`$eplVx3DNE^A)F$eca}I z|LOa27a|PDYSUH+M3=?{T%Wlb-%!JKsfNu*m79yAI_TA?4A@Lf-aEJ3cSROjf^-46 z?OCN!ydmaiO4Pgug|pNG7TsgiH_Ktxhvd36ijOp9+~@AuSuwSe#8){!|GBaF39D$m zF3#vy<{32p?94k3={<12qj;~|Fg9hw`e$P*FZ4^S5};YydIKsp?91=_MSCQxAT=kz z&X2U);YF|d+UT>%O-IX52pD`fEE^3_^gy)pVDP-FgUI7}NZugicY*hFx42!WRxI}js;_N2{JSZ_trTBDM_#+vzYZ2)U}|gECK3`XhQN9wwM3a?W`ZTH9||g6HwO(3wQy-@A(`U{ z(-NxCR9^S3H>&!Wn7g~iBg{^+8D(V+*Q-J@4+U}cL(UWh3#3f8YSLZO!hsyo z+IQ{wH`Ub*WBTUF$;j!YFPShunrUb1XGA-=Ago}lSD3FbTF}UJaQox{Iq<8$fC2L~UvRIeI}6s!XRxQyj| zObsOFK3y~&N0*zsxj7S^w??d~4G!KQa%-I)wRUy)5WIHs%11=xqf!6sr2$HyU;~J_ z6xM{=hXP6h*)Lzo2cyU&c+*F>&mxt!Q|w1L5)-Y)5>}2bSWTY;58LUZ%X-so?#%!+ zaTSK|dRd|wFWw5{6P!h6wH+12qO6JKUhq^nqER%pHLRl z&IPq%6?L$r;y{xdXx*O02XVp5AU9E|s5WJYkZWW_!1uW9+S4;VeblO|m9n_}o$Th} zJf&wDks3=Y0&KkfR@_xJnhd4F2>=9Q_vHi14r9tCc1~sc(?hIkaL8`CCUdXK4bRPn zqAYlNLb5+W{fXt^vpd*MmqK&Zky6;Olu;o48lGQu3L$lZZoG$EMBEgy(u>knK(%x^ zt6$+{+1VKw16rNcQgil4n8R&I1C0JJv|HSzs1Wd7os~70HCyeB0ertP6qLBA$F*Kx zSXC961Ua#4j3V<_J#!$G!4wfP=}xu}thPHyXvKr|{#&r1 z23V6%{9HR(u>uOWeckdDt zBV(e$^_QQMV*lxED=~45E{(`)QVm!&M5~Roo42;v%vI9=PLjzvq~U7SnnA*{xNM&! zB6I32vsbBm!3ZtgGcIRh0`l47KZg%}sDwe1cd;RhL_IF2`|EiW+2GGV&)$C?F8$u~ zU4|B-L2yB-f~&@5NA3gme`Hp{Nn|dqUL9X&wOtPaQK!V0zwHBlpNm-Pw*<;UZvpi< zvUbm@0(sC5bbGxn%X@RKcxCc8FIhAkM3p($2trxRVxlH$b|IctP&8%wcW0bbY+w+R z9NU3@X)|8ewg*#Hm>ySV&-v~kR|-`B@Ze;d;sFGORZ3FP?A&TsFxnf6sy>_S&|g(6 zg#YE_T)XY=jwNV^PEY6NvzgkBa0vNpxgN00S}b0J3&*Wmzwh!uv|Rgzl~7cRj(Xc} z9)vGZM(9-Y6~qKgcdu6B;{a#n1NIvVs~#qqKs=Bruh=i&#y{Wiy9oHpLL8)nVhf1g z%LA7SPC}mI2+fp4*^gtxIG_R`KRt|Ksj0RG^fUrBC=KzVZdHxH*ps2DK)1ckJ((F& z?G>t?flUuE4LK6Orlm1A8@HF8yN>u=>+0f^sr>@$7f!=t04`DNYsIKb6l*oA?K3A{?1 z?zfB1`YtXyIxB5K2pAIj%&?-s9nG8DM1fq zmiB=nZyGI?sN`~`vI)lQL+W%sKkup_+MO15qkxl3v- zcolr;Zfig*MoUJ8A|BT4nEvB%GMUU2>xk71BNR1uXLo=HXK=)7WqJQ=b?>789ZMW7 zD+QB*xZ@?*+_~9YACF~5>N<^QVd>J+++8j(w6T9X-z&CmB!6!_mXT~dGAyGLN-XTa zS6CQ|GrnSCLA1&`O3K2*`8!CQ9g+gp_i?z8=sNrr)>O&|5ViK(pHlyF3oK?bN<`(r z5nNxCqsKGdEghw~9wr+1hBlv#G#??s`Ur>wxjn^vV+m-}1CJY0u`bTC@%js-I+-lx*4a1EK?6lCtTK1|kT0X0CadYxCZZA>!7wo#ski|^AY=`al&j@pdVevNuwOkeDmx15G?-CjOiuZ!obb-jllE#R3rLBc;h z`^dDz&Sx`Oy3m7FZ}KxWZYf~^6nRnte?d(a%)%wD;o0+y*YLqSws%Pe^49~U>=E=>Z9paz1J*^s62N}SVg|AI0 zpg(slD3x4Huq78hxAN=$vggzBs<*d!*{_i;%O4iu7C*xBb6L!{t~BchfFinu!!=_l z%WAgnRu@V}yr9`|?1!axY=3?H_>eEFD8-2I%jC1+P=Xl2?gTknp-G3|k*A58uSLQv zR4rFEe`Fgu;sSnKWqxITIz2TtRVL{a-!V?M$Fhb#0Q2M4d+;EB5TVC}38-IkJgCLz zI_*Qo=d|mllmqspsX}ne@M-QNU+m`|uU6_kLlsiMe*pevumuD9JfZ_`kQF4O1*{SP zuu^Kr+eh3a%f^VE{G4%B1beeafTmDGL}ZT)cKEtr34WIaV5x&J19U99L|m&bRzE}s zI3)DPp)rB3zs30{^Wh4;_FLs-)|YT^F?#u0^y)ut zjLoHEzg;T)zR_)9xVcsJ*>$!IGE8ee6lcG!(!ASvHQB&R_&NF`o889s$-zQM^ssQh zW$uR{Eq?Rge@%Wkt&8hBc2U#S)R`?cA@j1k&ADlme+&&0LM!U!bf9EdsUPJg6$s;+ ze&l;JvwKDw&VAZX8qQxI zxx>l>S*?&b`L~PU)c1dtSm7}wShwB-W96yAeR?A|2FVt94OV&q!5Ff6fDVJ5}Kkc0Zo2Kng=cMI`oYIVU}MIW$<`Lcmw!H-txst4PUt5(KV`9_TxwPcE7Hi!O4#J!8fwa`6aVbBt*vzfGAN( zr@pI9VZ%(+h=ypX-QtGK=SXA7AmMS<$)<<%<&Bad?*`~@VlD?Wjg#n$BfZ!LP@uEfj#=dZN>y@^Mt)ci3rE=59*LLzSIr=06i zH#PItW+Ir@FTXymmUqU3faCA4J%vs&(Lpm|f#cKI=?fU-;lld&#ya|nc?H|inCiN0 zc7;P39p4A?+cErkE~f5p-0vnZnuCL1!hK55b7QKFQA3VIVPTn`_JV@J{&FmP$n{Ht zF1|{3CUNh0Z@kIqM(*c)XSQ; z7Rcn~+npK_o^+N@{fa^CQVwl)OawP< z?{R2WGf2VNWVdtXauVUQiP;I*;6i$96m0%Q#`cKx?(*n}Teht3H6)N`ah1#Qk=Pg`=RDT`-?2Z8ar28qIs$$hAOL!Xm zg~^a%K4VystLWcvC`9VvWg$W23UFAvu16)r5w(+-KY6%PR|n_kll3aRC#(oqpQ^uS zF5JN+ZG_TM-~rI^fo*obv^b=TpmHeHQwYNheq^CM@{;cn4F@%p3 zO?G8Ui+%p>*OqL0?->%*ALhA0J}Vvf;MmIlFmUl;U@YgSrT}@`L{3BF3)z3Kf`i+h zmQDVGtpKqQ+Nwt3)JzyI*ssp(*DuXfZwI0CxNdE-m_|_+1_z%jG^*=6X0UkFT$N-0 zkZ%iv{xGmRo=0l5Er!*U<%~IBW;7539@ef--zs0E>N~c%TeY_uk1FPW*1xoTgHydW zlz6N`4s}TOHW3es-z_2&I)Cij`+3hOog~_}rX)N=jb@R)n^5M0S01wBCYV$2Nmd3K zRTQ*s1T1tUUwrW+({^56d4%PGifCa^WrB0wvK{khG&0ukT(HTI(KXqlDov@G!QP#D z;2LP6mHTl-qrN0q(45g>4cXsmG&>H&#Ov&huRrgpHqbQ+d)k|l9C>m}5L$I3SJ0!D zIYhTL+g*kZkmAnfK~d@D-%#9L>o4Z$I3Zg4uMl0vLKt`ct3_q2F*UQDvMa0&K3en% z9oM{G{Hzc1KnsrNl&zm6?k^!#rz2^Y?Mv0$e}1CB9}1gXxh-P+;~1W`+KNHY6k29= zgGDCSFH>H(t@`q`TsH6ty_-jeQy?jmKhhHhrjvLyfx&CP+qIR9h^D!9H&~U?IJaTi8 z@5bOr=N8j5WrVCRgwM+8{Y*u@2@aR1gH}vR*icHN&FV~Pi_(4lR_!~DqJ9>NG>H{| zvx@O??DBUy?_1)siWyPo$7B4t-_lZ2HJ(ad)tGz}TZ@)`i*>b&9zvT1-okVGc`j8n zl?3bh`buHyD26M&&Kx~w2j)LKxW07zAeZS_I);Nm(@77)+dyKrU;I~{gw`t_$A8$C zu^HFA;8e=P+ItH;^z#}2ScQ|^$5(*t3`oz!f-%O^xnkC1lV|jMHgnphv@=*FPQm6M zr^QEEvFP?^adDTqYb(;?%@u7Bt|H)%rQ)lDBO%1u|D0B<`qy#O%PG6>5h`L8t(Lt5 z#apoMBtyogG)!YPFKkVg9aM-xG7<7>XY<{-dmmOK&Je!KVWaMYBzHi{dy(H&n}^Le zqkZA&>?dcV(eJU|Ivz-V!p3KyzCEy>Eo)s5TkYa$$^32LK(}pVf6CZ-2{}rdqGB?-qh?2@*W0q?}G~E&u+61Js0h77f-q)5$u^ z*x38}#6%bvgtxT1j}uZpu#uti->0(sZnoL1dB5)YzHa?iYtH6;97S#rFq!voQEtI+ zyfyUn0A^NQ(R-NzkJo*Ga&kVYs?&JLS!K-lCL0{ifG7N@wGU3eysha=PZ++@OPXZX z){7ZLHerS29LA_&4ahyR;&E=`#tgeh2ncc7w_C})>9kS`U@#dKLn+}cAo3a(!il}j zOU|h5HX9o0)`rJ_rU(5IkUqy;Q5N?~PhC-X`%L}R=g}l{;m_E?{+J)_dBBdJISaL; z`-h+iFF!(2Q15%~o%m#~$3-!(djh&>**19p-u|5lW2nJb^QJu}-HzI<{auh=oW4m-iX0d-Is{J2hUjY?W*S3v< zEhQn1(ka3aN(<5@(jeUop|msx9TL(5(m5b4IVvUHGc+RIIduGc@Oj?%TkHSU`v1LL zEFF&LoSE5Y@B6;)>%OjVprx_D{`s>>zB=b4*-I1? z170n~5={aXF1T zi#!hi14m#H;^1Y?tKKXvS8ZE!VlNoOkUI@pb&Vx9r|4xw55K%Ue|*pVZ4sYz61l*} zcAMBqn8(-Iw!*^77>h_+!)p6AZDExwksJ!q92aMs_#(02`~r`z102{9cwDxqh&?k^ z=0jpc7#CA1;n7E7qzwx*Q8FMGLo*IL{e0VN;B5xDqLP(UeCCEN6Gi}BG%%o{#(2@G zsN~A!)-x?r;e=epb^58`IK}tWt3KI;^wGcwzZkq!r@W#fmiRW0*hx`Vvz4%@W5YI4 z6U(4fTOdBbW|)}U#TP$iD$X8w?LW|c8Rf%5mAx8m@!ahbicEgyI*To^DcclsI6=D{y* z+z^w*=*iqG1k(xZ*>bO!~;M3#lGs;%*=a0 z(r!|aGrT94{&Z0r8YZDrz-M4eEYX&$an+p|clFT(f{lY>q@7?)Un&0P(X8R@Wzb&B z=lg*vQyI)-pze1XtA86$3U^m#DdiZ>E#q%;rsK5qDzV)IHP;n2{+#@lqmI=CY;rP= z(`{O5V1@SCVy&o$_IMm;thf0`W>NWY`SC$R zLMyRZoKpgxR*ZTc)PA?1h=^-Fe8z5I%A4#Lu)ow^xSky|9_o5AHnc@xXoesDk(%Y5 znUr(t+BcE8fvk+x+$y(pn2>#+ z;FSXtGvo-@92vk_KDH^$Xgv&X?&7u3q<~B2kP{Hcwwj!YVQpO5RK)?<&8zNwwXtxx zpI-1J$IaUcR)^LT-=@#^%X?W2yIr?ZAE#?^iT+C8WhLO5_Ix{8TWZ>pD2m30g!cy+ zBPnK43cGzpbmf!3ujKhY=geg3EaQ+HuPW8*Va6A7qY<3juCN(S$DZ!@6o#T6>Cknu zvMMFvyx)#5sP{VA-*fi?%o-fqa;ET8ED5!=sPfofvVeo$*MRY!y+)S?vLN~ zZwobHqOhc~JXN}^u`=^bgESRY;*Y+B?=tH51`0I7DGlGwf4tA6YJTv>sMFb0q9>T!vL)5kPh= zgd{j-xs6u9p{GloSZd}3M=BAr_#XfCyz|j`9m<=($_fCFxhl-^1-)XxZ>cq$M5>PR zA@9O-Q-Dp|4CVDV2bWt6BY&E|5&L0e%bebiqk7wYq1W={j7He1>Wp%}gM~P3t~>2g z2W?HMCfEeiD~(UJgxbsqeN@YGFTCI8^)XV>l!N0{YWqQ;q6<>IYOYd>x`iZYam@lnbcY?q z?va=1ZS%>3QcS>bJkta~*-1C8q7kqh)M~;fzLZirQ1RL9En!r~fuEy(9TJ{-BjAL0 zfuB-Ar5AXe>o$1oTHHQN=Z32%CX$nPCy_(LTs;(r3W#zTqgTeDC79w5rWQ9{g=?H} zVvQ=s@SB=;GuOT&j1yeRzfM_&7zj$GN5R^+JoNV5uY(rU-({U6F?*Rnjh4k2udsLX z;K+TN{+uF{Aj&m6N2IV4Dmog%=UHZb($u_+%oDT4RH8^ZHA~Ky=*MIP->48Yia7(A z7B}%`|RXU>@xwmQf0+bgpz$70ZtN43U%t)_V5;+_RaVVz*OqOg3Iy~VCLZZ|3STQp8J;z zkhZQ)?6aVIR(#En7q_9fSSs|*Y^q1cVrR!dVI_gE}rA5b6(bm>?#2uu{-*$ z^sfl|`KqC1FGy66jd7%;EuC>6rr=Zjg5?RpY3Dl78`dplW zTE>O9D`xO}pL9X)>&Gr_k6Cd;kw~~&uKj2k@NMcQW_cNu0Q$I-lTY>r2XjQw>fRn5 zm$il-m~$>oB!_1Mr*0VKLGttve%j0)Xn#Z;{^?6Um|}kv(Mw_-J=c{ODS|}!t`%cE zh05N{0)qgi3144?4@RIXnFY5u?P8_y4yhHKMUza4JzP}C?R=}L2L`@M&~0Csf%86i zgs`c*PY}4bou1x#1Y}d47VCv?69U_8M@OeL@BKu}93_QVTd)9JoDngD+QP{uXcPwg zJ#xoxK3t|3cMsrCc?Z~dDQ*UXIW;vlJ)e+-IPasgSZI39<4H(q#3Gc*u@1gMQLW+m`5GF-V1Rz) zQ5_xhCJnRl+8CIA%&CV52y2DA$b%`@aR7QaDtOlpV#>6j<*O=g9-oAf0BATvELUQB z`?BOv#qqCR>UUpld98H=v}er)9aU#%gAGnZ(CnAU0f(Nn%%hqtx6LZM?w;Q6?jB`@ zPS6nMT3f8-MLQvh6V^g2IXnz!al z$0dUG_s4%iBSnBu#drVv`ewzJs-~`HpeO4L4FG9sL6hdK8I)mUYMSNtAC#eCnb}~D z17flseBwPo7??>UlH3XSs7=Ock20wM^FmNhIokyLLZok4Rzq8ymFzs^_Py!`C!3p<(*!m|SbGZXBV2qbi>w>{VLLkxjfsN8YvVvYzQlJ|DY9+W*xw`&FNDYK zk*~6*W^d{O<4~j}W64aWOtoF|;~&}zMkOZ73D+n@!nqop2eR_jfGX?pDjz5q zEu$QMiwiEUmV|}^o*}9v&#Hr%m!x`o#1wdL(Sl{kw6!a_8mjg7t&UD0o{o;KkTn+8 zYfIls4`9>8t_9ko;govWcPH?V?t-`@IVTqsl}#g+(hPKJELC)LF!hSkMP=_D^0Km* zYQEcd${m1elorBc>ESUD%1(ArPUT2Viy;b!t4A}AL}lH1WHnW9*(=-et3CbI=Z>wJ zc*ChG&h=>BY2NF8M1N{o-VWvf5eNZ?U!QW*QUxLZo=4;6IIK~Stf98M+smvB_GF;xid)jKf3&!}@JtK~>)^3Pm*16xDTOq4wt@mY z>WuS{chXC3-ChTi1sb9EV|v9O(jDDO^V$g%Qv}3jw~f=iK~Uq5=zVP3TA;z92b7$Z z1iDjh36+*`pFFukINNgB$DbyOsYY?YuXZK;brDSuWVl0&Pdimxne{;|8U{-PnhmyHC64UC&2{3(Lh>`nicK50E(512G1A}dW= zj?pCuQ;uV@5#2wM5Y2AS@CnK+eS-V4OXcJ+$vo0i`dDaCYSQW6UpJZ&_fbp0m|jA zP56jo8&yJIJZtn!prN$>?K0eNV;-=fLGvU3yzH}84^Efe}w=#XEeDdN3))t2zzr)nVBoH8v zX1swH8^1a2yFz^S(Zb}%;r9FMN{JF@!-v~i`q}yo($M?qi~@t1ZAt>+v?^0q&$8)1 zf39gApWIHFKe>zxZy=Y((`m zQdusW?^Yg7^$!&!8_TcGL1oXwHZh-FN;{FOMy;P7j*b>;0=DQ(lVsr7Q{TTueWABy z1qD_6jVGyZLBDAtFg4az^BbYIDg>z+j%%4!bif@O1Fjd!_*;B(tuk#@C(_yKjmcCeqx$JvD9P0AY>V*z`qU zjFlF94IAr=!g!_AACyQorlg9g2T6|Bs)ms>9D>6VbKdahxR{;38`|I~`-BkFIs z`qJDfZ@=SS$%#3>U}_1dRK6Z($MqrwvKY)PuaK*Fw43I+_vLiFNCzwmM&Fx*we%}p zIp_Z@DFR9X74=6+YQechOS3N6$y`i!wsVS)!lFvr`S17BKArJTt@@M%=I2s`b@Zuk z2Km#Tg-DcG54MKuAsVd*!|o!|%r5ByHNW5eLzJkVe#B16^SqvmEe8MoadZ#$m%ZS`{Y?b zGKxi7GXY&~tEqZwtkHYRsJw8? zTsd)PKtaUg#a7kpnLAvupItV6+8H@@w-$GeS280bsA}w~&951HZTsJ7JgbrnJUzAO zUYn->Xg5E9a*!t4U_W_-_N(IZyK9V$S_X1ytcO`&)H(dcVy>Est^xu{l(?N@cSZS17M$#-V2OARpZQUKMal&ZnjXw3=`b{Gu9hRrUMVNl3+)pYl{Orq3 ztRM>B{2kx(#Q;i>M$&r)$)?d8;>unb4ykr&@s^sI7raS)1e$| z;+At}P7zHyOkk>xQy%QJbggWmOFbT8(p(IbB%S>DuXm~&ldUAJJ8*OPOA~Q}sAEl= z3%Lj+(l_lAyd5%5Sv-R4zpZ!sW6MNtj7pw(1!w`W4Bz9ywDY|Qr(O|2Is4mX-$)jm zfe3~dQaKWVXFBx_&mQ@Nhm6BT#H18#rzu>^(2t|uK|8=ZbjijP^}ZD8;0lOad(RhwxjQU5toge~etjHNAuYqK zwiu!cq$-#9nm@7lKs5$D9nAS_QZf8jf$}-t@n2Ud2mq@9I}_9m^c)({q=r0aD-OOV z;{f}smcCT7wE8R2l)by`)f;XIK&5#|XO&>Z6S5K-&JEQKE%8gTQtHY02n*}% zCBxavrnjkoXy_mQ-QLbl7Q2kK$VEI_!~C%k#|1@e<-JScp$hS$r&~#Uyp=mEg=yYZ zGWbbG%N6L--{ly1qs8e_-C9}aqq;Crwb!y&XsFXaVd#7{i>aP0>@4RY63>rG*5UtX z+pAuW?pglJOL4p$R;WSQ)6)J-AT9ary@b7>#GumhZn6WoUT#`6-i-d2X<38O3`UZi z)T@|pn}M5{bind9-ZEtV2avc`@fGwDj@~&r;9}`(%n8E329E?Zk9Q*5DI9p^j!TdR z8hYU)huZuvMibuxX=wz9tmtC~fJaaSb>}ZxrS7f|oL9cT&(9?-Jxqk;DhIcLxCh8@ zMIAfmV(ZwUb?jQ7+nSbP-^O7yU2)Vq8Zp036w#kKd~n<@<$MCYQ(K#de0&41K*f z8-9GrU^w0;C_Mh0#iaC7ZEye}mdm;M^b+50`U!2FocWYgLs56Q>bE3(W;ZT#{?$&k z*2P_qvvZ7QP}tptuNG!zW?e~qp8F|Je;7U1MjRU?32OU#U)S09pl5v+Cqjdm#wDGq z$mg&$qY^U!LNG3v$_=Qt?2r9vQHW!3{mn$C9&5C<(|H3Av}6_(fTlv5YU?8NPN!a% zbJA&yb%y)FBxYr8G72H3FtR}vW7I~q)0TJNHUJPAP;|E5je4NmJCGStopFn)oe~f! z)mTt1+Uswlsk>Y-=AsW3Kr#U^x?W#-D%GXY!>2_+Aq9L@^iY(~`4Qs$8um5ZD`gi( zkI6nf!g@^$Ah*yN%D%^W7@-XKB!)0NSx3Y!=iz~&CoRHIwJxqz$$Zk}x!5;=WW{%X zvmtH3eZKzQ(6_=?MhZ9Q*3H;gl{!BCh__CEs(`UT`pS&?lU-oD4@=ID4-jgtY5 zwbL$ms6BLg6ZCcf4p=we`x}FnZT@t?>?l%< zMi}6Ap@tRqxRw9hlK74z<|2W3K<=Ry{dQ3&jhyZU12Dj@bDM5NuPVs%+xj_P`Fq+2 zg#)&B8`ahR-i@t0r0iQi^s*40YBS&8QzN=3#vD)Q$ zfxx5z{|roE@OM1;&jEhog#Z5fs?@)KyGeWvfTj%XXN+wUJtLDs|Ge&RLj02?DxhfT z5c<7`L=`khT@FISwGe(!$xO18zC_n|q^pn?_Ax}9`$Yb!s{|J)N+=6?eC5hL^Xsz) zNDF589V^8`LZWUk+zy2GwI~~zlK$F8{gLE5xst5&)shKuM$jK|J>|Mfh+ksQKX-hS zI5S}ID<=|FM${N$DTqsG`fN?}u}LlK-!nca_BRohd~h5(k(j&plg@Pnc5ytLQ|p@w=8t-wf}qX=<1co+$!XzR;*Mg zlk%LtZ={UsyJxO=gf|bpPDyS_u|5KY^>{^9(nl#z`cFe>RAyUgR2~rAT$D(k8ZRD8h-R*4T8mij z&v=k-W37wY6UTtsJKl8!oUd#NTbm?T*mTOSlxf)9S1+5=93B|*h&4Yu)`N@|MOwjC zD+wUDOY_8f{*C6{iIO6BC-d88(WxQ|@G0w0wnIrpx@oHTtp}}@l`bwck<*5Hot>uU z*dY?xOym;=(aPM4LE9@63swTK3Uy*IoRsi&E6h zVWhvI)ey4su8&D@ZG+{msl5PuAj7Te<~q3PZ(*|0szI^{4Sm-J+%3(Aas{iID{=Bn z_caZn#B@ndnKBrN4U+2oN*Y@0QpaoqG}j7FIQ%lQbd`1 zcmBb)ZFosMfF(p_rx@N)yXyP;*?W zM044wT(F}Gl(m#(wj|9b
    %-S-Pb#}}+J-<;pPm%OPo(S16A@#$= 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 QuM@YqYX581l{>%vFY`l4j{pDw From 659b57993e25b1681f042eaaa57bbe5d1fa0ef42 Mon Sep 17 00:00:00 2001 From: m0dB <79429057+m0dB@users.noreply.github.com> Date: Sat, 14 Oct 2023 20:38:24 +0200 Subject: [PATCH 09/37] copy from browsetablemodel --- src/library/browse/browsetablemodel.cpp | 11 +++++++++++ src/library/browse/browsetablemodel.h | 1 + src/library/proxytrackmodel.cpp | 11 +++++++++++ src/library/proxytrackmodel.h | 1 + src/library/trackset/crate/cratetablemodel.cpp | 2 +- 5 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/library/browse/browsetablemodel.cpp b/src/library/browse/browsetablemodel.cpp index 561b2a3ecacf..ad98a0b6a942 100644 --- a/src/library/browse/browsetablemodel.cpp +++ b/src/library/browse/browsetablemodel.cpp @@ -14,6 +14,7 @@ #include "moc_browsetablemodel.cpp" #include "recording/recordingmanager.h" #include "track/track.h" +#include "util/clipboard.h" #include "widget/wlibrarytableview.h" namespace { @@ -314,6 +315,16 @@ bool BrowseTableModel::isColumnHiddenByDefault(int column) { void BrowseTableModel::moveTrack(const QModelIndex&, const QModelIndex&) { } +void BrowseTableModel::copyTracks(const QModelIndexList& indices) const { + Clipboard::start(); + for (const QModelIndex& index : indices) { + if (index.isValid()) { + Clipboard::add(QUrl::fromLocalFile(getTrackLocation(index))); + } + } + Clipboard::finish(); +} + void BrowseTableModel::removeTracks(const QModelIndexList&) { } diff --git a/src/library/browse/browsetablemodel.h b/src/library/browse/browsetablemodel.h index fb4b8dbc7f84..e770096eee53 100644 --- a/src/library/browse/browsetablemodel.h +++ b/src/library/browse/browsetablemodel.h @@ -71,6 +71,7 @@ class BrowseTableModel final : public QStandardItemModel, public virtual TrackMo const QString currentSearch() const override; bool isColumnInternal(int) override; void moveTrack(const QModelIndex&, const QModelIndex&) override; + void copyTracks(const QModelIndexList& indices) const override; bool isLocked() override { return false; } bool isColumnHiddenByDefault(int column) override; const QList& searchColumns() const override; diff --git a/src/library/proxytrackmodel.cpp b/src/library/proxytrackmodel.cpp index 73c374e28389..1d0398c6ffee 100644 --- a/src/library/proxytrackmodel.cpp +++ b/src/library/proxytrackmodel.cpp @@ -113,6 +113,17 @@ void ProxyTrackModel::removeTracks(const QModelIndexList& indices) { } } +void ProxyTrackModel::copyTracks(const QModelIndexList& indices) const { + QModelIndexList translatedList; + foreach (QModelIndex index, indices) { + QModelIndex indexSource = mapToSource(index); + translatedList.append(indexSource); + } + if (m_pTrackModel) { + m_pTrackModel->copyTracks(translatedList); + } +} + void ProxyTrackModel::moveTrack(const QModelIndex& sourceIndex, const QModelIndex& destIndex) { QModelIndex sourceIndexSource = mapToSource(sourceIndex); diff --git a/src/library/proxytrackmodel.h b/src/library/proxytrackmodel.h index d56ef77eeb56..561449a31a81 100644 --- a/src/library/proxytrackmodel.h +++ b/src/library/proxytrackmodel.h @@ -36,6 +36,7 @@ class ProxyTrackModel : public QSortFilterProxyModel, public TrackModel { bool isColumnInternal(int column) final; bool isColumnHiddenByDefault(int column) final; void removeTracks(const QModelIndexList& indices) final; + void copyTracks(const QModelIndexList& indices) const final; void moveTrack(const QModelIndex& sourceIndex, const QModelIndex& destIndex) final; QAbstractItemDelegate* delegateForColumn(const int i, QObject* pParent) final; QString getModelSetting(const QString& name) final; diff --git a/src/library/trackset/crate/cratetablemodel.cpp b/src/library/trackset/crate/cratetablemodel.cpp index 5603db80b506..df9c3f482871 100644 --- a/src/library/trackset/crate/cratetablemodel.cpp +++ b/src/library/trackset/crate/cratetablemodel.cpp @@ -154,7 +154,7 @@ int CrateTableModel::addTracksWithTrackIds( const QModelIndex& index, const QList& trackIds, int* pOutInsertionPos) { Q_UNUSED(index); - if (!pOutInsertionPos) { + if (pOutInsertionPos != nullptr) { // crate insertion is not done by position, and no duplicates will be added,. // 0 indicates this to the caller. *pOutInsertionPos = 0; From 82525ca2fc61cc2b338bb053cc68803d74748a37 Mon Sep 17 00:00:00 2001 From: m0dB <79429057+m0dB@users.noreply.github.com> Date: Sat, 28 Oct 2023 20:28:51 +0200 Subject: [PATCH 10/37] various cleanups (use pVar nomenclature for pointers, removed unnecessary intermediate slot, comments and debugging output, formatting) --- src/library/browse/browsetablemodel.cpp | 4 + src/library/library.cpp | 6 +- src/library/library.h | 1 - src/library/playlisttablemodel.cpp | 5 +- src/library/sidebarmodel.cpp | 30 ++++---- src/library/trackset/basetracksetfeature.cpp | 3 +- src/library/trackset/tracksettablemodel.cpp | 1 + src/widget/wlibrary.cpp | 77 ++++++++++---------- 8 files changed, 65 insertions(+), 62 deletions(-) diff --git a/src/library/browse/browsetablemodel.cpp b/src/library/browse/browsetablemodel.cpp index ad98a0b6a942..f6399267f701 100644 --- a/src/library/browse/browsetablemodel.cpp +++ b/src/library/browse/browsetablemodel.cpp @@ -323,6 +323,10 @@ void BrowseTableModel::copyTracks(const QModelIndexList& indices) const { } } Clipboard::finish(); + + // TODO Investigate if we can also implement cut and paste (via QFile + // operations) so mixxx could manage files in the filesystem, rather than + // having to go switch between mixxx and the system file browser. } void BrowseTableModel::removeTracks(const QModelIndexList&) { diff --git a/src/library/library.cpp b/src/library/library.cpp index a4a70f1ca05a..48c2ca4bc636 100644 --- a/src/library/library.cpp +++ b/src/library/library.cpp @@ -472,7 +472,7 @@ void Library::addFeature(LibraryFeature* feature) { connect(feature, &LibraryFeature::pasteFromSidebar, this, - &Library::slotPasteFromSidebar); + &Library::pasteFromSidebar); connect(feature, &LibraryFeature::showTrackModel, this, @@ -528,10 +528,6 @@ void Library::onPlayerManagerTrackAnalyzerIdle() { } } -void Library::slotPasteFromSidebar() { - emit pasteFromSidebar(); -} - void Library::slotShowTrackModel(QAbstractItemModel* model) { // qDebug() << "Library::slotShowTrackModel" << model; TrackModel* trackModel = dynamic_cast(model); diff --git a/src/library/library.h b/src/library/library.h index 5bd8a703f684..3cd08cc23e55 100644 --- a/src/library/library.h +++ b/src/library/library.h @@ -114,7 +114,6 @@ class Library: public QObject { void slotRequestAddDir(const QString& directory); void slotRequestRemoveDir(const QString& directory, LibraryRemovalType removalType); void slotRequestRelocateDir(const QString& previousDirectory, const QString& newDirectory); - void slotPasteFromSidebar(); void onSkinLoadFinished(); signals: diff --git a/src/library/playlisttablemodel.cpp b/src/library/playlisttablemodel.cpp index 38ca47d17f6c..ce7c937b717f 100644 --- a/src/library/playlisttablemodel.cpp +++ b/src/library/playlisttablemodel.cpp @@ -212,9 +212,12 @@ int PlaylistTableModel::addTracksWithTrackIds(const QModelIndex& insertionIndex, trackIds, m_iPlaylistId, position); if (trackIds.size() - tracksAdded > 0) { + QString playlistName = m_pTrackCollectionManager->internalCollection() + ->getPlaylistDAO() + .getPlaylistName(m_iPlaylistId); qDebug() << "PlaylistTableModel::addTracks could not add" << trackIds.size() - tracksAdded - << "to playlist" << m_iPlaylistId; + << "to playlist id" << m_iPlaylistId << "name" << playlistName; } return tracksAdded; } diff --git a/src/library/sidebarmodel.cpp b/src/library/sidebarmodel.cpp index 4826e34fea9c..e70870f60225 100644 --- a/src/library/sidebarmodel.cpp +++ b/src/library/sidebarmodel.cpp @@ -152,9 +152,9 @@ void SidebarModel::clear(const QModelIndex& index) { if (index.internalPointer() == this) { m_sFeatures[index.row()]->clear(); } else { - TreeItem* tree_item = (TreeItem*)index.internalPointer(); - if (tree_item) { - LibraryFeature* feature = tree_item->feature(); + TreeItem* pTreeItem = (TreeItem*)index.internalPointer(); + if (pTreeItem) { + LibraryFeature* feature = pTreeItem->feature(); feature->clearChild(index); } } @@ -164,9 +164,9 @@ void SidebarModel::cut(const QModelIndex& index) { if (index.internalPointer() == this) { m_sFeatures[index.row()]->cut(); } else { - TreeItem* tree_item = (TreeItem*)index.internalPointer(); - if (tree_item) { - LibraryFeature* feature = tree_item->feature(); + TreeItem* pTreeItem = (TreeItem*)index.internalPointer(); + if (pTreeItem) { + LibraryFeature* feature = pTreeItem->feature(); feature->cutChild(index); } } @@ -176,9 +176,9 @@ void SidebarModel::copy(const QModelIndex& index) const { if (index.internalPointer() == this) { m_sFeatures[index.row()]->copy(); } else { - TreeItem* tree_item = (TreeItem*)index.internalPointer(); - if (tree_item) { - LibraryFeature* feature = tree_item->feature(); + TreeItem* pTreeItem = (TreeItem*)index.internalPointer(); + if (pTreeItem) { + LibraryFeature* feature = pTreeItem->feature(); feature->copyChild(index); } } @@ -188,9 +188,9 @@ void SidebarModel::paste(const QModelIndex& index) { if (index.internalPointer() == this) { m_sFeatures[index.row()]->paste(); } else { - TreeItem* tree_item = (TreeItem*)index.internalPointer(); - if (tree_item) { - LibraryFeature* feature = tree_item->feature(); + TreeItem* pTreeItem = (TreeItem*)index.internalPointer(); + if (pTreeItem) { + LibraryFeature* feature = pTreeItem->feature(); feature->pasteChild(index); } } @@ -200,9 +200,9 @@ void SidebarModel::selectAll(const QModelIndex& index) { if (index.internalPointer() == this) { m_sFeatures[index.row()]->selectAll(); } else { - TreeItem* tree_item = (TreeItem*)index.internalPointer(); - if (tree_item) { - LibraryFeature* feature = tree_item->feature(); + TreeItem* pTreeItem = (TreeItem*)index.internalPointer(); + if (pTreeItem) { + LibraryFeature* feature = pTreeItem->feature(); feature->selectAllChild(index); } } diff --git a/src/library/trackset/basetracksetfeature.cpp b/src/library/trackset/basetracksetfeature.cpp index 7f95f7990358..51f18f1f4361 100644 --- a/src/library/trackset/basetracksetfeature.cpp +++ b/src/library/trackset/basetracksetfeature.cpp @@ -13,8 +13,7 @@ BaseTrackSetFeature::BaseTrackSetFeature( m_pSidebarModel(make_parented(this)) { } -void BaseTrackSetFeature::pasteChild( - const QModelIndex&) { +void BaseTrackSetFeature::pasteChild(const QModelIndex&) { emit pasteFromSidebar(); } diff --git a/src/library/trackset/tracksettablemodel.cpp b/src/library/trackset/tracksettablemodel.cpp index ca893c6d6f96..1e53c73ca601 100644 --- a/src/library/trackset/tracksettablemodel.cpp +++ b/src/library/trackset/tracksettablemodel.cpp @@ -1,5 +1,6 @@ #include "library/trackset/tracksettablemodel.h" +#include "library/trackcollectionmanager.h" #include "mixer/playermanager.h" #include "moc_tracksettablemodel.cpp" diff --git a/src/widget/wlibrary.cpp b/src/widget/wlibrary.cpp index d660668c67b4..b408c625c742 100644 --- a/src/widget/wlibrary.cpp +++ b/src/widget/wlibrary.cpp @@ -1,5 +1,6 @@ #include "widget/wlibrary.h" +#include #include #include "library/libraryview.h" @@ -31,20 +32,20 @@ void WLibrary::setup(const QDomNode& node, const SkinContext& context) { kMaxTrackTableBackgroundColorOpacity); } -bool WLibrary::registerView(const QString& name, QWidget* view) { +bool WLibrary::registerView(const QString& name, QWidget* pView) { //qDebug() << "WLibrary::registerView" << name; const auto lock = lockMutex(&m_mutex); if (m_viewMap.contains(name)) { return false; } - if (dynamic_cast(view) == nullptr) { + if (dynamic_cast(pView) == nullptr) { qDebug() << "WARNING: Attempted to register view" << name << "with WLibrary " << "which does not implement the LibraryView interface. " << "Ignoring."; return false; } - addWidget(view); - m_viewMap[name] = view; + addWidget(pView); + m_viewMap[name] = pView; return true; } @@ -52,49 +53,49 @@ void WLibrary::switchToView(const QString& name) { const auto lock = lockMutex(&m_mutex); //qDebug() << "WLibrary::switchToView" << name; - LibraryView* oldLibraryView = dynamic_cast( + LibraryView* pOldLibrartView = dynamic_cast( currentWidget()); - QWidget* widget = m_viewMap.value(name, nullptr); - if (widget != nullptr) { - LibraryView * lview = dynamic_cast(widget); - if (lview == nullptr) { + QWidget* pWidget = m_viewMap.value(name, nullptr); + if (pWidget != nullptr) { + LibraryView* pLibraryView = dynamic_cast(pWidget); + if (pLibraryView == nullptr) { qDebug() << "WARNING: Attempted to switch to view" << name << "with WLibrary " << "which does not implement the LibraryView interface. " << "Ignoring."; return; } - if (currentWidget() != widget) { - if (oldLibraryView) { - oldLibraryView->saveCurrentViewState(); + if (currentWidget() != pWidget) { + if (pOldLibrartView) { + pOldLibrartView->saveCurrentViewState(); } //qDebug() << "WLibrary::setCurrentWidget" << name; - setCurrentWidget(widget); - lview->onShow(); - lview->restoreCurrentViewState(); + setCurrentWidget(pWidget); + pLibraryView->onShow(); + pLibraryView->restoreCurrentViewState(); } } } void WLibrary::pasteFromSidebar() { - QWidget* current = currentWidget(); - LibraryView* view = dynamic_cast(current); - if (view) { - view->pasteFromSidebar(); + QWidget* pCurrent = currentWidget(); + LibraryView* pView = dynamic_cast(pCurrent); + if (pView) { + pView->pasteFromSidebar(); } } void WLibrary::search(const QString& name) { auto lock = lockMutex(&m_mutex); - QWidget* current = currentWidget(); - LibraryView* view = dynamic_cast(current); - if (view == nullptr) { + QWidget* pCurrent = currentWidget(); + LibraryView* pView = dynamic_cast(pCurrent); + if (pView == nullptr) { qDebug() << "WARNING: Attempted to search in view" << name << "with WLibrary " << "which does not implement the LibraryView interface. Ignoring."; return; } lock.unlock(); - view->onSearch(name); + pView->onSearch(name); } LibraryView* WLibrary::getActiveView() const { @@ -106,17 +107,17 @@ bool WLibrary::isTrackInCurrentView(const TrackId& trackId) { VERIFY_OR_DEBUG_ASSERT(trackId.isValid()) { return false; } - QWidget* current = currentWidget(); - WTrackTableView* tracksView = qobject_cast(current); - if (!tracksView) { + QWidget* pCurrent = currentWidget(); + WTrackTableView* pTracksView = qobject_cast(pCurrent); + if (!pTracksView) { // This view is no tracks view, but maybe a special tracks view with a // controls row (AutoDJ, Recording)? //qDebug() << " view is no tracks view. look for tracks view child"; - tracksView = current->findChild(); + pTracksView = pCurrent->findChild(); } - if (tracksView) { + if (pTracksView) { //qDebug() << " tracks view found"; - return tracksView->isTrackInCurrentView(trackId); + return pTracksView->isTrackInCurrentView(trackId); } else { // No tracks view, this is probably a root view WLibraryTextBrowser //qDebug() << " no tracks view found"; @@ -130,15 +131,15 @@ void WLibrary::slotSelectTrackInActiveTrackView(const TrackId& trackId) { return; } - QWidget* current = currentWidget(); - WTrackTableView* tracksView = qobject_cast(current); - if (!tracksView) { + QWidget* pCurrent = currentWidget(); + WTrackTableView* pTracksView = qobject_cast(pCurrent); + if (!pTracksView) { //qDebug() << " view is no tracks view. look for tracks view child"; - tracksView = current->findChild(); + pTracksView = pCurrent->findChild(); } - if (tracksView) { + if (pTracksView) { //qDebug() << " tracks view found"; - tracksView->slotSelectTrack(trackId); + pTracksView->slotSelectTrack(trackId); } else { //qDebug() << " no tracks view found"; } @@ -151,9 +152,9 @@ bool WLibrary::event(QEvent* pEvent) { return QStackedWidget::event(pEvent); } -void WLibrary::keyPressEvent(QKeyEvent* event) { - if (event->key() == Qt::Key_Left && event->modifiers() & Qt::ControlModifier) { +void WLibrary::keyPressEvent(QKeyEvent* pEvent) { + if (pEvent->key() == Qt::Key_Left && pEvent->modifiers() & Qt::ControlModifier) { emit setLibraryFocus(FocusWidget::Sidebar); } - QStackedWidget::keyPressEvent(event); + QStackedWidget::keyPressEvent(pEvent); } From e8808c53b983656c14726a29911ea53d0c2b4778 Mon Sep 17 00:00:00 2001 From: m0dB Date: Mon, 5 Feb 2024 22:46:02 +0100 Subject: [PATCH 11/37] ignore ctrl-left/right in wlibrarytableview --- src/widget/wlibrarytableview.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/widget/wlibrarytableview.cpp b/src/widget/wlibrarytableview.cpp index d4885207c3be..afdc6a42ce8d 100644 --- a/src/widget/wlibrarytableview.cpp +++ b/src/widget/wlibrarytableview.cpp @@ -386,6 +386,14 @@ QModelIndex WLibraryTableView::moveCursor(CursorAction cursorAction, return pModel->index(pModel->rowCount() - 1, column); } } break; + case QAbstractItemView::MoveLeft: + case QAbstractItemView::MoveRight: + if (modifiers & Qt::ControlModifier) { + // Ignore, so it can be handled by WLibrary::keyEvent + // to navigate to the sidebar + return currentIndex(); + } + break; default: break; } From 145813c3f158cc0f95ffa9b2880409ea14d08ef5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Tue, 27 Feb 2024 23:02:58 +0100 Subject: [PATCH 12/37] Add support for "x-special/gnome-copied-files" on Linux (no Linux guard for the case this mime type is used elsewhere) --- src/util/clipboard.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/util/clipboard.cpp b/src/util/clipboard.cpp index c92619a34c5a..1a942b78eb60 100644 --- a/src/util/clipboard.cpp +++ b/src/util/clipboard.cpp @@ -4,6 +4,20 @@ #include #include +namespace { + +QByteArray urlsToUtf8(const QList& urls) { + QByteArray result; + for (const QUrl& url : urls) { + result += url.toEncoded() + '\n'; + } + if (!result.isEmpty()) + result.chop(1); + return result; +} + +} // namespace + void Clipboard::start() { instance()->m_urls.clear(); } @@ -15,6 +29,9 @@ void Clipboard::add(const QUrl& url) { void Clipboard::finish() { QMimeData* data = new QMimeData; data->setUrls(instance()->m_urls); + // "x-special/gnome-copied-files" is used for many file managers + // https://indigo.re/posts/2021-12-21-clipboard-data.html + data->setData("x-special/gnome-copied-files", "copy\n" + urlsToUtf8(instance()->m_urls)); QApplication::clipboard()->setMimeData(data); } From 064510acbba3a8059fc6b3e41ef9fe6faf98aed7 Mon Sep 17 00:00:00 2001 From: m0dB Date: Fri, 1 Mar 2024 20:10:02 +0100 Subject: [PATCH 13/37] removed all methods, and calls to methods, that only had empty implementations --- src/library/libraryfeature.h | 19 --------------- src/library/sidebarmodel.cpp | 42 ---------------------------------- src/library/sidebarmodel.h | 3 --- src/widget/wlibrarysidebar.cpp | 12 ---------- 4 files changed, 76 deletions(-) diff --git a/src/library/libraryfeature.h b/src/library/libraryfeature.h index 5f7cc5dea366..61972192dcd0 100644 --- a/src/library/libraryfeature.h +++ b/src/library/libraryfeature.h @@ -70,30 +70,11 @@ class LibraryFeature : public QObject { virtual void clear() { } - virtual void clearChild(const QModelIndex& index) { - Q_UNUSED(index); - } - virtual void cut() { - } - virtual void cutChild(const QModelIndex& index) { - Q_UNUSED(index); - } - virtual void copy() const { - } - virtual void copyChild(const QModelIndex& index) const { - Q_UNUSED(index); - } virtual void paste() { } virtual void pasteChild(const QModelIndex& index) { Q_UNUSED(index); } - virtual void selectAll() { - } - virtual void selectAllChild(const QModelIndex& index) { - Q_UNUSED(index); - } - // Reimplement this to register custom views with the library widget. virtual void bindLibraryWidget(WLibrary* /* libraryWidget */, KeyboardEventFilter* /* keyboard */) {} diff --git a/src/library/sidebarmodel.cpp b/src/library/sidebarmodel.cpp index e70870f60225..49a13dd9bce6 100644 --- a/src/library/sidebarmodel.cpp +++ b/src/library/sidebarmodel.cpp @@ -151,36 +151,6 @@ QModelIndex SidebarModel::getFeatureRootIndex(LibraryFeature* pFeature) { void SidebarModel::clear(const QModelIndex& index) { if (index.internalPointer() == this) { m_sFeatures[index.row()]->clear(); - } else { - TreeItem* pTreeItem = (TreeItem*)index.internalPointer(); - if (pTreeItem) { - LibraryFeature* feature = pTreeItem->feature(); - feature->clearChild(index); - } - } -} - -void SidebarModel::cut(const QModelIndex& index) { - if (index.internalPointer() == this) { - m_sFeatures[index.row()]->cut(); - } else { - TreeItem* pTreeItem = (TreeItem*)index.internalPointer(); - if (pTreeItem) { - LibraryFeature* feature = pTreeItem->feature(); - feature->cutChild(index); - } - } -} - -void SidebarModel::copy(const QModelIndex& index) const { - if (index.internalPointer() == this) { - m_sFeatures[index.row()]->copy(); - } else { - TreeItem* pTreeItem = (TreeItem*)index.internalPointer(); - if (pTreeItem) { - LibraryFeature* feature = pTreeItem->feature(); - feature->copyChild(index); - } } } @@ -196,18 +166,6 @@ void SidebarModel::paste(const QModelIndex& index) { } } -void SidebarModel::selectAll(const QModelIndex& index) { - if (index.internalPointer() == this) { - m_sFeatures[index.row()]->selectAll(); - } else { - TreeItem* pTreeItem = (TreeItem*)index.internalPointer(); - if (pTreeItem) { - LibraryFeature* feature = pTreeItem->feature(); - feature->selectAllChild(index); - } - } -} - QModelIndex SidebarModel::parent(const QModelIndex& index) const { //qDebug() << "SidebarModel::parent index=" << index.getData(); if (index.isValid()) { diff --git a/src/library/sidebarmodel.h b/src/library/sidebarmodel.h index 7d942de3d321..c987dff72c73 100644 --- a/src/library/sidebarmodel.h +++ b/src/library/sidebarmodel.h @@ -48,9 +48,6 @@ class SidebarModel : public QAbstractItemModel { QModelIndex getFeatureRootIndex(LibraryFeature* pFeature); void clear(const QModelIndex& index); - void cut(const QModelIndex& index); - void copy(const QModelIndex& index) const; - void selectAll(const QModelIndex& index); void paste(const QModelIndex& index); public slots: void pressed(const QModelIndex& index); diff --git a/src/widget/wlibrarysidebar.cpp b/src/widget/wlibrarysidebar.cpp index a31909fe8f91..663006112c6b 100644 --- a/src/widget/wlibrarysidebar.cpp +++ b/src/widget/wlibrarysidebar.cpp @@ -247,22 +247,10 @@ void WLibrarySidebar::keyPressEvent(QKeyEvent* event) { sidebarModel->clear(index); return; } - if (event->matches(QKeySequence::Cut)) { - sidebarModel->cut(index); - return; - } - if (event->matches(QKeySequence::Copy)) { - sidebarModel->copy(index); - return; - } if (event->matches(QKeySequence::Paste)) { sidebarModel->paste(index); return; } - if (event->matches(QKeySequence::SelectAll)) { - sidebarModel->selectAll(index); - return; - } } focusSelectedIndex(); From ad4f5dccbccbbae081e32cc2db83feaf30b48988 Mon Sep 17 00:00:00 2001 From: m0dB Date: Fri, 1 Mar 2024 20:13:22 +0100 Subject: [PATCH 14/37] changed order to avoid last pasted track to be unselected --- src/widget/wtracktableview.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/widget/wtracktableview.cpp b/src/widget/wtracktableview.cpp index 10f409b5b5b9..dfa11b600579 100644 --- a/src/widget/wtracktableview.cpp +++ b/src/widget/wtracktableview.cpp @@ -865,10 +865,6 @@ void WTrackTableView::pasteTracks(const QModelIndex& index) { if (rows.empty()) { return; } - for (const auto row : rows) { - selectionModel()->select(model()->index(row, 0), - QItemSelectionModel::Select | QItemSelectionModel::Rows); - } updateGeometries(); @@ -882,6 +878,12 @@ void WTrackTableView::pasteTracks(const QModelIndex& index) { } else { selectRow(rows.front()); } + + // Select all the rows that we pasted + for (const auto row : rows) { + selectionModel()->select(model()->index(row, 0), + QItemSelectionModel::Select | QItemSelectionModel::Rows); + } } void WTrackTableView::keyPressEvent(QKeyEvent* event) { From 4773fc7ef0ede1db58bf0484c4bab56d3fa1e320 Mon Sep 17 00:00:00 2001 From: ronso0 Date: Wed, 6 Mar 2024 10:59:58 +0100 Subject: [PATCH 15/37] Crates: add missing isLocked() function avoids hitting DEBUG_ASSERT when removing tracks from a locked crate --- src/library/trackset/crate/cratetablemodel.cpp | 11 +++++++++++ src/library/trackset/crate/cratetablemodel.h | 1 + 2 files changed, 12 insertions(+) diff --git a/src/library/trackset/crate/cratetablemodel.cpp b/src/library/trackset/crate/cratetablemodel.cpp index df9c3f482871..d574f90eb35f 100644 --- a/src/library/trackset/crate/cratetablemodel.cpp +++ b/src/library/trackset/crate/cratetablemodel.cpp @@ -173,6 +173,17 @@ int CrateTableModel::addTracksWithTrackIds( return trackIds.size(); } +bool CrateTableModel::isLocked() { + Crate crate; + if (!m_pTrackCollectionManager->internalCollection() + ->crates() + .readCrateById(m_selectedCrate, &crate)) { + qWarning() << "Failed to read create" << m_selectedCrate; + return false; + } + return crate.isLocked(); +} + void CrateTableModel::removeTracks(const QModelIndexList& indices) { VERIFY_OR_DEBUG_ASSERT(m_selectedCrate.isValid()) { return; diff --git a/src/library/trackset/crate/cratetablemodel.h b/src/library/trackset/crate/cratetablemodel.h index ed7061fc5bdc..6e977b4a1d87 100644 --- a/src/library/trackset/crate/cratetablemodel.h +++ b/src/library/trackset/crate/cratetablemodel.h @@ -22,6 +22,7 @@ class CrateTableModel final : public TrackSetTableModel { int addTracksWithTrackIds(const QModelIndex& index, const QList& tracks, int* pOutInsertionPos) final; + bool isLocked() final; Capabilities getCapabilities() const final; QString modelKey(bool noSearch) const override; From 7659cc53d230e7a8ab0a574a60fa50cd673af169 Mon Sep 17 00:00:00 2001 From: ronso0 Date: Wed, 6 Mar 2024 11:01:06 +0100 Subject: [PATCH 16/37] Don't allow removing tracks from locked playlists or crates --- src/widget/wtracktableview.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/widget/wtracktableview.cpp b/src/widget/wtracktableview.cpp index dfa11b600579..2fbd00dabad2 100644 --- a/src/widget/wtracktableview.cpp +++ b/src/widget/wtracktableview.cpp @@ -996,9 +996,13 @@ void WTrackTableView::hideOrRemoveSelectedTracks() { } TrackModel::Capability cap; + // Hide is the primary action if allowed. Else we test for remove capability if (pTrackModel->hasCapabilities(TrackModel::Capability::Hide)) { cap = TrackModel::Capability::Hide; - } else if (pTrackModel->hasCapabilities(TrackModel::Capability::Remove)) { + } else if (pTrackModel->isLocked()) { // Locked playlists and crates + return; + } + if (pTrackModel->hasCapabilities(TrackModel::Capability::Remove)) { cap = TrackModel::Capability::Remove; } else if (pTrackModel->hasCapabilities(TrackModel::Capability::RemoveCrate)) { cap = TrackModel::Capability::RemoveCrate; From c3f1c7e182a0c2f6c347df5424597e2b0e213086 Mon Sep 17 00:00:00 2001 From: ronso0 Date: Wed, 6 Mar 2024 10:40:52 +0100 Subject: [PATCH 17/37] don't allow pasting tracks into locked playlists/crates or History --- src/library/basetracktablemodel.cpp | 5 +++++ src/widget/wtracktableview.cpp | 7 ++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/library/basetracktablemodel.cpp b/src/library/basetracktablemodel.cpp index 7c608a0b97f1..5ecd139d24ee 100644 --- a/src/library/basetracktablemodel.cpp +++ b/src/library/basetracktablemodel.cpp @@ -397,6 +397,11 @@ void BaseTrackTableModel::copyTracks(const QModelIndexList& indices) const { } QList BaseTrackTableModel::pasteTracks(const QModelIndex& insertionIndex) { + // Don't paste into locked playlists and crates or into into History + if (isLocked() || !hasCapabilities(TrackModel::Capability::ReceiveDrops)) { + return QList{}; + } + int insertionPos = 0; const QList urls = Clipboard::urls(); const QList trackIds = m_pTrackCollectionManager->resolveTrackIdsFromUrls(urls, false); diff --git a/src/widget/wtracktableview.cpp b/src/widget/wtracktableview.cpp index 2fbd00dabad2..869deabb7b08 100644 --- a/src/widget/wtracktableview.cpp +++ b/src/widget/wtracktableview.cpp @@ -861,7 +861,12 @@ void WTrackTableView::copySelectedTracks() { } void WTrackTableView::pasteTracks(const QModelIndex& index) { - const QList rows = getTrackModel()->pasteTracks(index); + TrackModel* trackModel = getTrackModel(); + if (!trackModel) { + return; + } + + const QList rows = trackModel->pasteTracks(index); if (rows.empty()) { return; } From cd275f647faa020fe5ae4f1c8d95f313b7909333 Mon Sep 17 00:00:00 2001 From: fwcd Date: Sat, 9 Mar 2024 03:13:22 +0100 Subject: [PATCH 18/37] CMakeLists: Fix deduplication trap with --preload-file --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f40833ba72e8..9e41865000d1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1830,7 +1830,7 @@ if(EMSCRIPTEN) # This will generate a mixxx.data file containing all the resources. # See https://emscripten.org/docs/porting/files/packaging_files.html # TODO: Strip this down by only including what we need (i.e. no macOS/Linux packaging, ...) - target_link_options(mixxx-lib PUBLIC --preload-file "${CMAKE_CURRENT_SOURCE_DIR}/res@/res") + target_link_options(mixxx-lib PUBLIC "--preload-file=${CMAKE_CURRENT_SOURCE_DIR}/res@/res") endif() if(WIN32) From 21691583593e15722dd46b81316e104f768cbcd6 Mon Sep 17 00:00:00 2001 From: m0dB <79429057+m0dB@users.noreply.github.com> Date: Sat, 9 Mar 2024 11:27:20 +0100 Subject: [PATCH 19/37] Update src/util/clipboard.cpp MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Daniel Schürmann --- src/util/clipboard.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/util/clipboard.cpp b/src/util/clipboard.cpp index 1a942b78eb60..843c0f3dc177 100644 --- a/src/util/clipboard.cpp +++ b/src/util/clipboard.cpp @@ -11,8 +11,9 @@ QByteArray urlsToUtf8(const QList& urls) { for (const QUrl& url : urls) { result += url.toEncoded() + '\n'; } - if (!result.isEmpty()) + if (!result.isEmpty()) { result.chop(1); + } return result; } From a6f1ba45dfe5bbacfcd266b0c858b5d4725a910b Mon Sep 17 00:00:00 2001 From: m0dB Date: Sat, 9 Mar 2024 12:01:48 +0100 Subject: [PATCH 20/37] added helper function getSelectedRows that checks for valid selectionModel --- src/widget/wtracktableview.cpp | 49 ++++++++++++++++++---------------- src/widget/wtracktableview.h | 3 +++ 2 files changed, 29 insertions(+), 23 deletions(-) diff --git a/src/widget/wtracktableview.cpp b/src/widget/wtracktableview.cpp index 869deabb7b08..49d4a601d010 100644 --- a/src/widget/wtracktableview.cpp +++ b/src/widget/wtracktableview.cpp @@ -115,7 +115,7 @@ void WTrackTableView::slotGuiTick50ms(double /*unused*/) { // slows down scrolling performance so we wait until the user has // stopped interacting first. if (m_selectionChangedSinceLastGuiTick) { - const QModelIndexList indices = selectionModel()->selectedRows(); + const QModelIndexList indices = getSelectedRows(); if (indices.size() == 1 && indices.first().isValid()) { // A single track has been selected TrackModel* trackModel = getTrackModel(); @@ -405,7 +405,7 @@ TrackModel::SortColumnId WTrackTableView::getColumnIdFromCurrentIndex() { } void WTrackTableView::assignPreviousTrackColor() { - QModelIndexList indices = selectionModel()->selectedRows(); + QModelIndexList indices = getSelectedRows(); if (indices.isEmpty()) { return; } @@ -426,7 +426,7 @@ void WTrackTableView::assignPreviousTrackColor() { } void WTrackTableView::assignNextTrackColor() { - QModelIndexList indices = selectionModel()->selectedRows(); + QModelIndexList indices = getSelectedRows(); if (indices.isEmpty()) { return; } @@ -447,7 +447,7 @@ void WTrackTableView::assignNextTrackColor() { } void WTrackTableView::slotPurge() { - QModelIndexList indices = selectionModel()->selectedRows(); + QModelIndexList indices = getSelectedRows(); if (indices.isEmpty()) { return; } @@ -461,7 +461,7 @@ void WTrackTableView::slotPurge() { } void WTrackTableView::slotDeleteTracksFromDisk() { - QModelIndexList indices = selectionModel()->selectedRows(); + QModelIndexList indices = getSelectedRows(); if (indices.isEmpty()) { return; } @@ -472,7 +472,7 @@ void WTrackTableView::slotDeleteTracksFromDisk() { } void WTrackTableView::slotUnhide() { - QModelIndexList indices = selectionModel()->selectedRows(); + QModelIndexList indices = getSelectedRows(); if (indices.isEmpty()) { return; } @@ -509,7 +509,7 @@ void WTrackTableView::contextMenuEvent(QContextMenuEvent* event) { } event->accept(); // Update track indices in context menu - QModelIndexList indices = selectionModel()->selectedRows(); + QModelIndexList indices = getSelectedRows(); m_pTrackMenu->loadTrackModelIndices(indices); saveCurrentIndex(); @@ -573,7 +573,7 @@ void WTrackTableView::mouseMoveEvent(QMouseEvent* pEvent) { //qDebug() << "MouseMoveEvent"; // Iterate over selected rows and append each item's location url to a list. QList locations; - const QModelIndexList indices = selectionModel()->selectedRows(); + const QModelIndexList indices = getSelectedRows(); for (const QModelIndex& index : indices) { if (!index.isValid()) { @@ -680,7 +680,7 @@ void WTrackTableView::dropEvent(QDropEvent * event) { // Save a list of row (just plain ints) so we don't get screwed over // when the QModelIndexes all become invalid (eg. after moveTrack() // or addTrack()) - const QModelIndexList indices = selectionModel()->selectedRows(); + const QModelIndexList indices = getSelectedRows(); QList selectedRows; for (const QModelIndex& idx : indices) { @@ -819,6 +819,15 @@ void WTrackTableView::dropEvent(QDropEvent * event) { verticalScrollBar()->setValue(vScrollBarPos); } +QModelIndexList WTrackTableView::getSelectedRows() const { + QItemSelectionModel* pSelectionModel = selectionModel(); + VERIFY_OR_DEBUG_ASSERT(pSelectionModel != nullptr) { + qWarning() << "No selection model available"; + return {}; + } + return pSelectionModel->selectedRows(); +} + TrackModel* WTrackTableView::getTrackModel() const { TrackModel* trackModel = dynamic_cast(model()); return trackModel; @@ -842,21 +851,21 @@ QModelIndex calculateCutIndex(const QModelIndex& currentIndex, } // namespace void WTrackTableView::removeSelectedTracks() { - const QModelIndexList indices = selectionModel()->selectedRows(); + const QModelIndexList indices = getSelectedRows(); const QModelIndex newIndex = calculateCutIndex(currentIndex(), indices); getTrackModel()->removeTracks(indices); setCurrentIndex(newIndex); } void WTrackTableView::cutSelectedTracks() { - const QModelIndexList indices = selectionModel()->selectedRows(); + const QModelIndexList indices = getSelectedRows(); const QModelIndex newIndex = calculateCutIndex(currentIndex(), indices); getTrackModel()->cutTracks(indices); setCurrentIndex(newIndex); } void WTrackTableView::copySelectedTracks() { - const QModelIndexList indices = selectionModel()->selectedRows(); + const QModelIndexList indices = getSelectedRows(); getTrackModel()->copyTracks(indices); } @@ -905,7 +914,7 @@ void WTrackTableView::keyPressEvent(QKeyEvent* event) { if (event->modifiers().testFlag(Qt::NoModifier)) { slotMouseDoubleClicked(currentIndex()); } else if ((event->modifiers() & kPropertiesShortcutModifier)) { - QModelIndexList indices = selectionModel()->selectedRows(); + QModelIndexList indices = getSelectedRows(); if (indices.length() == 1) { m_pTrackMenu->loadTrackModelIndices(indices); m_pTrackMenu->slotShowDlgTrackInfo(); @@ -990,7 +999,7 @@ void WTrackTableView::resizeEvent(QResizeEvent* event) { } void WTrackTableView::hideOrRemoveSelectedTracks() { - QModelIndexList indices = selectionModel()->selectedRows(); + QModelIndexList indices = getSelectedRows(); if (indices.isEmpty()) { return; } @@ -1072,7 +1081,7 @@ void WTrackTableView::hideOrRemoveSelectedTracks() { } void WTrackTableView::activateSelectedTrack() { - auto indices = selectionModel()->selectedRows(); + auto indices = getSelectedRows(); if (indices.isEmpty()) { return; } @@ -1080,7 +1089,7 @@ void WTrackTableView::activateSelectedTrack() { } void WTrackTableView::loadSelectedTrackToGroup(const QString& group, bool play) { - auto indices = selectionModel()->selectedRows(); + auto indices = getSelectedRows(); if (indices.isEmpty()) { return; } @@ -1122,19 +1131,13 @@ void WTrackTableView::loadSelectedTrackToGroup(const QString& group, bool play) QList WTrackTableView::getSelectedTrackIds() const { QList trackIds; - QItemSelectionModel* pSelectionModel = selectionModel(); - VERIFY_OR_DEBUG_ASSERT(pSelectionModel != nullptr) { - qWarning() << "No selected tracks available"; - return trackIds; - } - TrackModel* pTrackModel = getTrackModel(); VERIFY_OR_DEBUG_ASSERT(pTrackModel != nullptr) { qWarning() << "No selected tracks available"; return trackIds; } - const QModelIndexList rows = selectionModel()->selectedRows(); + const QModelIndexList rows = getSelectedRows(); trackIds.reserve(rows.size()); for (const QModelIndex& row: rows) { const TrackId trackId = pTrackModel->getTrackId(row); diff --git a/src/widget/wtracktableview.h b/src/widget/wtracktableview.h index bd98055569ba..ea87853d3f77 100644 --- a/src/widget/wtracktableview.h +++ b/src/widget/wtracktableview.h @@ -133,6 +133,9 @@ class WTrackTableView : public WLibraryTableView { // when dragging. void mouseMoveEvent(QMouseEvent *pEvent) override; + // Returns the list of selected rows, or an empty list if none are selected. + QModelIndexList getSelectedRows() const; + // Returns the current TrackModel, or returns NULL if none is set. TrackModel* getTrackModel() const; From 2257d0ba12b1492f0ba2b23eca393d68c6cbae9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Mon, 11 Mar 2024 07:30:05 +0100 Subject: [PATCH 21/37] Allow pasting new tracks not already in library --- src/library/basetracktablemodel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/library/basetracktablemodel.cpp b/src/library/basetracktablemodel.cpp index 5ecd139d24ee..285891605b32 100644 --- a/src/library/basetracktablemodel.cpp +++ b/src/library/basetracktablemodel.cpp @@ -404,7 +404,7 @@ QList BaseTrackTableModel::pasteTracks(const QModelIndex& insertionIndex) { int insertionPos = 0; const QList urls = Clipboard::urls(); - const QList trackIds = m_pTrackCollectionManager->resolveTrackIdsFromUrls(urls, false); + const QList trackIds = m_pTrackCollectionManager->resolveTrackIdsFromUrls(urls, true); if (!trackIds.isEmpty()) { addTracksWithTrackIds(insertionIndex, trackIds, &insertionPos); } From bf8578ceda72643e73e758222af84438b79621eb Mon Sep 17 00:00:00 2001 From: ronso0 Date: Tue, 12 Mar 2024 17:14:02 +0100 Subject: [PATCH 22/37] Track menu: rephrase BPM -> "Reset" to "Clear BPM and Beatgrid" --- src/widget/wtrackmenu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/widget/wtrackmenu.cpp b/src/widget/wtrackmenu.cpp index 8090dff4a294..fd2975902c23 100644 --- a/src/widget/wtrackmenu.cpp +++ b/src/widget/wtrackmenu.cpp @@ -481,7 +481,7 @@ void WTrackMenu::createActions() { slotScaleBpm(mixxx::Beats::BpmScale::ThreeHalves); }); - m_pBpmResetAction = new QAction(tr("Reset BPM"), m_pBPMMenu); + m_pBpmResetAction = new QAction(tr("Clear BPM and Beatgrid"), m_pBPMMenu); connect(m_pBpmResetAction, &QAction::triggered, this, From 042a78b9e956558f8c3ec76f965f5eb4d55d0233 Mon Sep 17 00:00:00 2001 From: ronso0 Date: Tue, 12 Mar 2024 17:15:49 +0100 Subject: [PATCH 23/37] Track menu: rephrase "Reset" menu -> "Clear" --- src/widget/wtrackmenu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/widget/wtrackmenu.cpp b/src/widget/wtrackmenu.cpp index fd2975902c23..889e7e646e8e 100644 --- a/src/widget/wtrackmenu.cpp +++ b/src/widget/wtrackmenu.cpp @@ -205,7 +205,7 @@ void WTrackMenu::createMenus() { if (featureIsEnabled(Feature::Reset)) { m_pClearMetadataMenu = new QMenu(this); //: Reset metadata in right click track context menu in library - m_pClearMetadataMenu->setTitle(tr("Reset")); + m_pClearMetadataMenu->setTitle(tr("Clear")); } if (featureIsEnabled(Feature::Analyze)) { From 079e3ffa1e41d4c06ee6700f51de77d24cfccef2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Locqueville?= Date: Tue, 12 Mar 2024 19:31:50 +0100 Subject: [PATCH 24/37] Apply suggestions from code review Co-authored-by: ronso0 --- src/skin/legacy/tooltips.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/skin/legacy/tooltips.cpp b/src/skin/legacy/tooltips.cpp index 3ed93ef43dbf..e4ccad8ba31e 100644 --- a/src/skin/legacy/tooltips.cpp +++ b/src/skin/legacy/tooltips.cpp @@ -326,25 +326,25 @@ void Tooltips::addStandardTooltips() { QString changeAmount = tr("Change the step-size in the Preferences -> Decks menu."); add("rate_perm_up_rate_perm_up_small") << tr("Speed Up") - << QString("%1: %2").arg(leftClick, tr("Raises the track playback speed (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected.")) + << QString("%1: %2").arg(leftClick, tr("Raises the track playback speed (tempo). If keylock is disabled, pitch is also affected.")) << QString("%1: %2").arg(rightClick, tr("Raises playback speed in small steps.")) << changeAmount; add("rate_perm_down_rate_perm_down_small") << tr("Slow Down") - << QString("%1: %2").arg(leftClick, tr("Lowers the track playback speed (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected.")) + << QString("%1: %2").arg(leftClick, tr("Lowers the track playback speed (tempo). If keylock is disabled, pitch is also affected.")) << QString("%1: %2").arg(rightClick, tr("Lowers playback speed in small steps.")) << changeAmount; add("rate_temp_up_rate_temp_up_small") << tr("Speed Up Temporarily (Nudge)") - << QString("%1: %2").arg(leftClick, tr("Holds playback speed higher while active (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected.")) + << QString("%1: %2").arg(leftClick, tr("Holds playback speed higher while active (tempo). If keylock is disabled, pitch is also affected.")) << QString("%1: %2").arg(rightClick, tr("Holds playback speed higher (small amount) while active.")) << changeAmount; add("rate_temp_down_rate_temp_down_small") << tr("Slow Down Temporarily (Nudge)") - << QString("%1: %2").arg(leftClick, tr("Holds playback speed lower while active (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected.")) + << QString("%1: %2").arg(leftClick, tr("Holds playback speed lower while active (tempo). If keylock is disabled, pitch is also affected.")) << QString("%1: %2").arg(rightClick, tr("Holds playback speed lower (small amount) while active.")) << changeAmount; From 03381659411acd9ec7c2190d26bc205f651707e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Mon, 11 Mar 2024 23:22:20 +0100 Subject: [PATCH 25/37] Try to fix a warning when concatinating QByteArrays --- src/util/clipboard.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/util/clipboard.cpp b/src/util/clipboard.cpp index 843c0f3dc177..f38c5f361c70 100644 --- a/src/util/clipboard.cpp +++ b/src/util/clipboard.cpp @@ -9,7 +9,8 @@ namespace { QByteArray urlsToUtf8(const QList& urls) { QByteArray result; for (const QUrl& url : urls) { - result += url.toEncoded() + '\n'; + result += url.toEncoded(); + result += '\n'; } if (!result.isEmpty()) { result.chop(1); @@ -28,12 +29,13 @@ void Clipboard::add(const QUrl& url) { } void Clipboard::finish() { - QMimeData* data = new QMimeData; - data->setUrls(instance()->m_urls); + QMimeData* pData = new QMimeData; + pData->setUrls(instance()->m_urls); // "x-special/gnome-copied-files" is used for many file managers // https://indigo.re/posts/2021-12-21-clipboard-data.html - data->setData("x-special/gnome-copied-files", "copy\n" + urlsToUtf8(instance()->m_urls)); - QApplication::clipboard()->setMimeData(data); + pData->setData(QStringLiteral("x-special/gnome-copied-files"), + "copy\n" + urlsToUtf8(instance()->m_urls)); + QApplication::clipboard()->setMimeData(pData); } QList Clipboard::urls() { From 909228623ee4064e12cd438d77fecde5c5e843ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Locqueville?= Date: Tue, 12 Mar 2024 20:25:30 +0100 Subject: [PATCH 26/37] Break excessively long lines --- src/skin/legacy/tooltips.cpp | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/skin/legacy/tooltips.cpp b/src/skin/legacy/tooltips.cpp index e4ccad8ba31e..f9a7c9eb5d53 100644 --- a/src/skin/legacy/tooltips.cpp +++ b/src/skin/legacy/tooltips.cpp @@ -326,26 +326,40 @@ void Tooltips::addStandardTooltips() { QString changeAmount = tr("Change the step-size in the Preferences -> Decks menu."); add("rate_perm_up_rate_perm_up_small") << tr("Speed Up") - << QString("%1: %2").arg(leftClick, tr("Raises the track playback speed (tempo). If keylock is disabled, pitch is also affected.")) - << QString("%1: %2").arg(rightClick, tr("Raises playback speed in small steps.")) + << QString("%1: %2").arg(leftClick, + tr("Raises the track playback speed (tempo). If keylock " + "is disabled, pitch is also affected.")) + << QString("%1: %2").arg( + rightClick, tr("Raises playback speed in small steps.")) << changeAmount; add("rate_perm_down_rate_perm_down_small") << tr("Slow Down") - << QString("%1: %2").arg(leftClick, tr("Lowers the track playback speed (tempo). If keylock is disabled, pitch is also affected.")) - << QString("%1: %2").arg(rightClick, tr("Lowers playback speed in small steps.")) + << QString("%1: %2").arg(leftClick, + tr("Lowers the track playback speed (tempo). If keylock " + "is disabled, pitch is also affected.")) + << QString("%1: %2").arg( + rightClick, tr("Lowers playback speed in small steps.")) << changeAmount; add("rate_temp_up_rate_temp_up_small") << tr("Speed Up Temporarily (Nudge)") - << QString("%1: %2").arg(leftClick, tr("Holds playback speed higher while active (tempo). If keylock is disabled, pitch is also affected.")) - << QString("%1: %2").arg(rightClick, tr("Holds playback speed higher (small amount) while active.")) + << QString("%1: %2").arg(leftClick, + tr("Holds playback speed higher while active (tempo). " + "If keylock is disabled, pitch is also affected.")) + << QString("%1: %2").arg(rightClick, + tr("Holds playback speed higher (small amount) while " + "active.")) << changeAmount; add("rate_temp_down_rate_temp_down_small") << tr("Slow Down Temporarily (Nudge)") - << QString("%1: %2").arg(leftClick, tr("Holds playback speed lower while active (tempo). If keylock is disabled, pitch is also affected.")) - << QString("%1: %2").arg(rightClick, tr("Holds playback speed lower (small amount) while active.")) + << QString("%1: %2").arg(leftClick, + tr("Holds playback speed lower while active (tempo). " + "If keylock is disabled, pitch is also affected.")) + << QString("%1: %2").arg(rightClick, + tr("Holds playback speed lower (small amount) while " + "active.")) << changeAmount; add("filterLow") From 64e16773bd0484f12363826af0840b60751ca404 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Locqueville?= Date: Tue, 12 Mar 2024 20:32:21 +0100 Subject: [PATCH 27/37] Use a common QString to avoid repetition --- src/skin/legacy/tooltips.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/skin/legacy/tooltips.cpp b/src/skin/legacy/tooltips.cpp index f9a7c9eb5d53..b0ad99e08fa5 100644 --- a/src/skin/legacy/tooltips.cpp +++ b/src/skin/legacy/tooltips.cpp @@ -324,11 +324,13 @@ void Tooltips::addStandardTooltips() { << tr("Manual: Sets how much to reduce the music volume, when talkover is activated regardless of volume of microphone inputs."); QString changeAmount = tr("Change the step-size in the Preferences -> Decks menu."); + QString pitchAffected = tr("If keylock is disabled, pitch is also affected."); + add("rate_perm_up_rate_perm_up_small") << tr("Speed Up") << QString("%1: %2").arg(leftClick, - tr("Raises the track playback speed (tempo). If keylock " - "is disabled, pitch is also affected.")) + tr("Raises the track playback speed (tempo).")) + << pitchAffected << QString("%1: %2").arg( rightClick, tr("Raises playback speed in small steps.")) << changeAmount; @@ -336,8 +338,8 @@ void Tooltips::addStandardTooltips() { add("rate_perm_down_rate_perm_down_small") << tr("Slow Down") << QString("%1: %2").arg(leftClick, - tr("Lowers the track playback speed (tempo). If keylock " - "is disabled, pitch is also affected.")) + tr("Lowers the track playback speed (tempo).")) + << pitchAffected << QString("%1: %2").arg( rightClick, tr("Lowers playback speed in small steps.")) << changeAmount; @@ -345,8 +347,8 @@ void Tooltips::addStandardTooltips() { add("rate_temp_up_rate_temp_up_small") << tr("Speed Up Temporarily (Nudge)") << QString("%1: %2").arg(leftClick, - tr("Holds playback speed higher while active (tempo). " - "If keylock is disabled, pitch is also affected.")) + tr("Holds playback speed higher while active (tempo).")) + << pitchAffected << QString("%1: %2").arg(rightClick, tr("Holds playback speed higher (small amount) while " "active.")) @@ -355,8 +357,8 @@ void Tooltips::addStandardTooltips() { add("rate_temp_down_rate_temp_down_small") << tr("Slow Down Temporarily (Nudge)") << QString("%1: %2").arg(leftClick, - tr("Holds playback speed lower while active (tempo). " - "If keylock is disabled, pitch is also affected.")) + tr("Holds playback speed lower while active (tempo).")) + << pitchAffected << QString("%1: %2").arg(rightClick, tr("Holds playback speed lower (small amount) while " "active.")) From be541eadbe706a2c6af42a85ba26c2c2889e55fc Mon Sep 17 00:00:00 2001 From: ronso0 Date: Mon, 4 Jul 2022 11:28:19 +0200 Subject: [PATCH 28/37] Library: move Analysis, Hidden and Missing into separate directories --- CMakeLists.txt | 20 +++++++++---------- .../{ => analysis}/analysisfeature.cpp | 4 ++-- src/library/{ => analysis}/analysisfeature.h | 0 .../analysislibrarytablemodel.cpp | 2 +- .../analysislibrarytablemodel.h | 0 src/library/{ => analysis}/dlganalysis.cpp | 3 ++- src/library/{ => analysis}/dlganalysis.h | 6 +++--- src/library/{ => analysis}/dlganalysis.ui | 0 src/library/library.cpp | 2 +- .../{ => missing_hidden}/dlghidden.cpp | 4 ++-- src/library/{ => missing_hidden}/dlghidden.h | 0 src/library/{ => missing_hidden}/dlghidden.ui | 0 .../{ => missing_hidden}/dlgmissing.cpp | 4 ++-- src/library/{ => missing_hidden}/dlgmissing.h | 0 .../{ => missing_hidden}/dlgmissing.ui | 0 .../{ => missing_hidden}/hiddentablemodel.cpp | 2 +- .../{ => missing_hidden}/hiddentablemodel.h | 0 .../missingtablemodel.cpp | 2 +- .../{ => missing_hidden}/missingtablemodel.h | 0 src/library/mixxxlibraryfeature.cpp | 4 ++-- src/library/traktor/traktorfeature.cpp | 2 +- 21 files changed, 28 insertions(+), 27 deletions(-) rename src/library/{ => analysis}/analysisfeature.cpp (98%) rename src/library/{ => analysis}/analysisfeature.h (100%) rename src/library/{ => analysis}/analysislibrarytablemodel.cpp (93%) rename src/library/{ => analysis}/analysislibrarytablemodel.h (100%) rename src/library/{ => analysis}/dlganalysis.cpp (98%) rename src/library/{ => analysis}/dlganalysis.h (95%) rename src/library/{ => analysis}/dlganalysis.ui (100%) rename src/library/{ => missing_hidden}/dlghidden.cpp (97%) rename src/library/{ => missing_hidden}/dlghidden.h (100%) rename src/library/{ => missing_hidden}/dlghidden.ui (100%) rename src/library/{ => missing_hidden}/dlgmissing.cpp (97%) rename src/library/{ => missing_hidden}/dlgmissing.h (100%) rename src/library/{ => missing_hidden}/dlgmissing.ui (100%) rename src/library/{ => missing_hidden}/hiddentablemodel.cpp (98%) rename src/library/{ => missing_hidden}/hiddentablemodel.h (100%) rename src/library/{ => missing_hidden}/missingtablemodel.cpp (98%) rename src/library/{ => missing_hidden}/missingtablemodel.h (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2de62e944b8e..9b824cc48ad1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -888,8 +888,10 @@ add_library(mixxx-lib STATIC EXCLUDE_FROM_ALL src/engine/sync/internalclock.cpp src/engine/sync/synccontrol.cpp src/errordialoghandler.cpp - src/library/analysisfeature.cpp - src/library/analysislibrarytablemodel.cpp + src/library/analysis/analysisfeature.cpp + src/library/analysis/analysislibrarytablemodel.cpp + src/library/analysis/dlganalysis.cpp + src/library/analysis/dlganalysis.ui src/library/autodj/autodjfeature.cpp src/library/autodj/autodjprocessor.cpp src/library/autodj/dlgautodj.cpp @@ -923,14 +925,8 @@ add_library(mixxx-lib STATIC EXCLUDE_FROM_ALL src/library/dao/settingsdao.cpp src/library/dao/trackdao.cpp src/library/dao/trackschema.cpp - src/library/dlganalysis.cpp - src/library/dlganalysis.ui src/library/dlgcoverartfullsize.cpp src/library/dlgcoverartfullsize.ui - src/library/dlghidden.cpp - src/library/dlghidden.ui - src/library/dlgmissing.cpp - src/library/dlgmissing.ui src/library/dlgtagfetcher.cpp src/library/dlgtagfetcher.ui src/library/dlgtrackinfo.cpp @@ -942,7 +938,6 @@ add_library(mixxx-lib STATIC EXCLUDE_FROM_ALL src/library/export/trackexportwizard.cpp src/library/export/trackexportworker.cpp src/library/externaltrackcollection.cpp - src/library/hiddentablemodel.cpp src/library/itunes/itunesdao.cpp src/library/itunes/itunesfeature.cpp src/library/itunes/itunesimporter.cpp @@ -954,7 +949,12 @@ add_library(mixxx-lib STATIC EXCLUDE_FROM_ALL src/library/libraryfeature.cpp src/library/librarytablemodel.cpp src/library/locationdelegate.cpp - src/library/missingtablemodel.cpp + src/library/missing_hidden/dlghidden.cpp + src/library/missing_hidden/dlghidden.ui + src/library/missing_hidden/dlgmissing.cpp + src/library/missing_hidden/dlgmissing.ui + src/library/missing_hidden/hiddentablemodel.cpp + src/library/missing_hidden/missingtablemodel.cpp src/library/mixxxlibraryfeature.cpp src/library/multilineeditdelegate.cpp src/library/parser.cpp diff --git a/src/library/analysisfeature.cpp b/src/library/analysis/analysisfeature.cpp similarity index 98% rename from src/library/analysisfeature.cpp rename to src/library/analysis/analysisfeature.cpp index ebe954c551d5..a713f57ddfcb 100644 --- a/src/library/analysisfeature.cpp +++ b/src/library/analysis/analysisfeature.cpp @@ -1,11 +1,11 @@ -#include "library/analysisfeature.h" +#include "library/analysis/analysisfeature.h" #include #include #include "analyzer/analyzerscheduledtrack.h" #include "controllers/keyboard/keyboardeventfilter.h" -#include "library/dlganalysis.h" +#include "library/analysis/dlganalysis.h" #include "library/library.h" #include "library/trackcollectionmanager.h" #include "moc_analysisfeature.cpp" diff --git a/src/library/analysisfeature.h b/src/library/analysis/analysisfeature.h similarity index 100% rename from src/library/analysisfeature.h rename to src/library/analysis/analysisfeature.h diff --git a/src/library/analysislibrarytablemodel.cpp b/src/library/analysis/analysislibrarytablemodel.cpp similarity index 93% rename from src/library/analysislibrarytablemodel.cpp rename to src/library/analysis/analysislibrarytablemodel.cpp index 4eeccbf5e1b5..574c1545b988 100644 --- a/src/library/analysislibrarytablemodel.cpp +++ b/src/library/analysis/analysislibrarytablemodel.cpp @@ -1,4 +1,4 @@ -#include "library/analysislibrarytablemodel.h" +#include "library/analysis/analysislibrarytablemodel.h" #include "moc_analysislibrarytablemodel.cpp" diff --git a/src/library/analysislibrarytablemodel.h b/src/library/analysis/analysislibrarytablemodel.h similarity index 100% rename from src/library/analysislibrarytablemodel.h rename to src/library/analysis/analysislibrarytablemodel.h diff --git a/src/library/dlganalysis.cpp b/src/library/analysis/dlganalysis.cpp similarity index 98% rename from src/library/dlganalysis.cpp rename to src/library/analysis/dlganalysis.cpp index 36bb12953b6d..3f67fe0bbd89 100644 --- a/src/library/dlganalysis.cpp +++ b/src/library/analysis/dlganalysis.cpp @@ -1,7 +1,8 @@ -#include "library/dlganalysis.h" +#include "library/analysis/dlganalysis.h" #include "analyzer/analyzerprogress.h" #include "analyzer/analyzerscheduledtrack.h" +#include "library/analysis/ui_dlganalysis.h" #include "library/dao/trackschema.h" #include "library/library.h" #include "moc_dlganalysis.cpp" diff --git a/src/library/dlganalysis.h b/src/library/analysis/dlganalysis.h similarity index 95% rename from src/library/dlganalysis.h rename to src/library/analysis/dlganalysis.h index c4d90c565218..ca32cc02f843 100644 --- a/src/library/dlganalysis.h +++ b/src/library/analysis/dlganalysis.h @@ -4,13 +4,13 @@ #include "analyzer/analyzerprogress.h" #include "analyzer/analyzerscheduledtrack.h" -#include "library/analysislibrarytablemodel.h" +#include "library/analysis/analysislibrarytablemodel.h" +#include "library/analysis/ui_dlganalysis.h" #include "library/libraryview.h" -#include "library/ui_dlganalysis.h" #include "preferences/usersettings.h" -class WAnalysisLibraryTableView; class Library; +class WAnalysisLibraryTableView; class WLibrary; class QItemSelection; diff --git a/src/library/dlganalysis.ui b/src/library/analysis/dlganalysis.ui similarity index 100% rename from src/library/dlganalysis.ui rename to src/library/analysis/dlganalysis.ui diff --git a/src/library/library.cpp b/src/library/library.cpp index 77bd315e1b4b..a420cdcefb26 100644 --- a/src/library/library.cpp +++ b/src/library/library.cpp @@ -6,7 +6,7 @@ #include "control/controlobject.h" #include "controllers/keyboard/keyboardeventfilter.h" -#include "library/analysisfeature.h" +#include "library/analysis/analysisfeature.h" #include "library/autodj/autodjfeature.h" #include "library/banshee/bansheefeature.h" #include "library/browse/browsefeature.h" diff --git a/src/library/dlghidden.cpp b/src/library/missing_hidden/dlghidden.cpp similarity index 97% rename from src/library/dlghidden.cpp rename to src/library/missing_hidden/dlghidden.cpp index a43bd67ce101..0943a182eb32 100644 --- a/src/library/dlghidden.cpp +++ b/src/library/missing_hidden/dlghidden.cpp @@ -1,10 +1,10 @@ -#include "library/dlghidden.h" +#include "library/missing_hidden/dlghidden.h" #include #include "controllers/keyboard/keyboardeventfilter.h" -#include "library/hiddentablemodel.h" #include "library/library.h" +#include "library/missing_hidden/hiddentablemodel.h" #include "moc_dlghidden.cpp" #include "util/assert.h" #include "widget/wlibrary.h" diff --git a/src/library/dlghidden.h b/src/library/missing_hidden/dlghidden.h similarity index 100% rename from src/library/dlghidden.h rename to src/library/missing_hidden/dlghidden.h diff --git a/src/library/dlghidden.ui b/src/library/missing_hidden/dlghidden.ui similarity index 100% rename from src/library/dlghidden.ui rename to src/library/missing_hidden/dlghidden.ui diff --git a/src/library/dlgmissing.cpp b/src/library/missing_hidden/dlgmissing.cpp similarity index 97% rename from src/library/dlgmissing.cpp rename to src/library/missing_hidden/dlgmissing.cpp index 24b4b3a42eea..736fb4842cdc 100644 --- a/src/library/dlgmissing.cpp +++ b/src/library/missing_hidden/dlgmissing.cpp @@ -1,10 +1,10 @@ -#include "library/dlgmissing.h" +#include "library/missing_hidden/dlgmissing.h" #include #include "controllers/keyboard/keyboardeventfilter.h" #include "library/library.h" -#include "library/missingtablemodel.h" +#include "library/missing_hidden/missingtablemodel.h" #include "moc_dlgmissing.cpp" #include "util/assert.h" #include "widget/wlibrary.h" diff --git a/src/library/dlgmissing.h b/src/library/missing_hidden/dlgmissing.h similarity index 100% rename from src/library/dlgmissing.h rename to src/library/missing_hidden/dlgmissing.h diff --git a/src/library/dlgmissing.ui b/src/library/missing_hidden/dlgmissing.ui similarity index 100% rename from src/library/dlgmissing.ui rename to src/library/missing_hidden/dlgmissing.ui diff --git a/src/library/hiddentablemodel.cpp b/src/library/missing_hidden/hiddentablemodel.cpp similarity index 98% rename from src/library/hiddentablemodel.cpp rename to src/library/missing_hidden/hiddentablemodel.cpp index f54fc17ca0eb..ff87e84387db 100644 --- a/src/library/hiddentablemodel.cpp +++ b/src/library/missing_hidden/hiddentablemodel.cpp @@ -1,4 +1,4 @@ -#include "library/hiddentablemodel.h" +#include "library/missing_hidden/hiddentablemodel.h" #include "library/dao/trackschema.h" #include "library/trackcollection.h" diff --git a/src/library/hiddentablemodel.h b/src/library/missing_hidden/hiddentablemodel.h similarity index 100% rename from src/library/hiddentablemodel.h rename to src/library/missing_hidden/hiddentablemodel.h diff --git a/src/library/missingtablemodel.cpp b/src/library/missing_hidden/missingtablemodel.cpp similarity index 98% rename from src/library/missingtablemodel.cpp rename to src/library/missing_hidden/missingtablemodel.cpp index 5906196c3b12..1b6c077e5094 100644 --- a/src/library/missingtablemodel.cpp +++ b/src/library/missing_hidden/missingtablemodel.cpp @@ -1,4 +1,4 @@ -#include "library/missingtablemodel.h" +#include "library/missing_hidden/missingtablemodel.h" #include "library/dao/trackschema.h" #include "library/trackcollection.h" diff --git a/src/library/missingtablemodel.h b/src/library/missing_hidden/missingtablemodel.h similarity index 100% rename from src/library/missingtablemodel.h rename to src/library/missing_hidden/missingtablemodel.h diff --git a/src/library/mixxxlibraryfeature.cpp b/src/library/mixxxlibraryfeature.cpp index 84400b7a939b..4ea52b1e6a1f 100644 --- a/src/library/mixxxlibraryfeature.cpp +++ b/src/library/mixxxlibraryfeature.cpp @@ -7,10 +7,10 @@ #include "library/basetrackcache.h" #include "library/dao/trackschema.h" -#include "library/dlghidden.h" -#include "library/dlgmissing.h" #include "library/library.h" #include "library/librarytablemodel.h" +#include "library/missing_hidden/dlghidden.h" +#include "library/missing_hidden/dlgmissing.h" #include "library/parser.h" #include "library/queryutil.h" #include "library/trackcollection.h" diff --git a/src/library/traktor/traktorfeature.cpp b/src/library/traktor/traktorfeature.cpp index 0cb61d2dd6de..d6773cf5fc3d 100644 --- a/src/library/traktor/traktorfeature.cpp +++ b/src/library/traktor/traktorfeature.cpp @@ -10,7 +10,7 @@ #include "library/library.h" #include "library/librarytablemodel.h" -#include "library/missingtablemodel.h" +#include "library/missing_hidden/missingtablemodel.h" #include "library/queryutil.h" #include "library/trackcollection.h" #include "library/trackcollectionmanager.h" From 12aa4dfd413e83e8d4be806bdb93e214ba579506 Mon Sep 17 00:00:00 2001 From: ronso0 Date: Tue, 12 Mar 2024 22:21:51 +0100 Subject: [PATCH 29/37] Library: move table item delegates to src/library/tabledelegates --- CMakeLists.txt | 20 +++++++++---------- src/library/basetracktablemodel.cpp | 16 +++++++-------- src/library/browse/browsetablemodel.cpp | 2 +- .../{ => tabledelegates}/bpmdelegate.cpp | 2 +- .../{ => tabledelegates}/bpmdelegate.h | 2 +- .../{ => tabledelegates}/colordelegate.cpp | 2 +- .../{ => tabledelegates}/colordelegate.h | 2 +- .../{ => tabledelegates}/coverartdelegate.cpp | 2 +- .../{ => tabledelegates}/coverartdelegate.h | 2 +- .../{ => tabledelegates}/locationdelegate.cpp | 2 +- .../{ => tabledelegates}/locationdelegate.h | 3 +-- .../multilineeditdelegate.cpp | 2 +- .../multilineeditdelegate.h | 2 +- .../playcountdelegate.cpp | 2 +- .../{ => tabledelegates}/playcountdelegate.h | 2 +- .../previewbuttondelegate.cpp | 2 +- .../previewbuttondelegate.h | 2 +- .../{ => tabledelegates}/stardelegate.cpp | 6 +++--- .../{ => tabledelegates}/stardelegate.h | 2 +- .../{ => tabledelegates}/stareditor.cpp | 4 ++-- src/library/{ => tabledelegates}/stareditor.h | 0 .../tableitemdelegate.cpp | 2 +- .../{ => tabledelegates}/tableitemdelegate.h | 0 23 files changed, 40 insertions(+), 41 deletions(-) rename src/library/{ => tabledelegates}/bpmdelegate.cpp (99%) rename src/library/{ => tabledelegates}/bpmdelegate.h (88%) rename src/library/{ => tabledelegates}/colordelegate.cpp (94%) rename src/library/{ => tabledelegates}/colordelegate.h (86%) rename src/library/{ => tabledelegates}/coverartdelegate.cpp (99%) rename src/library/{ => tabledelegates}/coverartdelegate.h (97%) rename src/library/{ => tabledelegates}/locationdelegate.cpp (94%) rename src/library/{ => tabledelegates}/locationdelegate.h (86%) rename src/library/{ => tabledelegates}/multilineeditdelegate.cpp (99%) rename src/library/{ => tabledelegates}/multilineeditdelegate.h (96%) rename src/library/{ => tabledelegates}/playcountdelegate.cpp (95%) rename src/library/{ => tabledelegates}/playcountdelegate.h (87%) rename src/library/{ => tabledelegates}/previewbuttondelegate.cpp (99%) rename src/library/{ => tabledelegates}/previewbuttondelegate.h (97%) rename src/library/{ => tabledelegates}/stardelegate.cpp (95%) rename src/library/{ => tabledelegates}/stardelegate.h (95%) rename src/library/{ => tabledelegates}/stareditor.cpp (98%) rename src/library/{ => tabledelegates}/stareditor.h (100%) rename src/library/{ => tabledelegates}/tableitemdelegate.cpp (98%) rename src/library/{ => tabledelegates}/tableitemdelegate.h (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9b824cc48ad1..7908e4f8215a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -905,16 +905,13 @@ add_library(mixxx-lib STATIC EXCLUDE_FROM_ALL src/library/basesqltablemodel.cpp src/library/basetrackcache.cpp src/library/basetracktablemodel.cpp - src/library/bpmdelegate.cpp src/library/browse/browsefeature.cpp src/library/browse/browsetablemodel.cpp src/library/browse/browsethread.cpp src/library/browse/foldertreemodel.cpp - src/library/colordelegate.cpp src/library/columncache.cpp src/library/coverart.cpp src/library/coverartcache.cpp - src/library/coverartdelegate.cpp src/library/coverartutils.cpp src/library/dao/analysisdao.cpp src/library/dao/autodjcratesdao.cpp @@ -948,7 +945,6 @@ add_library(mixxx-lib STATIC EXCLUDE_FROM_ALL src/library/librarycontrol.cpp src/library/libraryfeature.cpp src/library/librarytablemodel.cpp - src/library/locationdelegate.cpp src/library/missing_hidden/dlghidden.cpp src/library/missing_hidden/dlghidden.ui src/library/missing_hidden/dlgmissing.cpp @@ -956,14 +952,11 @@ add_library(mixxx-lib STATIC EXCLUDE_FROM_ALL src/library/missing_hidden/hiddentablemodel.cpp src/library/missing_hidden/missingtablemodel.cpp src/library/mixxxlibraryfeature.cpp - src/library/multilineeditdelegate.cpp src/library/parser.cpp src/library/parsercsv.cpp src/library/parserm3u.cpp src/library/parserpls.cpp - src/library/playcountdelegate.cpp src/library/playlisttablemodel.cpp - src/library/previewbuttondelegate.cpp src/library/proxytrackmodel.cpp src/library/recording/dlgrecording.cpp src/library/recording/dlgrecording.ui @@ -982,10 +975,17 @@ add_library(mixxx-lib STATIC EXCLUDE_FROM_ALL src/library/serato/seratofeature.cpp src/library/serato/seratoplaylistmodel.cpp src/library/sidebarmodel.cpp - src/library/stardelegate.cpp - src/library/stareditor.cpp src/library/starrating.cpp - src/library/tableitemdelegate.cpp + src/library/tabledelegates/bpmdelegate.cpp + src/library/tabledelegates/colordelegate.cpp + src/library/tabledelegates/coverartdelegate.cpp + src/library/tabledelegates/locationdelegate.cpp + src/library/tabledelegates/multilineeditdelegate.cpp + src/library/tabledelegates/playcountdelegate.cpp + src/library/tabledelegates/previewbuttondelegate.cpp + src/library/tabledelegates/stardelegate.cpp + src/library/tabledelegates/stareditor.cpp + src/library/tabledelegates/tableitemdelegate.cpp src/library/trackcollection.cpp src/library/trackcollectioniterator.cpp src/library/trackcollectionmanager.cpp diff --git a/src/library/basetracktablemodel.cpp b/src/library/basetracktablemodel.cpp index 274c206b4f14..bfc7b270b2d2 100644 --- a/src/library/basetracktablemodel.cpp +++ b/src/library/basetracktablemodel.cpp @@ -3,17 +3,17 @@ #include #include -#include "library/bpmdelegate.h" -#include "library/colordelegate.h" #include "library/coverartcache.h" -#include "library/coverartdelegate.h" #include "library/dao/trackschema.h" -#include "library/locationdelegate.h" -#include "library/multilineeditdelegate.h" -#include "library/playcountdelegate.h" -#include "library/previewbuttondelegate.h" -#include "library/stardelegate.h" #include "library/starrating.h" +#include "library/tabledelegates/bpmdelegate.h" +#include "library/tabledelegates/colordelegate.h" +#include "library/tabledelegates/coverartdelegate.h" +#include "library/tabledelegates/locationdelegate.h" +#include "library/tabledelegates/multilineeditdelegate.h" +#include "library/tabledelegates/playcountdelegate.h" +#include "library/tabledelegates/previewbuttondelegate.h" +#include "library/tabledelegates/stardelegate.h" #include "library/trackcollection.h" #include "library/trackcollectionmanager.h" #include "mixer/playerinfo.h" diff --git a/src/library/browse/browsetablemodel.cpp b/src/library/browse/browsetablemodel.cpp index 561b2a3ecacf..0095d8f25fe6 100644 --- a/src/library/browse/browsetablemodel.cpp +++ b/src/library/browse/browsetablemodel.cpp @@ -6,7 +6,7 @@ #include "library/browse/browsetablemodel.h" #include "library/browse/browsethread.h" -#include "library/previewbuttondelegate.h" +#include "library/tabledelegates/previewbuttondelegate.h" #include "library/trackcollection.h" #include "library/trackcollectionmanager.h" #include "mixer/playerinfo.h" diff --git a/src/library/bpmdelegate.cpp b/src/library/tabledelegates/bpmdelegate.cpp similarity index 99% rename from src/library/bpmdelegate.cpp rename to src/library/tabledelegates/bpmdelegate.cpp index 1c05f578218f..9b54cde6027a 100644 --- a/src/library/bpmdelegate.cpp +++ b/src/library/tabledelegates/bpmdelegate.cpp @@ -1,4 +1,4 @@ -#include "library/bpmdelegate.h" +#include "library/tabledelegates/bpmdelegate.h" #include #include diff --git a/src/library/bpmdelegate.h b/src/library/tabledelegates/bpmdelegate.h similarity index 88% rename from src/library/bpmdelegate.h rename to src/library/tabledelegates/bpmdelegate.h index f02511992555..38a398898dce 100644 --- a/src/library/bpmdelegate.h +++ b/src/library/tabledelegates/bpmdelegate.h @@ -1,6 +1,6 @@ #pragma once -#include "library/tableitemdelegate.h" +#include "library/tabledelegates/tableitemdelegate.h" class QCheckBox; diff --git a/src/library/colordelegate.cpp b/src/library/tabledelegates/colordelegate.cpp similarity index 94% rename from src/library/colordelegate.cpp rename to src/library/tabledelegates/colordelegate.cpp index 4808a0ee9caf..76400bd6ee8b 100644 --- a/src/library/colordelegate.cpp +++ b/src/library/tabledelegates/colordelegate.cpp @@ -1,4 +1,4 @@ -#include "library/colordelegate.h" +#include "library/tabledelegates/colordelegate.h" #include #include diff --git a/src/library/colordelegate.h b/src/library/tabledelegates/colordelegate.h similarity index 86% rename from src/library/colordelegate.h rename to src/library/tabledelegates/colordelegate.h index e0b0b9889e19..7309b560a0ef 100644 --- a/src/library/colordelegate.h +++ b/src/library/tabledelegates/colordelegate.h @@ -1,6 +1,6 @@ #pragma once -#include "library/tableitemdelegate.h" +#include "library/tabledelegates/tableitemdelegate.h" class QModelIndex; class QPainter; diff --git a/src/library/coverartdelegate.cpp b/src/library/tabledelegates/coverartdelegate.cpp similarity index 99% rename from src/library/coverartdelegate.cpp rename to src/library/tabledelegates/coverartdelegate.cpp index 7dbeeff33b51..781dbc482921 100644 --- a/src/library/coverartdelegate.cpp +++ b/src/library/tabledelegates/coverartdelegate.cpp @@ -1,4 +1,4 @@ -#include "library/coverartdelegate.h" +#include "library/tabledelegates/coverartdelegate.h" #include #include diff --git a/src/library/coverartdelegate.h b/src/library/tabledelegates/coverartdelegate.h similarity index 97% rename from src/library/coverartdelegate.h rename to src/library/tabledelegates/coverartdelegate.h index 84c69c5604a0..f2e5b338915f 100644 --- a/src/library/coverartdelegate.h +++ b/src/library/tabledelegates/coverartdelegate.h @@ -3,7 +3,7 @@ #include #include "library/coverart.h" -#include "library/tableitemdelegate.h" +#include "library/tabledelegates/tableitemdelegate.h" #include "track/track_decl.h" #include "util/cache.h" diff --git a/src/library/locationdelegate.cpp b/src/library/tabledelegates/locationdelegate.cpp similarity index 94% rename from src/library/locationdelegate.cpp rename to src/library/tabledelegates/locationdelegate.cpp index 43438d58e6e1..9fa79339c8e9 100644 --- a/src/library/locationdelegate.cpp +++ b/src/library/tabledelegates/locationdelegate.cpp @@ -1,4 +1,4 @@ -#include "library/locationdelegate.h" +#include "library/tabledelegates/locationdelegate.h" #include diff --git a/src/library/locationdelegate.h b/src/library/tabledelegates/locationdelegate.h similarity index 86% rename from src/library/locationdelegate.h rename to src/library/tabledelegates/locationdelegate.h index 9fb698dab21a..43fd03cc79d5 100644 --- a/src/library/locationdelegate.h +++ b/src/library/tabledelegates/locationdelegate.h @@ -1,7 +1,6 @@ #pragma once -#include "library/tableitemdelegate.h" - +#include "library/tabledelegates/tableitemdelegate.h" class LocationDelegate : public TableItemDelegate { Q_OBJECT diff --git a/src/library/multilineeditdelegate.cpp b/src/library/tabledelegates/multilineeditdelegate.cpp similarity index 99% rename from src/library/multilineeditdelegate.cpp rename to src/library/tabledelegates/multilineeditdelegate.cpp index e7c0fa7ae101..3dd6904fc8d9 100644 --- a/src/library/multilineeditdelegate.cpp +++ b/src/library/tabledelegates/multilineeditdelegate.cpp @@ -1,4 +1,4 @@ -#include "library/multilineeditdelegate.h" +#include "library/tabledelegates/multilineeditdelegate.h" #include #include diff --git a/src/library/multilineeditdelegate.h b/src/library/tabledelegates/multilineeditdelegate.h similarity index 96% rename from src/library/multilineeditdelegate.h rename to src/library/tabledelegates/multilineeditdelegate.h index 692598cc4225..d46bd048c266 100644 --- a/src/library/multilineeditdelegate.h +++ b/src/library/tabledelegates/multilineeditdelegate.h @@ -2,7 +2,7 @@ #include -#include "library/tableitemdelegate.h" +#include "library/tabledelegates/tableitemdelegate.h" /// A QPlainTextEdit to show all content lines in a scrollable view. /// * finish editing with Return key, like QLineEdit used for other text columns diff --git a/src/library/playcountdelegate.cpp b/src/library/tabledelegates/playcountdelegate.cpp similarity index 95% rename from src/library/playcountdelegate.cpp rename to src/library/tabledelegates/playcountdelegate.cpp index 4f25aaf88333..53bac452dc10 100644 --- a/src/library/playcountdelegate.cpp +++ b/src/library/tabledelegates/playcountdelegate.cpp @@ -1,4 +1,4 @@ -#include "library/playcountdelegate.h" +#include "library/tabledelegates/playcountdelegate.h" #include #include diff --git a/src/library/playcountdelegate.h b/src/library/tabledelegates/playcountdelegate.h similarity index 87% rename from src/library/playcountdelegate.h rename to src/library/tabledelegates/playcountdelegate.h index 87f3705ed57f..ce791f733c25 100644 --- a/src/library/playcountdelegate.h +++ b/src/library/tabledelegates/playcountdelegate.h @@ -1,6 +1,6 @@ #pragma once -#include "library/tableitemdelegate.h" +#include "library/tabledelegates/tableitemdelegate.h" class QCheckBox; diff --git a/src/library/previewbuttondelegate.cpp b/src/library/tabledelegates/previewbuttondelegate.cpp similarity index 99% rename from src/library/previewbuttondelegate.cpp rename to src/library/tabledelegates/previewbuttondelegate.cpp index ca565cb185b7..110b84d69fa4 100644 --- a/src/library/previewbuttondelegate.cpp +++ b/src/library/tabledelegates/previewbuttondelegate.cpp @@ -1,4 +1,4 @@ -#include "library/previewbuttondelegate.h" +#include "library/tabledelegates/previewbuttondelegate.h" #include #include diff --git a/src/library/previewbuttondelegate.h b/src/library/tabledelegates/previewbuttondelegate.h similarity index 97% rename from src/library/previewbuttondelegate.h rename to src/library/tabledelegates/previewbuttondelegate.h index fdd1f0f06d29..6bb37e514f9a 100644 --- a/src/library/previewbuttondelegate.h +++ b/src/library/tabledelegates/previewbuttondelegate.h @@ -2,7 +2,7 @@ #include -#include "library/tableitemdelegate.h" +#include "library/tabledelegates/tableitemdelegate.h" #include "track/track_decl.h" #include "util/parented_ptr.h" diff --git a/src/library/stardelegate.cpp b/src/library/tabledelegates/stardelegate.cpp similarity index 95% rename from src/library/stardelegate.cpp rename to src/library/tabledelegates/stardelegate.cpp index 2b1a2fb0c226..62743016af85 100644 --- a/src/library/stardelegate.cpp +++ b/src/library/tabledelegates/stardelegate.cpp @@ -1,10 +1,10 @@ -#include "library/stardelegate.h" +#include "library/tabledelegates/stardelegate.h" #include -#include "library/stareditor.h" #include "library/starrating.h" -#include "library/tableitemdelegate.h" +#include "library/tabledelegates/stareditor.h" +#include "library/tabledelegates/tableitemdelegate.h" #include "moc_stardelegate.cpp" StarDelegate::StarDelegate(QTableView* pTableView) diff --git a/src/library/stardelegate.h b/src/library/tabledelegates/stardelegate.h similarity index 95% rename from src/library/stardelegate.h rename to src/library/tabledelegates/stardelegate.h index 3ac6bd7fd3a2..39d0f1457d98 100644 --- a/src/library/stardelegate.h +++ b/src/library/tabledelegates/stardelegate.h @@ -1,6 +1,6 @@ #pragma once -#include "library/tableitemdelegate.h" +#include "library/tabledelegates/tableitemdelegate.h" class StarDelegate : public TableItemDelegate { Q_OBJECT diff --git a/src/library/stareditor.cpp b/src/library/tabledelegates/stareditor.cpp similarity index 98% rename from src/library/stareditor.cpp rename to src/library/tabledelegates/stareditor.cpp index 42abedd7609e..a4e1ba78a6c0 100644 --- a/src/library/stareditor.cpp +++ b/src/library/tabledelegates/stareditor.cpp @@ -1,4 +1,4 @@ -#include "library/stareditor.h" +#include "library/tabledelegates/stareditor.h" #include #include @@ -6,7 +6,7 @@ #include #include "library/starrating.h" -#include "library/tableitemdelegate.h" +#include "library/tabledelegates/tableitemdelegate.h" #include "moc_stareditor.cpp" // We enable mouse tracking on the widget so we can follow the cursor even diff --git a/src/library/stareditor.h b/src/library/tabledelegates/stareditor.h similarity index 100% rename from src/library/stareditor.h rename to src/library/tabledelegates/stareditor.h diff --git a/src/library/tableitemdelegate.cpp b/src/library/tabledelegates/tableitemdelegate.cpp similarity index 98% rename from src/library/tableitemdelegate.cpp rename to src/library/tabledelegates/tableitemdelegate.cpp index f044e4a664c9..229b08caa817 100644 --- a/src/library/tableitemdelegate.cpp +++ b/src/library/tabledelegates/tableitemdelegate.cpp @@ -1,4 +1,4 @@ -#include "library/tableitemdelegate.h" +#include "library/tabledelegates/tableitemdelegate.h" #include diff --git a/src/library/tableitemdelegate.h b/src/library/tabledelegates/tableitemdelegate.h similarity index 100% rename from src/library/tableitemdelegate.h rename to src/library/tabledelegates/tableitemdelegate.h From c5767c17125f8edfa2f890748990cf8da567ab10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Tue, 12 Mar 2024 22:55:32 +0100 Subject: [PATCH 30/37] Add a workflow for cleaning up the downloads folder at mixxx.org --- .github/workflows/download_cleanup.yml | 34 ++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 .github/workflows/download_cleanup.yml diff --git a/.github/workflows/download_cleanup.yml b/.github/workflows/download_cleanup.yml new file mode 100644 index 000000000000..064a3f35d799 --- /dev/null +++ b/.github/workflows/download_cleanup.yml @@ -0,0 +1,34 @@ +name: Clean up downloads + +on: + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-22.04 + + steps: + - name: "Set up SSH Agent" + if: github.event_name == 'push' && env.SSH_PRIVATE_KEY != null + env: + SSH_AUTH_SOCK: /tmp/ssh_agent.sock + SSH_PRIVATE_KEY: ${{ secrets.DOWNLOADS_HOSTGATOR_DOT_MIXXX_DOT_ORG_KEY }} + SSH_HOST: downloads-hostgator.mixxx.org + run: | + ssh-agent -a $SSH_AUTH_SOCK > /dev/null + ssh-add - <<< "${SSH_PRIVATE_KEY}" + mkdir -p "${HOME}/.ssh" + ssh-keyscan "${SSH_HOST}" >> "${HOME}/.ssh/known_hosts" + echo "SSH_AUTH_SOCK=${SSH_AUTH_SOCK}" >> "${GITHUB_ENV}" + + - name: Delete obsolete files + if: env.SSH_AUTH_SOCK != null + run: | + mkdir empty_folder + echo snapshots/build-checks-fix/* >> include_file.txt + echo snapshots/build-checks-fix >> include_file.txt + rsync --verbose --times --recursive --include-from=include_file.txt --exclude=* --delete "empty_folder/" "${SSH_USER}@${SSH_HOST}:${DESTDIR}/" + env: + DESTDIR: public_html/downloads + SSH_HOST: downloads-hostgator.mixxx.org + SSH_USER: mixxx From a9a4f3342183762aea2d5dab8328f3f0eb3650f1 Mon Sep 17 00:00:00 2001 From: Joerg Date: Sun, 17 Mar 2024 19:36:29 +0100 Subject: [PATCH 31/37] Removed old examples HID keyboard and HID trackpad --- res/controllers/HID Keyboard.hid.xml.example | 18 ----- res/controllers/HID Trackpad.hid.xml.example | 18 ----- res/controllers/HID-Keyboard.js | 29 -------- res/controllers/HID-Trackpad.js | 31 -------- res/controllers/common-hid-devices.js | 76 -------------------- 5 files changed, 172 deletions(-) delete mode 100644 res/controllers/HID Keyboard.hid.xml.example delete mode 100644 res/controllers/HID Trackpad.hid.xml.example delete mode 100644 res/controllers/HID-Keyboard.js delete mode 100644 res/controllers/HID-Trackpad.js delete mode 100644 res/controllers/common-hid-devices.js diff --git a/res/controllers/HID Keyboard.hid.xml.example b/res/controllers/HID Keyboard.hid.xml.example deleted file mode 100644 index c4be603bff76..000000000000 --- a/res/controllers/HID Keyboard.hid.xml.example +++ /dev/null @@ -1,18 +0,0 @@ - - - - Apple Bluetooth Keyboard - Ilkka Tuohela - HID example for Apple Bluetooth Keyboard - - - - - - - - - - - - diff --git a/res/controllers/HID Trackpad.hid.xml.example b/res/controllers/HID Trackpad.hid.xml.example deleted file mode 100644 index 89689f3a7d21..000000000000 --- a/res/controllers/HID Trackpad.hid.xml.example +++ /dev/null @@ -1,18 +0,0 @@ - - - - Apple Bluetooth Trackpad - Ilkka Tuohela - HID example for Apple Bluetooth Trackpad - - - - - - - - - - - - diff --git a/res/controllers/HID-Keyboard.js b/res/controllers/HID-Keyboard.js deleted file mode 100644 index 29efbc518380..000000000000 --- a/res/controllers/HID-Keyboard.js +++ /dev/null @@ -1,29 +0,0 @@ -// -// Demo script to print events from apple bluetooth keyboard on OS/X -// Copyright (C) 2012, Ilkka Tuohela -// Feel free to use whatever way wish1 -// - -HIDKeyboard = new HIDKeyboardDevice(); - -HIDKeyboard.init = function(id) { - HIDKeyboard.id = id; - HIDKeyboard.registerInputPackets(); - HIDKeyboard.registerOutputPackets(); - HIDKeyboard.registerScalers(); - HIDKeyboard.registerCallbacks(); - HIDDebug("HID Keyboard Initialized: " + HIDKeyboard.id); -} - -HIDKeyboard.shutdown = function() { - HIDDebug("HID Keyboard Shutdown: " + HIDKeyboard.id); -} - -HIDKeyboard.incomingData = function(data,length) { - var controller = HIDKeyboard.controller; - if (controller==undefined) { - HIDDebug("Error in script initialization: controller not found"); - return; - } - controller.parsePacket(data,length); -} diff --git a/res/controllers/HID-Trackpad.js b/res/controllers/HID-Trackpad.js deleted file mode 100644 index 2a0c48f0e114..000000000000 --- a/res/controllers/HID-Trackpad.js +++ /dev/null @@ -1,31 +0,0 @@ -// -// Demo script to print events from apple bluetooth trackpad on OS/X -// NOTE: the trackpad doesn't seem to actually send events to us. This -// is just a silly example anyway -// Copyright (C) 2012, Ilkka Tuohela -// Feel free to use whatever way wish1 -// - -HIDTrackpad = new HIDTrackpadDevice(); - -HIDTrackpad.init = function(id) { - HIDTrackpad.id = id; - HIDTrackpad.registerInputPackets(); - HIDTrackpad.registerOutputPackets(); - HIDTrackpad.registerScalers(); - HIDTrackpad.registerCallbacks(); - HIDDebug("HID Trackpad Initialized: " + HIDTrackpad.id); -} - -HIDTrackpad.shutdown = function() { - HIDDebug("HID Trackpad Shutdown: " + HIDTrackpad.id); -} - -HIDTrackpad.incomingData = function(data,length) { - var controller = HIDTrackpad.controller; - if (controller==undefined) { - HIDDebug("Error in script initialization: controller not found"); - return; - } - controller.parsePacket(data,length); -} diff --git a/res/controllers/common-hid-devices.js b/res/controllers/common-hid-devices.js deleted file mode 100644 index 6d4e917bf2b1..000000000000 --- a/res/controllers/common-hid-devices.js +++ /dev/null @@ -1,76 +0,0 @@ -// Generic HID trackpad implementation -HIDTrackpadDevice = function() { - this.controller = new HIDController() - - this.registerInputPackets = function() { - // Example how to register a callback directly on a packet - packet = new HIDPacket("control", 0, this.mouseInput) - packet.addControl("hid", "byte_1", 3, "B") - packet.addControl("hid", "byte_2", 4, "B") - packet.addControl("hid", "byte_3", 5, "B") - packet.addControl("hid", "byte_4", 6, "B") - this.controller.registerInputPacket(packet) - } - - // HID trackpads have no output controls - this.registerOutputPackets = function() { } - - // No need to do scaling for keyboard presses - this.registerScalers = function() { } - - // No need for callbacks here, we bound whole input packet to mouseInput - this.registerCallbacks = function() { } - - // Example to process the mouse input packet all yourself - this.mouseInput = function(packet, delta) { - HIDDebug("Trackpad INPUT " + packet.name) - if (!delta.length) { - HIDDebug("No changed data received in HID packet") - return - } - for (var field_name in delta) { - var field = delta[field_name] - HIDDebug("FIELD " + field.id + " VALUE " + value) - } - } -} - -// Generic HID keyboard implementation -HIDKeyboardDevice = function() { - this.controller = new HIDController() - - this.registerInputPackets = function() { - packet = new HIDPacket("control", 0x1) - packet.addControl("hid", "keycode_1", 3, "B") - packet.addControl("hid", "keycode_2", 4, "B") - packet.addControl("hid", "keycode_3", 5, "B") - packet.addControl("hid", "keycode_4", 6, "B") - packet.addControl("hid", "keycode_5", 7, "B") - packet.addControl("hid", "keycode_6", 8, "B") - this.controller.registerInputPacket(packet) - } - - // HID keyboards have no output controls - this.registerOutputPackets = function() { } - - // No need to do scaling for keyboard presses - this.registerScalers = function() { } - - // Example to bind the bytes to a callback - this.registerCallbacks = function() { - this.controller.setCallback("control", "hid", "keycode_1", this.keyPress) - this.controller.setCallback("control", "hid", "keycode_2", this.keyPress) - this.controller.setCallback("control", "hid", "keycode_3", this.keyPress) - this.controller.setCallback("control", "hid", "keycode_4", this.keyPress) - this.controller.setCallback("control", "hid", "keycode_5", this.keyPress) - this.controller.setCallback("control", "hid", "keycode_6", this.keyPress) - } - - // Example to do something with the keycodes received - this.keyPress = function(field) { - if (field.value != 0) - HIDDebug("KEY PRESS " + field.id + " CODE " + field.value) - else - HIDDebug("KEY RELEASE " + field.id) - } -} From 5e83d6df01fd405e7650ec22ccc63cf283d326e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Wed, 13 Mar 2024 05:04:16 +0100 Subject: [PATCH 32/37] Update Changelog --- CHANGELOG.md | 33 +++++- res/linux/org.mixxx.Mixxx.metainfo.xml | 141 +++++++++++++++++++++++-- 2 files changed, 162 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 61c4d4c681d0..6341b3c4f386 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,6 @@ ### Features -* Sync Lock: End of track checking is not needed [#11035](https://github.com/mixxxdj/mixxx/pull/11035) * BaseExternalLibraryFeature: Add ability to import external playlists as crates [#11852](https://github.com/mixxxdj/mixxx/pull/11852) * Logging: Include timestamps in messages by default [#11861](https://github.com/mixxxdj/mixxx/pull/11861) * DlgPrefSound: Fix fetching of sample rate [#11951](https://github.com/mixxxdj/mixxx/pull/11951) [11949](https://github.com/mixxxdj/mixxx/issues/11949) @@ -14,10 +13,15 @@ * Playlist feature: add 'Shuffle playlist' sidebar action [#12498](https://github.com/mixxxdj/mixxx/pull/12498) * New built-in effect: Glitch [#11329](https://github.com/mixxxdj/mixxx/pull/11329) * Fullscreen toggle rework [#11566](https://github.com/mixxxdj/mixxx/pull/11566) +* Playlists: Uupdate of playlist labels after adding tracks [#12866](https://github.com/mixxxdj/mixxx/pull/12866) [#12761](https://github.com/mixxxdj/mixxx/issues/12761) +* Tracks: custom text color for played tracks (qss) [#12744](https://github.com/mixxxdj/mixxx/pull/12744) [#5911](https://github.com/mixxxdj/mixxx/issues/5911) [#12912](https://github.com/mixxxdj/mixxx/pull/12912) +* History: show track count and duration in sidebar [#12811](https://github.com/mixxxdj/mixxx/pull/12811) [#12788](https://github.com/mixxxdj/mixxx/issues/12788) +* fixes around cratetablemodel, remove tracks + don't allow pasting tracks into locked playlists/crates or History [#12926](https://github.com/mixxxdj/mixxx/pull/12926) +* Tootips: Improve `rate_up/down` tooltips, pitch vs. speed [#12590](https://github.com/mixxxdj/mixxx/pull/12590) +* Shortkeys for track list management [#12020](https://github.com/mixxxdj/mixxx/pull/12020) ### Controller Mappings -* Traktor Kontrol S2 MK3: Add colored hotcues [#4637](https://github.com/mixxxdj/mixxx/pull/4637) * Pioneer DDJ-FLX4: mapping improvements [#12842](https://github.com/mixxxdj/mixxx/pull/12842) ### Controller Backend @@ -34,6 +38,8 @@ * fix(qml): Improve knobs by applying selective 4xMSAA on the Arc shape [#12541](https://github.com/mixxxdj/mixxx/pull/12541) * Add QML interceptor to auto reload on file change [#12795](https://github.com/mixxxdj/mixxx/pull/12795) * Add multi-sampling settings for QML [#12546](https://github.com/mixxxdj/mixxx/pull/12546) [#12794](https://github.com/mixxxdj/mixxx/pull/12794) [#12536](https://github.com/mixxxdj/mixxx/issues/12536) +* Install qml module on Windows [#12604](https://github.com/mixxxdj/mixxx/pull/12604) +* Add scrolling waveforms [#3967](https://github.com/mixxxdj/mixxx/pull/3967) ### Update to Qt6 @@ -59,6 +65,7 @@ * Fix track color background with Qt6 [#12380](https://github.com/mixxxdj/mixxx/pull/12380) * multi-line delegate: fix bg color, Qt6 on Linux [#12478](https://github.com/mixxxdj/mixxx/pull/12478) * Revert "BaseTrackPlayer: Remove references to WaveformWidgetRenderer when using Qt6" [#12342](https://github.com/mixxxdj/mixxx/pull/12342) +* Fix Tango waveform splitter [#12939](https://github.com/mixxxdj/mixxx/pull/12939) ### Experimental iOs support @@ -78,6 +85,20 @@ * MacOsVersion: Rename to AppleOsVersion [#12662](https://github.com/mixxxdj/mixxx/pull/12662) * macOS: Add more `Q_OS_MACOS` cond-compiles where appropriate [#12663](https://github.com/mixxxdj/mixxx/pull/12663) +### Experimental WebAssembly support + +* CMakeLists: Add support for targeting Emscripten/WebAssembly [#12918](https://github.com/mixxxdj/mixxx/pull/12918) +* CMakeLists: Emit better errors for exotic target platforms [#12910](https://github.com/mixxxdj/mixxx/pull/12910) +* Build: Add `PORTMIDI` flag for compiling with(out) PortMidi [#12913](https://github.com/mixxxdj/mixxx/pull/12913) +* DesktopHelper: Compile out process-spawning on WASM too [#12916](https://github.com/mixxxdj/mixxx/pull/12916) +* MixxxApplication: Use `QWasmIntegrationPlugin` when targeting WebAssembly [#12915](https://github.com/mixxxdj/mixxx/pull/12915) +* CMakeLists: Enable asyncify when targeting WASM [#12921](https://github.com/mixxxdj/mixxx/pull/12921) +* Resources: Bundle resources for preloading when targeting Emscripten/WASM [#12922](https://github.com/mixxxdj/mixxx/pull/12922) +* CMakeLists: Add `WASM_ASSERTIONS` option [#12931](https://github.com/mixxxdj/mixxx/pull/12931) +* VersionStore: Recognize Emscripten/WebAssembly [#12940](https://github.com/mixxxdj/mixxx/pull/12940) +* OpenGLWindow: Fix sizing on Wasm by setting `Qt::FramelessWindowHint` [#12945](https://github.com/mixxxdj/mixxx/pull/12945) +* CMakeLists: Require WebGL 2.0 when building for Wasm [#12952](https://github.com/mixxxdj/mixxx/pull/12952) + ### Misc Refactorings * Add missing `` include in `defs.h` [#11348](https://github.com/mixxxdj/mixxx/pull/11348) @@ -111,10 +132,18 @@ * fix/History: remove obsolete placeholder playlists [#12494](https://github.com/mixxxdj/mixxx/pull/12494) * Add missing Taglib dependency [#12830](https://github.com/mixxxdj/mixxx/pull/12830) * fix: typo ;) [#12726](https://github.com/mixxxdj/mixxx/pull/12726) +* refactor: avoid temporary qlist allocation on midi sysex receive [#12843](https://github.com/mixxxdj/mixxx/pull/12843) +* SoundSourceMP3: fix unused function warning [#12847](https://github.com/mixxxdj/mixxx/pull/12847) +* update libkeyfinder to 2.2.8 [#12853](https://github.com/mixxxdj/mixxx/pull/12853) +* feat(ci): add eslint rule prefer-template [#12889](https://github.com/mixxxdj/mixxx/pull/12889) +* Labeler: Add `qml` to labeler config [#12911](https://github.com/mixxxdj/mixxx/pull/12911) +* WTrackMenu: Add missing wcoverartlabel.h include [#12924](https://github.com/mixxxdj/mixxx/pull/12924) +* Fix clazy complains and naming [#12935](https://github.com/mixxxdj/mixxx/pull/12935) * Update to latest vcpkg dependencies [#11649](https://github.com/mixxxdj/mixxx/pull/11649) [#12512](https://github.com/mixxxdj/mixxx/pull/12512) [#12067](https://github.com/mixxxdj/mixxx/pull/12067) + [#12898](https://github.com/mixxxdj/mixxx/pull/12898) * GitHub actions updates [#11544](https://github.com/mixxxdj/mixxx/pull/11544) [#11508](https://github.com/mixxxdj/mixxx/pull/11508) diff --git a/res/linux/org.mixxx.Mixxx.metainfo.xml b/res/linux/org.mixxx.Mixxx.metainfo.xml index 4e57e1a4d18a..c6f941180308 100644 --- a/res/linux/org.mixxx.Mixxx.metainfo.xml +++ b/res/linux/org.mixxx.Mixxx.metainfo.xml @@ -96,16 +96,12 @@ Do not edit it manually. --> - +

    Features

      -
    • - Sync Lock: End of track checking is not needed - #11035 -
    • BaseExternalLibraryFeature: Add ability to import external playlists as crates #11852 @@ -143,15 +139,41 @@ Fullscreen toggle rework #11566
    • +
    • + Playlists: Uupdate of playlist labels after adding tracks + #12866 + #12761 +
    • +
    • + Tracks: custom text color for played tracks (qss) + #12744 + #5911 + #12912 +
    • +
    • + History: show track count and duration in sidebar + #12811 + #12788 +
    • +
    • + fixes around cratetablemodel, remove tracks + don't allow pasting tracks into locked playlists/crates or History + #12926 +
    • +
    • + Tootips: Improve + rate_up/down + tooltips, pitch vs. speed + #12590 +
    • +
    • + Shortkeys for track list management + #12020 +

    Controller Mappings

      -
    • - Traktor Kontrol S2 MK3: Add colored hotcues - #4637 -
    • Pioneer DDJ-FLX4: mapping improvements #12842 @@ -207,6 +229,14 @@ #12794 #12536
    • +
    • + Install qml module on Windows + #12604 +
    • +
    • + Add scrolling waveforms + #3967 +

    Update to Qt6 @@ -300,6 +330,10 @@ Revert "BaseTrackPlayer: Remove references to WaveformWidgetRenderer when using Qt6" #12342