summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Schürmann <daschuer@mixxx.org>2020-03-15 17:20:01 +0100
committerDaniel Schürmann <daschuer@mixxx.org>2020-03-17 23:51:27 +0100
commitd13f3ab486125b3ddbce8926f2330cf83e795468 (patch)
tree2698b225b533b009e0cf4609f5670628d5604b12
parent7ece3ef9525a0957178d04b3923964d41c0051f6 (diff)
Added WHotcueButton featuring a right click context menu
-rw-r--r--CMakeLists.txt1
-rw-r--r--build/depends.py1
-rw-r--r--res/skins/Deere/hotcue_button.xml7
-rw-r--r--res/skins/LateNight/button_hotcue.xml7
-rw-r--r--res/skins/Shade/hotcue_button.xml6
-rw-r--r--res/skins/Tango/button_hotcue_deck.xml6
-rw-r--r--res/skins/Tango/button_hotcue_sam_pre.xml6
-rw-r--r--src/skin/legacyskinparser.cpp79
-rw-r--r--src/skin/skincontext.h4
-rw-r--r--src/widget/whotcuebutton.cpp59
-rw-r--r--src/widget/whotcuebutton.h26
-rw-r--r--src/widget/woverview.cpp2
-rw-r--r--src/widget/woverview.h3
13 files changed, 157 insertions, 50 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7959253ab4..e581293c3d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -680,6 +680,7 @@ add_library(mixxx-lib STATIC EXCLUDE_FROM_ALL
src/widget/weffectparameterknobcomposed.cpp
src/widget/weffectpushbutton.cpp
src/widget/weffectselector.cpp
+ src/widget/whotcuebutton.cpp
src/widget/wimagestore.cpp
src/widget/wkey.cpp
src/widget/wknob.cpp
diff --git a/build/depends.py b/build/depends.py
index e13d2df5b3..eee9463315 100644
--- a/build/depends.py
+++ b/build/depends.py
@@ -960,6 +960,7 @@ class MixxxCore(Feature):
"src/widget/wvumeter.cpp",
"src/widget/wpushbutton.cpp",
"src/widget/weffectpushbutton.cpp",
+ "src/widget/whotcuebutton.cpp",
"src/widget/wslidercomposed.cpp",
"src/widget/wstatuslight.cpp",
"src/widget/woverview.cpp",
diff --git a/res/skins/Deere/hotcue_button.xml b/res/skins/Deere/hotcue_button.xml
index 2712d6eb0f..247351615b 100644
--- a/res/skins/Deere/hotcue_button.xml
+++ b/res/skins/Deere/hotcue_button.xml
@@ -8,13 +8,16 @@
SmallSquareButtonSize: the button size
-->
<Template>
- <PushButton>
+ <HotcueButton>
<TooltipId>hotcue</TooltipId>
<ObjectName>HotcueButton</ObjectName>
<MinimumSize>18,22</MinimumSize>
<MaximumSize>22,22</MaximumSize>
<SizePolicy>me,f</SizePolicy>
<NumberStates>2</NumberStates>
+ <Group><Variable name="group"/></Group>
+ <Hotcue><Variable name="hotcue"/></Hotcue>
+
<LeftClickIsPushButton><Variable name="LeftClickIsPushButton"/></LeftClickIsPushButton>
<RightClickIsPushButton><Variable name="RightClickIsPushButton"/></RightClickIsPushButton>
<State>
@@ -49,5 +52,5 @@
<ConfigKey><Variable name="group"/>,hotcue_<Variable name="hotcue"/>_color</ConfigKey>
<BindProperty>backgroundColorRgba</BindProperty>
</Connection>
- </PushButton>
+ </HotcueButton>
</Template>
diff --git a/res/skins/LateNight/button_hotcue.xml b/res/skins/LateNight/button_hotcue.xml
index 920ffc05d3..05afcc6b23 100644
--- a/res/skins/LateNight/button_hotcue.xml
+++ b/res/skins/LateNight/button_hotcue.xml
@@ -7,13 +7,16 @@
<SizePolicy>me,f</SizePolicy>
<Layout>horizontal</Layout>
<Children>
- <PushButton>
+ <HotcueButton>
<TooltipId>hotcue</TooltipId>
<ObjectName>HotcueButton</ObjectName>
<MinimumSize>26,26</MinimumSize>
<MaximumSize>26,26</MaximumSize>
<SizePolicy>me,f</SizePolicy>
<NumberStates>2</NumberStates>
+ <Group><Variable name="group"/></Group>
+ <Hotcue><Variable name="number"/></Hotcue>
+
<State>
<Number>0</Number>
<Unpressed scalemode="STRETCH">skin:/buttons_<Variable name="btn_scheme"/>/btn_<Variable name="btn_type"/>_square.svg</Unpressed>
@@ -40,7 +43,7 @@
<ConfigKey><Variable name="group"/>,hotcue_<Variable name="number"/>_color</ConfigKey>
<BindProperty>backgroundColorRgba</BindProperty>
</Connection>
- </PushButton>
+ </HotcueButton>
</Children>
</WidgetGroup>
</Template>
diff --git a/res/skins/Shade/hotcue_button.xml b/res/skins/Shade/hotcue_button.xml
index 40149e41b8..a12d94bd8b 100644
--- a/res/skins/Shade/hotcue_button.xml
+++ b/res/skins/Shade/hotcue_button.xml
@@ -1,9 +1,11 @@
<Template>
- <PushButton>
+ <HotcueButton>
<TooltipId>hotcue</TooltipId>
<ObjectName>HotcueButton</ObjectName>
<Pos><Variable name="pos"/></Pos>
<NumberStates>2</NumberStates>
+ <Group><Variable name="group"/></Group>
+ <Hotcue><Variable name="hotcue"/></Hotcue>
<State>
<Number>0</Number>
<Pressed>skin:/btn/btn_hotcue_<Variable name="hotcue"/>.png</Pressed>
@@ -30,5 +32,5 @@
<ConfigKey><Variable name="group"/>,hotcue_<Variable name="hotcue"/>_color</ConfigKey>
<BindProperty>backgroundColorRgba</BindProperty>
</Connection>
- </PushButton>
+ </HotcueButton>
</Template>
diff --git a/res/skins/Tango/button_hotcue_deck.xml b/res/skins/Tango/button_hotcue_deck.xml
index eb0785f234..6627b1e062 100644
--- a/res/skins/Tango/button_hotcue_deck.xml
+++ b/res/skins/Tango/button_hotcue_deck.xml
@@ -8,13 +8,15 @@ Variables:
HotCue: hotcue number
-->
<Template>
- <PushButton>
+ <HotcueButton>
<TooltipId>hotcue</TooltipId>
<ObjectName>HotcueButton</ObjectName>
<MinimumSize>15,24</MinimumSize>
<MaximumSize>23,24</MaximumSize>
<SizePolicy>me,f</SizePolicy>
<NumberStates>2</NumberStates>
+ <Group><Variable name="group"/></Group>
+ <Hotcue><Variable name="HotCue"/></Hotcue>
<State>
<Number>0</Number>
<Text><Variable name="HotCue"/></Text>
@@ -41,5 +43,5 @@ Variables:
<ConfigKey><Variable name="group"/>,hotcue_<Variable name="HotCue"/>_color</ConfigKey>
<BindProperty>backgroundColorRgba</BindProperty>
</Connection>
- </PushButton>
+ </HotcueButton>
</Template>
diff --git a/res/skins/Tango/button_hotcue_sam_pre.xml b/res/skins/Tango/button_hotcue_sam_pre.xml
index 5f13a21662..214612e669 100644
--- a/res/skins/Tango/button_hotcue_sam_pre.xml
+++ b/res/skins/Tango/button_hotcue_sam_pre.xml
@@ -9,13 +9,15 @@ Variables:
HotCue: hotcue number
-->
<Template>
- <PushButton>
+ <HotcueButton>
<TooltipId>hotcue</TooltipId>
<ObjectName>HotcueButton</ObjectName>
<MinimumSize>14,18</MinimumSize>
<MaximumSize>20,18</MaximumSize>
<SizePolicy>me,f</SizePolicy>
<NumberStates>2</NumberStates>
+ <Group><Variable name="group"/></Group>
+ <Hotcue><Variable name="HotCue"/></Hotcue>
<State>
<Number>0</Number>
<Text><Variable name="HotCue"/></Text>
@@ -38,5 +40,5 @@ Variables:
<ConfigKey><Variable name="group"/>,hotcue_<Variable name="HotCue"/>_enabled</ConfigKey>
<ConnectValueFromWidget>false</ConnectValueFromWidget>
</Connection>
- </PushButton>
+ </HotcueButton>
</Template>
diff --git a/src/skin/legacyskinparser.cpp b/src/skin/legacyskinparser.cpp
index 19ee2fc857..30cd1c3ae7 100644
--- a/src/skin/legacyskinparser.cpp
+++ b/src/skin/legacyskinparser.cpp
@@ -32,59 +32,60 @@
#include "recording/recordingmanager.h"
+#include "util/cmdlineargs.h"
+#include "util/timer.h"
+#include "util/valuetransformer.h"
+#include "waveform/waveformwidgetfactory.h"
#include "widget/controlwidgetconnection.h"
#include "widget/wbasewidget.h"
+#include "widget/wbattery.h"
+#include "widget/wbeatspinbox.h"
+#include "widget/wcombobox.h"
#include "widget/wcoverart.h"
-#include "widget/wwidget.h"
+#include "widget/wdisplay.h"
+#include "widget/weffect.h"
+#include "widget/weffectbuttonparameter.h"
+#include "widget/weffectchain.h"
+#include "widget/weffectparameter.h"
+#include "widget/weffectparameterbase.h"
+#include "widget/weffectparameterknob.h"
+#include "widget/weffectparameterknobcomposed.h"
+#include "widget/weffectpushbutton.h"
+#include "widget/weffectselector.h"
+#include "widget/whotcuebutton.h"
+#include "widget/wkey.h"
#include "widget/wknob.h"
#include "widget/wknobcomposed.h"
-#include "widget/wslidercomposed.h"
-#include "widget/wpushbutton.h"
-#include "widget/weffectpushbutton.h"
-#include "widget/wdisplay.h"
-#include "widget/wvumeter.h"
-#include "widget/wstatuslight.h"
#include "widget/wlabel.h"
-#include "widget/wtime.h"
-#include "widget/wrecordingduration.h"
-#include "widget/wtracktext.h"
-#include "widget/wtrackproperty.h"
-#include "widget/wstarrating.h"
+#include "widget/wlibrary.h"
+#include "widget/wlibrarysidebar.h"
#include "widget/wnumber.h"
#include "widget/wnumberdb.h"
#include "widget/wnumberpos.h"
#include "widget/wnumberrate.h"
-#include "widget/weffectchain.h"
-#include "widget/weffect.h"
-#include "widget/weffectselector.h"
-#include "widget/weffectparameter.h"
-#include "widget/weffectparameterknob.h"
-#include "widget/weffectparameterknobcomposed.h"
-#include "widget/weffectbuttonparameter.h"
-#include "widget/weffectparameterbase.h"
-#include "widget/wbeatspinbox.h"
-#include "widget/woverviewlmh.h"
#include "widget/woverviewhsv.h"
+#include "widget/woverviewlmh.h"
#include "widget/woverviewrgb.h"
-#include "widget/wspinny.h"
-#include "widget/wwaveformviewer.h"
-#include "waveform/waveformwidgetfactory.h"
-#include "widget/wsearchlineedit.h"
-#include "widget/wlibrary.h"
-#include "widget/wlibrarysidebar.h"
-#include "widget/wskincolor.h"
#include "widget/wpixmapstore.h"
-#include "widget/wwidgetstack.h"
+#include "widget/wpushbutton.h"
+#include "widget/wrecordingduration.h"
+#include "widget/wsearchlineedit.h"
+#include "widget/wsingletoncontainer.h"
#include "widget/wsizeawarestack.h"
-#include "widget/wwidgetgroup.h"
-#include "widget/wkey.h"
-#include "widget/wbattery.h"
-#include "widget/wcombobox.h"
+#include "widget/wskincolor.h"
+#include "widget/wslidercomposed.h"
+#include "widget/wspinny.h"
#include "widget/wsplitter.h"
-#include "widget/wsingletoncontainer.h"
-#include "util/valuetransformer.h"
-#include "util/cmdlineargs.h"
-#include "util/timer.h"
+#include "widget/wstarrating.h"
+#include "widget/wstatuslight.h"
+#include "widget/wtime.h"
+#include "widget/wtrackproperty.h"
+#include "widget/wtracktext.h"
+#include "widget/wvumeter.h"
+#include "widget/wwaveformviewer.h"
+#include "widget/wwidget.h"
+#include "widget/wwidgetgroup.h"
+#include "widget/wwidgetstack.h"
using mixxx::skin::SkinManifest;
@@ -505,6 +506,8 @@ QList<QWidget*> LegacySkinParser::parseNode(const QDomElement& node) {
result = wrapWidget(parseStandardWidget<WPushButton>(node));
} else if (nodeName == "EffectPushButton") {
result = wrapWidget(parseEffectPushButton(node));
+ } else if (nodeName == "HotcueButton") {
+ result = wrapWidget(parseStandardWidget<WHotcueButton>(node));
} else if (nodeName == "ComboBox") {
result = wrapWidget(parseStandardWidget<WComboBox>(node));
} else if (nodeName == "Overview") {
diff --git a/src/skin/skincontext.h b/src/skin/skincontext.h
index 8898b337f3..2095e26dca 100644
--- a/src/skin/skincontext.h
+++ b/src/skin/skincontext.h
@@ -257,6 +257,10 @@ class SkinContext {
return m_scaleFactor;
}
+ UserSettingsPointer getConfig() const {
+ return m_pConfig;
+ }
+
private:
PixmapSource getPixmapSourceInner(const QString& filename) const;
diff --git a/src/widget/whotcuebutton.cpp b/src/widget/whotcuebutton.cpp
new file mode 100644
index 0000000000..de177abfe3
--- /dev/null
+++ b/src/widget/whotcuebutton.cpp
@@ -0,0 +1,59 @@
+#include "widget/whotcuebutton.h"
+
+#include <QtDebug>
+#include "mixer/playerinfo.h"
+
+WHotcueButton::WHotcueButton(QWidget* pParent)
+ : WPushButton(pParent),
+ m_hotcue(Cue::kNoHotCue) {
+}
+
+void WHotcueButton::setup(const QDomNode& node, const SkinContext& context) {
+ // Setup parent class.
+ WPushButton::setup(node, context);
+
+ m_group = context.selectString(node, "Group");
+ bool ok;
+ int hotcue = context.selectString(node, "Hotcue").toInt(&ok);
+ if (ok && hotcue > 0) {
+ m_hotcue = hotcue - 1;
+ }
+
+ m_pCueMenuPopup = make_parented<WCueMenuPopup>(context.getConfig(), this);
+ ColorPaletteSettings colorPaletteSettings(context.getConfig());
+ auto colorPalette = colorPaletteSettings.getHotcueColorPalette();
+ m_pCueMenuPopup->setColorPalette(colorPalette);
+
+ setFocusPolicy(Qt::NoFocus);
+}
+
+void WHotcueButton::mousePressEvent(QMouseEvent* e) {
+ const bool rightClick = e->button() == Qt::RightButton;
+ if (rightClick) {
+ if (readDisplayValue() == 1) {
+ // hot cue is set
+ TrackPointer pTrack = PlayerInfo::instance().getTrackInfo(m_group);
+ if (!pTrack) {
+ return;
+ }
+
+ CuePointer pHotCue;
+ QList<CuePointer> cueList = pTrack->getCuePoints();
+ for (const auto& pCue : cueList) {
+ if (pCue->getHotCue() == m_hotcue) {
+ pHotCue = pCue;
+ break;
+ }
+ }
+ if (!pHotCue) {
+ return;
+ }
+ m_pCueMenuPopup->setTrackAndCue(pTrack, pHotCue);
+ m_pCueMenuPopup->popup(e->globalPos());
+ }
+ return;
+ }
+
+ // Pass all other press events to the base class.
+ WPushButton::mousePressEvent(e);
+}
diff --git a/src/widget/whotcuebutton.h b/src/widget/whotcuebutton.h
new file mode 100644
index 0000000000..0f2d81b176
--- /dev/null
+++ b/src/widget/whotcuebutton.h
@@ -0,0 +1,26 @@
+#pragma once
+
+#include <QDomNode>
+#include <QMouseEvent>
+#include <QWidget>
+
+#include "skin/skincontext.h"
+#include "util/parented_ptr.h"
+#include "widget/wcuemenupopup.h"
+#include "widget/wpushbutton.h"
+
+class WHotcueButton : public WPushButton {
+ Q_OBJECT
+ public:
+ WHotcueButton(QWidget* pParent);
+
+ void setup(const QDomNode& node, const SkinContext& context) override;
+
+ protected:
+ void mousePressEvent(QMouseEvent* e) override;
+
+ private:
+ QString m_group;
+ int m_hotcue;
+ parented_ptr<WCueMenuPopup> m_pCueMenuPopup;
+};
diff --git a/src/widget/woverview.cpp b/src/widget/woverview.cpp
index 4fb65c6fbf..a6475491f7 100644
--- a/src/widget/woverview.cpp
+++ b/src/widget/woverview.cpp
@@ -54,7 +54,7 @@ WOverview::WOverview(
m_group(group),
m_pConfig(pConfig),
m_endOfTrack(false),
- m_pCueMenuPopup(std::make_unique<WCueMenuPopup>(pConfig, this)),
+ m_pCueMenuPopup(make_parented<WCueMenuPopup>(pConfig, this)),
m_bShowCueTimes(true),
m_iPosSeconds(0),
m_bLeftClickDragging(false),
diff --git a/src/widget/woverview.h b/src/widget/woverview.h
index 25ce680bd1..a3e6a93d44 100644
--- a/src/widget/woverview.h
+++ b/src/widget/woverview.h
@@ -25,6 +25,7 @@
#include "widget/wwidget.h"
#include "util/color/color.h"
+#include "util/parented_ptr.h"
#include "waveform/renderers/waveformsignalcolors.h"
#include "waveform/renderers/waveformmarkset.h"
@@ -141,7 +142,7 @@ class WOverview : public WWidget, public TrackDropTarget {
TrackPointer m_pCurrentTrack;
ConstWaveformPointer m_pWaveform;
- std::unique_ptr<WCueMenuPopup> m_pCueMenuPopup;
+ parented_ptr<WCueMenuPopup> m_pCueMenuPopup;
bool m_bShowCueTimes;
int m_iPosSeconds;