diff --git a/.github/workflows/download_cleanup.yml b/.github/workflows/download_cleanup.yml index a61a1ca8f52..d117eb01e01 100644 --- a/.github/workflows/download_cleanup.yml +++ b/.github/workflows/download_cleanup.yml @@ -25,13 +25,254 @@ jobs: if: env.SSH_AUTH_SOCK != null run: | mkdir empty_folder - echo 1.12 >> include_file.txt - echo 1.12/manual >> include_file.txt - echo 1.12/manual/* >> include_file.txt - echo 1.12/manual/*/html >> include_file.txt - echo 1.12/manual/*/html/* >> include_file.txt - echo 1.12/manual/*/html/*/* >> include_file.txt - rsync --verbose --archive --times --recursive --delete --include-from=include_file.txt --exclude=* "empty_folder/" "${SSH_USER}@${SSH_HOST}:${DESTDIR}/snapshots/" + echo 2.3 >> include_file.txt + echo 2.3/Windows >> include_file.txt + echo 2.3/Windows/mixxx-dependencies-2.3-x64-windows-166ec959cf3d* >> include_file.txt + echo 2.3/Windows/mixxx-dependencies-2.3-x64-windows-19e666415160* >> include_file.txt + echo 2.3/Windows/mixxx-dependencies-2.3-x64-windows-368ae69a78cf* >> include_file.txt + echo 2.3/Windows/mixxx-dependencies-2.3-x64-windows-39398482e110* >> include_file.txt + echo 2.3/Windows/mixxx-dependencies-2.3-x64-windows-3b0444ac8407* >> include_file.txt + echo 2.3/Windows/mixxx-dependencies-2.3-x64-windows-3eaba950a58a* >> include_file.txt + echo 2.3/Windows/mixxx-dependencies-2.3-x64-windows-4ad4b301cff6* >> include_file.txt + echo 2.3/Windows/mixxx-dependencies-2.3-x64-windows-4c326bb6ae14* >> include_file.txt + echo 2.3/Windows/mixxx-dependencies-2.3-x64-windows-680eee15a156* >> include_file.txt + echo 2.3/Windows/mixxx-dependencies-2.3-x64-windows-6a9e1c818629* >> include_file.txt + echo 2.3/Windows/mixxx-dependencies-2.3-x64-windows-732303e0085e* >> include_file.txt + echo 2.3/Windows/mixxx-dependencies-2.3-x64-windows-73b11c608f6b* >> include_file.txt + echo 2.3/Windows/mixxx-dependencies-2.3-x64-windows-76e3c70661c2* >> include_file.txt + echo 2.3/Windows/mixxx-dependencies-2.3-x64-windows-7e8d81317c40* >> include_file.txt + echo 2.3/Windows/mixxx-dependencies-2.3-x64-windows-9a1c03c8ce8b* >> include_file.txt + echo 2.3/Windows/mixxx-dependencies-2.3-x64-windows-a00a544c3bac* >> include_file.txt + echo 2.3/Windows/mixxx-dependencies-2.3-x64-windows-a344b0e65600* >> include_file.txt + echo 2.3/Windows/mixxx-dependencies-2.3-x64-windows-afda5a4c9fd7* >> include_file.txt + echo 2.3/Windows/mixxx-dependencies-2.3-x64-windows-b2858329cd22* >> include_file.txt + echo 2.3/Windows/mixxx-dependencies-2.3-x64-windows-e3f158c5fe54* >> include_file.txt + echo 2.3/Windows/mixxx-dependencies-2.3-x64-windows-ff5c5797f07f* >> include_file.txt + echo 2.3/Windows/mixxx-deps-2.3-x64-windows-1fd22d8* >> include_file.txt + echo 2.4-rel >> include_file.txt + echo 2.4-rel/macOS >> include_file.txt + echo 2.4-rel/macOS/mixxx-deps-2.4-arm64-osx-min1100-8f8342a* >> include_file.txt + echo 2.4-rel/macOS/mixxx-deps-2.4-arm64-osx-min1100-release-00a63e* >> include_file.txt + echo 2.4-rel/macOS/mixxx-deps-2.4-arm64-osx-min1100-release-498634* >> include_file.txt + echo 2.4-rel/macOS/mixxx-deps-2.4-arm64-osx-min1100-release-67e51e* >> include_file.txt + echo 2.4-rel/macOS/mixxx-deps-2.4-arm64-osx-min1100-release-eadc77* >> include_file.txt + echo 2.4-rel/macOS/mixxx-deps-2.4-x64-osx-min1012-53cbf38* >> include_file.txt + echo 2.4-rel/macOS/mixxx-deps-2.4-x64-osx-min1012-5f1e01d* >> include_file.txt + echo 2.4-rel/macOS/mixxx-deps-2.4-x64-osx-min1012-8f8342a* >> include_file.txt + echo 2.4-rel/macOS/mixxx-deps-2.4-x64-osx-min1012-release-00a63eb* >> include_file.txt + echo 2.4-rel/macOS/mixxx-deps-2.4-x64-osx-min1012-release-498634a* >> include_file.txt + echo 2.4-rel/macOS/mixxx-deps-2.4-x64-osx-min1012-release-67e51ef* >> include_file.txt + echo 2.4-rel/macOS/mixxx-deps-2.4-x64-osx-min1012-release-eadc77c* >> include_file.txt + echo 2.4-rel/macOS/mixxx-deps-rel-2.4-arm64-osx-min1100-14128e6* >> include_file.txt + echo 2.4-rel/macOS/mixxx-deps-rel-2.4-arm64-osx-min1100-569c3c7* >> include_file.txt + echo 2.4-rel/macOS/mixxx-deps-rel-2.4-arm64-osx-min1100-869da91* >> include_file.txt + echo 2.4-rel/macOS/mixxx-deps-rel-2.4-arm64-osx-min1100-8cc0543* >> include_file.txt + echo 2.4-rel/macOS/mixxx-deps-rel-2.4-arm64-osx-min1100-9348e40* >> include_file.txt + echo 2.4-rel/macOS/mixxx-deps-rel-2.4-arm64-osx-min1100-a47f1d2* >> include_file.txt + echo 2.4-rel/macOS/mixxx-deps-rel-2.4-arm64-osx-min1100-d854f94* >> include_file.txt + echo 2.4-rel/macOS/mixxx-deps-rel-2.4-arm64-osx-min1100-ef81bbb* >> include_file.txt + echo 2.4-rel/macOS/mixxx-deps-rel-2.4-arm64-osx-min1100-release-c0* >> include_file.txt + echo 2.4-rel/macOS/mixxx-deps-rel-2.4-x64-osx-min1012-14128e6* >> include_file.txt + echo 2.4-rel/macOS/mixxx-deps-rel-2.4-x64-osx-min1012-569c3c7* >> include_file.txt + echo 2.4-rel/macOS/mixxx-deps-rel-2.4-x64-osx-min1012-869da91* >> include_file.txt + echo 2.4-rel/macOS/mixxx-deps-rel-2.4-x64-osx-min1012-8cc0543* >> include_file.txt + echo 2.4-rel/macOS/mixxx-deps-rel-2.4-x64-osx-min1012-9348e40* >> include_file.txt + echo 2.4-rel/macOS/mixxx-deps-rel-2.4-x64-osx-min1012-a47f1d2* >> include_file.txt + echo 2.4-rel/macOS/mixxx-deps-rel-2.4-x64-osx-min1012-d854f94* >> include_file.txt + echo 2.4-rel/macOS/mixxx-deps-rel-2.4-x64-osx-min1012-ef81bbb* >> include_file.txt + echo 2.4-rel/macOS/mixxx-deps-rel-2.4-x64-osx-min1012-release-c06f* >> include_file.txt + echo 2.4 >> include_file.txt + echo 2.4/Windows >> include_file.txt + echo 2.4/Windows/mixxx-deps-2.4-x64-windows-00e79d1* >> include_file.txt + echo 2.4/Windows/mixxx-deps-2.4-x64-windows-39d1b21* >> include_file.txt + echo 2.4/Windows/mixxx-deps-2.4-x64-windows-50ff351* >> include_file.txt + echo 2.4/Windows/mixxx-deps-2.4-x64-windows-6e308f8* >> include_file.txt + echo 2.4/Windows/mixxx-deps-2.4-x64-windows-85942ea* >> include_file.txt + echo 2.4/Windows/mixxx-deps-2.4-x64-windows-86eed74* >> include_file.txt + echo 2.4/Windows/mixxx-deps-2.4-x64-windows-8cd543b* >> include_file.txt + echo 2.4/Windows/mixxx-deps-2.4-x64-windows-933ff62* >> include_file.txt + echo 2.4/Windows/mixxx-deps-2.4-x64-windows-a1480f7* >> include_file.txt + echo 2.4/Windows/mixxx-deps-2.4-x64-windows-a714f5b* >> include_file.txt + echo 2.4/Windows/mixxx-deps-2.4-x64-windows-c9ebc36* >> include_file.txt + echo 2.4/Windows/mixxx-deps-2.4-x64-windows-cf9ad27* >> include_file.txt + echo 2.4/Windows/mixxx-deps-2.4-x64-windows-db02b82* >> include_file.txt + echo 2.4/Windows/mixxx-deps-2.4-x64-windows-e2a51b1* >> include_file.txt + echo 2.4/Windows/mixxx-deps-2.4-x64-windows-e6cc98b* >> include_file.txt + echo 2.4/Windows/mixxx-deps-2.4-x64-windows-fa517d5* >> include_file.txt + echo 2.4/macOS >> include_file.txt + echo 2.4/macOS/mixxx-deps-2.4-arm64-osx-min1100-00e79d1* >> include_file.txt + echo 2.4/macOS/mixxx-deps-2.4-arm64-osx-min1100-39d1b21* >> include_file.txt + echo 2.4/macOS/mixxx-deps-2.4-arm64-osx-min1100-450a843* >> include_file.txt + echo 2.4/macOS/mixxx-deps-2.4-arm64-osx-min1100-50ff351* >> include_file.txt + echo 2.4/macOS/mixxx-deps-2.4-arm64-osx-min1100-6e308f8* >> include_file.txt + echo 2.4/macOS/mixxx-deps-2.4-arm64-osx-min1100-86eed74* >> include_file.txt + echo 2.4/macOS/mixxx-deps-2.4-arm64-osx-min1100-8cd543b* >> include_file.txt + echo 2.4/macOS/mixxx-deps-2.4-arm64-osx-min1100-933ff62* >> include_file.txt + echo 2.4/macOS/mixxx-deps-2.4-arm64-osx-min1100-985aed5* >> include_file.txt + echo 2.4/macOS/mixxx-deps-2.4-arm64-osx-min1100-9e85dfd* >> include_file.txt + echo 2.4/macOS/mixxx-deps-2.4-arm64-osx-min1100-a1480f7* >> include_file.txt + echo 2.4/macOS/mixxx-deps-2.4-arm64-osx-min1100-c971ee2* >> include_file.txt + echo 2.4/macOS/mixxx-deps-2.4-arm64-osx-min1100-cf9ad27* >> include_file.txt + echo 2.4/macOS/mixxx-deps-2.4-arm64-osx-min1100-e2a51b1* >> include_file.txt + echo 2.4/macOS/mixxx-deps-2.4-arm64-osx-min1100-fa517d5* >> include_file.txt + echo 2.4/macOS/mixxx-deps-2.4-x64-osx-min1012-00e79d1* >> include_file.txt + echo 2.4/macOS/mixxx-deps-2.4-x64-osx-min1012-39d1b21* >> include_file.txt + echo 2.4/macOS/mixxx-deps-2.4-x64-osx-min1012-450a843* >> include_file.txt + echo 2.4/macOS/mixxx-deps-2.4-x64-osx-min1012-50ff351* >> include_file.txt + echo 2.4/macOS/mixxx-deps-2.4-x64-osx-min1012-6e308f8* >> include_file.txt + echo 2.4/macOS/mixxx-deps-2.4-x64-osx-min1012-85942ea* >> include_file.txt + echo 2.4/macOS/mixxx-deps-2.4-x64-osx-min1012-86eed74* >> include_file.txt + echo 2.4/macOS/mixxx-deps-2.4-x64-osx-min1012-8cd543b* >> include_file.txt + echo 2.4/macOS/mixxx-deps-2.4-x64-osx-min1012-933ff62* >> include_file.txt + echo 2.4/macOS/mixxx-deps-2.4-x64-osx-min1012-985aed5* >> include_file.txt + echo 2.4/macOS/mixxx-deps-2.4-x64-osx-min1012-a1480f7* >> include_file.txt + echo 2.4/macOS/mixxx-deps-2.4-x64-osx-min1012-c971ee2* >> include_file.txt + echo 2.4/macOS/mixxx-deps-2.4-x64-osx-min1012-c9ebc36* >> include_file.txt + echo 2.4/macOS/mixxx-deps-2.4-x64-osx-min1012-cf9ad27* >> include_file.txt + echo 2.4/macOS/mixxx-deps-2.4-x64-osx-min1012-db02b82* >> include_file.txt + echo 2.4/macOS/mixxx-deps-2.4-x64-osx-min1012-e2a51b1* >> include_file.txt + echo 2.4/macOS/mixxx-deps-2.4-x64-osx-min1012-fa517d5* >> include_file.txt + echo 2.4-rel/Windows >> include_file.txt + echo 2.4-rel/Windows/mixxx-deps-2.4-x64-windows-53cbf38* >> include_file.txt + echo 2.4-rel/Windows/mixxx-deps-2.4-x64-windows-5f1e01d* >> include_file.txt + echo 2.4-rel/Windows/mixxx-deps-2.4-x64-windows-8f8342a* >> include_file.txt + echo 2.4-rel/Windows/mixxx-deps-2.4-x64-windows-release-00a63eb* >> include_file.txt + echo 2.4-rel/Windows/mixxx-deps-2.4-x64-windows-release-498634a* >> include_file.txt + echo 2.4-rel/Windows/mixxx-deps-2.4-x64-windows-release-67e51ef* >> include_file.txt + echo 2.4-rel/Windows/mixxx-deps-2.4-x64-windows-release-eadc77c* >> include_file.txt + echo 2.4-rel/Windows/mixxx-deps-rel-2.4-x64-windows-14128e6* >> include_file.txt + echo 2.4-rel/Windows/mixxx-deps-rel-2.4-x64-windows-3cb806a* >> include_file.txt + echo 2.4-rel/Windows/mixxx-deps-rel-2.4-x64-windows-569c3c7* >> include_file.txt + echo 2.4-rel/Windows/mixxx-deps-rel-2.4-x64-windows-869da91* >> include_file.txt + echo 2.4-rel/Windows/mixxx-deps-rel-2.4-x64-windows-9348e40* >> include_file.txt + echo 2.4-rel/Windows/mixxx-deps-rel-2.4-x64-windows-a47f1d2* >> include_file.txt + echo 2.4-rel/Windows/mixxx-deps-rel-2.4-x64-windows-ef81bbb* >> include_file.txt + echo 2.5 >> include_file.txt + echo 2.5/Windows >> include_file.txt + echo 2.5/Windows/mixxx-deps-2.4-x64-windows-ee6a820* >> include_file.txt + echo 2.5/Windows/mixxx-deps-2.5-x64-windows-025e451* >> include_file.txt + echo 2.5/Windows/mixxx-deps-2.5-x64-windows-0d6dec6* >> include_file.txt + echo 2.5/Windows/mixxx-deps-2.5-x64-windows-2223b1d* >> include_file.txt + echo 2.5/Windows/mixxx-deps-2.5-x64-windows-22e5547* >> include_file.txt + echo 2.5/Windows/mixxx-deps-2.5-x64-windows-27ceb62* >> include_file.txt + echo 2.5/Windows/mixxx-deps-2.5-x64-windows-2df9e55* >> include_file.txt + echo 2.5/Windows/mixxx-deps-2.5-x64-windows-54e92cb* >> include_file.txt + echo 2.5/Windows/mixxx-deps-2.5-x64-windows-556a389* >> include_file.txt + echo 2.5/Windows/mixxx-deps-2.5-x64-windows-5e1a10e* >> include_file.txt + echo 2.5/Windows/mixxx-deps-2.5-x64-windows-5f1e4ab* >> include_file.txt + echo 2.5/Windows/mixxx-deps-2.5-x64-windows-6fe4441* >> include_file.txt + echo 2.5/Windows/mixxx-deps-2.5-x64-windows-875f13b* >> include_file.txt + echo 2.5/Windows/mixxx-deps-2.5-x64-windows-89f011a* >> include_file.txt + echo 2.5/Windows/mixxx-deps-2.5-x64-windows-8b4aa07* >> include_file.txt + echo 2.5/Windows/mixxx-deps-2.5-x64-windows-8f4f065* >> include_file.txt + echo 2.5/Windows/mixxx-deps-2.5-x64-windows-9d10a04* >> include_file.txt + echo 2.5/Windows/mixxx-deps-2.5-x64-windows-a00d1f7* >> include_file.txt + echo 2.5/Windows/mixxx-deps-2.5-x64-windows-a04d7bc* >> include_file.txt + echo 2.5/Windows/mixxx-deps-2.5-x64-windows-a52e10e* >> include_file.txt + echo 2.5/Windows/mixxx-deps-2.5-x64-windows-bcf8ed3* >> include_file.txt + echo 2.5/Windows/mixxx-deps-2.5-x64-windows-bffc647* >> include_file.txt + echo 2.5/Windows/mixxx-deps-2.5-x64-windows-cbc158a* >> include_file.txt + echo 2.5/Windows/mixxx-deps-2.5-x64-windows-da7c834* >> include_file.txt + echo 2.5/Windows/mixxx-deps-2.5-x64-windows-dd80a94* >> include_file.txt + echo 2.5/Windows/mixxx-deps-2.5-x64-windows-eddd0f2* >> include_file.txt + echo 2.5/Windows/mixxx-deps-2.5-x64-windows-fbeeab6* >> include_file.txt + echo 2.5-rel >> include_file.txt + echo 2.5-rel/Windows >> include_file.txt + echo 2.5-rel/Windows/mixxx-deps-2.5-x64-windows-release-6e7a346* >> include_file.txt + echo 2.5-rel/Windows/mixxx-deps-2.5-x64-windows-release-70c6975* >> include_file.txt + echo 2.5-rel/Windows/mixxx-deps-2.5-x64-windows-release-99f3970* >> include_file.txt + echo 2.5-rel/Windows/mixxx-deps-2.5-x64-windows-release-a65f0d2* >> include_file.txt + echo 2.5-rel/Windows/mixxx-deps-2.5-x64-windows-release-da4c4b8* >> include_file.txt + echo 2.5-rel/Windows/mixxx-deps-2.5-x64-windows-release-de723f4* >> include_file.txt + echo 2.5-rel/Windows/mixxx-deps-rel-2.4-x64-windows-8c12f3f* >> include_file.txt + echo 2.5-rel/Windows/mixxx-deps-rel-2.5-x64-windows-0048787* >> include_file.txt + echo 2.5-rel/Windows/mixxx-deps-rel-2.5-x64-windows-104c751* >> include_file.txt + echo 2.5-rel/Windows/mixxx-deps-rel-2.5-x64-windows-10c57bf* >> include_file.txt + echo 2.5-rel/Windows/mixxx-deps-rel-2.5-x64-windows-2e1b6b1* >> include_file.txt + echo 2.5-rel/Windows/mixxx-deps-rel-2.5-x64-windows-5cf5341* >> include_file.txt + echo 2.5-rel/Windows/mixxx-deps-rel-2.5-x64-windows-6c90be2* >> include_file.txt + echo 2.5-rel/Windows/mixxx-deps-rel-2.5-x64-windows-9b0995f* >> include_file.txt + echo 2.5-rel/Windows/mixxx-deps-rel-2.5-x64-windows-dacaacf* >> include_file.txt + echo 2.5-rel/Windows/mixxx-deps-rel-2.5-x64-windows-release-2fa319b* >> include_file.txt + echo 2.5-rel/Windows/mixxx-deps-rel-2.5-x64-windows-release-cefa504* >> include_file.txt + echo 2.5/macOS >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.4-arm64-osx-min1100-ee6a820* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.4-x64-osx-min1012-ee6a820* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-arm64-osx-min1100-release-0d6dec* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-arm64-osx-min1100-release-1d013e* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-arm64-osx-min1100-release-22e554* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-arm64-osx-min1100-release-2df9e5* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-arm64-osx-min1100-release-54e92c* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-arm64-osx-min1100-release-556a38* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-arm64-osx-min1100-release-5e1a10* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-arm64-osx-min1100-release-875f13* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-arm64-osx-min1100-release-89f011* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-arm64-osx-min1100-release-8f4f06* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-arm64-osx-min1100-release-b20ad3* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-arm64-osx-min1100-release-b94019* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-arm64-osx-min1100-release-bffc64* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-arm64-osx-min1100-release-eddd0f* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-arm64-osx-min1100-release-fbeeab* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-x64-osx-min1015-025e451* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-x64-osx-min1015-1d013e9* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-x64-osx-min1015-1d618f7* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-x64-osx-min1015-2223b1d* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-x64-osx-min1015-22e5547* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-x64-osx-min1015-27ceb62* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-x64-osx-min1015-342fe99* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-x64-osx-min1015-54e92cb* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-x64-osx-min1015-556a389* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-x64-osx-min1015-5889ac5* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-x64-osx-min1015-5f1e4ab* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-x64-osx-min1015-6bd376f* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-x64-osx-min1015-6fe4441* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-x64-osx-min1015-89f011a* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-x64-osx-min1015-8b4aa07* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-x64-osx-min1015-8f4f065* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-x64-osx-min1015-9d10a04* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-x64-osx-min1015-a00d1f7* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-x64-osx-min1015-a04d7bc* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-x64-osx-min1015-a52e10e* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-x64-osx-min1015-b20ad39* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-x64-osx-min1015-b94019b* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-x64-osx-min1015-bcf8ed3* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-x64-osx-min1015-bef9399* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-x64-osx-min1015-c318c2d* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-x64-osx-min1015-cbc158a* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-x64-osx-min1015-da7c834* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-x64-osx-min1015-dd80a94* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-x64-osx-min1015-e54cec7* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-x64-osx-min1015-fbeeab6* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-x64-osx-min1100-0d6dec6* >> include_file.txt + echo 2.5/macOS/mixxx-deps-2.5-x64-osx-min1100-875f13b* >> include_file.txt + echo 2.5-rel/macOS >> include_file.txt + echo 2.5-rel/macOS/mixxx-deps-2.5-arm64-osx-min1100-release-6e7a34* >> include_file.txt + echo 2.5-rel/macOS/mixxx-deps-2.5-arm64-osx-min1100-release-70c697* >> include_file.txt + echo 2.5-rel/macOS/mixxx-deps-2.5-arm64-osx-min1100-release-99f397* >> include_file.txt + echo 2.5-rel/macOS/mixxx-deps-2.5-arm64-osx-min1100-release-a65f0d* >> include_file.txt + echo 2.5-rel/macOS/mixxx-deps-2.5-arm64-osx-min1100-release-de723f* >> include_file.txt + echo 2.5-rel/macOS/mixxx-deps-2.5-x64-osx-min1015-release-99f3970* >> include_file.txt + echo 2.5-rel/macOS/mixxx-deps-2.5-x64-osx-min1015-release-a65f0d2* >> include_file.txt + echo 2.5-rel/macOS/mixxx-deps-2.5-x64-osx-min1015-release-de723f4* >> include_file.txt + echo 2.5-rel/macOS/mixxx-deps-2.5-x64-osx-min1100-release-6e7a346* >> include_file.txt + echo 2.5-rel/macOS/mixxx-deps-rel-2.4-arm64-osx-min1100-8c12f3f* >> include_file.txt + echo 2.5-rel/macOS/mixxx-deps-rel-2.4-x64-osx-min1012-8c12f3f* >> include_file.txt + echo 2.5-rel/macOS/mixxx-deps-rel-2.5-arm64-osx-min1100-104c751* >> include_file.txt + echo 2.5-rel/macOS/mixxx-deps-rel-2.5-arm64-osx-min1100-10c57bf* >> include_file.txt + echo 2.5-rel/macOS/mixxx-deps-rel-2.5-arm64-osx-min1100-dacaacf* >> include_file.txt + echo 2.5-rel/macOS/mixxx-deps-rel-2.5-arm64-osx-min1100-release-2f* >> include_file.txt + echo 2.5-rel/macOS/mixxx-deps-rel-2.5-arm64-osx-min1100-release-ce* >> include_file.txt + echo 2.5-rel/macOS/mixxx-deps-rel-2.5-x64-osx-min1015-104c751* >> include_file.txt + echo 2.5-rel/macOS/mixxx-deps-rel-2.5-x64-osx-min1015-10c57bf* >> include_file.txt + echo 2.5-rel/macOS/mixxx-deps-rel-2.5-x64-osx-min1015-2e1b6b1* >> include_file.txt + echo 2.5-rel/macOS/mixxx-deps-rel-2.5-x64-osx-min1015-5cf5341* >> include_file.txt + echo 2.5-rel/macOS/mixxx-deps-rel-2.5-x64-osx-min1015-9b0995f* >> include_file.txt + echo 2.5-rel/macOS/mixxx-deps-rel-2.5-x64-osx-min1015-c7cf485* >> include_file.txt + echo 2.5-rel/macOS/mixxx-deps-rel-2.5-x64-osx-min1015-d28ff38* >> include_file.txt + echo 2.5-rel/macOS/mixxx-deps-rel-2.5-x64-osx-min1015-dacaacf* >> include_file.txt + echo 2.5-rel/macOS/mixxx-deps-rel-2.5-x64-osx-min1015-release-2fa3* >> include_file.txt + echo 2.5-rel/macOS/mixxx-deps-rel-2.5-x64-osx-min1015-release-cefa* >> include_file.txt + rsync --verbose --archive --times --recursive --delete --include-from=include_file.txt --exclude=* "empty_folder/" "${SSH_USER}@${SSH_HOST}:${DESTDIR}/dependencies/" env: DESTDIR: public_html/downloads SSH_HOST: downloads-hostgator.mixxx.org diff --git a/CHANGELOG.md b/CHANGELOG.md index dbca711c83f..9672d81dc00 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -192,6 +192,9 @@ [#12842](https://github.com/mixxxdj/mixxx/pull/12842) * Traktor Kontrol F1: Fixes for hid-parser and related script [#12876](https://github.com/mixxxdj/mixxx/pull/12876) * Traktor S3: Fix mapping crash on macOS [#12840](https://github.com/mixxxdj/mixxx/pull/12840) +* Behringer DDM4000 & BCR2000: Fix exception in JS code [#12969](https://github.com/mixxxdj/mixxx/pull/12969) +* Denon DJ MC7000: Fix redundant argument and migrate to `hotcue_x_status` [#13113](https://github.com/mixxxdj/mixxx/pull/13113) [#13121](https://github.com/mixxxdj/mixxx/pull/13121) +* Polish fx chain controls [#12805](https://github.com/mixxxdj/mixxx/pull/12805) ### Target Support @@ -200,13 +203,52 @@ [#12847](https://github.com/mixxxdj/mixxx/pull/12847) [#12822](https://github.com/mixxxdj/mixxx/pull/12822) [#12892](https://github.com/mixxxdj/mixxx/pull/12892) + [#13079](https://github.com/mixxxdj/mixxx/pull/13079) + [#12989](https://github.com/mixxxdj/mixxx/pull/12989) +* CMakeLists: Always prefer OpenGL framework on macOS + [#13080](https://github.com/mixxxdj/mixxx/pull/13080) + +### Skins + +* Deere: make sampler rows persist [#12928](https://github.com/mixxxdj/mixxx/pull/12928) +* Tango: Remove unneeded waveform Singleton [#12938](https://github.com/mixxxdj/mixxx/pull/12938) +* Possible crash in customs skins using parallel waveforms [#13043](https://github.com/mixxxdj/mixxx/pull/13043) [#12580](https://github.com/mixxxdj/mixxx/issues/12580) +* Slider tooltip: consider orientation for up/down shortcut tooltips + add support for WKnobComposed [#13088](https://github.com/mixxxdj/mixxx/pull/13088) +* Tooltips: update 'hotcue' with saved loop features [#12875](https://github.com/mixxxdj/mixxx/pull/12875) + +### Library + +* Sidebar: show track count and duration of History playlists + [#12811](https://github.com/mixxxdj/mixxx/pull/12811) + [#13020](https://github.com/mixxxdj/mixxx/pull/13020) + [#13019](https://github.com/mixxxdj/mixxx/issues/13019) + [#12788](https://github.com/mixxxdj/mixxx/issues/12788) + [#12880](https://github.com/mixxxdj/mixxx/issues/12880) + [#12882](https://github.com/mixxxdj/mixxx/pull/12882) +* Computer feature: update removable devices on Linux [#12893](https://github.com/mixxxdj/mixxx/pull/12893) [#12891](https://github.com/mixxxdj/mixxx/issues/12891) +* Playlists: Prevent removing tracks from locked playlists [#12927](https://github.com/mixxxdj/mixxx/pull/12927) +* History feature: Fix removing deleted tracks after export + [#13016](https://github.com/mixxxdj/mixxx/pull/13016) + [#13000](https://github.com/mixxxdj/mixxx/issues/13000) +* BPM display uses decimal separator of selected locale [#13067](https://github.com/mixxxdj/mixxx/pull/13067) [#13051](https://github.com/mixxxdj/mixxx/issues/13051) +* Fix relink directory when migrate between Linux/macOS and Windows [#12878](https://github.com/mixxxdj/mixxx/pull/12878) +* Allow adding new directories while watched directories are missing + [#12937](https://github.com/mixxxdj/mixxx/pull/12937) + [#10481](https://github.com/mixxxdj/mixxx/issues/10481) ### Miscellaneous * Remove unnecessary unpolish operation of the style, before polish the new style [#12445](https://github.com/mixxxdj/mixxx/pull/12445) * Developer Tools: Initially sort controls by group name, ascending [#12884](https://github.com/mixxxdj/mixxx/pull/12884) -* History: Show track count and duration in sidebar [#12811](https://github.com/mixxxdj/mixxx/pull/12811) -* Prevent removing tracks from locked playlists [#12927](https://github.com/mixxxdj/mixxx/pull/12927) +* Waveforms: Fix scratching crossing loop boundaries [#13007](https://github.com/mixxxdj/mixxx/pull/13007) +* Prohibit un-replace when deck is playing [#13023](https://github.com/mixxxdj/mixxx/pull/13023) [#12906](https://github.com/mixxxdj/mixxx/issues/12906) +* Track Properties dialog: Prevent wiping metadata when applying twice quickly + [#12965](https://github.com/mixxxdj/mixxx/pull/12965) + [#12963](https://github.com/mixxxdj/mixxx/issues/12963) +* AutoDJ: Fix button state after error message about playing deck 3/4 + [#12976](https://github.com/mixxxdj/mixxx/pull/12976) + [#12975](https://github.com/mixxxdj/mixxx/issues/12975) +* Tagfetcher: Cache fetched covers [#12301](https://github.com/mixxxdj/mixxx/pull/12301) [#11084](https://github.com/mixxxdj/mixxx/issues/11084) ## [2.4.0](https://github.com/mixxxdj/mixxx/milestone/15?closed=1) (2024-02-16) diff --git a/CMakeLists.txt b/CMakeLists.txt index 66e8c376602..32875acaecd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1301,6 +1301,7 @@ add_library(mixxx-lib STATIC EXCLUDE_FROM_ALL src/widget/wpixmapstore.cpp src/widget/wpushbutton.cpp src/widget/wraterange.cpp + src/widget/wstarratingaction.cpp src/widget/wrecordingduration.cpp src/widget/wscrollable.cpp src/widget/wsearchlineedit.cpp diff --git a/cmake/modules/FindSndFile.cmake b/cmake/modules/FindSndFile.cmake index 65f572db3b0..4bf847b8c65 100644 --- a/cmake/modules/FindSndFile.cmake +++ b/cmake/modules/FindSndFile.cmake @@ -43,6 +43,8 @@ The following cache variables may also be set: #]=======================================================================] +include(IsStaticLibrary) + find_package(PkgConfig QUIET) if(PkgConfig_FOUND) pkg_check_modules(PC_SndFile QUIET sndfile) @@ -94,5 +96,24 @@ if(SndFile_FOUND) INTERFACE_COMPILE_OPTIONS "${PC_SndFile_CFLAGS_OTHER}" INTERFACE_INCLUDE_DIRECTORIES "${SndFile_INCLUDE_DIR}" ) + is_static_library(SndFile_IS_STATIC SndFile::sndfile) + if(SndFile_IS_STATIC) + find_package(FLAC) + if(FLAC_FOUND) + set_property(TARGET SndFile::sndfile APPEND PROPERTY INTERFACE_LINK_LIBRARIES + FLAC::FLAC + ) + endif() + + # The mpg123 dependency was introduced in libsndfile 1.1.0 + if(SndFile_VERSION VERSION_GREATER_EQUAL "1.1.0") + find_package(mpg123 CONFIG) + if(mpg123_FOUND) + set_property(TARGET SndFile::sndfile APPEND PROPERTY INTERFACE_LINK_LIBRARIES + MPG123::libmpg123 + ) + endif() + endif() + endif() endif() endif() diff --git a/res/controllers/Traktor-Kontrol-S2-MK1-hid-scripts.js b/res/controllers/Traktor-Kontrol-S2-MK1-hid-scripts.js index 765d552f04a..a82b7977667 100644 --- a/res/controllers/Traktor-Kontrol-S2-MK1-hid-scripts.js +++ b/res/controllers/Traktor-Kontrol-S2-MK1-hid-scripts.js @@ -600,7 +600,8 @@ class PadButton { } outputHotcueCallback() { let color; - if (engine.getValue(this.deck.channel, "hotcue_" + this.number + "_enabled")) { + const status = engine.getValue(this.deck.channel, `hotcue_${ this.number }_status`); + if (status === 1 || status === 2) { color = {green: 0, blue: 0x1F}; } else { color = {green: 0, blue: 0}; @@ -651,7 +652,7 @@ class PadButton { if (padMode === padModes.hotcue) { this.connections.push( - engine.makeConnection(this.deck.channel, "hotcue_" + this.number + "_enabled", this.outputHotcueCallback.bind(this))); + engine.makeConnection(this.deck.channel, `hotcue_${ this.number }_status`, this.outputHotcueCallback.bind(this))); } else if (padMode === padModes.introOutro) { this.connections.push(engine.makeConnection( this.deck.channel, introOutroKeys[this.number-1] + "_enabled", this.outputIntroOutroCallback.bind(this))); @@ -771,7 +772,7 @@ class EffectUnit { } } enableSoftTakeover() { - engine.softTakeover(this.group, "!mix", true); + engine.softTakeover(this.group, "mix", true); for (let i = 0; i < 3; i++) { this.params[i].enableSoftTakeover(); } diff --git a/res/linux/org.mixxx.Mixxx.metainfo.xml b/res/linux/org.mixxx.Mixxx.metainfo.xml index d750f116121..b3d50bc1e03 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 @@ -704,7 +704,7 @@ - +

Controller Mappings @@ -727,6 +727,20 @@ Traktor S3: Fix mapping crash on macOS #12840 +

  • + Behringer DDM4000 & BCR2000: Fix exception in JS code + #12969 +
  • +
  • + Denon DJ MC7000: Fix redundant argument and migrate to + hotcue_x_status + #13113 + #13121 +
  • +
  • + Polish fx chain controls + #12805 +
  • Target Support @@ -738,6 +752,80 @@ #12847 #12822 #12892 + #13079 + #12989 + +

  • + CMakeLists: Always prefer OpenGL framework on macOS + #13080 +
  • + +

    + Skins +

    +
      +
    • + Deere: make sampler rows persist + #12928 +
    • +
    • + Tango: Remove unneeded waveform Singleton + #12938 +
    • +
    • + Possible crash in customs skins using parallel waveforms + #13043 + #12580 +
    • +
    • + Slider tooltip: consider orientation for up/down shortcut tooltips + add support for WKnobComposed + #13088 +
    • +
    • + Tooltips: update 'hotcue' with saved loop features + #12875 +
    • +
    +

    + Library +

    +
      +
    • + Sidebar: show track count and duration of History playlists + #12811 + #13020 + #13019 + #12788 + #12880 + #12882 +
    • +
    • + Computer feature: update removable devices on Linux + #12893 + #12891 +
    • +
    • + Playlists: Prevent removing tracks from locked playlists + #12927 +
    • +
    • + History feature: Fix removing deleted tracks after export + #13016 + #13000 +
    • +
    • + BPM display uses decimal separator of selected locale + #13067 + #13051 +
    • +
    • + Fix relink directory when migrate between Linux/macOS and Windows + #12878 +
    • +
    • + Allow adding new directories while watched directories are missing + #12937 + #10481

    @@ -753,12 +841,28 @@ #12884

  • - History: Show track count and duration in sidebar - #12811 + Waveforms: Fix scratching crossing loop boundaries + #13007
  • - Prevent removing tracks from locked playlists - #12927 + Prohibit un-replace when deck is playing + #13023 + #12906 +
  • +
  • + Track Properties dialog: Prevent wiping metadata when applying twice quickly + #12965 + #12963 +
  • +
  • + AutoDJ: Fix button state after error message about playing deck 3/4 + #12976 + #12975 +
  • +
  • + Tagfetcher: Cache fetched covers + #12301 + #11084
  • diff --git a/res/skins/Deere/style.qss b/res/skins/Deere/style.qss index 9818f8af864..e3c3905d7f6 100644 --- a/res/skins/Deere/style.qss +++ b/res/skins/Deere/style.qss @@ -2022,6 +2022,7 @@ WTrackMenu::item, WTrackMenu QMenu, WTrackMenu QMenu::item, WTrackMenu QMenu QCheckBox, +WTrackMenu WStarRating, QLineEdit QMenu, QLineEdit QMenu::item, QPlainTextEdit QMenu, diff --git a/res/skins/LateNight/style_classic.qss b/res/skins/LateNight/style_classic.qss index c4effe6a7bc..407877bd035 100644 --- a/res/skins/LateNight/style_classic.qss +++ b/res/skins/LateNight/style_classic.qss @@ -1122,6 +1122,7 @@ WLibraryTextBrowser QMenu, WTrackMenu, WTrackMenu QMenu, WTrackMenu QMenu QCheckBox, +WTrackMenu WStarRating, QLineEdit QMenu, QPlainTextEdit QMenu, WEffectChainPresetButton QMenu, @@ -2499,6 +2500,7 @@ WTrackMenu::item, WTrackMenu QMenu, WTrackMenu QMenu::item, WTrackMenu QMenu QCheckBox, +WTrackMenu WStarRating, QLineEdit QMenu, QLineEdit QMenu::item, QPlainTextEdit QMenu, diff --git a/res/skins/LateNight/style_palemoon.qss b/res/skins/LateNight/style_palemoon.qss index 715175f560a..dc1df82d011 100644 --- a/res/skins/LateNight/style_palemoon.qss +++ b/res/skins/LateNight/style_palemoon.qss @@ -1222,6 +1222,7 @@ WLibraryTextBrowser QMenu, WTrackMenu, WTrackMenu QMenu, WTrackMenu QMenu QCheckBox, +WTrackMenu WStarRating, WEffectChainPresetButton QMenu, WEffectChainPresetButton QMenu QCheckBox, QLineEdit QMenu, @@ -2957,6 +2958,7 @@ WTrackMenu::item, WTrackMenu QMenu, WTrackMenu QMenu::item, WTrackMenu QMenu QCheckBox, +WTrackMenu WStarRating, QLineEdit QMenu, QLineEdit QMenu::item, QPlainTextEdit QMenu, diff --git a/res/skins/Shade/style.qss b/res/skins/Shade/style.qss index d103980b735..b397f95aa4c 100644 --- a/res/skins/Shade/style.qss +++ b/res/skins/Shade/style.qss @@ -108,6 +108,7 @@ WTrackMenu::item, WTrackMenu QMenu, WTrackMenu QMenu::item, WTrackMenu QMenu QCheckBox, +WTrackMenu WStarRating, QLineEdit QMenu, QLineEdit QMenu::item, QPlainTextEdit QMenu, diff --git a/res/skins/Shade/style_dark.qss b/res/skins/Shade/style_dark.qss index 9e3b7d34f53..c09903a48aa 100644 --- a/res/skins/Shade/style_dark.qss +++ b/res/skins/Shade/style_dark.qss @@ -14,6 +14,7 @@ WTrackMenu::item, WTrackMenu QMenu, WTrackMenu QMenu::item, WTrackMenu QMenu QCheckBox, +WTrackMenu WStarRating, QLineEdit QMenu, QLineEdit QMenu::item, QPlainTextEdit QMenu, diff --git a/res/skins/Shade/style_summer_sunset.qss b/res/skins/Shade/style_summer_sunset.qss index 0c441f854d4..e8a8da9b386 100644 --- a/res/skins/Shade/style_summer_sunset.qss +++ b/res/skins/Shade/style_summer_sunset.qss @@ -14,6 +14,7 @@ WTrackMenu::item, WTrackMenu QMenu, WTrackMenu QMenu::item, WTrackMenu QMenu QCheckBox, +WTrackMenu WStarRating, QLineEdit QMenu, QLineEdit QMenu::item, QPlainTextEdit QMenu, diff --git a/res/skins/Tango/style.qss b/res/skins/Tango/style.qss index 5911164c434..e28bc900121 100644 --- a/res/skins/Tango/style.qss +++ b/res/skins/Tango/style.qss @@ -2313,6 +2313,7 @@ WTrackMenu::item, WTrackMenu QMenu, WTrackMenu QMenu::item, WTrackMenu QMenu QCheckBox, +WTrackMenu WStarRating, QLineEdit QMenu, QLineEdit QMenu::item, QPlainTextEdit QMenu, diff --git a/src/track/beats.cpp b/src/track/beats.cpp index d8600979c2b..3e14671a127 100644 --- a/src/track/beats.cpp +++ b/src/track/beats.cpp @@ -432,6 +432,20 @@ Beats::ConstIterator Beats::iteratorFrom(audio::FramePos position) const { DEBUG_ASSERT(isValid()); auto it = cfirstmarker(); + auto previousIfNeeded = [](Beats::ConstIterator it, audio::FramePos position) { + // In positive direction the minimum step width of a double increases. + // This may lead to tiny floating point errors that make `std::ceil` + // round up and makes us end up one beat too late. + // + // Likewise, in negative direction, we can also end up one beat to + // late if position is very close to a beat. + // + // This works around that issue by going back to the previous + // beat if necessary. + auto previousBeatIt = it - 1; + return (*previousBeatIt >= position) ? previousBeatIt : it; + }; + audio::FrameDiff_t diff = position - m_lastMarkerPosition; if (diff > 0) { DEBUG_ASSERT(*clastmarker() == m_lastMarkerPosition); @@ -441,16 +455,7 @@ Beats::ConstIterator Beats::iteratorFrom(audio::FramePos position) const { return cend(); } it = clastmarker() + static_cast(n); - - // In positive direction the minimum step width of a double increases. - // This may lead to tiny floating point errors that make `std::ceil` - // round up and makes us end up one beat too - // late. This works around that issue by going back to the previous - // beat if necessary. - auto previousBeatIt = it - 1; - if (*previousBeatIt >= position) { - it = previousBeatIt; - } + it = previousIfNeeded(it, position); } else if (position < *it) { // Lookup position is before the first marker position const double n = std::floor((*it - position) / firstBeatLengthFrames()); @@ -458,6 +463,7 @@ Beats::ConstIterator Beats::iteratorFrom(audio::FramePos position) const { return cbegin(); } it -= static_cast(n); + it = previousIfNeeded(it, position); } else { it = std::lower_bound(cfirstmarker(), clastmarker() + 1, position); } diff --git a/src/util/cmdlineargs.cpp b/src/util/cmdlineargs.cpp index 328e0702282..8fd7b237768 100644 --- a/src/util/cmdlineargs.cpp +++ b/src/util/cmdlineargs.cpp @@ -24,6 +24,9 @@ CmdlineArgs::CmdlineArgs() m_controllerDebug(false), m_controllerAbortOnWarning(false), m_developer(false), +#ifdef MIXXX_USE_QML + m_qml(false), +#endif m_safeMode(false), m_useLegacyVuMeter(false), m_useLegacySpinny(false), diff --git a/src/widget/wpushbutton.cpp b/src/widget/wpushbutton.cpp index 5da332b5626..1d4d03d5cd6 100644 --- a/src/widget/wpushbutton.cpp +++ b/src/widget/wpushbutton.cpp @@ -155,9 +155,13 @@ void WPushButton::setup(const QDomNode& node, const SkinContext& context) { switch (m_leftButtonMode) { case ControlPushButton::PUSH: case ControlPushButton::POWERWINDOW: + leftConnection->setEmitOption( + ControlParameterWidgetConnection::EMIT_ON_PRESS_AND_RELEASE); + break; case ControlPushButton::LONGPRESSLATCHING: leftConnection->setEmitOption( ControlParameterWidgetConnection::EMIT_ON_PRESS_AND_RELEASE); + m_pLongPressLatching = std::make_unique(this); break; case ControlPushButton::TOGGLE: case ControlPushButton::TRIGGER: @@ -302,17 +306,21 @@ void WPushButton::onConnectedControlChanged(double dParameter, double dValue) { void WPushButton::paintEvent(QPaintEvent* e) { Q_UNUSED(e); + paintOnDevice(nullptr); +} + +void WPushButton::paintOnDevice(QPaintDevice* pd) { QStyleOption option; option.initFrom(this); - QStylePainter p(this); - p.drawPrimitive(QStyle::PE_Widget, option); + std::unique_ptr p(pd ? new QStylePainter(pd, this) : new QStylePainter(this)); + p->drawPrimitive(QStyle::PE_Widget, option); if (m_iNoStates == 0) { return; } if (m_pPixmapBack) { - m_pPixmapBack->draw(rect(), &p); + m_pPixmapBack->draw(rect(), p.get()); } const QVector& pixmaps = m_bPressed ? @@ -335,7 +343,7 @@ void WPushButton::paintEvent(QPaintEvent* e) { PaintablePointer pPixmap = pixmaps.at(idx); if (!pPixmap.isNull() && !pPixmap->isNull()) { - pPixmap->draw(rect(), &p); + pPixmap->draw(rect(), p.get()); } QString text = m_text.at(idx); @@ -348,7 +356,11 @@ void WPushButton::paintEvent(QPaintEvent* e) { // int textWidth = width() - lPad - rPad; // QRect textRect = rect().adjust(x1, y1, x2, y2); QString elidedText = metrics.elidedText(text, m_elideMode, width()); - p.drawText(rect(), m_align.at(idx), elidedText); + p->drawText(rect(), m_align.at(idx), elidedText); + } + + if (pd == nullptr && m_pLongPressLatching) { + m_pLongPressLatching->paint(p.get(), m_clickTimer.remainingTime()); } } @@ -395,12 +407,16 @@ void WPushButton::mousePressEvent(QMouseEvent * e) { } else { // Toggle through the states emitValue = getControlParameterLeft(); + const auto oldValue = emitValue; if (!util_isnan(emitValue) && m_iNoStates > 0) { emitValue = static_cast(emitValue + 1.0) % m_iNoStates; } if (m_leftButtonMode == ControlPushButton::LONGPRESSLATCHING) { m_clickTimer.setSingleShot(true); m_clickTimer.start(ControlPushButtonBehavior::kLongPressLatchingTimeMillis); + if (oldValue == 0.0 && m_pLongPressLatching) { + m_pLongPressLatching->start(); + } } } setControlParameterLeftDown(emitValue); @@ -455,6 +471,10 @@ void WPushButton::mouseReleaseEvent(QMouseEvent * e) { const bool leftClick = e->button() == Qt::LeftButton; const bool rightClick = e->button() == Qt::RightButton; + if (m_pLongPressLatching) { + m_pLongPressLatching->stop(); + } + if (m_leftButtonMode == ControlPushButton::POWERWINDOW && m_iNoStates == 2) { if (leftClick) { @@ -520,3 +540,52 @@ void WPushButton::fillDebugTooltip(QStringList* debug) { << QString("RightButtonMode: %1") .arg(ControlPushButton::buttonModeToString(m_rightButtonMode)); } + +void WPushButton::updateSlot() { + update(); +} + +WPushButton::LongPressLatching::LongPressLatching(WPushButton* pButton) + : m_pButton(pButton) { + // To animate the long press latching + connect(&m_animTimer, &QTimer::timeout, m_pButton, &WPushButton::updateSlot); +} + +void WPushButton::LongPressLatching::paint(QPainter* p, int remainingTime) { + if (m_animTimer.isActive()) { + // Animate the long press latching by capturing the off state in a pixmap + // and gradually draw less of it over the duration of the long press latching. + + remainingTime = std::max(0, remainingTime); + + if (remainingTime == 0) { + m_animTimer.stop(); + } else { + qreal x = m_pButton->width() * static_cast(remainingTime) / + static_cast(ControlPushButtonBehavior:: + kLongPressLatchingTimeMillis); + p->drawPixmap(QPointF(m_pButton->width() - x, 0), + m_preLongPressPixmap, + QRectF((m_pButton->width() - x) * m_pButton->devicePixelRatio(), + 0, + x * m_pButton->devicePixelRatio(), + m_pButton->height() * m_pButton->devicePixelRatio())); + } + } +} + +void WPushButton::LongPressLatching::start() { + // Capture pixmap with the off state ... + m_preLongPressPixmap = QPixmap(static_cast(m_pButton->width() * + m_pButton->devicePixelRatio()), + static_cast( + m_pButton->height() * m_pButton->devicePixelRatio())); + m_preLongPressPixmap.setDevicePixelRatio(m_pButton->devicePixelRatio()); + m_pButton->paintOnDevice(&m_preLongPressPixmap); + // ... and start the long press latching animation + m_animTimer.start(1000 / 60); +} + +void WPushButton::LongPressLatching::stop() { + m_animTimer.stop(); +} diff --git a/src/widget/wpushbutton.h b/src/widget/wpushbutton.h index 0e0b3557d73..fbda3083954 100644 --- a/src/widget/wpushbutton.h +++ b/src/widget/wpushbutton.h @@ -3,6 +3,7 @@ #include #include #include +#include #include "control/controlpushbutton.h" #include "util/fpclassify.h" @@ -61,6 +62,9 @@ class WPushButton : public WWidget { public slots: void onConnectedControlChanged(double dParameter, double dValue) override; + private slots: + void updateSlot(); + protected: bool event(QEvent* e) override; void paintEvent(QPaintEvent* e) override; @@ -86,6 +90,8 @@ class WPushButton : public WWidget { Paintable::DrawMode mode, double scaleFactor); + void paintOnDevice(QPaintDevice* pd); + // True, if the button is currently pressed bool m_bPressed; // True, if the button is pointer is above button @@ -106,4 +112,25 @@ class WPushButton : public WWidget { ControlPushButton::ButtonMode m_rightButtonMode; QTimer m_clickTimer; QVector m_align; + + // Animates long press latching by storing the off state of the + // WPushButton in a pixmap and gradually (from left to right) + // drawing less of the off state on top of the on state, to + // give a visual indication that the long press latching is in + // progress. + class LongPressLatching { + public: + LongPressLatching(WPushButton* pButton); + void paint(QPainter* p, int remainingTime); + void start(); + void stop(); + + private: + WPushButton* m_pButton; + QPixmap m_preLongPressPixmap; + QTimer m_animTimer; + }; + + // Only assigned for WPushButtons that use long press latching + std::unique_ptr m_pLongPressLatching; }; diff --git a/src/widget/wspinnyglsl.cpp b/src/widget/wspinnyglsl.cpp index 989e9c0044a..8ffed866e7b 100644 --- a/src/widget/wspinnyglsl.cpp +++ b/src/widget/wspinnyglsl.cpp @@ -14,6 +14,21 @@ WSpinnyGLSL::WSpinnyGLSL( : WSpinnyBase(parent, group, pConfig, pVCMan, pPlayer) { } +WSpinnyGLSL::~WSpinnyGLSL() { + cleanupGL(); +} + +void WSpinnyGLSL::cleanupGL() { + makeCurrentIfNeeded(); + m_bgTexture.destroy(); + m_maskTexture.destroy(); + m_fgTextureScaled.destroy(); + m_ghostTextureScaled.destroy(); + m_loadedCoverTextureScaled.destroy(); + m_qTexture.destroy(); + doneCurrent(); +} + void WSpinnyGLSL::coverChanged() { if (isContextValid()) { makeCurrentIfNeeded(); diff --git a/src/widget/wspinnyglsl.h b/src/widget/wspinnyglsl.h index 56ee53a3a03..2c418a7b867 100644 --- a/src/widget/wspinnyglsl.h +++ b/src/widget/wspinnyglsl.h @@ -17,7 +17,7 @@ class WSpinnyGLSL : public WSpinnyBase, private QOpenGLFunctions { UserSettingsPointer pConfig, VinylControlManager* pVCMan, BaseTrackPlayer* pPlayer); - ~WSpinnyGLSL() override = default; + ~WSpinnyGLSL() override; private: void draw() override; @@ -27,6 +27,7 @@ class WSpinnyGLSL : public WSpinnyBase, private QOpenGLFunctions { void paintGL() override; void resizeGL(int w, int h) override; void drawTexture(QOpenGLTexture* texture); + void cleanupGL(); void updateTextures(); void setupVinylSignalQuality() override; diff --git a/src/widget/wstarratingaction.cpp b/src/widget/wstarratingaction.cpp new file mode 100644 index 00000000000..cbc3a30c04f --- /dev/null +++ b/src/widget/wstarratingaction.cpp @@ -0,0 +1,35 @@ +#include "widget/wstarratingaction.h" + +#include + +#include "moc_wstarratingaction.cpp" +#include "widget/wstarrating.h" + +WStarRatingAction::WStarRatingAction(QWidget* parent) + : QWidgetAction(parent), + m_pStarRating(make_parented(parent)) { + m_pStarRating->setMouseTracking(true); + // forward the signal + connect(m_pStarRating, + &WStarRating::ratingChangeRequest, + this, + &WStarRatingAction::ratingSet); + + QHBoxLayout* pLayout = new QHBoxLayout(); + pLayout->addWidget(m_pStarRating); + pLayout->setSizeConstraint(QLayout::SetFixedSize); + pLayout->setContentsMargins(0, 0, 0, 0); + + QWidget* pWidget = new QWidget(); + pWidget->setLayout(pLayout); + pWidget->setSizePolicy(QSizePolicy()); + setDefaultWidget(pWidget); +} + +void WStarRatingAction::setRating(const int rating) { + m_pStarRating->slotSetRating(rating); +} + +QSize WStarRatingAction::sizeHint() { + return m_pStarRating->sizeHint(); +} diff --git a/src/widget/wstarratingaction.h b/src/widget/wstarratingaction.h new file mode 100644 index 00000000000..2eaf738e2fa --- /dev/null +++ b/src/widget/wstarratingaction.h @@ -0,0 +1,23 @@ +#pragma once + +#include + +#include "util/parented_ptr.h" + +class WStarRating; + +class WStarRatingAction : public QWidgetAction { + Q_OBJECT + public: + explicit WStarRatingAction(QWidget* parent = nullptr); + + void setRating(const int rating); + + QSize sizeHint(); + + signals: + void ratingSet(const int rating); + + private: + parented_ptr m_pStarRating; +}; diff --git a/src/widget/wtrackmenu.cpp b/src/widget/wtrackmenu.cpp index 889e7e646e8..a7e11bffb33 100644 --- a/src/widget/wtrackmenu.cpp +++ b/src/widget/wtrackmenu.cpp @@ -45,7 +45,9 @@ #include "widget/wcoverartmenu.h" #include "widget/wfindonwebmenu.h" #include "widget/wsearchrelatedtracksmenu.h" +// WStarRating is required for DlgTrackInfo #include "widget/wstarrating.h" +#include "widget/wstarratingaction.h" constexpr WTrackMenu::Features WTrackMenu::kDeckTrackMenuFeatures; @@ -334,6 +336,13 @@ void WTrackMenu::createActions() { } if (featureIsEnabled(Feature::Properties)) { + m_pStarRatingAction = new WStarRatingAction(this); + m_pStarRatingAction->setObjectName("RatingAction"); + connect(m_pStarRatingAction, + &WStarRatingAction::ratingSet, + this, + &WTrackMenu::slotSetRating); + m_pPropertiesAct = new QAction(tr("Properties"), this); // This is just for having the shortcut displayed next to the action // when the menu is invoked from the tracks table. @@ -606,6 +615,10 @@ void WTrackMenu::setupActions() { addMenu(m_pBPMMenu); } + if (featureIsEnabled(Feature::Properties)) { + addAction(m_pStarRatingAction); + } + if (featureIsEnabled(Feature::Color)) { m_pColorMenu->addAction(m_pColorPickerAction); addMenu(m_pColorMenu); @@ -737,6 +750,39 @@ std::pair WTrackMenu::getTrackBpmLockStates() const { return std::pair(anyBpmLocked, anyBpmNotLocked); } +int WTrackMenu::getCommonTrackRating() const { + VERIFY_OR_DEBUG_ASSERT(!isEmpty()) { + return 0; + } + int commonRating; + if (m_pTrackModel) { + const int column = + m_pTrackModel->fieldIndex(LIBRARYTABLE_RATING); + commonRating = m_trackIndexList.first() + .sibling(m_trackIndexList.first().row(), column) + .data() + .value() + .starCount(); + for (const auto& trackIndex : m_trackIndexList) { + const auto otherRating = + trackIndex.sibling(trackIndex.row(), column) + .data() + .value() + .starCount(); + if (commonRating != otherRating) { + // Multiple, different ratings + return 0; + } + } + } else { + if (!m_pTrack) { + return 0; + } + commonRating = m_pTrack->getRating(); + } + return commonRating; +} + std::optional> WTrackMenu::getCommonTrackColor() const { VERIFY_OR_DEBUG_ASSERT(!isEmpty()) { return std::nullopt; @@ -1039,6 +1085,11 @@ void WTrackMenu::updateMenus() { } if (featureIsEnabled(Feature::Properties)) { + // Might be needed to resize Menu to fit the star rating + // QResizeEvent resizeEvent(QSize(), m_pStarRatingAction->sizeHint()); + // qApp->sendEvent(m_pStarRatingAction, &resizeEvent); + m_pStarRatingAction->setRating(getCommonTrackRating()); + m_pPropertiesAct->setEnabled(singleTrackSelected); } @@ -1626,6 +1677,41 @@ void WTrackMenu::lockBpm(bool lock) { namespace { +class SetRatingTrackPointerOperation : public mixxx::TrackPointerOperation { + public: + explicit SetRatingTrackPointerOperation(const int rating) + : m_rating(rating) { + } + + private: + void doApply( + const TrackPointer& pTrack) const override { + pTrack->setRating(m_rating); + } + + const int m_rating; +}; + +} // anonymous namespace + +void WTrackMenu::slotSetRating(int rating) { + if (!mixxx::TrackRecord::isValidRating(rating)) { + return; + } + + const auto progressLabelText = + tr("Setting rating of %n track(s)", "", getTrackCount()); + const auto trackOperator = + SetRatingTrackPointerOperation(rating); + applyTrackPointerOperation( + progressLabelText, + &trackOperator); + + hide(); +} + +namespace { + class SetColorTrackPointerOperation : public mixxx::TrackPointerOperation { public: explicit SetColorTrackPointerOperation(const mixxx::RgbColor::optional_t& color) diff --git a/src/widget/wtrackmenu.h b/src/widget/wtrackmenu.h index 4b44bbd8edb..a8c60492856 100644 --- a/src/widget/wtrackmenu.h +++ b/src/widget/wtrackmenu.h @@ -26,6 +26,7 @@ class WColorPickerAction; class WCoverArtMenu; class WFindOnWebMenu; class WSearchRelatedTracksMenu; +class WStarRatingAction; /// A context menu for track(s). /// Can be used with individual track type widgets based on TrackPointer @@ -117,6 +118,9 @@ class WTrackMenu : public QMenu { void slotOpenInFileBrowser(); void slotSelectInLibrary(); + // Track rating + void slotSetRating(int rating); + // Row color void slotColorPicked(const mixxx::RgbColor::optional_t& color); @@ -222,6 +226,10 @@ class WTrackMenu : public QMenu { std::pair getTrackBpmLockStates() const; + /// Get the common rating of all selected tracks. + /// Return 0 if ratings differ. + int getCommonTrackRating() const; + /// Get the common track color of all tracks this menu is shown for, or /// return `nullopt` if there is no common color. Tracks may have no color /// assigned to them. In that case the inner optional is set to `nullopt`. @@ -303,7 +311,8 @@ class WTrackMenu : public QMenu { QAction* m_pBpmThreeHalvesAction{}; QAction* m_pBpmResetAction{}; - // Track color + // Track rating and color + WStarRatingAction* m_pStarRatingAction{}; WColorPickerAction* m_pColorPickerAction{}; // Analysis actions diff --git a/src/widget/wtracktableview.cpp b/src/widget/wtracktableview.cpp index a8b0b643dca..80352b854c0 100644 --- a/src/widget/wtracktableview.cpp +++ b/src/widget/wtracktableview.cpp @@ -576,7 +576,6 @@ void WTrackTableView::mouseMoveEvent(QMouseEvent* pEvent) { return; } //qDebug() << "MouseMoveEvent"; - // Iterate over selected rows and append each item's location url to a list. if (DragAndDropHelper::mouseMoveInitiatesDrag(pEvent)) { // Iterate over selected rows and append each item's location url to a list. diff --git a/src/widget/wvumeterglsl.cpp b/src/widget/wvumeterglsl.cpp index 039651dccff..39da264ecc9 100644 --- a/src/widget/wvumeterglsl.cpp +++ b/src/widget/wvumeterglsl.cpp @@ -11,6 +11,10 @@ WVuMeterGLSL::WVuMeterGLSL(QWidget* pParent) : WVuMeterBase(pParent) { } +WVuMeterGLSL::~WVuMeterGLSL() { + cleanupGL(); +} + void WVuMeterGLSL::draw() { if (shouldRender()) { makeCurrentIfNeeded(); @@ -139,6 +143,13 @@ void WVuMeterGLSL::paintGL() { m_textureShader.release(); } +void WVuMeterGLSL::cleanupGL() { + makeCurrentIfNeeded(); + m_textureBack.destroy(); + m_textureVu.destroy(); + doneCurrent(); +} + void WVuMeterGLSL::drawTexture(QOpenGLTexture* texture, const QRectF& targetRect, const QRectF& sourceRect) { diff --git a/src/widget/wvumeterglsl.h b/src/widget/wvumeterglsl.h index 3b3c3cb1b6b..13749281b74 100644 --- a/src/widget/wvumeterglsl.h +++ b/src/widget/wvumeterglsl.h @@ -13,7 +13,7 @@ class WVuMeterGLSL : public WVuMeterBase, private QOpenGLFunctions { Q_OBJECT public: explicit WVuMeterGLSL(QWidget* pParent = nullptr); - ~WVuMeterGLSL() override = default; + ~WVuMeterGLSL() override; private: OpenGLTexture2D m_textureBack; @@ -22,6 +22,7 @@ class WVuMeterGLSL : public WVuMeterBase, private QOpenGLFunctions { void draw() override; void initializeGL() override; + void cleanupGL(); void paintGL() override; void drawTexture(QOpenGLTexture* texture, const QRectF& sourceRect, const QRectF& targetRect); };