Cover Art
@@ -131,6 +131,8 @@
#11086
#12041
#12300
+ #12543
+ #12532
CoverArtCache refactoring + Fix scrolling lag after updating Mixxx
@@ -302,20 +304,6 @@
Don't store or update metadata of missing tracks in the Mixxx database to prevent inconsistencies with file tags
#3811
-
- Code improvements and minor bug fixes when importing track metadata
- #3851
- #3858
- #3860
- #3866
- #3871
- #3870
- #3924
- #4368
- #3906
- #3998
- #11031
-
Update library schema to 37 for synchronizing file modified time with track source on metadata import/export
#3978
@@ -396,6 +384,18 @@
#12321
#12064
+
+ Tracks table: Fix initial track selection with BackTab
+ #11130
+
+
+ Tracks table: Try to restore selection position after track removal
+ #11196
+
+
+ Tracks table: Remove parenthesis from play counter display
+ #11357
+
Re-enable shortcuts after editing controls
#4360
@@ -506,18 +506,6 @@
#3212
#11842
-
- Tracks table: Fix initial track selection with BackTab
- #11130
-
-
- Tracks table: Try to restore selection position after track removal
- #11196
-
-
- Tracks table: Remove parenthesis from play counter display
- #11357
-
Remove/hide tracks dialog: Add 'Don't ask again' checkbox
#11239
@@ -627,48 +615,14 @@
#11948
- Track Properties: Don't clear unsaved properties when updating star rating
- #11565
- #11540
-
-
- Track Properties: Focus Double-clicked property field for edit
- #11764
- #11804
- #11802
-
-
- Track Properties: Display the samplerate
- #12418
+ Fix setting the wrong default cue color
+ #11554
+ #11260
- Refactoring of library code
- #2756
- #2717
- #2715
- #2810
- #2900
- #2906
- #2925
- #3017
- #3475
- #4164
- #4152
- #4162
- #4101
- #4214
- #4280
- #4429
- #4477
- #4475
- #4480
- #4633
- #4837
- #4864
- #4893
- #10861
- #10871
- #12082
+ Tweak remove/hide track confirm message to match confirm exit message
+ #4577
+ #1947992
@@ -751,7 +705,7 @@
#11888
- AAC encoder: Fixed a memory leak
+ AAC encoder: Fix a memory leak
#4386
#4408
@@ -814,6 +768,12 @@
#11760
#11545
+
+ Fix possible crash with opus files with embedded cover arts and require TagLib 1.11 or newer
+ #4251
+ #4252
+ #10500
+
Audio Engine
@@ -849,7 +809,7 @@
#10497
- Fixed an assertion when loop is before track start
+ Fix an assertion when loop is before track start
#4383
#10556
@@ -944,94 +904,9 @@
#12223
- Refactoring of beatgrid/beatmap code
- #4044
- #4048
- #4045
- #4049
- #4092
- #4094
- #4104
- #4103
- #4127
- #4099
- #4071
- #4184
- #4234
- #4233
- #4258
- #4259
- #4263
- #4272
- #4268
- #4270
- #4342
- #4336
- #4409
- #4361
- #4488
- #4411
- #4498
- #4500
- #4499
- #4510
- #4607
- #11263
- #12368
- #12349
- #12071
- #12016
-
-
- Refactoring of audio engine code
- #2762
- #2801
- #2885
- #2997
- #3266
- #4064
- #4065
- #4066
- #4069
- #4074
- #4075
- #4076
- #4078
- #4082
- #4077
- #4080
- #4086
- #4089
- #4090
- #4079
- #4091
- #4083
- #4095
- #4081
- #4061
- #4105
- #4183
- #4186
- #4189
- #4216
- #4221
- #4219
- #4191
- #4232
- #4231
- #4229
- #4257
- #4266
- #4217
- #1966
- #4535
- #4770
- #4771
- #4589
- #1717
- #4852
- #10835
- #10843
+ make decks' xfader assignment persistent
+ #12074
+ #10122
@@ -1276,10 +1151,6 @@
#10540
#10539
-
- Controller preferences: add search bars to mapping tables
- #11165
-
Added TypeScript declarations for engine and controller scripting API to improve IDE code completion during mapping developent
#4759
@@ -1295,42 +1166,6 @@
#11474
#11473
-
- Prepare code for upcoming ES6 based controller mapping system with module support
- #2682
- #2868
- #2875
- #2936
- #2946
- #11953
-
-
- Other refactorings of controller code
- #2904
- #3308
- #3463
- #3634
- #3635
- #3636
- #3676
- #3880
- #4085
- #4524
- #4533
- #4521
- #4585
- #4692
- #4566
- #4599
- #4624
- #4627
- #4738
- #11160
- #11662
- #11622
- #12400
- #12468
-
feat(control): Do not show CO aliases in developer tools window
#12265
@@ -1382,67 +1217,18 @@
Repeat certain control actions if keyboard key is held
#12474
+
+ Logging: Add support for
+ QT_MESSAGE_PATTERN
+ environment variable
+ #3204
+ #3518
+
Skins
- -
- Add experimental QML user interface
- #3345
- #3446
- #3854
- #3891
- #2874
- #3915
- #3894
- #3920
- #3907
- #3925
- #3928
- #3932
- #3911
- #3937
- #3940
- #3913
- #3950
- #3919
- #3955
- #3957
- #3961
- #3952
- #3963
- #3971
- #3959
- #3972
- #3992
- #4003
- #4004
- #3999
- #4000
- #4067
- #4068
- #4060
- #4037
- #4414
- #3934
- #4117
- #4327
- #4339
- #4568
- #4576
- #4591
- #4616
- #4567
- #4629
- #4643
- #4650
- #4654
- #4673
- #4680
- #4681
- #4736
-
-
Add harmonic keywheel window
#1695
@@ -1483,6 +1269,10 @@
#4398
#10557
+ -
+ Shade: Audio Latency meter fix
+ #11601
+
-
Fix switching from Shade to other skins
#4421
@@ -1594,10 +1384,6 @@
#11975
#11957
- -
- Shade: Audio Latency meter fix
- #11601
-
-
Fix 500ms blocking of the whole event loop, when holding mouse down on title bar on Windows
#12359
@@ -1639,6 +1425,15 @@
Label
#12004
+ -
+ Implement Un-eject by pressing eject again
+ #4668
+ #11246
+
+ -
+ Implement Un-replace by double-clicking eject
+ #11246
+
Waveforms and GL Widgets
@@ -1988,500 +1783,78 @@
#12095
- macOS packaging: Enable app sandbox in unsigned 2.4 builds too
+ macOS packaging: Enable app sandbox and fix related issues
#12138
-
-
- macOS packaging: Fix regression that caused
- Sandbox::canAccess
- to fail
#12457
#12137
#11552
-
-
- macOS packaging: Fix running macOS bundle from development build directory
- #12099
-
-
- Hide applocal group from Windows installer
- #12118
- #11992
-
-
-
- Other
-
-
- -
- Improve and fix the CMake build system
- #2943
- #3046
- #3114
- #3471
- #3765
- #3849
- #3876
- #4098
- #4113
- #4166
- #4185
- #4187
- #4351
- #4423
- #4422
- #4497
- #4514
- #3550
- #4861
- #10855
- #10896
- #10926
- #11368
- #11144
- #4866
- #12442
- #12351
- #12288
- #12197
- #11754
- #11741
- #12518
-
- -
- Improve GitHub workflow continuous integration
- #2937
- #3041
- #3300
- #4007
- #4084
- #4250
- #4274
- #4313
- #4226
- #4452
- #4742
- #4741
- #4795
- #4798
- #4792
- #4829
- #4822
- #4820
- #4821
- #4818
- #4819
- #4817
- #4815
- #10938
- #11038
- #11066
- #11089
- #11156
- #11193
- #11396
- #11386
- #11414
- #12502
- #12434
- #11962
- #11945
-
- -
- Improve pre-commit hook
- #2796
- #3923
- #3948
- #3929
- #4192
- #4282
- #4278
- #4314
- #4321
- #4374
- #4494
- #4512
- #4558
- #4580
- #4743
- #10950
- #10980
- #11078
- #10929
- #11369
- #11388
- #11889
-
- -
- Improve Lauchpad PPA builds
- #4277
- #4285
- #4425
- #12347
- #11729
-
- -
- Update vcpkg build environment for Windows and macOS
- #4163
- #4225
- #4338
- #4709
- #4717
- #10872
- #10966
- #11050
- #11074
- #11238
- #11457
- #11562
- #12370
- #11733
-
- -
- Windows: Fix extraction of build environment archive when using 7-Zip
- #11510
-
- -
- Fix Windows warnings and enable "Treat all compiler warnings as errors"
- #11607
- #12417
-
- -
- Devendor libraries from the mixxx lib directory
- #4201
- #4202
- #11839
- #11742
- #11841
-
- -
- #4540
-
- -
- Update hidapi to 0.11.2
- #4783
-
- -
- Update xwax to Version 1.8
- #4597
- #10627
-
- -
- Update rigtorp/SPSCQueue
- #4678
-
- -
- macOS: Fail early if the Xcode command line tools are not installed.
- #11699
-
- -
- macOS buildenv: Improve error messages for CI-only wrappers
- #12382
-
- -
- Improve cmake first time error reporting
- #11635
- #11596
- #11597
-
- -
- Manual include #include "moc_*.cpp" to speed up build
- #11567
-
- -
- Fix building Mixxx with SDK 11
- #11766
-
- -
- chore: Fix spelling and formatting issues
- #11890
-
- -
- Prefer mold or lld as linker to speed up linking
- #11790
- #11796
-
- -
- feat: allow sanitizers on GCC as well
- #12002
-
- -
- Update manifest even if one job fails
- #12091
-
- -
- Mixxx 2.4: Fail Qt6 build not on GitHub Actions
- #12293
-
- -
- CMakeLists: Relativize
- __FILE__
- paths by default
- #12350
-
- -
- Debug: Add Rust-inspired
- DBG
- macro for quick print-debugging
- #12344
- #12383
-
- -
- Migration to Qt6 (work in progress)
- #4052
- #4295
- #4293
- #4294
- #4291
- #4290
- #4300
- #4302
- #4289
- #4292
- #4299
- #4051
- #4303
- #4305
- #4304
- #4306
- #4308
- #4309
- #4322
- #4373
- #4371
- #4375
- #4378
- #4381
- #4380
- #4376
- #4379
- #4372
- #4377
- #4387
- #4391
- #4392
- #4395
- #4397
- #4396
- #4402
- #4405
- #4394
- #4404
- #4401
- #4400
- #4403
- #4407
- #4399
- #4406
- #4420
- #4415
- #4417
- #4419
- #4416
- #4418
- #4547
- #4433
- #4434
- #4441
- #4445
- #4446
- #4444
- #4436
- #4437
- #4440
- #4430
- #4435
- #4443
- #4439
- #4442
- #4438
- #4449
- #4451
- #4453
- #4478
- #4479
- #4506
- #4556
- #4554
- #4555
- #4552
- #4549
- #4788
- #4620
- #4641
- #4649
- #4679
- #10928
- #10927
- #11063
- #11153
- #11180
- #11167
- #11181
- #11266
- #11312
- #11389
- #4393
- #12268
- #12240
- #12056
- #12430
- #12029
-
- -
- Allow to compile with precompiled headers, enabled on Windows by default
- #12381
- #12080
- #12410
- #12360
- #12352
- #12346
- #12338
- #12327
- #12308
- #12303
- #12302
- #12298
- #12229
- #12079
- #12058
- #12037
- #12024
- #12025
-
- -
- Made use of inclusive language
- #2894
- #3868
- #11017
- #11968
- #11959
- #11942
-
- -
- Improve the unit tests
- #2938
- #2980
- #3006
- #4345
-
- -
- Logging: Add support for
- QT_MESSAGE_PATTERN
- environment variable
- #3204
- #3518
-
- -
- Colored logging console output
- #3197
-
- -
- Improve command line argument parser
- #3640
- #3962
- #4022
- #4036
- #4170
- #4057
-
- -
- Improve message when dealing with macOS sandbox
#4018
#10373
-
- Moved contribution guidelines into our git repository
- #2699
-
- -
- Make windows_buildenv.bat work with spaces in path
- #4896
-
- -
- Automate deployment of CHANGELOG to the manual
- #4180
- #4256
- #4208
- #4228
- #4222
-
- -
- Always show tooltips in preferences
- #4198
- #9716
-
- -
- Allow to build Mixxx on Linux without ALSA, working around a Pipewire bug
- #4242
-
- -
- Fix possible crash with opus files with embedded cover arts and require TagLib 1.11 or newer
- #4251
- #4252
- #10500
-
- -
- DlgTrackInfo: Fixed a SIGSEGV after a debug assertion
- #4316
-
- -
- Library Preferences: Added link to settings files info in the manual
- #4367
-
- -
- Use rounded Mixxx Icon for MacOS to follow Apples style guide
+ macOS: Use rounded Mixxx Icon to follow Apples style guide
#4545
+ #10958
-
- Show native path separators in command line argument --help
- #4657
-
- -
- Add 13 new translation languages
- #4785
- #9702
-
- -
- Fix translation related warnings
- #11539
+ OpenBSD: Allow building Mixxx
+ #11083
-
- Remove redundant
- cmn
- translation in favor of
- zh
- #11793
- #11791
+ Improve Linux launcher
+ #11826
+ #11820
+ #11805
+ #12424
+
+
+ Track properties
+
+
-
- Improve Vinyl control quality indicator
- #3279
+ Fix a SIGSEGV after a debug assertion
+ #4316
-
- Track info dialog: Apply pending changes also when saving via hotkey
+ Apply pending changes also when saving via hotkey
#4562
#10612
-
- Track info dialog: Fix crash when trying to scale 0.0 BPM
+ Fix crash when trying to scale 0.0 BPM
#4587
#1955853
-
- Track info dialog: Add track color selector
+ Add track color selector
#11436
#10324
-
- Tweak remove/hide track confirm message to match confirm exit message
- #4577
- #1947992
+ Don't clear unsaved properties when updating star rating
+ #11565
+ #11540
-
- Implement Un-eject by pressing eject again
- #4668
- #11246
+ Focus Double-clicked property field for edit
+ #11764
+ #11804
+ #11802
+
+ -
+ Display the samplerate
+ #12418
+
+
+
+ Preferences
+
+
+ -
+ Always show tooltips in preferences
+ #4198
+ #9716
-
Preferences > Effects: Fix Tab key navigation / UX
@@ -2527,6 +1900,10 @@
macOS: fix slider styling in preferences dialog
#11647
+ -
+ Preferences Vinyl control Improve quality indicator
+ #3279
+
-
Preferences > Mixer: apply & save settings only in slotApply(), fix bugs, improve UX
#11527
@@ -2545,214 +1922,17 @@
#11926
-
- macOS: Add better rasterization of program icon
- #10958
-
- -
- make decks' xfader assignment persistent
- #12074
- #10122
-
- -
- Allow building Mixxx on OpenBSD
- #11083
-
- -
- Fix autogenerated metainfo
- #11383
-
- -
- Fix setting the wrong default cue color
- #11554
- #11260
-
- -
- (fix) linux launcher: add missing quote to command line
- #11826
- #11820
-
- -
- Delete obsolete -platform xcb args
- #11805
+ Library Preferences: Added link to settings files info in the manual
+ #4367
-
- A small fix to .desktop file that improves Gnome dock integration on
- #12424
+ Controller preferences: add search bars to mapping tables
+ #11165
-
- Replace Launchpad bugs by GitHub issues
- #10850
- #10865
- #4877
- #11270
- #11377
- #11379
-
- -
- Misc. refactorings
- #3154
- #2870
- #2872
- #2978
- #2969
- #3016
- #3320
- #3356
- #3453
- #3487
- #3558
- #3685
- #3741
- #3744
- #3753
- #3761
- #3834
- #3842
- #3853
- #3874
- #3883
- #3922
- #3947
- #3974
- #4024
- #4026
- #4034
- #4038
- #4039
- #4043
- #4053
- #4072
- #4097
- #4096
- #4118
- #4130
- #4129
- #4109
- #4106
- #4131
- #4140
- #3032
- #4110
- #4173
- #4178
- #4194
- #4197
- #4190
- #4212
- #4223
- #4238
- #4236
- #4320
- #4325
- #4203
- #3861
- #3514
- #3274
- #3182
- #4343
- #4358
- #4388
- #4427
- #4341
- #4473
- #4464
- #4481
- #4527
- #4534
- #4537
- #4539
- #4541
- #4543
- #4546
- #4542
- #4559
- #4574
- #4581
- #4582
- #4598
- #4596
- #4592
- #4784
- #4604
- #4603
- #4611
- #4605
- #4583
- #4636
- #4644
- #4653
- #4655
- #4609
- #4647
- #4660
- #4663
- #4661
- #4670
- #4672
- #4674
- #4618
- #4690
- #4724
- #4730
- #4731
- #4732
- #4728
- #4737
- #4739
- #4745
- #4765
- #4767
- #4797
- #4782
- #4800
- #4791
- #4848
- #4856
- #4860
- #4867
- #4888
- #4908
- #4903
- #8818
- #4907
- #10897
- #10964
- #10963
- #11048
- #11149
- #11169
- #11318
- #11331
- #11338
- #4651
- #11336
- #11282
- #11421
- #11431
- #11434
- #11301
- #11688
- #11685
- #12000
- #12003
- #11684
- #12031
- #12008
- #12054
- #11768
- #11893
- #11636
- #12026
- #12230
- #12375
- #11619
- #11917
- #11936
- #12033
- #12263
- #12212
- #12066
- #12065
+ Add 13 new translation languages
+ #4785
+ #9702
@@ -2768,7 +1948,7 @@
#11094
- Different, language depending library sorting on macOS
+ macOS: Library entries are now sorted using the language depending Unicode Collation Algorithm (UCA).
#12517
diff --git a/src/dialog/dlgabout.cpp b/src/dialog/dlgabout.cpp
index 63cba7c7ac2..d88b661faab 100644
--- a/src/dialog/dlgabout.cpp
+++ b/src/dialog/dlgabout.cpp
@@ -49,100 +49,71 @@ DlgAbout::DlgAbout()
thisReleaseDevelopers
<< "RJ Skerry-Ryan"
<< "Owen Williams"
- << "Sean Pappalardo"
<< "Daniel Schürmann"
- << "S. Brandt"
- << "Uwe Klotz"
<< "Be"
<< "Sébastien Blaisot"
<< "ronso0"
<< "Jan Holthuis"
- << "Nikolaus Einhauser";
+ << "Nikolaus Einhauser"
+ << "Ferran Pujol Camins"
+ << "Jörg Wartenberg"
+ << "Fredrik Wieczerkowski"
+ << "Maarten de Boer";
// This list should contains all contributors committed
// code to the Mixxx core within the past two years.
// New Contributors are added at the end.
QStringList recentContributors;
recentContributors
- << "Tuukka Pasanen"
+ << "Uwe Klotz"
<< "Nino MP"
- << "Ferran Pujol Camins"
- << "Josep Maria Antolín Segura"
+ << "Dávid Szakállas"
<< "Daniel Poelzleithner"
- << "Stéphane Lepin"
<< "luzpaz"
- << "Bernd Binder"
- << "Pradyuman"
- << "Nik Martin"
- << "Kerrick Staley"
- << "Raphael Graf"
- << "Nik Martin"
- << "YunQiang Su"
+ << "Kshitij Gupta"
<< "Sebastian Hasler"
<< "Philip Gottschling"
- << "Melissa"
- << "Ned Haughton"
<< "Adam Szmigin"
- << "Cristiano Lacerda"
- << "Sergey Ukolov"
- << "Ketan Lambat"
<< "Evan Dekker"
- << "Edward Kigwana"
- << "Simon Harst"
<< "Harshit Maurya"
<< "Janek Fischer"
- << "Stéphane Lepin"
- << "Jérôme Blanchi"
- << "Chris Hills"
- << "David Lowenfels"
- << "Matthieu Bouron"
- << "Nathan Korth"
+ << "Matthias Beyer"
<< "Kristiyan Katsarov"
- << "Jörg Wartenberg"
<< "Sanskar Bajpai"
- << "Edward Millen"
- << "Frank Breitling"
<< "Christian"
<< "Geraldo Nascimento"
- << "Albert Aparicio"
- << "Pierre Le Gall"
- << "David Baker"
- << "Justin Kourie"
- << "Waylon Robertson"
- << "Al Hadebe"
<< "Javier Vilarroig"
- << "Balló György"
- << "Pino Toscano"
- << "Alexander Horner"
- << "Michael Ehlen"
- << "Alice Midori"
- << "h67ma"
+ << "Allen Wittenauer"
+ << "Raphael Bigal"
+ << "Filok"
<< "tcoyvwac"
+ << "Gary Tunstall"
<< "Tobias Oszlanyi (OsZ)"
- << "Fredrik Wieczerkowski"
<< "Viktor Gal"
<< "Matyáš Bobek"
<< "Mr. Rincewind"
<< "Stefan Nürnberger"
<< "motific"
<< "Fatih Emre YILDIZ"
- << "Vincent Duez-Dellac"
+ << "Neil Naveen"
<< "Javier Vilalta"
<< "David Chocholatý"
<< "Fabian Wolter"
<< "Matteo Gheza"
<< "Michael Bacarella"
- << "Somesh Metri"
- << "Maarten de Boer"
- << "Doteya"
- << "olafklingt"
<< "Bilal Ahmed Karbelkar"
<< "Alice Psykose"
<< "Jakob Leifhelm"
<< "Florian Goth"
<< "Chase Durand"
+ << "Antoine Colombier"
<< "John Last"
- << "Robbert van der Helm";
+ << "Saksham Hans"
+ << "Robbert van der Helm"
+ << "Andrew Burns"
+ << "Michael Wigard"
+ << "djantti"
+ << "Eugene Erokhin";
QStringList specialThanks;
specialThanks
@@ -191,7 +162,10 @@ DlgAbout::DlgAbout()
<< "Ilkka Tuohela"
<< "Max Linke"
<< "Marcos Cardinot"
- << "Nicu Badescu";
+ << "Nicu Badescu"
+ << "Uwe Klotz"
+ << "Sean Pappalardo"
+ << "S. Brandt";
QStringList pastContributors;
pastContributors
@@ -356,12 +330,49 @@ DlgAbout::DlgAbout()
<< "Nico Schlömer"
<< "Joan Marcè i Igual"
<< "Stefan Weber"
- << "Kshitij Gupta"
<< "Matthew Nicholson"
<< "Jamie Gifford"
<< "Sebastian Reuße"
<< "Paweł Goliński"
- << "beenisss";
+ << "beenisss"
+ << "Tuukka Pasanen"
+ << "Josep Maria Antolín Segura"
+ << "Stéphane Lepin"
+ << "Bernd Binder"
+ << "Pradyuman"
+ << "Nik Martin"
+ << "Kerrick Staley"
+ << "Raphael Graf"
+ << "YunQiang Su"
+ << "Melissa"
+ << "Ned Haughton"
+ << "Cristiano Lacerda"
+ << "Ketan Lambat"
+ << "Edward Kigwana"
+ << "Simon Harst"
+ << "Jérôme Blanchi"
+ << "Chris Hills"
+ << "David Lowenfels"
+ << "Matthieu Bouron"
+ << "Nathan Korth"
+ << "Edward Millen"
+ << "Frank Breitling"
+ << "Albert Aparicio"
+ << "Pierre Le Gall"
+ << "David Baker"
+ << "Justin Kourie"
+ << "Waylon Robertson"
+ << "Al Hadebe"
+ << "Balló György"
+ << "Pino Toscano"
+ << "Alexander Horner"
+ << "Michael Ehlen"
+ << "Alice Midori"
+ << "h67ma"
+ << "Vincent Duez-Dellac"
+ << "Somesh Metri"
+ << "Doteya"
+ << "olafklingt";
QString sectionTemplate = QString(
"%1
%2
");
diff --git a/src/library/dlgtagfetcher.cpp b/src/library/dlgtagfetcher.cpp
index 4243d6e1289..1b45b4f67c7 100644
--- a/src/library/dlgtagfetcher.cpp
+++ b/src/library/dlgtagfetcher.cpp
@@ -91,13 +91,37 @@ QStringList trackReleaseColumnValues(
return columnValues;
}
-void addTrack(
+void addTagRow(
const QStringList& trackRow,
int tagIndex,
QTreeWidget* pParent) {
QTreeWidgetItem* pItem = new QTreeWidgetItem(pParent, trackRow);
pItem->setData(0, Qt::UserRole, tagIndex);
pItem->setData(0, Qt::TextAlignmentRole, Qt::AlignLeft);
+ if (tagIndex == kOriginalTrackIndex) {
+ // Disable the original tag row so it can't be selected.
+ // Only setDisabled() prevents currentItemChanged() signal, removing the
+ // Qt::ItemIsSelectable is not sufficient.
+ // Store the normal text brush
+ const auto brush = pParent->palette().windowText();
+ pItem->setDisabled(true);
+ // Restore the normal text color to ensure the tags are readable
+ for (int col = 0; col < pItem->columnCount(); col++) {
+ pItem->setForeground(col, brush);
+ }
+ }
+}
+
+void addDivider(const QString& text, QTreeWidget* pParent) {
+ QTreeWidgetItem* pItem = new QTreeWidgetItem(pParent);
+ pItem->setFirstColumnSpanned(true);
+ pItem->setText(0, text);
+ pItem->setFlags(Qt::NoItemFlags);
+ pItem->setForeground(0, pParent->palette().color(QPalette::Disabled, QPalette::Text));
+
+ QFont bold_font(pParent->font());
+ bold_font.setBold(true);
+ pItem->setFont(0, bold_font);
}
void updateOriginalTag(const Track& track, QTreeWidget* pParent) {
@@ -144,8 +168,7 @@ void DlgTagFetcher::init() {
btnPrev->hide();
}
- connect(btnApply, &QPushButton::clicked, this, &DlgTagFetcher::applyTagsAndCover);
- connect(btnApplyCover, &QPushButton::clicked, this, &DlgTagFetcher::applyCover);
+ connect(btnApply, &QPushButton::clicked, this, &DlgTagFetcher::apply);
connect(btnQuit, &QPushButton::clicked, this, &DlgTagFetcher::quit);
connect(btnRetry, &QPushButton::clicked, this, &DlgTagFetcher::retry);
connect(tags, &QTreeWidget::currentItemChanged, this, &DlgTagFetcher::tagSelected);
@@ -168,7 +191,11 @@ void DlgTagFetcher::init() {
loadingProgressBar->setMaximum(kMaximumValueOfQProgressBar);
btnRetry->setDisabled(true);
- btnApplyCover->setDisabled(true);
+
+ int iApplyTags = m_pConfig->getValue(mixxx::library::prefs::kTagFetcherApplyTagsConfigKey, 1);
+ int iApplyCover = m_pConfig->getValue(mixxx::library::prefs::kTagFetcherApplyCoverConfigKey, 1);
+ checkBoxTags->setChecked(iApplyTags == 1);
+ checkBoxCover->setChecked(iApplyCover == 1);
CoverArtCache* pCache = CoverArtCache::instance();
if (pCache) {
@@ -238,12 +265,13 @@ void DlgTagFetcher::loadTrack(const TrackPointer& pTrack) {
btnRetry->setDisabled(true);
btnApply->setDisabled(true);
- btnApplyCover->setDisabled(true);
+ checkBoxTags->setDisabled(true);
+ checkBoxCover->setDisabled(true);
statusMessage->setVisible(false);
loadingProgressBar->setVisible(true);
loadingProgressBar->setValue(kMinimumValueOfQProgressBar);
addDivider(tr("Original tags"), tags);
- addTrack(trackColumnValues(*m_pTrack), kOriginalTrackIndex, tags);
+ addTagRow(trackColumnValues(*m_pTrack), kOriginalTrackIndex, tags);
connect(m_pTrack.get(),
&Track::changed,
@@ -266,7 +294,20 @@ void DlgTagFetcher::slotTrackChanged(TrackId trackId) {
}
}
-void DlgTagFetcher::applyTagsAndCover() {
+void DlgTagFetcher::apply() {
+ if (checkBoxTags->isChecked()) {
+ applyTags();
+ statusMessage->setText(tr("Metadata applied"));
+ }
+ // If only/also the cover shall be updated (and the worker succeeds) the
+ // delayed slotWorkerCoverArtUpdated() will (over)write the status message,
+ // so let slot take care of updating the status message accordingly.
+ if (checkBoxCover->isChecked()) {
+ applyCover();
+ }
+}
+
+void DlgTagFetcher::applyTags() {
int tagIndex = m_data.m_selectedTag;
if (tagIndex < 0) {
return;
@@ -330,16 +371,12 @@ void DlgTagFetcher::applyTagsAndCover() {
}
#endif // __EXTRA_METADATA__
- applyCover();
-
m_pTrack->replaceMetadataFromSource(
std::move(trackMetadata),
// Prevent re-import of outdated metadata from file tags
// by explicitly setting the synchronization time stamp
// to the current time.
QDateTime::currentDateTimeUtc());
-
- statusMessage->setText(tr("Metadata & Cover Art applied"));
}
void DlgTagFetcher::applyCover() {
@@ -393,21 +430,31 @@ void DlgTagFetcher::applyCover() {
void DlgTagFetcher::retry() {
btnRetry->setDisabled(true);
btnApply->setDisabled(true);
- btnApplyCover->setDisabled(true);
+ checkBoxTags->setDisabled(true);
+ checkBoxCover->setDisabled(true);
loadingProgressBar->setValue(kMinimumValueOfQProgressBar);
m_tagFetcher.startFetch(m_pTrack);
}
void DlgTagFetcher::quit() {
m_tagFetcher.cancel();
+ saveCheckBoxState();
accept();
}
void DlgTagFetcher::reject() {
m_tagFetcher.cancel();
+ saveCheckBoxState();
accept();
}
+void DlgTagFetcher::saveCheckBoxState() {
+ m_pConfig->set(mixxx::library::prefs::kTagFetcherApplyTagsConfigKey,
+ ConfigValue(checkBoxTags->isChecked()));
+ m_pConfig->set(mixxx::library::prefs::kTagFetcherApplyCoverConfigKey,
+ ConfigValue(checkBoxCover->isChecked()));
+}
+
void DlgTagFetcher::showProgressOfConstantTask(const QString& text) {
QString status = tr("%1");
loadingProgressBar->setFormat(status.arg(text));
@@ -444,8 +491,9 @@ void DlgTagFetcher::fetchTagFinished(
return;
} else {
btnApply->setDisabled(true);
- btnApplyCover->setDisabled(true);
btnRetry->setDisabled(true);
+ checkBoxTags->setDisabled(true);
+ checkBoxCover->setDisabled(true);
loadingProgressBar->setVisible(false);
statusMessage->setVisible(true);
@@ -462,7 +510,7 @@ void DlgTagFetcher::fetchTagFinished(
// Add fetched tag into TreeItemWidget, if it is not added before
if (!allColumnValues.contains(columnValues)) {
allColumnValues.insert(columnValues);
- addTrack(columnValues, trackIndex, tags);
+ addTagRow(columnValues, trackIndex, tags);
}
++trackIndex;
}
@@ -497,31 +545,23 @@ void DlgTagFetcher::slotNetworkResult(
return;
}
-void DlgTagFetcher::addDivider(const QString& text, QTreeWidget* pParent) const {
- QTreeWidgetItem* pItem = new QTreeWidgetItem(pParent);
- pItem->setFirstColumnSpanned(true);
- pItem->setText(0, text);
- pItem->setFlags(Qt::NoItemFlags);
- pItem->setForeground(0, palette().color(QPalette::Disabled, QPalette::Text));
-
- QFont bold_font(font());
- bold_font.setBold(true);
- pItem->setFont(0, bold_font);
-}
-
void DlgTagFetcher::tagSelected() {
if (!tags->currentItem()) {
btnApply->setDisabled(true);
+ checkBoxTags->setDisabled(true);
+ checkBoxCover->setDisabled(true);
return;
}
if (tags->currentItem()->data(0, Qt::UserRole).toInt() == kOriginalTrackIndex) {
tags->currentItem()->setFlags(Qt::ItemIsEnabled);
btnApply->setDisabled(true);
+ checkBoxTags->setDisabled(true);
return;
}
// Allow applying the tags, regardless the cover art
btnApply->setEnabled(true);
+ checkBoxTags->setEnabled(true);
const int tagIndex = tags->currentItem()->data(0, Qt::UserRole).toInt();
m_data.m_selectedTag = tagIndex;
@@ -530,7 +570,6 @@ void DlgTagFetcher::tagSelected() {
m_pWFetchedCoverArtLabel->loadData(QByteArray());
m_pWFetchedCoverArtLabel->setCoverArt(CoverInfo{},
QPixmap(CoverArtUtils::defaultCoverLocation()));
- btnApplyCover->setDisabled(true);
const mixxx::musicbrainz::TrackRelease& trackRelease = m_data.m_tags[tagIndex];
QUuid selectedTagAlbumId = trackRelease.albumReleaseId;
@@ -600,7 +639,7 @@ void DlgTagFetcher::slotLoadBytesToLabel(const QByteArray& data) {
m_fetchedCoverArtByteArrays); // This data loaded because for full size.
m_pWFetchedCoverArtLabel->setCoverArt(coverInfo, fetchedCoverArtPixmap);
- btnApplyCover->setDisabled(data.isNull());
+ checkBoxCover->setEnabled(!data.isNull());
}
void DlgTagFetcher::getCoverArt(const QString& url) {
@@ -613,6 +652,7 @@ void DlgTagFetcher::slotCoverArtLinkNotFound() {
loadingProgressBar->setVisible(false);
statusMessage->setText(tr("Cover Art is not available for selected metadata"));
statusMessage->setVisible(true);
+ checkBoxCover->setDisabled(true);
}
void DlgTagFetcher::slotWorkerStarted() {
@@ -623,7 +663,14 @@ void DlgTagFetcher::slotWorkerCoverArtUpdated(const CoverInfoRelative& coverInfo
qDebug() << "DlgTagFetcher::slotWorkerCoverArtUpdated" << coverInfo;
m_pTrack->setCoverInfo(coverInfo);
loadCurrentTrackCover();
- statusMessage->setText(tr("Selected cover art applied"));
+ // If 'Tags' was checked those were already applied by now.
+ // Update the status message now accordingly.
+ // Assumes the checkbox wasn't toggled since hitting Apply
+ if (checkBoxTags->isChecked()) {
+ statusMessage->setText(tr("Metadata & Cover Art applied"));
+ } else {
+ statusMessage->setText(tr("Selected cover art applied"));
+ }
}
void DlgTagFetcher::slotWorkerAskOverwrite(const QString& coverArtAbsolutePath,
diff --git a/src/library/dlgtagfetcher.h b/src/library/dlgtagfetcher.h
index fe373a832b5..e247e40af90 100644
--- a/src/library/dlgtagfetcher.h
+++ b/src/library/dlgtagfetcher.h
@@ -49,7 +49,8 @@ class DlgTagFetcher : public QDialog, public Ui::DlgTagFetcher {
void slotNetworkResult(int httpStatus, const QString& app, const QString& message, int code);
// Called when apply is pressed.
void slotTrackChanged(TrackId trackId);
- void applyTagsAndCover();
+ void apply();
+ void applyTags();
void applyCover();
void retry();
void quit();
@@ -73,10 +74,11 @@ class DlgTagFetcher : public QDialog, public Ui::DlgTagFetcher {
private:
// Called on population or changed via buttons Next&Prev.
void loadTrackInternal(const TrackPointer& pTrack);
- void addDivider(const QString& text, QTreeWidget* pParent) const;
void getCoverArt(const QString& url);
void loadCurrentTrackCover();
+ void saveCheckBoxState();
+
UserSettingsPointer m_pConfig;
const TrackModel* const m_pTrackModel;
diff --git a/src/library/dlgtagfetcher.ui b/src/library/dlgtagfetcher.ui
index acb163cc4d8..b97d05d1518 100644
--- a/src/library/dlgtagfetcher.ui
+++ b/src/library/dlgtagfetcher.ui
@@ -296,13 +296,6 @@
- -
-
-
- Apply Cover
-
-
-
-
@@ -409,6 +402,20 @@
+ -
+
+
+ Tags
+
+
+
+ -
+
+
+ Cover
+
+
+
-
@@ -435,7 +442,8 @@
submit_tree
btnPrev
btnNext
- btnApplyCover
+ checkBoxTags
+ checkBoxCover
btnApply
btnQuit
btnRetry
diff --git a/src/library/library_prefs.cpp b/src/library/library_prefs.cpp
index bf8265f7cb6..a10136763c8 100644
--- a/src/library/library_prefs.cpp
+++ b/src/library/library_prefs.cpp
@@ -89,3 +89,13 @@ const ConfigKey mixxx::library::prefs::kCoverArtFetcherQualityConfigKey =
ConfigKey{
mixxx::library::prefs::kConfigGroup,
QStringLiteral("CoverArtFetcherQuality")};
+
+const ConfigKey mixxx::library::prefs::kTagFetcherApplyTagsConfigKey =
+ ConfigKey{
+ mixxx::library::prefs::kConfigGroup,
+ QStringLiteral("TagFetcherApplyTags")};
+
+const ConfigKey mixxx::library::prefs::kTagFetcherApplyCoverConfigKey =
+ ConfigKey{
+ mixxx::library::prefs::kConfigGroup,
+ QStringLiteral("TagFetcherApplyCover")};
diff --git a/src/library/library_prefs.h b/src/library/library_prefs.h
index b6f9f91f4f0..6750582b6d3 100644
--- a/src/library/library_prefs.h
+++ b/src/library/library_prefs.h
@@ -48,6 +48,10 @@ extern const ConfigKey kUseRelativePathOnExportConfigKey;
extern const ConfigKey kCoverArtFetcherQualityConfigKey;
+extern const ConfigKey kTagFetcherApplyTagsConfigKey;
+
+extern const ConfigKey kTagFetcherApplyCoverConfigKey;
+
} // namespace prefs
} // namespace library