Krotos Modules 3
Loading...
Searching...
No Matches
SampleItem.cpp
Go to the documentation of this file.
1namespace krotos
2{
5 const String SampleItem::ComponentIds::ButtonSampleDeleteId("DeleteButton");
6 const String SampleItem::ComponentIds::ButtonSampleSelectId("SampleSelectButton");
7
8 const Identifier SampleItem::CuedId{"Cued"};
9
10 SampleItem::SampleItem(const String& sampleLabel)
11 : sampleSelectButton(sampleLabel), muteButton("M"), soloButton("S"),
12 playButton("Preview", DrawableButton::ButtonStyle::ImageFitted),
13 deleteButton("Remove", DrawableButton::ButtonStyle::ImageFitted)
14 {
15 // Initialise drawables
16 m_playIcon = Drawable::createFromImageData(KrotosBinaryData::Preview_Sample_Icon_Default_svg,
17 KrotosBinaryData::Preview_Sample_Icon_Default_svgSize);
18 m_playIconHover = Drawable::createFromImageData(KrotosBinaryData::Preview_Sample_Icon_Hover_svg,
19 KrotosBinaryData::Preview_Sample_Icon_Hover_svgSize);
20 m_playIconClick = Drawable::createFromImageData(KrotosBinaryData::Preview_Sample_Icon_Click_svg,
21 KrotosBinaryData::Preview_Sample_Icon_Click_svgSize);
22
23 m_deleteIcon = Drawable::createFromImageData(KrotosBinaryData::Remove_Sample_Icon_Default_svg,
24 KrotosBinaryData::Remove_Sample_Icon_Default_svgSize);
25 m_deleteIconHover = Drawable::createFromImageData(KrotosBinaryData::Remove_Sample_Icon_Hover_svg,
26 KrotosBinaryData::Remove_Sample_Icon_Hover_svgSize);
27
28 playButton.setImages(m_playIcon.get(), m_playIconHover.get(), m_playIconClick.get());
29 deleteButton.setImages(m_deleteIcon.get(), m_deleteIconHover.get(), m_deleteIconClick.get());
30
31 addAndMakeVisible(sampleSelectButton);
33 addAndMakeVisible(muteButton);
35 addAndMakeVisible(soloButton);
37 addAndMakeVisible(deleteButton);
39
40 // KST-2359 Disable play button Todo: Reimplement post 2.0.0 release
41 // addAndMakeVisible(m_playButton);
42
43 muteButton.setLookAndFeel(&m_muteSoloButtonLAF);
44 soloButton.setLookAndFeel(&m_muteSoloButtonLAF);
45
46 muteButton.addListener(this);
47 soloButton.addListener(this);
48
49 muteButton.setColour(TextButton::ColourIds::textColourOnId, Colour(251, 68, 77));
50 muteButton.setColour(TextButton::ColourIds::textColourOffId, Colours::white);
51 soloButton.setColour(TextButton::ColourIds::textColourOnId, Colours::white);
52 soloButton.setColour(TextButton::ColourIds::textColourOffId, Colours::white);
53 muteButton.setClickingTogglesState(true);
54 soloButton.setClickingTogglesState(true);
55 sampleSelectButton.setToggleable(true);
56 }
57
59 {
60 muteButton.setLookAndFeel(nullptr);
61 soloButton.setLookAndFeel(nullptr);
62
63 muteButton.removeListener(this);
64 soloButton.removeListener(this);
65 }
66
68 {
69 auto bounds = getLocalBounds();
70
71 bounds.removeFromLeft(6); // margin
72 auto muteSoloRect = bounds.removeFromLeft(m_layout.msWidth);
73 // Add 5px for overlap / oversize
74 muteButton.setBounds(m_layout.muteButton.withSizeKeepingCentre(m_layout.msBtnWidth, m_layout.msBtnHeight));
75 soloButton.setBounds(m_layout.soloButton.withSizeKeepingCentre(m_layout.msBtnWidth, m_layout.msBtnHeight));
76 bounds.removeFromLeft(m_layout.margin); // margin
77
78 deleteButton.setBounds(bounds.removeFromRight(m_layout.iconWidth).reduced(3));
79
80 // KST-2359 Disable play button Todo: Reimplement post 2.0.0 release
81 // m_playButton.setBounds(bounds.removeFromLeft(m_layout.iconWidth).reduced(3));
82
83 // Recalculate label width to fill gap of missing play button
84 const int labelWidth = m_layout.labelWidth + m_layout.iconWidth;
85
86 bounds.removeFromLeft(m_layout.margin); // margin
87
88 sampleSelectButton.setBounds(
89 bounds.removeFromLeft(labelWidth).withSizeKeepingCentre(labelWidth, m_layout.labelHeight));
90 }
91
92 void SampleItem::paint(Graphics& g)
93 {
94 bool mouseOver = sampleSelectButton.isEnabled() && sampleSelectButton.isMouseOver();
95 if (m_isCued || mouseOver)
96 {
97 g.setColour(m_layout.cueMarkerCyan.withAlpha(mouseOver ? 0.7f : 1.0f));
98 // place ellipse in centre of bounds
99 g.fillEllipse(m_layout.cueMarkerX, getHeight() / 2 - (m_layout.cueMarkerHeight / 2),
101 }
102 }
103
104 void SampleItem::buttonClicked(Button* button)
105 {
106 // Prevent mute from being activated if it's already solo'ed
107 if (button == &muteButton)
108 {
109 if (muteButton.getToggleState() && soloButton.getToggleState())
110 {
111 muteButton.setToggleState(false, NotificationType::dontSendNotification);
112 }
113 }
114 }
115
116 void SampleItem::setCued(bool isCued)
117 {
118 m_isCued = isCued;
119 sampleSelectButton.getProperties().set(CuedId, isCued);
120 repaint();
121 }
122
123 void SampleItem::MuteSoloButtonLAF::drawButtonText(Graphics& g, TextButton& button,
124 bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown)
125 {
126 Font font(button.getHeight());
127 g.setFont(font);
128 float defaultOpacity = 0.1f;
129 float clickOpacity = button.getComponentID() == "MuteIcon" ? 0.7f : 1.0f;
130 auto opacity = button.isMouseButtonDown() || button.getToggleState()
131 ? clickOpacity
132 : (button.isMouseOver() ? 0.7f : defaultOpacity);
133
134 g.setColour(
135 button.findColour(button.getToggleState() ? TextButton::textColourOnId : TextButton::textColourOffId)
136 .withAlpha(opacity));
137
138 g.drawFittedText(button.getButtonText(), 0, 0, button.getWidth(), button.getHeight(), Justification::centred, 1,
139 1.0f);
140 }
141} // namespace krotos
void drawButtonText(Graphics &, TextButton &, bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override
Definition SampleItem.cpp:123
bool m_isCued
Definition SampleItem.h:92
SampleItem(const String &sampleLabel)
Creates a SampleItem component.
Definition SampleItem.cpp:10
void paint(Graphics &g) override
Definition SampleItem.cpp:92
struct krotos::SampleItem::Layout m_layout
void resized() override
Definition SampleItem.cpp:67
std::unique_ptr< Drawable > m_playIconClick
Definition SampleItem.h:76
std::unique_ptr< Drawable > m_deleteIconClick
Definition SampleItem.h:77
std::unique_ptr< Drawable > m_playIcon
Definition SampleItem.h:76
std::unique_ptr< Drawable > m_playIconHover
Definition SampleItem.h:76
std::unique_ptr< Drawable > m_deleteIconHover
Definition SampleItem.h:77
TextButton soloButton
Definition SampleItem.h:23
TextButton sampleSelectButton
The sample name text button.
Definition SampleItem.h:28
~SampleItem()
Definition SampleItem.cpp:58
MuteSoloButtonLAF m_muteSoloButtonLAF
Definition SampleItem.h:88
TextButton muteButton
The Mute/Solo buttons visible in the SampleItem.
Definition SampleItem.h:23
void buttonClicked(Button *buttonThatWasClicked) override
Definition SampleItem.cpp:104
DrawableButton playButton
Definition SampleItem.h:30
DrawableButton deleteButton
Definition SampleItem.h:30
static const Identifier CuedId
Identifier used for the boolean LAF property to draw this item as cued or not.
Definition SampleItem.h:45
std::unique_ptr< Drawable > m_deleteIcon
Definition SampleItem.h:77
void setCued(bool isCued)
Call this to enable or disable the "cued" state for this component. This will draw a marker icon and ...
Definition SampleItem.cpp:116
Definition AirAbsorptionFilter.cpp:2
static const String ButtonSampleSelectId
Definition SampleItem.h:52
static const String ButtonSampleSoloId
Definition SampleItem.h:50
static const String ButtonSampleMuteId
Definition SampleItem.h:49
static const String ButtonSampleDeleteId
Definition SampleItem.h:51
const Colour cueMarkerCyan
Definition SampleItem.h:71
const int labelHeight
Definition SampleItem.h:69
const int msBtnWidth
Definition SampleItem.h:63
const Rectangle< int > muteButton
Definition SampleItem.h:61
const int labelWidth
Definition SampleItem.h:68
const int cueMarkerHeight
Definition SampleItem.h:73
const int msWidth
Definition SampleItem.h:60
const Rectangle< int > soloButton
Definition SampleItem.h:62
const int margin
Definition SampleItem.h:58
const int cueMarkerX
Definition SampleItem.h:72
const int msBtnHeight
Definition SampleItem.h:64
const int iconWidth
Definition SampleItem.h:66