diff --git a/res/images/preferences/dark/ic_preferences_autodj.svg b/res/images/preferences/dark/ic_preferences_autodj.svg
new file mode 100644
index 000000000000..2ff8701be13c
--- /dev/null
+++ b/res/images/preferences/dark/ic_preferences_autodj.svg
@@ -0,0 +1,13 @@
+
diff --git a/res/images/preferences/dark/ic_preferences_bpmdetect.svg b/res/images/preferences/dark/ic_preferences_bpmdetect.svg
new file mode 100644
index 000000000000..25ecf03c0c14
--- /dev/null
+++ b/res/images/preferences/dark/ic_preferences_bpmdetect.svg
@@ -0,0 +1,7 @@
+
diff --git a/res/images/preferences/dark/ic_preferences_broadcast.svg b/res/images/preferences/dark/ic_preferences_broadcast.svg
new file mode 100644
index 000000000000..05bb64fb88a9
--- /dev/null
+++ b/res/images/preferences/dark/ic_preferences_broadcast.svg
@@ -0,0 +1,12 @@
+
diff --git a/res/images/preferences/dark/ic_preferences_colors.svg b/res/images/preferences/dark/ic_preferences_colors.svg
new file mode 100644
index 000000000000..214b78d58fb3
--- /dev/null
+++ b/res/images/preferences/dark/ic_preferences_colors.svg
@@ -0,0 +1,7 @@
+
diff --git a/res/images/preferences/dark/ic_preferences_controllers.svg b/res/images/preferences/dark/ic_preferences_controllers.svg
new file mode 100644
index 000000000000..fc34415d2e1f
--- /dev/null
+++ b/res/images/preferences/dark/ic_preferences_controllers.svg
@@ -0,0 +1,4 @@
+
diff --git a/res/images/preferences/dark/ic_preferences_crossfader.svg b/res/images/preferences/dark/ic_preferences_crossfader.svg
new file mode 100644
index 000000000000..d70d4f6fb8d4
--- /dev/null
+++ b/res/images/preferences/dark/ic_preferences_crossfader.svg
@@ -0,0 +1,8 @@
+
diff --git a/res/images/preferences/dark/ic_preferences_decks.svg b/res/images/preferences/dark/ic_preferences_decks.svg
new file mode 100644
index 000000000000..e2e6d721a955
--- /dev/null
+++ b/res/images/preferences/dark/ic_preferences_decks.svg
@@ -0,0 +1,4 @@
+
diff --git a/res/images/preferences/dark/ic_preferences_effects.svg b/res/images/preferences/dark/ic_preferences_effects.svg
new file mode 100644
index 000000000000..9a292ee13b68
--- /dev/null
+++ b/res/images/preferences/dark/ic_preferences_effects.svg
@@ -0,0 +1,6 @@
+
diff --git a/res/images/preferences/dark/ic_preferences_equalizers.svg b/res/images/preferences/dark/ic_preferences_equalizers.svg
new file mode 100644
index 000000000000..add3b2f0f256
--- /dev/null
+++ b/res/images/preferences/dark/ic_preferences_equalizers.svg
@@ -0,0 +1,15 @@
+
diff --git a/res/images/preferences/dark/ic_preferences_interface.svg b/res/images/preferences/dark/ic_preferences_interface.svg
new file mode 100644
index 000000000000..2e3209eca992
--- /dev/null
+++ b/res/images/preferences/dark/ic_preferences_interface.svg
@@ -0,0 +1,13 @@
+
diff --git a/res/images/preferences/dark/ic_preferences_keydetect.svg b/res/images/preferences/dark/ic_preferences_keydetect.svg
new file mode 100644
index 000000000000..86c71d68b3a7
--- /dev/null
+++ b/res/images/preferences/dark/ic_preferences_keydetect.svg
@@ -0,0 +1,8 @@
+
diff --git a/res/images/preferences/dark/ic_preferences_library.svg b/res/images/preferences/dark/ic_preferences_library.svg
new file mode 100644
index 000000000000..8788cd5e9644
--- /dev/null
+++ b/res/images/preferences/dark/ic_preferences_library.svg
@@ -0,0 +1,14 @@
+
diff --git a/res/images/preferences/dark/ic_preferences_lv2.svg b/res/images/preferences/dark/ic_preferences_lv2.svg
new file mode 100644
index 000000000000..2f13a81b5ad2
--- /dev/null
+++ b/res/images/preferences/dark/ic_preferences_lv2.svg
@@ -0,0 +1,4 @@
+
diff --git a/res/images/preferences/dark/ic_preferences_midicontrollers.svg b/res/images/preferences/dark/ic_preferences_midicontrollers.svg
new file mode 100644
index 000000000000..142a8779701a
--- /dev/null
+++ b/res/images/preferences/dark/ic_preferences_midicontrollers.svg
@@ -0,0 +1,13 @@
+
diff --git a/res/images/preferences/dark/ic_preferences_modplug.svg b/res/images/preferences/dark/ic_preferences_modplug.svg
new file mode 100644
index 000000000000..302e03632b5e
--- /dev/null
+++ b/res/images/preferences/dark/ic_preferences_modplug.svg
@@ -0,0 +1,12 @@
+
diff --git a/res/images/preferences/dark/ic_preferences_recording.svg b/res/images/preferences/dark/ic_preferences_recording.svg
new file mode 100644
index 000000000000..0b731101e420
--- /dev/null
+++ b/res/images/preferences/dark/ic_preferences_recording.svg
@@ -0,0 +1,4 @@
+
diff --git a/res/images/preferences/dark/ic_preferences_replaygain.svg b/res/images/preferences/dark/ic_preferences_replaygain.svg
new file mode 100644
index 000000000000..22cbef665ced
--- /dev/null
+++ b/res/images/preferences/dark/ic_preferences_replaygain.svg
@@ -0,0 +1,9 @@
+
diff --git a/res/images/preferences/dark/ic_preferences_sampler.svg b/res/images/preferences/dark/ic_preferences_sampler.svg
new file mode 100644
index 000000000000..c3e3f5d8b84e
--- /dev/null
+++ b/res/images/preferences/dark/ic_preferences_sampler.svg
@@ -0,0 +1,4 @@
+
diff --git a/res/images/preferences/dark/ic_preferences_soundhardware.svg b/res/images/preferences/dark/ic_preferences_soundhardware.svg
new file mode 100644
index 000000000000..39c62ff9ea68
--- /dev/null
+++ b/res/images/preferences/dark/ic_preferences_soundhardware.svg
@@ -0,0 +1,13 @@
+
diff --git a/res/images/preferences/dark/ic_preferences_vinyl.svg b/res/images/preferences/dark/ic_preferences_vinyl.svg
new file mode 100644
index 000000000000..391c105652ab
--- /dev/null
+++ b/res/images/preferences/dark/ic_preferences_vinyl.svg
@@ -0,0 +1,10 @@
+
diff --git a/res/images/preferences/dark/ic_preferences_waveforms.svg b/res/images/preferences/dark/ic_preferences_waveforms.svg
new file mode 100644
index 000000000000..cc25285087f7
--- /dev/null
+++ b/res/images/preferences/dark/ic_preferences_waveforms.svg
@@ -0,0 +1,4 @@
+
diff --git a/res/images/preferences/ic_preferences_autodj.svg b/res/images/preferences/ic_preferences_autodj.svg
deleted file mode 100644
index 40683a2bb1a5..000000000000
--- a/res/images/preferences/ic_preferences_autodj.svg
+++ /dev/null
@@ -1,375 +0,0 @@
-
-
diff --git a/res/images/preferences/ic_preferences_bpmdetect.svg b/res/images/preferences/ic_preferences_bpmdetect.svg
deleted file mode 100644
index fe70517e1baf..000000000000
--- a/res/images/preferences/ic_preferences_bpmdetect.svg
+++ /dev/null
@@ -1,365 +0,0 @@
-
-
diff --git a/res/images/preferences/ic_preferences_broadcast.svg b/res/images/preferences/ic_preferences_broadcast.svg
deleted file mode 100644
index 80eefee4e14d..000000000000
--- a/res/images/preferences/ic_preferences_broadcast.svg
+++ /dev/null
@@ -1,419 +0,0 @@
-
-
diff --git a/res/images/preferences/ic_preferences_colors.svg b/res/images/preferences/ic_preferences_colors.svg
deleted file mode 100644
index cb7199750b8f..000000000000
--- a/res/images/preferences/ic_preferences_colors.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
diff --git a/res/images/preferences/ic_preferences_controllers.svg b/res/images/preferences/ic_preferences_controllers.svg
deleted file mode 100644
index ce6b0b94554b..000000000000
--- a/res/images/preferences/ic_preferences_controllers.svg
+++ /dev/null
@@ -1,405 +0,0 @@
-
-
diff --git a/res/images/preferences/ic_preferences_crossfader.svg b/res/images/preferences/ic_preferences_crossfader.svg
deleted file mode 100644
index 9c995c0aac59..000000000000
--- a/res/images/preferences/ic_preferences_crossfader.svg
+++ /dev/null
@@ -1,487 +0,0 @@
-
-
diff --git a/res/images/preferences/ic_preferences_decks.svg b/res/images/preferences/ic_preferences_decks.svg
deleted file mode 100644
index 610d154e3946..000000000000
--- a/res/images/preferences/ic_preferences_decks.svg
+++ /dev/null
@@ -1,615 +0,0 @@
-
-
diff --git a/res/images/preferences/ic_preferences_effects.svg b/res/images/preferences/ic_preferences_effects.svg
deleted file mode 100644
index 4c0effcf8c93..000000000000
--- a/res/images/preferences/ic_preferences_effects.svg
+++ /dev/null
@@ -1,486 +0,0 @@
-
-
diff --git a/res/images/preferences/ic_preferences_equalizers.svg b/res/images/preferences/ic_preferences_equalizers.svg
deleted file mode 100644
index 6ffaa6b61eef..000000000000
--- a/res/images/preferences/ic_preferences_equalizers.svg
+++ /dev/null
@@ -1,796 +0,0 @@
-
-
diff --git a/res/images/preferences/ic_preferences_interface.svg b/res/images/preferences/ic_preferences_interface.svg
deleted file mode 100644
index 7dfcf4db4a52..000000000000
--- a/res/images/preferences/ic_preferences_interface.svg
+++ /dev/null
@@ -1,646 +0,0 @@
-
-
diff --git a/res/images/preferences/ic_preferences_keydetect.svg b/res/images/preferences/ic_preferences_keydetect.svg
deleted file mode 100644
index c65160da675d..000000000000
--- a/res/images/preferences/ic_preferences_keydetect.svg
+++ /dev/null
@@ -1,512 +0,0 @@
-
-
diff --git a/res/images/preferences/ic_preferences_library.svg b/res/images/preferences/ic_preferences_library.svg
deleted file mode 100644
index 098833b7bed8..000000000000
--- a/res/images/preferences/ic_preferences_library.svg
+++ /dev/null
@@ -1,538 +0,0 @@
-
-
diff --git a/res/images/preferences/ic_preferences_lv2.svg b/res/images/preferences/ic_preferences_lv2.svg
deleted file mode 100644
index 407f50ed0c6e..000000000000
--- a/res/images/preferences/ic_preferences_lv2.svg
+++ /dev/null
@@ -1,436 +0,0 @@
-
-
diff --git a/res/images/preferences/ic_preferences_midicontrollers.svg b/res/images/preferences/ic_preferences_midicontrollers.svg
deleted file mode 100644
index 4bda7004c968..000000000000
--- a/res/images/preferences/ic_preferences_midicontrollers.svg
+++ /dev/null
@@ -1,560 +0,0 @@
-
-
diff --git a/res/images/preferences/ic_preferences_modplug.svg b/res/images/preferences/ic_preferences_modplug.svg
deleted file mode 100644
index 694e005d6cff..000000000000
--- a/res/images/preferences/ic_preferences_modplug.svg
+++ /dev/null
@@ -1,503 +0,0 @@
-
-
diff --git a/res/images/preferences/ic_preferences_recording.svg b/res/images/preferences/ic_preferences_recording.svg
deleted file mode 100644
index 1a3a1979f820..000000000000
--- a/res/images/preferences/ic_preferences_recording.svg
+++ /dev/null
@@ -1,438 +0,0 @@
-
-
diff --git a/res/images/preferences/ic_preferences_replaygain.svg b/res/images/preferences/ic_preferences_replaygain.svg
deleted file mode 100644
index af5b92f0b14b..000000000000
--- a/res/images/preferences/ic_preferences_replaygain.svg
+++ /dev/null
@@ -1,610 +0,0 @@
-
-
diff --git a/res/images/preferences/ic_preferences_sampler.svg b/res/images/preferences/ic_preferences_sampler.svg
deleted file mode 100644
index ac40c1fc28fa..000000000000
--- a/res/images/preferences/ic_preferences_sampler.svg
+++ /dev/null
@@ -1,606 +0,0 @@
-
-
diff --git a/res/images/preferences/ic_preferences_soundhardware.svg b/res/images/preferences/ic_preferences_soundhardware.svg
deleted file mode 100644
index e2b0386a743c..000000000000
--- a/res/images/preferences/ic_preferences_soundhardware.svg
+++ /dev/null
@@ -1,713 +0,0 @@
-
-
diff --git a/res/images/preferences/ic_preferences_vinyl.svg b/res/images/preferences/ic_preferences_vinyl.svg
deleted file mode 100644
index 78cec69a19d9..000000000000
--- a/res/images/preferences/ic_preferences_vinyl.svg
+++ /dev/null
@@ -1,673 +0,0 @@
-
-
diff --git a/res/images/preferences/ic_preferences_waveforms.svg b/res/images/preferences/ic_preferences_waveforms.svg
deleted file mode 100644
index e3954fdc1ca1..000000000000
--- a/res/images/preferences/ic_preferences_waveforms.svg
+++ /dev/null
@@ -1,643 +0,0 @@
-
-
diff --git a/res/images/preferences/light/ic_preferences_autodj.svg b/res/images/preferences/light/ic_preferences_autodj.svg
new file mode 100644
index 000000000000..4d6b4af906b2
--- /dev/null
+++ b/res/images/preferences/light/ic_preferences_autodj.svg
@@ -0,0 +1,13 @@
+
diff --git a/res/images/preferences/light/ic_preferences_bpmdetect.svg b/res/images/preferences/light/ic_preferences_bpmdetect.svg
new file mode 100644
index 000000000000..5566885dc8bd
--- /dev/null
+++ b/res/images/preferences/light/ic_preferences_bpmdetect.svg
@@ -0,0 +1,7 @@
+
diff --git a/res/images/preferences/light/ic_preferences_broadcast.svg b/res/images/preferences/light/ic_preferences_broadcast.svg
new file mode 100644
index 000000000000..eda9ab0123d8
--- /dev/null
+++ b/res/images/preferences/light/ic_preferences_broadcast.svg
@@ -0,0 +1,12 @@
+
diff --git a/res/images/preferences/light/ic_preferences_colors.svg b/res/images/preferences/light/ic_preferences_colors.svg
new file mode 100644
index 000000000000..9421215b3916
--- /dev/null
+++ b/res/images/preferences/light/ic_preferences_colors.svg
@@ -0,0 +1,7 @@
+
diff --git a/res/images/preferences/light/ic_preferences_controllers.svg b/res/images/preferences/light/ic_preferences_controllers.svg
new file mode 100644
index 000000000000..8d36f4d0147f
--- /dev/null
+++ b/res/images/preferences/light/ic_preferences_controllers.svg
@@ -0,0 +1,4 @@
+
diff --git a/res/images/preferences/light/ic_preferences_crossfader.svg b/res/images/preferences/light/ic_preferences_crossfader.svg
new file mode 100644
index 000000000000..786128b92568
--- /dev/null
+++ b/res/images/preferences/light/ic_preferences_crossfader.svg
@@ -0,0 +1,8 @@
+
diff --git a/res/images/preferences/light/ic_preferences_decks.svg b/res/images/preferences/light/ic_preferences_decks.svg
new file mode 100644
index 000000000000..79b874e6fd4a
--- /dev/null
+++ b/res/images/preferences/light/ic_preferences_decks.svg
@@ -0,0 +1,4 @@
+
diff --git a/res/images/preferences/light/ic_preferences_effects.svg b/res/images/preferences/light/ic_preferences_effects.svg
new file mode 100644
index 000000000000..f3fb6af38723
--- /dev/null
+++ b/res/images/preferences/light/ic_preferences_effects.svg
@@ -0,0 +1,6 @@
+
diff --git a/res/images/preferences/light/ic_preferences_equalizers.svg b/res/images/preferences/light/ic_preferences_equalizers.svg
new file mode 100644
index 000000000000..b9371aad9b27
--- /dev/null
+++ b/res/images/preferences/light/ic_preferences_equalizers.svg
@@ -0,0 +1,15 @@
+
diff --git a/res/images/preferences/light/ic_preferences_interface.svg b/res/images/preferences/light/ic_preferences_interface.svg
new file mode 100644
index 000000000000..cfd48cb57e97
--- /dev/null
+++ b/res/images/preferences/light/ic_preferences_interface.svg
@@ -0,0 +1,13 @@
+
diff --git a/res/images/preferences/light/ic_preferences_keydetect.svg b/res/images/preferences/light/ic_preferences_keydetect.svg
new file mode 100644
index 000000000000..9afb445fa689
--- /dev/null
+++ b/res/images/preferences/light/ic_preferences_keydetect.svg
@@ -0,0 +1,8 @@
+
diff --git a/res/images/preferences/light/ic_preferences_library.svg b/res/images/preferences/light/ic_preferences_library.svg
new file mode 100644
index 000000000000..34abdab3b346
--- /dev/null
+++ b/res/images/preferences/light/ic_preferences_library.svg
@@ -0,0 +1,14 @@
+
diff --git a/res/images/preferences/light/ic_preferences_lv2.svg b/res/images/preferences/light/ic_preferences_lv2.svg
new file mode 100644
index 000000000000..9742706279e8
--- /dev/null
+++ b/res/images/preferences/light/ic_preferences_lv2.svg
@@ -0,0 +1,4 @@
+
diff --git a/res/images/preferences/light/ic_preferences_midicontrollers.svg b/res/images/preferences/light/ic_preferences_midicontrollers.svg
new file mode 100644
index 000000000000..68f55cbdf9e3
--- /dev/null
+++ b/res/images/preferences/light/ic_preferences_midicontrollers.svg
@@ -0,0 +1,13 @@
+
diff --git a/res/images/preferences/light/ic_preferences_modplug.svg b/res/images/preferences/light/ic_preferences_modplug.svg
new file mode 100644
index 000000000000..d684fe09bc43
--- /dev/null
+++ b/res/images/preferences/light/ic_preferences_modplug.svg
@@ -0,0 +1,12 @@
+
diff --git a/res/images/preferences/light/ic_preferences_recording.svg b/res/images/preferences/light/ic_preferences_recording.svg
new file mode 100644
index 000000000000..25fe3a239356
--- /dev/null
+++ b/res/images/preferences/light/ic_preferences_recording.svg
@@ -0,0 +1,4 @@
+
diff --git a/res/images/preferences/light/ic_preferences_replaygain.svg b/res/images/preferences/light/ic_preferences_replaygain.svg
new file mode 100644
index 000000000000..08c8dfe67ef6
--- /dev/null
+++ b/res/images/preferences/light/ic_preferences_replaygain.svg
@@ -0,0 +1,9 @@
+
diff --git a/res/images/preferences/light/ic_preferences_sampler.svg b/res/images/preferences/light/ic_preferences_sampler.svg
new file mode 100644
index 000000000000..e0766ac4490a
--- /dev/null
+++ b/res/images/preferences/light/ic_preferences_sampler.svg
@@ -0,0 +1,4 @@
+
diff --git a/res/images/preferences/light/ic_preferences_soundhardware.svg b/res/images/preferences/light/ic_preferences_soundhardware.svg
new file mode 100644
index 000000000000..67fafc3bb875
--- /dev/null
+++ b/res/images/preferences/light/ic_preferences_soundhardware.svg
@@ -0,0 +1,13 @@
+
diff --git a/res/images/preferences/light/ic_preferences_vinyl.svg b/res/images/preferences/light/ic_preferences_vinyl.svg
new file mode 100644
index 000000000000..7f895e62b893
--- /dev/null
+++ b/res/images/preferences/light/ic_preferences_vinyl.svg
@@ -0,0 +1,10 @@
+
diff --git a/res/images/preferences/light/ic_preferences_waveforms.svg b/res/images/preferences/light/ic_preferences_waveforms.svg
new file mode 100644
index 000000000000..409e43f0eb55
--- /dev/null
+++ b/res/images/preferences/light/ic_preferences_waveforms.svg
@@ -0,0 +1,4 @@
+
diff --git a/res/mixxx.qrc b/res/mixxx.qrc
index e2cef8820d56..5ec55237df63 100644
--- a/res/mixxx.qrc
+++ b/res/mixxx.qrc
@@ -37,26 +37,45 @@
images/ic_delete.svg
images/ic_mixxx_symbolic.svg
images/ic_none.svg
- images/preferences/ic_preferences_autodj.svg
- images/preferences/ic_preferences_bpmdetect.svg
- images/preferences/ic_preferences_broadcast.svg
- images/preferences/ic_preferences_colors.svg
- images/preferences/ic_preferences_controllers.svg
- images/preferences/ic_preferences_crossfader.svg
- images/preferences/ic_preferences_decks.svg
- images/preferences/ic_preferences_effects.svg
- images/preferences/ic_preferences_equalizers.svg
- images/preferences/ic_preferences_interface.svg
- images/preferences/ic_preferences_keydetect.svg
- images/preferences/ic_preferences_library.svg
- images/preferences/ic_preferences_lv2.svg
- images/preferences/ic_preferences_modplug.svg
- images/preferences/ic_preferences_recording.svg
- images/preferences/ic_preferences_replaygain.svg
- images/preferences/ic_preferences_soundhardware.svg
- images/preferences/ic_preferences_vinyl.svg
+ images/preferences/dark/ic_preferences_autodj.svg
+ images/preferences/dark/ic_preferences_bpmdetect.svg
+ images/preferences/dark/ic_preferences_broadcast.svg
+ images/preferences/dark/ic_preferences_colors.svg
+ images/preferences/dark/ic_preferences_controllers.svg
+ images/preferences/dark/ic_preferences_crossfader.svg
+ images/preferences/dark/ic_preferences_decks.svg
+ images/preferences/dark/ic_preferences_effects.svg
+ images/preferences/dark/ic_preferences_equalizers.svg
+ images/preferences/dark/ic_preferences_interface.svg
+ images/preferences/dark/ic_preferences_keydetect.svg
+ images/preferences/dark/ic_preferences_library.svg
+ images/preferences/dark/ic_preferences_lv2.svg
+ images/preferences/dark/ic_preferences_modplug.svg
+ images/preferences/dark/ic_preferences_recording.svg
+ images/preferences/dark/ic_preferences_replaygain.svg
+ images/preferences/dark/ic_preferences_soundhardware.svg
+ images/preferences/dark/ic_preferences_vinyl.svg
+ images/preferences/dark/ic_preferences_waveforms.svg
+ images/preferences/light/ic_preferences_autodj.svg
+ images/preferences/light/ic_preferences_bpmdetect.svg
+ images/preferences/light/ic_preferences_broadcast.svg
+ images/preferences/light/ic_preferences_colors.svg
+ images/preferences/light/ic_preferences_controllers.svg
+ images/preferences/light/ic_preferences_crossfader.svg
+ images/preferences/light/ic_preferences_decks.svg
+ images/preferences/light/ic_preferences_effects.svg
+ images/preferences/light/ic_preferences_equalizers.svg
+ images/preferences/light/ic_preferences_interface.svg
+ images/preferences/light/ic_preferences_keydetect.svg
+ images/preferences/light/ic_preferences_library.svg
+ images/preferences/light/ic_preferences_lv2.svg
+ images/preferences/light/ic_preferences_modplug.svg
+ images/preferences/light/ic_preferences_recording.svg
+ images/preferences/light/ic_preferences_replaygain.svg
+ images/preferences/light/ic_preferences_soundhardware.svg
+ images/preferences/light/ic_preferences_vinyl.svg
+ images/preferences/light/ic_preferences_waveforms.svg
images/preferences/ic_preferences_warning.svg
- images/preferences/ic_preferences_waveforms.svg
schema.xml
shaders/filteredsignal.frag
shaders/passthrough.vert
diff --git a/src/controllers/dlgprefcontroller.cpp b/src/controllers/dlgprefcontroller.cpp
index 016f193f6fd7..4e51eb4db36c 100644
--- a/src/controllers/dlgprefcontroller.cpp
+++ b/src/controllers/dlgprefcontroller.cpp
@@ -38,6 +38,8 @@ DlgPrefController::DlgPrefController(QWidget* parent,
m_pOutputProxyModel(nullptr),
m_bDirty(false) {
m_ui.setupUi(this);
+ // Create text color for the file and wiki links
+ createLinkColor();
initTableView(m_ui.m_pInputMappingTableView);
initTableView(m_ui.m_pOutputMappingTableView);
@@ -234,40 +236,46 @@ QString DlgPrefController::presetAuthor(
return tr("No Author");
}
-QString DlgPrefController::presetForumLink(
+QString DlgPrefController::presetSupportLinks(
const ControllerPresetPointer pPreset) const {
- QString url;
- if (pPreset) {
- QString link = pPreset->forumlink();
- if (link.length() > 0) {
- url = "Mixxx Forums";
- }
+ if (!pPreset) {
+ return QString();
}
- return url;
-}
-QString DlgPrefController::presetWikiLink(
- const ControllerPresetPointer pPreset) const {
- QString url;
- if (pPreset) {
- QString link = pPreset->wikilink();
- if (link.length() > 0) {
- url = "Mixxx Wiki";
- }
+ QStringList linkList;
+
+ QString forumLink = pPreset->forumlink();
+ if (!forumLink.isEmpty()) {
+ linkList << coloredLinkString(
+ m_pLinkColor,
+ "Mixxx Forums",
+ forumLink);
}
- return url;
-}
-QString DlgPrefController::presetManualLink(
- const ControllerPresetPointer pPreset) const {
- QString url;
- if (pPreset) {
- QString link = pPreset->manualLink();
- if (!link.isEmpty()) {
- url = "Manual";
- }
+ QString wikiLink = pPreset->wikilink();
+ if (!wikiLink.isEmpty()) {
+ linkList << coloredLinkString(
+ m_pLinkColor,
+ "Mixxx Wiki",
+ wikiLink);
+ }
+
+ QString manualLink = pPreset->manualLink();
+ if (!manualLink.isEmpty()) {
+ linkList << coloredLinkString(
+ m_pLinkColor,
+ "Mixxx Manual",
+ manualLink);
}
- return url;
+
+ // There is always at least one support link.
+ // TODO(rryan): This is a horrible general support link for MIDI!
+ linkList << coloredLinkString(
+ m_pLinkColor,
+ tr("Troubleshooting"),
+ MIXXX_WIKI_MIDI_SCRIPTING_URL);
+
+ return QString(linkList.join(" "));
}
QString DlgPrefController::presetFileLinks(
@@ -279,20 +287,20 @@ QString DlgPrefController::presetFileLinks(
const QString builtinFileSuffix = QStringLiteral(" (") + tr("built-in") + QStringLiteral(")");
QString systemPresetPath = resourcePresetsPath(m_pConfig);
QStringList linkList;
- QString xmlFileName = QFileInfo(pPreset->filePath()).fileName();
- QString xmlFileLink = QStringLiteral("filePath() + QStringLiteral("\">") +
- xmlFileName + QStringLiteral("");
+ QString xmlFileLink = coloredLinkString(
+ m_pLinkColor,
+ QFileInfo(pPreset->filePath()).fileName(),
+ pPreset->filePath());
if (pPreset->filePath().startsWith(systemPresetPath)) {
xmlFileLink += builtinFileSuffix;
}
linkList << xmlFileLink;
for (const auto& script : pPreset->getScriptFiles()) {
- QString scriptFileLink = QStringLiteral("") +
- script.name + QStringLiteral("");
-
+ QString scriptFileLink = coloredLinkString(
+ m_pLinkColor,
+ script.name,
+ script.file.absoluteFilePath());
if (!script.file.exists()) {
scriptFileLink +=
QStringLiteral(" (") + tr("missing") + QStringLiteral(")");
@@ -647,35 +655,8 @@ void DlgPrefController::slotShowPreset(ControllerPresetPointer preset) {
m_ui.labelLoadedPreset->setText(presetName(preset));
m_ui.labelLoadedPresetDescription->setText(presetDescription(preset));
m_ui.labelLoadedPresetAuthor->setText(presetAuthor(preset));
- QStringList supportLinks;
-
- QString forumLink = presetForumLink(preset);
- if (forumLink.length() > 0) {
- supportLinks << forumLink;
- }
-
- QString manualLink = presetManualLink(preset);
- if (manualLink.length() > 0) {
- supportLinks << manualLink;
- }
-
- QString wikiLink = presetWikiLink(preset);
- if (wikiLink.length() > 0) {
- supportLinks << wikiLink;
- }
-
- // There is always at least one support link.
- // TODO(rryan): This is a horrible general support link for MIDI!
- QString troubleShooting = QString(
- "%1")
- .arg(tr("Troubleshooting"));
- supportLinks << troubleShooting;
-
- QString support = supportLinks.join(" ");
- m_ui.labelLoadedPresetSupportLinks->setText(support);
-
- QString mappingFileLinks = presetFileLinks(preset);
- m_ui.labelLoadedPresetScriptFileLinks->setText(mappingFileLinks);
+ m_ui.labelLoadedPresetSupportLinks->setText(presetSupportLinks(preset));
+ m_ui.labelLoadedPresetScriptFileLinks->setText(presetFileLinks(preset));
// We mutate this preset so keep a reference to it while we are using it.
// TODO(rryan): Clone it? Technically a waste since nothing else uses this
diff --git a/src/controllers/dlgprefcontroller.h b/src/controllers/dlgprefcontroller.h
index 8b114d9719ad..75407f616a2b 100644
--- a/src/controllers/dlgprefcontroller.h
+++ b/src/controllers/dlgprefcontroller.h
@@ -66,9 +66,7 @@ class DlgPrefController : public DlgPreferencePage {
QString presetName(const ControllerPresetPointer pPreset) const;
QString presetAuthor(const ControllerPresetPointer pPreset) const;
QString presetDescription(const ControllerPresetPointer pPreset) const;
- QString presetForumLink(const ControllerPresetPointer pPreset) const;
- QString presetManualLink(const ControllerPresetPointer pPreset) const;
- QString presetWikiLink(const ControllerPresetPointer pPreset) const;
+ QString presetSupportLinks(const ControllerPresetPointer pPreset) const;
QString presetFileLinks(const ControllerPresetPointer pPreset) const;
void applyPresetChanges();
void savePreset();
diff --git a/src/controllers/dlgprefcontrollers.cpp b/src/controllers/dlgprefcontrollers.cpp
index c734944bad64..9adef3a00c8a 100644
--- a/src/controllers/dlgprefcontrollers.cpp
+++ b/src/controllers/dlgprefcontrollers.cpp
@@ -19,6 +19,8 @@ DlgPrefControllers::DlgPrefControllers(DlgPreferences* pPreferences,
m_pControllerManager(pControllerManager),
m_pControllerTreeItem(pControllerTreeItem) {
setupUi(this);
+ // Create text color for the cue mode link "?" to the manual
+ createLinkColor();
setupControllerWidgets();
const QString presetsPath = userPresetsPath(m_pConfig);
@@ -30,6 +32,42 @@ DlgPrefControllers::DlgPrefControllers(DlgPreferences* pPreferences,
&ControllerManager::devicesChanged,
this,
&DlgPrefControllers::rescanControllers);
+
+ // Setting the description text here instead of in the ui file allows to paste
+ // a formatted link (text color is a more readable blend of text color and original link color).
+ txtPresetsOverview->setText(tr(
+ "Mixxx uses \"mappings\" to connect messages from your controller to "
+ "controls in Mixxx. If you do not see a mapping for your controller "
+ "in the \"Load Mapping\" menu when you click on your controller on the "
+ "left sidebar, you may be able to download one online from the %1. "
+ "Place the XML (.xml) and Javascript (.js) file(s) in the \"User Mapping "
+ "Folder\" then restart Mixxx. If you download a mapping in a ZIP file, "
+ "extract the XML and Javascript file(s) from the ZIP file to your "
+ "\"User Mapping Folder\" then restart Mixxx.")
+ .arg(coloredLinkString(
+ m_pLinkColor,
+ QStringLiteral("Mixxx Controller Forums"),
+ MIXXX_CONTROLLER_FORUMS_URL)));
+
+ txtHardwareCompatibility->setText(coloredLinkString(
+ m_pLinkColor,
+ tr("Mixxx DJ Hardware Guide"),
+ MIXXX_WIKI_HARDWARE_COMPATIBILITY_URL));
+
+ txtControllerForums->setText(coloredLinkString(
+ m_pLinkColor,
+ tr("MIDI Mapping File Format"),
+ MIXXX_WIKI_CONTROLLER_PRESET_FORMAT_URL));
+
+ txtControllerPresetFormat->setText(coloredLinkString(
+ m_pLinkColor,
+ QStringLiteral("Mixxx Controller Forums"),
+ MIXXX_CONTROLLER_FORUMS_URL));
+
+ txtControllerScripting->setText(coloredLinkString(
+ m_pLinkColor,
+ tr("MIDI Scripting with Javascript"),
+ MIXXX_WIKI_MIDI_SCRIPTING_URL));
}
DlgPrefControllers::~DlgPrefControllers() {
diff --git a/src/controllers/dlgprefcontrollersdlg.ui b/src/controllers/dlgprefcontrollersdlg.ui
index 45894afc14f2..5f1aa4e8ebd5 100644
--- a/src/controllers/dlgprefcontrollersdlg.ui
+++ b/src/controllers/dlgprefcontrollersdlg.ui
@@ -87,9 +87,6 @@
0
-
- Mixxx uses "mappings" to connect messages from your controller to controls in Mixxx. If you do not see a mapping for your controller in the "Load Mapping" menu when you click on your controller on the left sidebar, you may be able to download one online from the <a href="https://mixxx.discourse.group/c/controller-mappings/10">Mixxx Forum</a>. Place the XML (.xml) and Javascript (.js) file(s) in the "User Mapping Folder" then restart Mixxx. If you download a mapping in a ZIP file, extract the XML and Javascript file(s) from the ZIP file to your "User Mapping Folder" then restart Mixxx:
-
true
@@ -138,9 +135,6 @@
-
-
- <a href="https://github.com/mixxxdj/mixxx/wiki/Hardware%20compatibility">Mixxx DJ Hardware Guide</a>
-
true
@@ -148,9 +142,6 @@
-
-
- <a href="https://mixxx.discourse.group/c/controller-mappings/10">Mixxx Controller Forums</a>
-
true
@@ -158,9 +149,6 @@
-
-
- <a href="https://github.com/mixxxdj/mixxx/wiki/Midi-Controller-Mapping-File-Format">MIDI Mapping File Format</a>
-
true
@@ -168,9 +156,6 @@
-
-
- <a href="https://github.com/mixxxdj/mixxx/wiki/midi%20scripting">MIDI Scripting with Javascript</a>
-
true
diff --git a/src/controllers/midi/midicontroller.cpp b/src/controllers/midi/midicontroller.cpp
index a3a62a668628..b3e235b52748 100644
--- a/src/controllers/midi/midicontroller.cpp
+++ b/src/controllers/midi/midicontroller.cpp
@@ -4,6 +4,7 @@
#include "controllers/controllerdebug.h"
#include "controllers/defs_controllers.h"
#include "controllers/midi/midiutils.h"
+#include "defs_urls.h"
#include "errordialoghandler.h"
#include "mixer/playermanager.h"
#include "moc_midicontroller.cpp"
@@ -130,9 +131,10 @@ void MidiController::createOutputHandlers() {
QString detailsText = tr("* Check to see that the MixxxControl "
"names are spelled correctly in the mapping "
"file (.xml)\n");
- detailsText += tr("* Make sure the MixxxControls in question actually exist."
- " Visit this wiki page for a complete list: ");
- detailsText += "http://mixxx.org/wiki/doku.php/mixxxcontrols\n\n";
+ detailsText += tr(
+ "* Make sure the MixxxControls in question actually exist."
+ " Visit the manual for a complete list: ");
+ detailsText += MIXXX_MANUAL_CONTROLS_URL + QStringLiteral("\n\n");
detailsText += failures.join("\n");
props->setDetails(detailsText);
ErrorDialogHandler::instance()->requestErrorDialog(props);
diff --git a/src/defs_urls.h b/src/defs_urls.h
index 4e96c42afe36..59b1bf414722 100644
--- a/src/defs_urls.h
+++ b/src/defs_urls.h
@@ -1,23 +1,42 @@
#pragma once
#define MIXXX_WEBSITE_URL "https://www.mixxx.org"
+#define MIXXX_WEBSITE_SHORT_URL "www.mixxx.org"
#define MIXXX_SUPPORT_URL "https://www.mixxx.org/support/"
#define MIXXX_TRANSLATION_URL "https://www.transifex.com/projects/p/mixxxdj/"
#define MIXXX_FEEDBACK_URL "https://goo.gl/forms/IHf3JK7Q9DXmExXc2"
+
+#define MIXXX_CONTROLLER_FORUMS_URL \
+ "https://mixxx.discourse.group/c/controller-mappings/10"
+
+#define MIXXX_WIKI_URL "https://github.com/mixxxdj/mixxx/wiki"
+#define MIXXX_WIKI_TROUBLESHOOTING_SOUND_URL \
+ MIXXX_WIKI_URL "/troubleshooting#i-cant-select-my-sound-card-in-the-sound-hardware-preferences"
+#define MIXXX_WIKI_HARDWARE_COMPATIBILITY_URL \
+ MIXXX_WIKI_URL "/Hardware-Compatibility"
+#define MIXXX_WIKI_AUDIO_LATENCY_URL \
+ MIXXX_WIKI_URL "/Adjusting-Audio-Latency"
+#define MIXXX_WIKI_CONTROLLER_PRESET_FORMAT_URL \
+ MIXXX_WIKI_URL "/Midi-Controller-Mapping-File-Format"
+#define MIXXX_WIKI_MIDI_SCRIPTING_URL \
+ MIXXX_WIKI_URL "/Midi-Scripting"
+
#define MIXXX_MANUAL_URL "https://manual.mixxx.org/2.3"
#define MIXXX_MANUAL_SHORTCUTS_URL \
MIXXX_MANUAL_URL "/chapters/controlling_mixxx.html#using-a-keyboard"
#define MIXXX_MANUAL_CONTROLLERS_URL \
- MIXXX_MANUAL_URL \
- "/chapters/controlling_mixxx.html#using-midi-hid-controllers"
+ MIXXX_MANUAL_URL "/chapters/controlling_mixxx.html#using-midi-hid-controllers"
#define MIXXX_MANUAL_CONTROLLERMANUAL_PREFIX \
- MIXXX_MANUAL_URL \
- "/hardware/controllers/"
+ MIXXX_MANUAL_URL "/hardware/controllers/"
#define MIXXX_MANUAL_CONTROLLERMANUAL_SUFFIX ".html"
+#define MIXXX_MANUAL_CONTROLS_URL \
+ MIXXX_MANUAL_URL "/chapters/advanced_topics.html#mixxx-controls"
#define MIXXX_MANUAL_SOUND_URL \
MIXXX_MANUAL_URL "/chapters/preferences.html#sound-hardware"
#define MIXXX_MANUAL_LIBRARY_URL \
MIXXX_MANUAL_URL "/chapters/preferences.html#library"
+#define MIXXX_MANUAL_CUE_MODES_URL \
+ MIXXX_MANUAL_URL "/chapters/user_interface.html#using-cue-modes"
#define MIXXX_MANUAL_BEATS_URL \
MIXXX_MANUAL_URL "/chapters/preferences.html#beat-detection"
#define MIXXX_MANUAL_KEY_URL \
@@ -28,4 +47,6 @@
MIXXX_MANUAL_URL "/chapters/livebroadcasting.html#configuring-mixxx"
#define MIXXX_MANUAL_VINYL_URL \
MIXXX_MANUAL_URL "/chapters/vinyl_control.html#configuring-vinyl-control"
+#define MIXXX_MANUAL_VINYL_TROUBLESHOOTING_URL \
+ MIXXX_MANUAL_URL "/chapters/vinyl_control.html#troubleshooting"
#define MIXXX_MANUAL_FILENAME "Mixxx-Manual.pdf"
diff --git a/src/dialog/dlgabout.cpp b/src/dialog/dlgabout.cpp
index 3afc55ab4b18..bf7dd8d71322 100644
--- a/src/dialog/dlgabout.cpp
+++ b/src/dialog/dlgabout.cpp
@@ -2,7 +2,9 @@
#include
+#include "defs_urls.h"
#include "moc_dlgabout.cpp"
+#include "util/color/color.h"
#include "util/version.h"
DlgAbout::DlgAbout(QWidget* parent) : QDialog(parent), Ui::DlgAboutDlg() {
@@ -326,6 +328,14 @@ DlgAbout::DlgAbout(QWidget* parent) : QDialog(parent), Ui::DlgAboutDlg() {
specialThanks.join("
"));
textBrowser->setHtml(sections.join(""));
+ textWebsiteLink->setText(
+ QString("%3")
+ .arg(Color::blendColors(palette().link().color(),
+ palette().text().color())
+ .name(),
+ MIXXX_WEBSITE_URL,
+ tr("Official Website")));
+
connect(buttonBox, &QDialogButtonBox::accepted, this, &DlgAbout::accept);
connect(buttonBox, &QDialogButtonBox::rejected, this, &DlgAbout::reject);
}
diff --git a/src/dialog/dlgaboutdlg.ui b/src/dialog/dlgaboutdlg.ui
index 5b506e53e32c..9d6d6deda721 100644
--- a/src/dialog/dlgaboutdlg.ui
+++ b/src/dialog/dlgaboutdlg.ui
@@ -171,10 +171,7 @@ p, li { white-space: pre-wrap; }
-
-
-
-
- <a href="http://mixxx.org/">Official Website</a>
-
+
true
diff --git a/src/mixxx.cpp b/src/mixxx.cpp
index 7d8519feb1cc..498bb19b0910 100644
--- a/src/mixxx.cpp
+++ b/src/mixxx.cpp
@@ -29,6 +29,7 @@
#include
#include
+#include "defs_urls.h"
#include "dialog/dlgabout.h"
#include "dialog/dlgdevelopertools.h"
#include "effects/builtin/builtinbackend.h"
@@ -988,9 +989,7 @@ QDialog::DialogCode MixxxMainWindow::soundDeviceErrorDlg(
*retryClicked = true;
return QDialog::Accepted;
} else if (msgBox.clickedButton() == wikiButton) {
- QDesktopServices::openUrl(QUrl(
- "http://mixxx.org/wiki/doku.php/troubleshooting"
- "#i_can_t_select_my_sound_card_in_the_sound_hardware_preferences"));
+ QDesktopServices::openUrl(QUrl(MIXXX_WIKI_TROUBLESHOOTING_SOUND_URL));
wikiButton->setEnabled(false);
} else if (msgBox.clickedButton() == reconfigureButton) {
msgBox.hide();
diff --git a/src/preferences/dialog/dlgprefdeck.cpp b/src/preferences/dialog/dlgprefdeck.cpp
index c79f0fa5f2a1..ead1084ea63d 100644
--- a/src/preferences/dialog/dlgprefdeck.cpp
+++ b/src/preferences/dialog/dlgprefdeck.cpp
@@ -50,6 +50,8 @@ DlgPrefDeck::DlgPrefDeck(QWidget* parent,
m_iNumConfiguredDecks(0),
m_iNumConfiguredSamplers(0) {
setupUi(this);
+ // Create text color for the cue mode link "?" to the manual
+ createLinkColor();
m_pNumDecks->connectValueChanged(this, [=](double value){slotNumDecksChanged(value);});
slotNumDecksChanged(m_pNumDecks->get(), true);
@@ -333,11 +335,11 @@ DlgPrefDeck::DlgPrefDeck(QWidget* parent,
//
// Add "(?)" with a manual link to the label
- labelCueMode->setText(
- labelCueMode->text() +
- " (?)");
+ labelCueMode->setText(labelCueMode->text() + QStringLiteral(" ") +
+ coloredLinkString(
+ m_pLinkColor,
+ QStringLiteral("(?)"),
+ MIXXX_MANUAL_CUE_MODES_URL));
//
// Ramping Temporary Rate Change configuration
diff --git a/src/preferences/dialog/dlgpreferences.cpp b/src/preferences/dialog/dlgpreferences.cpp
index 8297f500d4d5..e0b48a338423 100644
--- a/src/preferences/dialog/dlgpreferences.cpp
+++ b/src/preferences/dialog/dlgpreferences.cpp
@@ -171,20 +171,27 @@ DlgPreferences::~DlgPreferences() {
}
void DlgPreferences::createIcons() {
+ QString iconSetPath(":/images/preferences/");
+ // If the text of the OS theme is bright let's also pick a bright icon set.
+ QString iconSetColor = QStringLiteral("dark/");
+ if (!Color::isDimColor(palette().text().color())) {
+ iconSetColor = QStringLiteral("light/");
+ }
+ iconSetPath += iconSetColor;
m_pSoundButton = new QTreeWidgetItem(contentsTreeWidget, QTreeWidgetItem::Type);
- m_pSoundButton->setIcon(0, QIcon(":/images/preferences/ic_preferences_soundhardware.svg"));
+ m_pSoundButton->setIcon(0, QIcon(iconSetPath + "ic_preferences_soundhardware.svg"));
m_pSoundButton->setText(0, tr("Sound Hardware"));
m_pSoundButton->setTextAlignment(0, Qt::AlignLeft | Qt::AlignVCenter);
m_pSoundButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
m_pLibraryButton = new QTreeWidgetItem(contentsTreeWidget, QTreeWidgetItem::Type);
- m_pLibraryButton->setIcon(0, QIcon(":/images/preferences/ic_preferences_library.svg"));
+ m_pLibraryButton->setIcon(0, QIcon(iconSetPath + "ic_preferences_library.svg"));
m_pLibraryButton->setText(0, tr("Library"));
m_pLibraryButton->setTextAlignment(0, Qt::AlignLeft | Qt::AlignVCenter);
m_pLibraryButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
m_pControllerTreeItem = new QTreeWidgetItem(contentsTreeWidget, QTreeWidgetItem::Type);
- m_pControllerTreeItem->setIcon(0, QIcon(":/images/preferences/ic_preferences_controllers.svg"));
+ m_pControllerTreeItem->setIcon(0, QIcon(iconSetPath + "ic_preferences_controllers.svg"));
m_pControllerTreeItem->setText(0, tr("Controllers"));
m_pControllerTreeItem->setTextAlignment(0, Qt::AlignLeft | Qt::AlignVCenter);
m_pControllerTreeItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
@@ -193,7 +200,7 @@ void DlgPreferences::createIcons() {
m_pVinylControlButton = new QTreeWidgetItem(contentsTreeWidget, QTreeWidgetItem::Type);
//QT screws up my nice vinyl svg for some reason, so we'll use a PNG version
//instead...
- m_pVinylControlButton->setIcon(0, QIcon(":/images/preferences/ic_preferences_vinyl.svg"));
+ m_pVinylControlButton->setIcon(0, QIcon(iconSetPath + "ic_preferences_vinyl.svg"));
m_pVinylControlButton->setText(0, tr("Vinyl Control"));
m_pVinylControlButton->setTextAlignment(0, Qt::AlignLeft | Qt::AlignVCenter);
m_pVinylControlButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
@@ -201,103 +208,103 @@ void DlgPreferences::createIcons() {
m_pVinylControlButton = new QTreeWidgetItem(contentsTreeWidget, QTreeWidgetItem::Type);
//QT screws up my nice vinyl svg for some reason, so we'll use a PNG version
//instead...
- m_pVinylControlButton->setIcon(0, QIcon(":/images/preferences/ic_preferences_vinyl.svg"));
+ m_pVinylControlButton->setIcon(0, QIcon(iconSetPath + "ic_preferences_vinyl.svg"));
m_pVinylControlButton->setText(0, tr("Vinyl Control"));
m_pVinylControlButton->setTextAlignment(0, Qt::AlignLeft | Qt::AlignVCenter);
m_pVinylControlButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
#endif
m_pInterfaceButton = new QTreeWidgetItem(contentsTreeWidget, QTreeWidgetItem::Type);
- m_pInterfaceButton->setIcon(0, QIcon(":/images/preferences/ic_preferences_interface.svg"));
+ m_pInterfaceButton->setIcon(0, QIcon(iconSetPath + "ic_preferences_interface.svg"));
m_pInterfaceButton->setText(0, tr("Interface"));
m_pInterfaceButton->setTextAlignment(0, Qt::AlignLeft | Qt::AlignVCenter);
m_pInterfaceButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
m_pWaveformButton = new QTreeWidgetItem(contentsTreeWidget, QTreeWidgetItem::Type);
- m_pWaveformButton->setIcon(0, QIcon(":/images/preferences/ic_preferences_waveforms.svg"));
+ m_pWaveformButton->setIcon(0, QIcon(iconSetPath + "ic_preferences_waveforms.svg"));
m_pWaveformButton->setText(0, tr("Waveforms"));
m_pWaveformButton->setTextAlignment(0, Qt::AlignLeft | Qt::AlignVCenter);
m_pWaveformButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
m_pDecksButton = new QTreeWidgetItem(contentsTreeWidget, QTreeWidgetItem::Type);
- m_pDecksButton->setIcon(0, QIcon(":/images/preferences/ic_preferences_decks.svg"));
+ m_pDecksButton->setIcon(0, QIcon(iconSetPath + "ic_preferences_decks.svg"));
m_pDecksButton->setText(0, tr("Decks"));
m_pDecksButton->setTextAlignment(0, Qt::AlignLeft | Qt::AlignVCenter);
m_pDecksButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
m_pColorsButton = new QTreeWidgetItem(contentsTreeWidget, QTreeWidgetItem::Type);
- m_pColorsButton->setIcon(0, QIcon(":/images/preferences/ic_preferences_colors.svg"));
+ m_pColorsButton->setIcon(0, QIcon(iconSetPath + "ic_preferences_colors.svg"));
m_pColorsButton->setText(0, tr("Colors"));
m_pColorsButton->setTextAlignment(0, Qt::AlignLeft | Qt::AlignVCenter);
m_pColorsButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
m_pEqButton = new QTreeWidgetItem(contentsTreeWidget, QTreeWidgetItem::Type);
- m_pEqButton->setIcon(0, QIcon(":/images/preferences/ic_preferences_equalizers.svg"));
+ m_pEqButton->setIcon(0, QIcon(iconSetPath + "ic_preferences_equalizers.svg"));
m_pEqButton->setText(0, tr("Equalizers"));
m_pEqButton->setTextAlignment(0, Qt::AlignLeft | Qt::AlignVCenter);
m_pEqButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
m_pCrossfaderButton = new QTreeWidgetItem(contentsTreeWidget, QTreeWidgetItem::Type);
- m_pCrossfaderButton->setIcon(0, QIcon(":/images/preferences/ic_preferences_crossfader.svg"));
+ m_pCrossfaderButton->setIcon(0, QIcon(iconSetPath + "ic_preferences_crossfader.svg"));
m_pCrossfaderButton->setText(0, tr("Crossfader"));
m_pCrossfaderButton->setTextAlignment(0, Qt::AlignLeft | Qt::AlignVCenter);
m_pCrossfaderButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
m_pEffectsButton = new QTreeWidgetItem(contentsTreeWidget, QTreeWidgetItem::Type);
- m_pEffectsButton->setIcon(0, QIcon(":/images/preferences/ic_preferences_effects.svg"));
+ m_pEffectsButton->setIcon(0, QIcon(iconSetPath + "ic_preferences_effects.svg"));
m_pEffectsButton->setText(0, tr("Effects"));
m_pEffectsButton->setTextAlignment(0, Qt::AlignLeft | Qt::AlignVCenter);
m_pEffectsButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
#ifdef __LILV__
m_pLV2Button = new QTreeWidgetItem(contentsTreeWidget, QTreeWidgetItem::Type);
- m_pLV2Button->setIcon(0, QIcon(":/images/preferences/ic_preferences_lv2.svg"));
+ m_pLV2Button->setIcon(0, QIcon(iconSetPath + "ic_preferences_lv2.svg"));
m_pLV2Button->setText(0, tr("LV2 Plugins"));
m_pLV2Button->setTextAlignment(0, Qt::AlignLeft | Qt::AlignVCenter);
m_pLV2Button->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
#endif /* __LILV__ */
m_pAutoDJButton = new QTreeWidgetItem(contentsTreeWidget, QTreeWidgetItem::Type);
- m_pAutoDJButton->setIcon(0, QIcon(":/images/preferences/ic_preferences_autodj.svg"));
+ m_pAutoDJButton->setIcon(0, QIcon(iconSetPath + "ic_preferences_autodj.svg"));
m_pAutoDJButton->setText(0, tr("Auto DJ"));
m_pAutoDJButton->setTextAlignment(0, Qt::AlignLeft | Qt::AlignVCenter);
m_pAutoDJButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
#ifdef __BROADCAST__
m_pBroadcastButton = new QTreeWidgetItem(contentsTreeWidget, QTreeWidgetItem::Type);
- m_pBroadcastButton->setIcon(0, QIcon(":/images/preferences/ic_preferences_broadcast.svg"));
+ m_pBroadcastButton->setIcon(0, QIcon(iconSetPath + "ic_preferences_broadcast.svg"));
m_pBroadcastButton->setText(0, tr("Live Broadcasting"));
m_pBroadcastButton->setTextAlignment(0, Qt::AlignLeft | Qt::AlignVCenter);
m_pBroadcastButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
#endif
m_pRecordingButton = new QTreeWidgetItem(contentsTreeWidget, QTreeWidgetItem::Type);
- m_pRecordingButton->setIcon(0, QIcon(":/images/preferences/ic_preferences_recording.svg"));
+ m_pRecordingButton->setIcon(0, QIcon(iconSetPath + "ic_preferences_recording.svg"));
m_pRecordingButton->setText(0, tr("Recording"));
m_pRecordingButton->setTextAlignment(0, Qt::AlignLeft | Qt::AlignVCenter);
m_pRecordingButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
m_pBeatDetectionButton = new QTreeWidgetItem(contentsTreeWidget, QTreeWidgetItem::Type);
- m_pBeatDetectionButton->setIcon(0, QIcon(":/images/preferences/ic_preferences_bpmdetect.svg"));
+ m_pBeatDetectionButton->setIcon(0, QIcon(iconSetPath + "ic_preferences_bpmdetect.svg"));
m_pBeatDetectionButton->setText(0, tr("Beat Detection"));
m_pBeatDetectionButton->setTextAlignment(0, Qt::AlignLeft | Qt::AlignVCenter);
m_pBeatDetectionButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
m_pKeyDetectionButton = new QTreeWidgetItem(contentsTreeWidget, QTreeWidgetItem::Type);
- m_pKeyDetectionButton->setIcon(0, QIcon(":/images/preferences/ic_preferences_keydetect.svg"));
+ m_pKeyDetectionButton->setIcon(0, QIcon(iconSetPath + "ic_preferences_keydetect.svg"));
m_pKeyDetectionButton->setText(0, tr("Key Detection"));
m_pKeyDetectionButton->setTextAlignment(0, Qt::AlignLeft | Qt::AlignVCenter);
m_pKeyDetectionButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
m_pReplayGainButton = new QTreeWidgetItem(contentsTreeWidget, QTreeWidgetItem::Type);
- m_pReplayGainButton->setIcon(0, QIcon(":/images/preferences/ic_preferences_replaygain.svg"));
+ m_pReplayGainButton->setIcon(0, QIcon(iconSetPath + "ic_preferences_replaygain.svg"));
m_pReplayGainButton->setText(0, tr("Normalization"));
m_pReplayGainButton->setTextAlignment(0, Qt::AlignLeft | Qt::AlignVCenter);
m_pReplayGainButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
#ifdef __MODPLUG__
m_pModplugButton = new QTreeWidgetItem(contentsTreeWidget, QTreeWidgetItem::Type);
- m_pModplugButton->setIcon(0, QIcon(":/images/preferences/ic_preferences_modplug.svg"));
+ m_pModplugButton->setIcon(0, QIcon(iconSetPath + "ic_preferences_modplug.svg"));
m_pModplugButton->setText(0, tr("Modplug Decoder"));
m_pModplugButton->setTextAlignment(0, Qt::AlignLeft | Qt::AlignVCenter);
m_pModplugButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
diff --git a/src/preferences/dialog/dlgprefmodplug.cpp b/src/preferences/dialog/dlgprefmodplug.cpp
index 3fac78ee815c..1cd86c8822d8 100644
--- a/src/preferences/dialog/dlgprefmodplug.cpp
+++ b/src/preferences/dialog/dlgprefmodplug.cpp
@@ -2,6 +2,7 @@
#include
+#include "defs_urls.h"
#include "moc_dlgprefmodplug.cpp"
#include "preferences/dialog/ui_dlgprefmodplugdlg.h"
#include "preferences/usersettings.h"
@@ -15,6 +16,8 @@ DlgPrefModplug::DlgPrefModplug(QWidget *parent,
m_pUi(new Ui::DlgPrefModplug),
m_pConfig(_config) {
m_pUi->setupUi(this);
+ // Create text color for the OpenMTP manual link
+ createLinkColor();
m_pUi->advancedSettings->setVisible(m_pUi->showAdvanced->isChecked());
connect(m_pUi->memoryLimit,
@@ -29,6 +32,14 @@ DlgPrefModplug::DlgPrefModplug(QWidget *parent,
&QAbstractButton::toggled,
m_pUi->advancedSettings,
&QWidget::setVisible);
+
+ m_pUi->modplugSettingsHint->setText(
+ tr("All settings take effect on next track load. Currently loaded tracks "
+ "are not affected. For an explanation of these settings, see the %1")
+ .arg(coloredLinkString(
+ m_pLinkColor,
+ "OpenMPT manual",
+ "http://wiki.openmpt.org/Manual:_Setup/Player")));
}
DlgPrefModplug::~DlgPrefModplug() {
diff --git a/src/preferences/dialog/dlgprefmodplugdlg.ui b/src/preferences/dialog/dlgprefmodplugdlg.ui
index fa62ff17a5f2..71c80818bf14 100644
--- a/src/preferences/dialog/dlgprefmodplugdlg.ui
+++ b/src/preferences/dialog/dlgprefmodplugdlg.ui
@@ -398,10 +398,7 @@
-
-
-
- All settings take effect on next track load. Currently loaded tracks are not affected. For an explanation of these settings, see the <a href="http://wiki.openmpt.org/Manual:_Setup/Player">OpenMPT manual</a>.
-
+
true
diff --git a/src/preferences/dialog/dlgprefnovinyl.cpp b/src/preferences/dialog/dlgprefnovinyl.cpp
index fb9afe21d4c9..e6497bfa3af2 100644
--- a/src/preferences/dialog/dlgprefnovinyl.cpp
+++ b/src/preferences/dialog/dlgprefnovinyl.cpp
@@ -2,6 +2,7 @@
#include
+#include "defs_urls.h"
#include "moc_dlgprefnovinyl.cpp"
DlgPrefNoVinyl::DlgPrefNoVinyl(QWidget * parent, SoundManager * soundman,
@@ -10,6 +11,17 @@ DlgPrefNoVinyl::DlgPrefNoVinyl(QWidget * parent, SoundManager * soundman,
Q_UNUSED(soundman);
Q_UNUSED(_config);
setupUi(this);
+ // Create text color for the cue mode link "?" to the manual
+ createLinkColor();
+ noVinylControlHint->setText(
+ // TODO That link is kinda pointless as it does not clarify
+ // why VC is not available
+ tr("This version of Mixxx does not support vinyl control.\n"
+ "Please visit %1 for more information.")
+ .arg(coloredLinkString(
+ m_pLinkColor,
+ MIXXX_WEBSITE_SHORT_URL,
+ MIXXX_WEBSITE_URL)));
}
DlgPrefNoVinyl::~DlgPrefNoVinyl() {
diff --git a/src/preferences/dialog/dlgprefnovinyldlg.ui b/src/preferences/dialog/dlgprefnovinyldlg.ui
index 212f0b011554..4f681708a10a 100644
--- a/src/preferences/dialog/dlgprefnovinyldlg.ui
+++ b/src/preferences/dialog/dlgprefnovinyldlg.ui
@@ -15,16 +15,13 @@
-
-
+
0
0
-
- <b>This version of Mixxx does not support vinyl control.</b> <br> Please visit <a href="http://mixxx.org">Mixxx.org</a> for more information.
-
true
diff --git a/src/preferences/dialog/dlgprefsound.cpp b/src/preferences/dialog/dlgprefsound.cpp
index 1316a21d6718..2d6358d7d897 100644
--- a/src/preferences/dialog/dlgprefsound.cpp
+++ b/src/preferences/dialog/dlgprefsound.cpp
@@ -29,6 +29,8 @@ DlgPrefSound::DlgPrefSound(QWidget* pParent,
m_bSkipConfigClear(true),
m_loading(false) {
setupUi(this);
+ // Create text color for the wiki links
+ createLinkColor();
connect(m_pSoundManager, &SoundManager::devicesUpdated, this, &DlgPrefSound::refreshDevices);
@@ -216,11 +218,11 @@ DlgPrefSound::DlgPrefSound(QWidget* pParent,
qDebug() << "RLimit Max " << RLimit::getMaxRtPrio();
if (RLimit::isRtPrioAllowed()) {
- limitsHint->setText(tr("Realtime scheduling is enabled."));
+ realtimeHint->setText(tr("Realtime scheduling is enabled."));
}
#else
// the limits warning is a Linux only thing
- limitsHint->hide();
+ realtimeHint->hide();
#endif // __LINUX__
// Set the focus policy for QComboBoxes (and wide QDoubleSpinBoxes) and
@@ -238,6 +240,21 @@ DlgPrefSound::DlgPrefSound(QWidget* pParent,
spin->installEventFilter(this);
}
}
+
+ realtimeHint->setText(
+ tr("To enable Realtime scheduling (currently disabled), see the %1.")
+ .arg(coloredLinkString(
+ m_pLinkColor,
+ QStringLiteral("Mixxx Wiki"),
+ MIXXX_WIKI_AUDIO_LATENCY_URL)));
+
+ hardwareGuide->setText(
+ tr("The %1 lists sound cards and controllers you may want to "
+ "consider for using Mixxx.")
+ .arg(coloredLinkString(
+ m_pLinkColor,
+ tr("Mixxx DJ Hardware Guide"),
+ MIXXX_WIKI_HARDWARE_COMPATIBILITY_URL)));
}
DlgPrefSound::~DlgPrefSound() {
diff --git a/src/preferences/dialog/dlgprefsounddlg.ui b/src/preferences/dialog/dlgprefsounddlg.ui
index 2c15e9b910c4..69fb2ab7f6bb 100644
--- a/src/preferences/dialog/dlgprefsounddlg.ui
+++ b/src/preferences/dialog/dlgprefsounddlg.ui
@@ -340,10 +340,7 @@
-
-
-
- Enable Realtime scheduling (currently disabled), see the <a href="http://mixxx.org/wiki/doku.php/adjusting_audio_latency">Mixxx Wiki</a>.
-
+
true
@@ -354,9 +351,6 @@
-
-
- The <a href="https://github.com/mixxxdj/mixxx/wiki/Hardware%20compatibility">Mixxx DJ Hardware Guide</a> lists sound cards and controllers you may want to consider for using Mixxx.
-
true
diff --git a/src/preferences/dialog/dlgprefvinyl.cpp b/src/preferences/dialog/dlgprefvinyl.cpp
index bc71880babda..30413fb8f185 100644
--- a/src/preferences/dialog/dlgprefvinyl.cpp
+++ b/src/preferences/dialog/dlgprefvinyl.cpp
@@ -20,6 +20,8 @@ DlgPrefVinyl::DlgPrefVinyl(QWidget * parent, VinylControlManager *pVCMan,
m_pNumDecks->connectValueChanged(this, &DlgPrefVinyl::slotNumDecksChanged);
setupUi(this);
+ // Create text color for the Troubleshooting link
+ createLinkColor();
delete groupBoxSignalQuality->layout();
QHBoxLayout *layout = new QHBoxLayout;
@@ -77,10 +79,10 @@ DlgPrefVinyl::DlgPrefVinyl(QWidget * parent, VinylControlManager *pVCMan,
LeadinTime3->setSuffix(" s");
LeadinTime4->setSuffix(" s");
- TroubleshootingLink->setText(
- QString("Troubleshooting")
- .arg(MIXXX_MANUAL_URL,
- "/chapters/vinyl_control.html#troubleshooting"));
+ TroubleshootingLink->setText(coloredLinkString(
+ m_pLinkColor,
+ QStringLiteral("Troubleshooting"),
+ MIXXX_MANUAL_VINYL_TROUBLESHOOTING_URL));
connect(VinylGain, &QSlider::sliderReleased, this, &DlgPrefVinyl::slotVinylGainApply);
connect(VinylGain,
diff --git a/src/preferences/dlgpreferencepage.h b/src/preferences/dlgpreferencepage.h
index 114cb043e4dc..7e8134eca872 100644
--- a/src/preferences/dlgpreferencepage.h
+++ b/src/preferences/dlgpreferencepage.h
@@ -4,6 +4,9 @@
#include
#include
+#include "util/color/color.h"
+#include "util/string.h"
+
/// Interface that all preference pages have to implement.
class DlgPreferencePage : public QWidget {
Q_OBJECT
@@ -16,6 +19,8 @@ class DlgPreferencePage : public QWidget {
/// overriding this. The default implementation returns an invalid QUrl.
virtual QUrl helpUrl() const;
+ QColor m_pLinkColor;
+
public slots:
/// Called when the preference dialog is shown to the user (not necessarily
/// when this PreferencePage is shown to the user). At this point, the
@@ -43,4 +48,14 @@ class DlgPreferencePage : public QWidget {
/// Called when the preferences dialog is hidden from the user.
virtual void slotHide() {}
+
+ // Supply a readable text color for all file and website links
+ inline void createLinkColor() {
+ // Blend the palette colors for regular text and link text to get a color
+ // that is more likely to be visible with dark OS themes.
+ // https://bugs.launchpad.net/mixxx/+bug/1900201
+ m_pLinkColor = Color::blendColors(palette().link().color(),
+ palette().text().color())
+ .name();
+ }
};
diff --git a/src/util/cmdlineargs.cpp b/src/util/cmdlineargs.cpp
index bcff9c4956f7..1259926519b9 100644
--- a/src/util/cmdlineargs.cpp
+++ b/src/util/cmdlineargs.cpp
@@ -178,5 +178,8 @@ void CmdlineArgs::printUsage() {
"\
-h, --help Display this help message and exit", stdout);
- fputs("\n\n(For more information, see http://mixxx.org/wiki/doku.php/command_line_options)\n",stdout);
+ fputs("\n\n(For more information, see "
+ "https://manual.mixxx.org/2.3/chapters/"
+ "appendix.html#command-line-options)\n",
+ stdout);
}
diff --git a/src/util/color/color.cpp b/src/util/color/color.cpp
index 182eeaf1f422..16a58718a4b7 100644
--- a/src/util/color/color.cpp
+++ b/src/util/color/color.cpp
@@ -51,4 +51,15 @@ QColor chooseContrastColor(QColor baseColor, int dimBrightThreshold) {
return contrastColor;
}
+QColor blendColors(QColor color1, QColor color2) {
+ if (!color1.isValid() || !color2.isValid()) {
+ return QColor();
+ }
+ int r = (color1.red() + color2.red()) / 2;
+ int g = (color1.green() + color2.green()) / 2;
+ int b = (color1.blue() + color2.blue()) / 2;
+ // TODO also blend alpha?
+ return QColor(r, g, b, 255);
+}
+
} // namespace Color
diff --git a/src/util/color/color.h b/src/util/color/color.h
index 912e642cef0a..ae1ea035b3d2 100644
--- a/src/util/color/color.h
+++ b/src/util/color/color.h
@@ -36,4 +36,7 @@ inline QColor chooseColorByBrightness(QColor colorToChooseBy,
// returns a lighter color, otherwise returns a darker color.
QColor chooseContrastColor(QColor baseColor, int dimBrightThreshold);
+// Blends two color 50/50
+QColor blendColors(QColor color1, QColor color2);
+
} // namespace Color
diff --git a/src/util/string.h b/src/util/string.h
index 71c9cc8339ec..64941f4c4bd5 100644
--- a/src/util/string.h
+++ b/src/util/string.h
@@ -1,7 +1,8 @@
#pragma once
-#include
#include
+#include
+#include
#include
#include
@@ -24,3 +25,15 @@ class StringCollator {
private:
QCollator m_collator;
};
+
+// Helper to create html link strings to be used for ui files, mostly in
+// Preferences dialogs.
+inline QString coloredLinkString(
+ const QColor& color,
+ const QString& text,
+ const QString& baseUrl,
+ const QString& extUrl = nullptr) {
+ return QStringLiteral("") + text + QStringLiteral("");
+}