fix choice of preset via plugin host (safely updates table from non-message thread)
This commit is contained in:
@ -21,18 +21,9 @@ using namespace Util;
|
||||
*/
|
||||
TableComponent::TableComponent(
|
||||
AudioProcessorValueTreeState& valueTreeState
|
||||
// const vector<string> &columns,
|
||||
// const vector<TableRow> &rows,
|
||||
// const function<void (int)> &onRowSelected,
|
||||
// const function<int (const vector<string>&)> &rowToIDMapper,
|
||||
// int initiallySelectedRow
|
||||
)
|
||||
: valueTreeState{valueTreeState}
|
||||
, font{14.0f}
|
||||
//, columns{columns}
|
||||
//, rows{rows}
|
||||
// , onRowSelected{onRowSelected}
|
||||
// rowToIDMapper(rowToIDMapper)
|
||||
{
|
||||
// Create our table component and add it to this component..
|
||||
addAndMakeVisible (table);
|
||||
@ -44,19 +35,6 @@ TableComponent::TableComponent(
|
||||
|
||||
int columnIx = 1;
|
||||
|
||||
// Add some columns to the table header, based on the column list in our database..
|
||||
// for (auto &column : columns) // access by reference to avoid copying
|
||||
// {
|
||||
// const int colWidth{ columnIx == 1 ? 30 : 200 };
|
||||
// table.getHeader().addColumn (
|
||||
// String(column),
|
||||
// columnIx++,
|
||||
// colWidth, // column width
|
||||
// 30, // min width
|
||||
// 400, // max width
|
||||
// TableHeaderComponent::defaultFlags
|
||||
// );
|
||||
// }
|
||||
table.getHeader().addColumn (
|
||||
String("#"),
|
||||
columnIx++,
|
||||
@ -76,20 +54,11 @@ TableComponent::TableComponent(
|
||||
|
||||
table.setWantsKeyboardFocus(false);
|
||||
|
||||
// table.selectRow();
|
||||
// ValueTree presets{valueTreeState.state.getChildWithName("presets")};
|
||||
ValueTree banks{valueTreeState.state.getChildWithName("banks")};
|
||||
loadModelFrom(banks);
|
||||
// selectCurrentPreset();
|
||||
|
||||
// we could now change some initial settings..
|
||||
table.getHeader().setSortColumnId(1, false); // sort ascending by ID column
|
||||
// table.getHeader().setColumnVisible (7, false); // hide the "length" column until the user shows it
|
||||
|
||||
// un-comment this line to have a go of stretch-to-fit mode
|
||||
// table.getHeader().setStretchToFitActive (true);
|
||||
|
||||
// table.setMultipleSelectionEnabled (false);
|
||||
valueTreeState.state.addListener(this);
|
||||
valueTreeState.addParameterListener("bank", this);
|
||||
valueTreeState.addParameterListener("preset", this);
|
||||
@ -101,27 +70,10 @@ TableComponent::~TableComponent() {
|
||||
valueTreeState.state.removeListener(this);
|
||||
}
|
||||
|
||||
// void TableComponent::loadModelFrom(ValueTree& presets) {
|
||||
// rows.clear();
|
||||
// int numChildren{presets.getNumChildren()};
|
||||
// for(int i{0}; i<numChildren; i++) {
|
||||
// ValueTree child{presets.getChild(i)};
|
||||
// int num{child.getProperty("num")};
|
||||
// String name{child.getProperty("name")};
|
||||
// rows.emplace_back(num, name);
|
||||
// }
|
||||
// table.deselectAllRows();
|
||||
// table.updateContent();
|
||||
// table.getHeader().setSortColumnId(0, true);
|
||||
// selectCurrentPreset();
|
||||
// table.repaint();
|
||||
// }
|
||||
|
||||
void TableComponent::loadModelFrom(ValueTree& banks) {
|
||||
banksToPresets.clear();
|
||||
int banksChildren{banks.getNumChildren()};
|
||||
for(int bankIx{0}; bankIx<banksChildren; bankIx++) {
|
||||
// vector<TableRow> presets;
|
||||
ValueTree bank{banks.getChild(bankIx)};
|
||||
int bankNum{bank.getProperty("num")};
|
||||
int bankChildren{bank.getNumChildren()};
|
||||
@ -129,9 +81,7 @@ void TableComponent::loadModelFrom(ValueTree& banks) {
|
||||
ValueTree preset{bank.getChild(presetIx)};
|
||||
int presetNum{preset.getProperty("num")};
|
||||
String presetName{preset.getProperty("name")};
|
||||
// presets.emplace_back(presetNum, presetName);
|
||||
TableRow row{presetNum, move(presetName)};
|
||||
// banksToPresets.insert(BanksToPresets::value_type(bankNum, move(row)));
|
||||
banksToPresets.emplace(bankNum, move(row));
|
||||
}
|
||||
}
|
||||
@ -139,15 +89,10 @@ void TableComponent::loadModelFrom(ValueTree& banks) {
|
||||
}
|
||||
|
||||
void TableComponent::parameterChanged(const String& parameterID, float newValue) {
|
||||
// valueTreeState.getParameter
|
||||
if (parameterID == "bank") {
|
||||
repopulateTable();
|
||||
} else if (parameterID == "preset") {
|
||||
selectCurrentPreset();
|
||||
// RangedAudioParameter *param {valueTreeState.getParameter("preset")};
|
||||
// jassert(dynamic_cast<AudioParameterInt*> (param) != nullptr);
|
||||
// AudioParameterInt* castParam {dynamic_cast<AudioParameterInt*> (param)};
|
||||
// int value{castParam->get()};
|
||||
}
|
||||
}
|
||||
|
||||
@ -170,7 +115,6 @@ void TableComponent::repopulateTable() {
|
||||
upperBound,
|
||||
back_inserter(rows),
|
||||
mem_fn(&BanksToPresets::value_type::second)
|
||||
// [](BanksToPresets::value_type element){return element.second;}
|
||||
);
|
||||
table.deselectAllRows();
|
||||
table.updateContent();
|
||||
@ -182,11 +126,6 @@ void TableComponent::repopulateTable() {
|
||||
void TableComponent::valueTreePropertyChanged(
|
||||
ValueTree& treeWhosePropertyHasChanged,
|
||||
const Identifier& property) {
|
||||
// if (treeWhosePropertyHasChanged.getType() == StringRef("presets")) {
|
||||
// if (property == StringRef("synthetic")) {
|
||||
// loadModelFrom(treeWhosePropertyHasChanged);
|
||||
// }
|
||||
// }
|
||||
if (treeWhosePropertyHasChanged.getType() == StringRef("banks")) {
|
||||
if (property == StringRef("synthetic")) {
|
||||
loadModelFrom(treeWhosePropertyHasChanged);
|
||||
@ -194,52 +133,6 @@ void TableComponent::valueTreePropertyChanged(
|
||||
}
|
||||
}
|
||||
|
||||
// void TableComponent::valueTreeParentChanged(ValueTree& treeWhoseParentHasChanged) {
|
||||
// if (treeWhoseParentHasChanged.getType() == StringRef("presets")) {
|
||||
// loadModelFrom(treeWhoseParentHasChanged);
|
||||
// }
|
||||
// }
|
||||
|
||||
// void TableComponent::valueTreePropertyChanged(
|
||||
// ValueTree& treeWhosePropertyHasChanged,
|
||||
// const Identifier& property) {
|
||||
// DEBUG_PRINT(treeWhosePropertyHasChanged.getType().toString());
|
||||
// }
|
||||
// void TableComponent::valueTreeChildAdded(
|
||||
// ValueTree& parentTree,
|
||||
// ValueTree& childWhichHasBeenAdded) {
|
||||
// DEBUG_PRINT(parentTree.getType().toString());
|
||||
// }
|
||||
// void TableComponent::valueTreeChildRemoved(
|
||||
// ValueTree& parentTree,
|
||||
// ValueTree& childWhichHasBeenRemoved,
|
||||
// int indexFromWhichChildWasRemoved) {
|
||||
// DEBUG_PRINT(parentTree.getType().toString());
|
||||
// }
|
||||
// void TableComponent::valueTreeChildOrderChanged(
|
||||
// ValueTree& parentTreeWhoseChildrenHaveMoved,
|
||||
// int oldIndex,
|
||||
// int newIndex) {
|
||||
// DEBUG_PRINT(parentTreeWhoseChildrenHaveMoved.getType().toString());
|
||||
// }
|
||||
// void TableComponent::valueTreeParentChanged(
|
||||
// ValueTree& treeWhoseParentHasChanged) {
|
||||
// DEBUG_PRINT(treeWhoseParentHasChanged.getType().toString());
|
||||
// }
|
||||
// void TableComponent::valueTreeRedirected(
|
||||
// ValueTree& treeWhichHasBeenChanged) {
|
||||
// DEBUG_PRINT(treeWhichHasBeenChanged.getType().toString());
|
||||
// }
|
||||
|
||||
// void TableComponent::setRows(const vector<vector<string>>& rows, int initiallySelectedRow) {
|
||||
// this->rows = rows;
|
||||
// table.deselectAllRows();
|
||||
// table.updateContent();
|
||||
// table.getHeader().setSortColumnId(0, true);
|
||||
// table.selectRow(initiallySelectedRow);
|
||||
// table.repaint();
|
||||
// }
|
||||
|
||||
// This is overloaded from TableListBoxModel, and must return the total number of rows in our table
|
||||
int TableComponent::getNumRows()
|
||||
{
|
||||
@ -297,40 +190,24 @@ void TableComponent::sortOrderChanged (
|
||||
bool isForwards
|
||||
) {
|
||||
if (newSortColumnId != 0) {
|
||||
// int selectedRowIx = table.getSelectedRow();
|
||||
// TableRow* selectedRow;
|
||||
// if (selectedRowIx >= 0) {
|
||||
// selectedRow = &rows[selectedRowIx];
|
||||
// }
|
||||
|
||||
TableComponent::DataSorter sorter (newSortColumnId, isForwards);
|
||||
sort(rows.begin(), rows.end(), sorter);
|
||||
|
||||
table.updateContent();
|
||||
selectCurrentPreset();
|
||||
|
||||
// if (selectedRowIx >= 0) {
|
||||
// for (auto it = rows.begin(); it != rows.end(); ++it) {
|
||||
// if(it->preset == value) {
|
||||
// int index {static_cast<int>(std::distance(rows.begin(), it))};
|
||||
// table.selectRow(index);
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
void TableComponent::selectCurrentPreset() {
|
||||
table.deselectAllRows();
|
||||
RangedAudioParameter *param {valueTreeState.getParameter("preset")};
|
||||
jassert(dynamic_cast<AudioParameterInt*> (param) != nullptr);
|
||||
AudioParameterInt* castParam {dynamic_cast<AudioParameterInt*> (param)};
|
||||
RangedAudioParameter *param{valueTreeState.getParameter("preset")};
|
||||
jassert(dynamic_cast<AudioParameterInt*>(param) != nullptr);
|
||||
AudioParameterInt* castParam{dynamic_cast<AudioParameterInt*>(param)};
|
||||
int value{castParam->get()};
|
||||
|
||||
for (auto it = rows.begin(); it != rows.end(); ++it) {
|
||||
for (auto it{rows.begin()}; it != rows.end(); ++it) {
|
||||
if(it->preset == value) {
|
||||
int index {static_cast<int>(distance(rows.begin(), it))};
|
||||
int index{static_cast<int>(distance(rows.begin(), it))};
|
||||
table.selectRow(index);
|
||||
break;
|
||||
}
|
||||
@ -397,12 +274,10 @@ void TableComponent::selectedRowsChanged (int row) {
|
||||
if (row < 0) {
|
||||
return;
|
||||
}
|
||||
// onRowSelected(rowToIDMapper(rows[row]));
|
||||
// onRowSelected(stoi(rows[row][0]));
|
||||
int newPreset{rows[row].preset};
|
||||
RangedAudioParameter *param {valueTreeState.getParameter("preset")};
|
||||
jassert(dynamic_cast<AudioParameterInt*> (param) != nullptr);
|
||||
AudioParameterInt* castParam {dynamic_cast<AudioParameterInt*> (param)};
|
||||
RangedAudioParameter *param{valueTreeState.getParameter("preset")};
|
||||
jassert(dynamic_cast<AudioParameterInt*>(param) != nullptr);
|
||||
AudioParameterInt* castParam{dynamic_cast<AudioParameterInt*>(param)};
|
||||
*castParam = newPreset;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user