diff --git a/src/library/columncache.cpp b/src/library/columncache.cpp index 24930d33507f..b8b05404a577 100644 --- a/src/library/columncache.cpp +++ b/src/library/columncache.cpp @@ -163,6 +163,9 @@ constexpr ColumnProperties kColumnPropertiesByEnum[] = { DI(ColumnCache::COLUMN_TRACKLOCATIONSTABLE_LOCATION){&TRACKLOCATIONSTABLE_LOCATION, QT_TRANSLATE_NOOP("BaseTrackTableModel", "Location"), kDefaultColumnWidth * 6}, + DI(ColumnCache::COLUMN_TRACKLOCATIONSTABLE_DIRECTORY){&TRACKLOCATIONSTABLE_DIRECTORY, + nullptr, + 0}, DI(ColumnCache::COLUMN_TRACKLOCATIONSTABLE_FSDELETED){&TRACKLOCATIONSTABLE_FSDELETED, nullptr, 0}, diff --git a/src/library/columncache.h b/src/library/columncache.h index 8057107e3376..05c18754b71f 100644 --- a/src/library/columncache.h +++ b/src/library/columncache.h @@ -59,6 +59,7 @@ class ColumnCache : public QObject { COLUMN_LIBRARYTABLE_LAST_PLAYED_AT, COLUMN_TRACKLOCATIONSTABLE_LOCATION, + COLUMN_TRACKLOCATIONSTABLE_DIRECTORY, COLUMN_TRACKLOCATIONSTABLE_FSDELETED, COLUMN_PLAYLISTTRACKSTABLE_TRACKID, diff --git a/src/library/dao/trackschema.cpp b/src/library/dao/trackschema.cpp index aaba5830b881..57e6cb06c1e8 100644 --- a/src/library/dao/trackschema.cpp +++ b/src/library/dao/trackschema.cpp @@ -3,7 +3,9 @@ namespace mixxx { namespace trackschema { QString tableForColumn(const QString& columnName) { - if (columnName == TRACKLOCATIONSTABLE_FSDELETED || columnName == TRACKLOCATIONSTABLE_LOCATION) { + if (columnName == TRACKLOCATIONSTABLE_FSDELETED || + columnName == TRACKLOCATIONSTABLE_LOCATION || + columnName == TRACKLOCATIONSTABLE_DIRECTORY) { return QStringLiteral(TRACKLOCATIONS_TABLE); } // This doesn't detect unknown columns, but that's not really important here. diff --git a/src/library/librarytablemodel.cpp b/src/library/librarytablemodel.cpp index 4c8746801c0b..f44abd9deb8a 100644 --- a/src/library/librarytablemodel.cpp +++ b/src/library/librarytablemodel.cpp @@ -76,6 +76,7 @@ bool LibraryTableModel::isColumnInternal(int column) { column == fieldIndex(ColumnCache::COLUMN_LIBRARYTABLE_BPM_LOCK) || column == fieldIndex(ColumnCache::COLUMN_LIBRARYTABLE_BEATS_VERSION) || column == fieldIndex(ColumnCache::COLUMN_LIBRARYTABLE_CHANNELS) || + column == fieldIndex(ColumnCache::COLUMN_TRACKLOCATIONSTABLE_DIRECTORY) || column == fieldIndex(ColumnCache::COLUMN_TRACKLOCATIONSTABLE_FSDELETED) || (PlayerManager::numPreviewDecks() == 0 && column == fieldIndex(ColumnCache::COLUMN_LIBRARYTABLE_PREVIEW)) || diff --git a/src/library/missing_hidden/hiddentablemodel.cpp b/src/library/missing_hidden/hiddentablemodel.cpp index 4d277613202d..d13906c9771b 100644 --- a/src/library/missing_hidden/hiddentablemodel.cpp +++ b/src/library/missing_hidden/hiddentablemodel.cpp @@ -81,6 +81,7 @@ bool HiddenTableModel::isColumnInternal(int column) { column == fieldIndex(ColumnCache::COLUMN_LIBRARYTABLE_BEATS_VERSION) || column == fieldIndex(ColumnCache::COLUMN_LIBRARYTABLE_MIXXXDELETED) || column == fieldIndex(ColumnCache::COLUMN_LIBRARYTABLE_KEY_ID) || + column == fieldIndex(ColumnCache::COLUMN_TRACKLOCATIONSTABLE_DIRECTORY) || column == fieldIndex(ColumnCache::COLUMN_TRACKLOCATIONSTABLE_FSDELETED) || column == fieldIndex(ColumnCache::COLUMN_LIBRARYTABLE_COVERART_SOURCE) || column == fieldIndex(ColumnCache::COLUMN_LIBRARYTABLE_COVERART_TYPE) || diff --git a/src/library/missing_hidden/missingtablemodel.cpp b/src/library/missing_hidden/missingtablemodel.cpp index 8c3f23b318f9..e7f47dbe5b6a 100644 --- a/src/library/missing_hidden/missingtablemodel.cpp +++ b/src/library/missing_hidden/missingtablemodel.cpp @@ -74,6 +74,7 @@ bool MissingTableModel::isColumnInternal(int column) { column == fieldIndex(ColumnCache::COLUMN_LIBRARYTABLE_BEATS_VERSION) || column == fieldIndex(ColumnCache::COLUMN_LIBRARYTABLE_KEY_ID) || column == fieldIndex(ColumnCache::COLUMN_LIBRARYTABLE_MIXXXDELETED) || + column == fieldIndex(ColumnCache::COLUMN_TRACKLOCATIONSTABLE_DIRECTORY) || column == fieldIndex(ColumnCache::COLUMN_TRACKLOCATIONSTABLE_FSDELETED) || column == fieldIndex(ColumnCache::COLUMN_LIBRARYTABLE_COVERART_SOURCE) || column == fieldIndex(ColumnCache::COLUMN_LIBRARYTABLE_COVERART_TYPE) || diff --git a/src/library/mixxxlibraryfeature.cpp b/src/library/mixxxlibraryfeature.cpp index 27e6972155ff..f4d3596e2dd9 100644 --- a/src/library/mixxxlibraryfeature.cpp +++ b/src/library/mixxxlibraryfeature.cpp @@ -61,6 +61,7 @@ MixxxLibraryFeature::MixxxLibraryFeature(Library* pLibrary, LIBRARYTABLE_FILETYPE, LIBRARYTABLE_DATETIMEADDED, TRACKLOCATIONSTABLE_LOCATION, + TRACKLOCATIONSTABLE_DIRECTORY, TRACKLOCATIONSTABLE_FSDELETED, LIBRARYTABLE_COMMENT, LIBRARYTABLE_MIXXXDELETED, diff --git a/src/library/searchquery.cpp b/src/library/searchquery.cpp index 9eb4b559f957..b2113db1a8b4 100644 --- a/src/library/searchquery.cpp +++ b/src/library/searchquery.cpp @@ -55,6 +55,8 @@ QVariant getTrackValueForColumn(const TrackPointer& pTrack, const QString& colum return pTrack->getTrackNumber(); } else if (column == TRACKLOCATIONSTABLE_LOCATION) { return QDir::toNativeSeparators(pTrack->getLocation()); + } else if (column == TRACKLOCATIONSTABLE_DIRECTORY) { + return QDir::toNativeSeparators(pTrack->getDirectory()); } else if (column == LIBRARYTABLE_COMMENT) { return pTrack->getComment(); } else if (column == LIBRARYTABLE_DURATION) { diff --git a/src/library/searchqueryparser.cpp b/src/library/searchqueryparser.cpp index e0bdabfadab0..b52c767c9aac 100644 --- a/src/library/searchqueryparser.cpp +++ b/src/library/searchqueryparser.cpp @@ -81,6 +81,7 @@ SearchQueryParser::SearchQueryParser(TrackCollection* pTrackCollection, QStringL << "gr" << "grouping" << "cm" << "comment" << "lo" << "location" + << "dir" << "directory" << "c" << "crate" << "type"; m_numericFilters << "tr" << "track" @@ -134,6 +135,8 @@ SearchQueryParser::SearchQueryParser(TrackCollection* pTrackCollection, QStringL m_fieldToSqlColumns["rating"] << "rating"; m_fieldToSqlColumns["loc"] << "location"; m_fieldToSqlColumns["location"] << "location"; + m_fieldToSqlColumns["dir"] << "directory"; + m_fieldToSqlColumns["directory"] << "directory"; m_fieldToSqlColumns["type"] << "filetype"; m_fieldToSqlColumns["ad"] << "datetime_added"; m_fieldToSqlColumns["datetime_added"] << "datetime_added"; diff --git a/src/library/trackset/tracksettablemodel.cpp b/src/library/trackset/tracksettablemodel.cpp index 405776e6b55e..1144cf0d2afc 100644 --- a/src/library/trackset/tracksettablemodel.cpp +++ b/src/library/trackset/tracksettablemodel.cpp @@ -19,6 +19,7 @@ bool TrackSetTableModel::isColumnInternal(int column) { column == fieldIndex(ColumnCache::COLUMN_LIBRARYTABLE_BEATS_VERSION) || column == fieldIndex(ColumnCache::COLUMN_LIBRARYTABLE_KEY_ID) || column == fieldIndex(ColumnCache::COLUMN_TRACKLOCATIONSTABLE_FSDELETED) || + column == fieldIndex(ColumnCache::COLUMN_TRACKLOCATIONSTABLE_DIRECTORY) || (PlayerManager::numPreviewDecks() == 0 && column == fieldIndex(ColumnCache::COLUMN_LIBRARYTABLE_PREVIEW)) || column == fieldIndex(ColumnCache::COLUMN_LIBRARYTABLE_COVERART_SOURCE) || diff --git a/src/track/track.h b/src/track/track.h index 13323bf9e491..08fff4e424ec 100644 --- a/src/track/track.h +++ b/src/track/track.h @@ -102,6 +102,15 @@ class Track : public QObject { return fileInfo.location(); } + // Returns absolute path to the file, including the filename. + QString getDirectory() const { + const auto fileInfo = getFileInfo(); + if (!fileInfo.hasLocation()) { + return {}; + } + return fileInfo.locationPath(); + } + /// Set the file type /// /// Returns the old type to allow the caller to report if it has changed.