Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -341,7 +341,7 @@ jobs:
env:
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
if: runner.os == 'Windows' && env.AZURE_TENANT_ID
uses: azure/trusted-signing-action@v0.5.10
uses: azure/trusted-signing-action@v1.0.0
with:
azure-tenant-id: ${{ secrets.AZURE_TENANT_ID }}
azure-client-id: ${{ secrets.AZURE_CLIENT_ID }}
Expand Down Expand Up @@ -407,7 +407,7 @@ jobs:
env:
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
if: runner.os == 'Windows' && env.AZURE_TENANT_ID
uses: azure/trusted-signing-action@v0.5.10
uses: azure/trusted-signing-action@v1.0.0
with:
azure-tenant-id: ${{ secrets.AZURE_TENANT_ID }}
azure-client-id: ${{ secrets.AZURE_CLIENT_ID }}
Expand Down
2 changes: 1 addition & 1 deletion COPYING
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
Mixxx is Copyright (C) 2000-2024 by its respective authors. This version
Mixxx is Copyright (C) 2000-2026 by its respective authors. This version
of the program is distributed under the General Public License version 2,
as described in the file LICENSE distributed with the program.
2 changes: 1 addition & 1 deletion LICENSE
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
Mixxx 2.5.4, Digital DJ'ing software.
Copyright (C) 2001-2025 Mixxx Development Team
Copyright (C) 2001-2026 Mixxx Development Team

Mixxx is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Expand Down
2 changes: 1 addition & 1 deletion packaging/debian/copyright
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ Source: https://downloads.mixxx.org/

Files: *
Copyright:
2001-2025 Mixxx development team
2001-2026 Mixxx development team
License: GPL-2+

License: GPL-2+
Expand Down
2 changes: 1 addition & 1 deletion packaging/wix/LICENSE.rtf.in
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
{\colortbl ;\red0\green0\blue255;}
{\*\generator Riched20 10.0.14393}\viewkind4\uc1
\pard\qj\ul\b\f0\fs22\lang1036 Mixxx @CMAKE_PROJECT_VERSION@, Digital DJ'ing software.\ulnone\b0\fs24\par
\fs22 Copyright (C) 2001-2025 Mixxx Development Team\par
\fs22 Copyright (C) 2001-2026 Mixxx Development Team\par
\par
Promotional tracks are copyright their respective owners and\par
distributed with permission.\par
Expand Down
54 changes: 53 additions & 1 deletion src/library/basesqltablemodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -844,7 +844,59 @@ void BaseSqlTableModel::hideTracks(const QModelIndexList& indices) {

// TODO(rryan) : do not select, instead route event to BTC and notify from
// there.
select(); //Repopulate the data model.

QSet<TrackId> tracksRemovedSet = QSet<TrackId>(trackIds.begin(), trackIds.end());
removeTrackRows(tracksRemovedSet);
}

void BaseSqlTableModel::removeTrackRows(const QSet<TrackId>& trackIdsToRemove) {
// This is called after hiding, purging or removing tracks from a track set.
// The purpose is to keep the tracks view constant after after these
// operations by avoiding pointless/confusing re-sorting of the model,
// which happens when we call select(), which rebuilds the row cache.
// We assume metadata of remaining tracks hasn't changed, we can simply
// remove the respective track rows.

// However, if this is a playlist model, track removal likely also changes
// the tracks' positions in the playlist. We need to get the tracks' new
// positions from the database, so let's do a select().
// FIXME Update position without re-sorting
if (hasPositionColumn()) {
select();
return;
}

// For other models we can now remove all track rows.
QVector<RowInfo> rowInfos = m_rowInfo;
TrackId2Rows trackIdToRows;
TrackPos2Row trackPosToRows; // remains empty

QMutableListIterator<RowInfo> it(rowInfos);
while (it.hasNext()) {
const RowInfo& rowInfo = it.next();
if (trackIdsToRemove.contains(rowInfo.trackId)) {
it.remove();
}
}

// Recreate TrackId2Rows, taken from select()
trackIdToRows.reserve(rowInfos.size());
for (int i = 0; i < rowInfos.size(); ++i) {
const RowInfo& rowInfo = rowInfos[i];
if (rowInfo.row == -1) {
// We've reached the end of valid rows. Resize rowInfo to cut off
// this and all further elements.
rowInfos.resize(i);
break;
}
trackIdToRows[rowInfo.trackId].push_back(i);
}

clearRows();
replaceRows(
std::move(rowInfos),
std::move(trackIdToRows),
std::move(trackPosToRows));
}

QList<TrackRef> BaseSqlTableModel::getTrackRefs(
Expand Down
1 change: 1 addition & 0 deletions src/library/basesqltablemodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ class BaseSqlTableModel : public BaseTrackTableModel {
int columnIndexFromSortColumnId(TrackModel::SortColumnId sortColumn) const override;

void hideTracks(const QModelIndexList& indices) override;
void removeTrackRows(const QSet<TrackId>& trackIdsToRemove) override;

void select() override;

Expand Down
8 changes: 6 additions & 2 deletions src/library/basetracktablemodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -107,9 +107,9 @@ BaseTrackTableModel::BaseTrackTableModel(
m_trackPlayedColor(QColor(WTrackTableView::kDefaultTrackPlayedColor)),
m_trackMissingColor(QColor(WTrackTableView::kDefaultTrackMissingColor)) {
connect(&pTrackCollectionManager->internalCollection()->getTrackDAO(),
&TrackDAO::forceModelUpdate,
&TrackDAO::tracksRemoved,
this,
&BaseTrackTableModel::slotRefreshAllRows);
&BaseTrackTableModel::slotTracksRemoved);
connect(&PlayerInfo::instance(),
&PlayerInfo::trackChanged,
this,
Expand Down Expand Up @@ -989,6 +989,10 @@ void BaseTrackTableModel::slotRefreshAllRows() {
select();
}

void BaseTrackTableModel::slotTracksRemoved(const QSet<TrackId>& trackIds) {
removeTrackRows(trackIds);
}

void BaseTrackTableModel::emitDataChangedForMultipleRowsInColumn(
const QList<int>& rows,
int column,
Expand Down
2 changes: 2 additions & 0 deletions src/library/basetracktablemodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,8 @@ class BaseTrackTableModel : public QAbstractTableModel, public TrackModel {

void slotRefreshAllRows();

void slotTracksRemoved(const QSet<TrackId>& trackIds);

void slotCoverFound(
const QObject* pRequester,
const CoverInfo& coverInfo,
Expand Down
4 changes: 2 additions & 2 deletions src/library/dao/trackdao.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1111,9 +1111,9 @@ void TrackDAO::afterPurgingTracks(
#else
QSet<TrackId> tracksRemovedSet = QSet<TrackId>::fromList(trackIds);
#endif
// Notify BaseTrackCache it should remove tracks and track models
// that they should update their cache as well.
emit tracksRemoved(tracksRemovedSet);
// notify trackmodels that they should update their cache as well.
emit forceModelUpdate();
}

namespace {
Expand Down
1 change: 1 addition & 0 deletions src/library/dao/trackdao.h
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ class TrackDAO : public QObject, public virtual DAO, public virtual GlobalTrackC
void progressVerifyTracksOutside(const QString& path);
void progressCoverArt(const QString& file);
void forceModelUpdate();
void removeTrackRows(const QSet<TrackId>& trackIds);

public slots:
// Slots to inform the TrackDAO about changes that
Expand Down
2 changes: 1 addition & 1 deletion src/library/trackcollection.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ TrackCollection::TrackCollection(
connect(&m_trackDao,
&TrackDAO::tracksRemoved,
this,
&TrackCollection::tracksRemoved,
&TrackCollection::tracksRemoved, // unused
/*signal-to-signal*/ Qt::DirectConnection);
connect(&m_trackDao,
&TrackDAO::forceModelUpdate,
Expand Down
2 changes: 2 additions & 0 deletions src/library/trackmodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,8 @@ class TrackModel {
virtual void select() {
}

virtual void removeTrackRows(const QSet<TrackId>&) {};

/// This is an interface to stop any potentially running
/// model population when switching models in WTrackTableView.
/// Only implemented in ProxyTrackModel.
Expand Down
4 changes: 3 additions & 1 deletion src/library/trackset/crate/cratetablemodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,9 @@ void CrateTableModel::removeTracks(const QModelIndexList& indices) {
return;
}

select();
// Now remove the track rows
QSet<TrackId> tracksRemovedSet = QSet<TrackId>(trackIds.begin(), trackIds.end());
removeTrackRows(tracksRemovedSet);
}

QString CrateTableModel::modelKey(bool noSearch) const {
Expand Down
16 changes: 14 additions & 2 deletions src/preferences/dialog/dlgprefinterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include <QDir>
#include <QList>
#include <QLocale>
#include <QMainWindow>
#include <QScreen>
#include <QVariant>
#include <QtGlobal>
Expand Down Expand Up @@ -240,8 +241,19 @@ DlgPrefInterface::DlgPrefInterface(
}

QScreen* DlgPrefInterface::getScreen() const {
auto* pScreen =
mixxx::widgethelper::getScreen(*this);
QScreen* pScreen = nullptr;
const QWidgetList topLevelWidgets = QApplication::topLevelWidgets();
for (QWidget* pWidget : topLevelWidgets) {
// Ignore other popups and hidden track menus
QMainWindow* pMainWindow = qobject_cast<QMainWindow*>(pWidget);
if (pMainWindow) {
pScreen = mixxx::widgethelper::getScreen(*pMainWindow);
break;
}
}
VERIFY_OR_DEBUG_ASSERT(pScreen) {
pScreen = mixxx::widgethelper::getScreen(*this);
}
if (!pScreen) {
// Obtain the primary screen. This is necessary if no window is
// available before the widget is displayed.
Expand Down
31 changes: 28 additions & 3 deletions tools/debian_buildenv.sh
Original file line number Diff line number Diff line change
Expand Up @@ -52,16 +52,41 @@ case "$1" in
fi

# Install a faster linker. Prefer mold, fall back to lld
if apt-cache show mold 2>%1 >/dev/null;
if apt-cache show mold 2>/dev/null >/dev/null;
then
sudo apt-get install -y --no-install-recommends mold
else
if apt-cache show lld 2>%1 >/dev/null;
if apt-cache show lld 2>/dev/null >/dev/null;
then
sudo apt-get install -y --no-install-recommends lld
fi
fi

# Check if fonts-ubuntu is available (from non-free repository)
if ! apt-cache show fonts-ubuntu 2>/dev/null | grep -q "Package: fonts-ubuntu"; then
echo ""
echo "⚠️ WARNING: The package 'fonts-ubuntu' is not available."
echo "This package is required for Mixxx and is located in the Debian non-free repository."
echo ""
read -p "Do you want to enable the non-free repository and install fonts-ubuntu? (y/n) " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
echo "Enabling non-free repository..."
# Add non-free to sources.list if not already present
if ! grep -q " non-free$" /etc/apt/sources.list; then
sudo sed -i 's/^\(deb.*\) \(main\|contrib\|non-free-firmware\)$/\1 \2 non-free/' /etc/apt/sources.list
fi
echo "Updating package list..."
sudo apt-get update
FONTS_UBUNTU_AVAILABLE=true
else
echo "Continuing without fonts-ubuntu..."
FONTS_UBUNTU_AVAILABLE=false
fi
else
FONTS_UBUNTU_AVAILABLE=true
fi

sudo apt-get install -y --no-install-recommends -- \
ccache \
cmake \
Expand All @@ -72,7 +97,7 @@ case "$1" in
docbook-to-man \
dput \
fonts-open-sans \
fonts-ubuntu \
$([ "$FONTS_UBUNTU_AVAILABLE" = true ] && echo "fonts-ubuntu") \
g++ \
lcov \
libavformat-dev \
Expand Down