Yes you are right. The code I showed in my first post is in the constructor of my TableListBoxModel class. The table is a TableListBox. Here is the entire code:
#include "../JuceLibraryCode/JuceHeader.h"
#include "ControlTrackTable.h"
ControlTrackTable::ControlTrackTable()
{
addAndMakeVisible(table);
font.setHeight(14.0);
table.setModel(this);
table.setColour(ListBox::outlineColourId, Colours::grey);
table.setHeaderHeight(1);
table.setOutlineThickness(1);
table.getHeader().addColumn("Col_1", 1, 25);
table.getHeader().addColumn("Col_2", 2, 50);
table.getHeader().addColumn("Col_3", 3, 25);
table.getHeader().addColumn("Col_4", 4, 500);
m_isPlaying = false;
m_selectedTrack = -1;
m_lastPlayingRow = -1;
}
ControlTrackTable::~ControlTrackTable()
{
}
void ControlTrackTable::setTrackName(int rowNumber, String text)
{
stateInfo.m_TrackName[rowNumber] = text;
}
void ControlTrackTable::setTrackDescription(int rowNumber, String text)
{
stateInfo.m_TrackDescription[rowNumber] = text;
}
void ControlTrackTable::setTrackLoadState(int rowNumber, int state)
{
stateInfo.m_TrackLoadState[rowNumber] = state;
}
void ControlTrackTable::setTrackType(int rowNumber, int type)
{
stateInfo.m_TrackType[rowNumber] = type;
}
void ControlTrackTable::setTrackFilePath(int rowNumber, String filePath)
{
stateInfo.m_TrackFilePath[rowNumber] = filePath;
}
String ControlTrackTable::getTrackName(int rowNumber)
{
return stateInfo.m_TrackName[rowNumber];
}
String ControlTrackTable::getTrackDescription(int rowNumber)
{
return stateInfo.m_TrackDescription[rowNumber];
}
int ControlTrackTable::getTrackLoadState(int rowNumber)
{
return stateInfo.m_TrackLoadState[rowNumber];
}
int ControlTrackTable::getTrackType(int rowNumber)
{
return stateInfo.m_TrackType[rowNumber];
}
String ControlTrackTable::getTrackFilePath(int rowNumber)
{
return stateInfo.m_TrackFilePath[rowNumber];
}
int ControlTrackTable::getNumRows()
{
return StateInfo::NUM_TRACKS;
}
void ControlTrackTable::paintRowBackground(Graphics& g, int rowNumber, int width, int, bool rowIsSelected)
{
if (rowIsSelected)
{
g.fillAll(Colours::lightblue);
m_selectedTrack = rowNumber;
}
else
{
g.fillAll(Colours::lightgrey);
}
if (rowNumber != 0)
{
g.drawLine(0.0, 0.0, float(width), 0);
}
}
void ControlTrackTable::paintCell(Graphics& g, int rowNumber, int columnId, int width, int height, bool /*rowIsSelected*/)
{
g.setColour(Colours::black);
g.setFont(font);
if (columnId == 1)
{
if (m_isPlaying && m_lastPlayingRow == rowNumber)
{
Path triangle;
float l = 12.0; float h = 10.0;
float x1 = 5.0; float y1 = 5.0;
triangle.addTriangle(x1+1, y1+1, x1+1, y1+1 + l, x1+1 + h, y1+1 + (l/2));
g.fillPath(triangle);
Path triangle2;
triangle2.addTriangle(x1, y1, x1, y1 + l, x1 + h, y1 + (l/2));
g.setColour(Colours::green);
g.fillPath(triangle2);
}
else
{
Rectangle<float> rect(5.0, 6.0, 10.0, 10.0);
if (stateInfo.m_TrackLoadState[rowNumber] == StateInfo::RED)
{
g.drawEllipse(rect, 1.0);
g.setColour(Colours::red);
g.fillEllipse(rect);
}
else if (stateInfo.m_TrackLoadState[rowNumber] == StateInfo::GREEN)
{
g.drawEllipse(rect, 1.0);
g.setColour(Colours::green);
g.fillEllipse(rect);
}
}
}
else if (columnId == 2)
{
g.setColour(Colours::grey);
if (stateInfo.m_TrackType[rowNumber] == StateInfo::AUDIO
|| stateInfo.m_TrackType[rowNumber] == StateInfo::RealTrack
|| stateInfo.m_TrackType[rowNumber] == StateInfo::RealDrums
|| stateInfo.m_TrackType[rowNumber] == StateInfo::Loop
|| stateInfo.m_TrackType[rowNumber] == StateInfo::RealDrumsLoop
|| stateInfo.m_TrackType[rowNumber] == StateInfo::ArtisticPerformanceTrack
|| stateInfo.m_TrackType[rowNumber] == StateInfo::UserTracks
|| stateInfo.m_TrackType[rowNumber] == StateInfo::Combo)
{
g.setColour(Colours::green);
}
else if (stateInfo.m_TrackType[rowNumber] == StateInfo::MIDI
|| stateInfo.m_TrackType[rowNumber] == StateInfo::MIDICUSTOM
|| stateInfo.m_TrackType[rowNumber] == StateInfo::MIDISuperTrack)
{
g.setColour(Colours::yellow);
}
g.drawText(stateInfo.m_TrackName[rowNumber], 2, 0, width - 4, height, Justification::centredLeft, true);
}
else if (columnId == 4)
{
g.setColour(Colours::grey);
if (stateInfo.m_TrackType[rowNumber] == StateInfo::AUDIO
|| stateInfo.m_TrackType[rowNumber] == StateInfo::RealTrack
|| stateInfo.m_TrackType[rowNumber] == StateInfo::RealDrums
|| stateInfo.m_TrackType[rowNumber] == StateInfo::Loop
|| stateInfo.m_TrackType[rowNumber] == StateInfo::RealDrumsLoop
|| stateInfo.m_TrackType[rowNumber] == StateInfo::ArtisticPerformanceTrack
|| stateInfo.m_TrackType[rowNumber] == StateInfo::UserTracks
|| stateInfo.m_TrackType[rowNumber] == StateInfo::Combo)
{
g.setColour(Colours::green);
}
else if (stateInfo.m_TrackType[rowNumber] == StateInfo::MIDI
|| stateInfo.m_TrackType[rowNumber] == StateInfo::MIDICUSTOM
|| stateInfo.m_TrackType[rowNumber] == StateInfo::MIDISuperTrack)
{
g.setColour(Colours::yellow);
}
g.drawText(stateInfo.m_TrackDescription[rowNumber], 2, 0, width - 4, height, Justification::centredLeft, true);
}
}
void ControlTrackTable::resized()
{
table.setBounds(0, 0, getWidth(), getHeight());
}
var ControlTrackTable::getDragSourceDescription(const SparseSet<int>& selectedRows)
{
if (!selectedRows.isEmpty())
{
for (int i = 0; i < 8; i++)
{
if (selectedRows.contains(i) && stateInfo.m_TrackLoadState[i] == StateInfo::GREEN)
{
DragAndDropContainer * dragContainer = DragAndDropContainer::findParentDragContainerFor(this);
StringArray str(stateInfo.m_TrackFilePath[i]);
dragContainer->performExternalDragDropOfFiles(str, false);
return dragContainer;
}
}
return var();
}
else
{
return var();
}
}
void ControlTrackTable::cellDoubleClicked(int rowNumber, int columnId, const MouseEvent&)
{
if (trackIsSetToPlay(rowNumber))
{
if (m_isPlaying && m_lastPlayingRow == rowNumber)
stopTrack(rowNumber);
else
{
playTrack(rowNumber);
}
}
}
bool ControlTrackTable::trackIsSetToPlay(int rowNumber)
{
if (rowNumber > -1 && rowNumber < StateInfo::NUM_TRACKS)
{
if (stateInfo.m_TrackLoadState[rowNumber] == StateInfo::GREEN
&& (stateInfo.m_TrackType[rowNumber] == StateInfo::AUDIO
|| stateInfo.m_TrackType[rowNumber] == StateInfo::RealTrack
|| stateInfo.m_TrackType[rowNumber] == StateInfo::RealDrums
|| stateInfo.m_TrackType[rowNumber] == StateInfo::Loop
|| stateInfo.m_TrackType[rowNumber] == StateInfo::RealDrumsLoop
|| stateInfo.m_TrackType[rowNumber] == StateInfo::ArtisticPerformanceTrack
|| stateInfo.m_TrackType[rowNumber] == StateInfo::UserTracks
|| stateInfo.m_TrackType[rowNumber] == StateInfo::Combo))
{
return true;
}
else
{
AlertWindow::showMessageBox(AlertWindow::NoIcon, "Audio playback:", "This track can't be played");
return false;
}
}
else {
AlertWindow::showMessageBox(AlertWindow::NoIcon, "Audio playback:", "No track is selected");
return false;
}
}
void ControlTrackTable::playTrack(int rowNumber)
{
audioPlayer.loadAudioFile(File(stateInfo.m_TrackFilePath[rowNumber]));
audioPlayer.play();
m_isPlaying = true;
m_lastPlayingRow = rowNumber;
repaint();
}
void ControlTrackTable::stopTrack(int rowNumber)
{
audioPlayer.stop();
m_isPlaying = false;
repaint();
}