commit d59a4e953730e1e0ff7d9a8390da9f1b53ac1dec
parent 314559327e13d1dc2b09df3a3ede19006e33a6e3
Author: dsp56300 <dsp56300@users.noreply.github.com>
Date: Sat, 8 Mar 2025 12:50:36 +0100
support multiple waves/tables in D&D, add support to D&D all user waves to .mid file
Diffstat:
7 files changed, 74 insertions(+), 32 deletions(-)
diff --git a/source/xtJucePlugin/weControlTreeItem.cpp b/source/xtJucePlugin/weControlTreeItem.cpp
@@ -65,7 +65,7 @@ namespace xtJucePlugin
auto* desc = new WaveDesc(m_editor);
- desc->waveId = m_wave;
+ desc->waveIds = {m_wave};
desc->source = WaveDescSource::ControlTableList;
desc->tableIndex = m_index;
@@ -78,7 +78,14 @@ namespace xtJucePlugin
{
if(xt::wave::isReadOnly(m_table) || xt::wave::isReadOnly(m_index))
return false;
- return WaveDesc::fromDragSource(_dragSourceDetails) != nullptr;
+ auto* desc = WaveDesc::fromDragSource(_dragSourceDetails);
+ if (desc == nullptr)
+ return false;
+ if (desc->source == WaveDescSource::WaveList && desc->waveIds.size() != 1)
+ return false;
+ if (desc->source == WaveDescSource::ControlTableList && desc->tableIndex == m_index)
+ return false;
+ return true;
}
void ControlTreeItem::itemDropped(const juce::DragAndDropTarget::SourceDetails& _dragSourceDetails, int _insertIndex)
@@ -98,9 +105,9 @@ namespace xtJucePlugin
data.sendTableToDevice(m_table);
}
}
- else if(waveDesc->source == WaveDescSource::WaveList)
+ else if(waveDesc->source == WaveDescSource::WaveList && waveDesc->waveIds.size() == 1)
{
- if(data.setTableWave(m_table, m_index, waveDesc->waveId))
+ if(data.setTableWave(m_table, m_index, waveDesc->waveIds.front()))
data.sendTableToDevice(m_table);
}
}
diff --git a/source/xtJucePlugin/weTablesTreeItem.cpp b/source/xtJucePlugin/weTablesTreeItem.cpp
@@ -36,7 +36,7 @@ namespace xtJucePlugin
{
auto* waveDesc = new WaveDesc(m_editor);
- waveDesc->tableId = m_index;
+ waveDesc->tableIds = {m_index};
waveDesc->source = WaveDescSource::TablesList;
waveDesc->fillData(m_editor.getData());
@@ -51,7 +51,9 @@ namespace xtJucePlugin
const auto* waveDesc = WaveDesc::fromDragSource(dragSourceDetails);
if(!waveDesc || waveDesc->source != WaveDescSource::TablesList)
return false;
- return waveDesc->tableId != m_index;
+ if (waveDesc->tableIds.size() != -1)
+ return false;
+ return waveDesc->tableIds.front() != m_index;
}
void TablesTreeItem::itemDropped(const juce::DragAndDropTarget::SourceDetails& dragSourceDetails, int insertIndex)
@@ -60,11 +62,11 @@ namespace xtJucePlugin
const auto* waveDesc = WaveDesc::fromDragSource(dragSourceDetails);
- if(!waveDesc || waveDesc->source != WaveDescSource::TablesList || waveDesc->tableId == m_index)
+ if(!waveDesc || waveDesc->source != WaveDescSource::TablesList || waveDesc->tableIds.size() != 1 || waveDesc->tableIds.front() == m_index)
return;
auto& data = m_editor.getData();
- if(data.copyTable(m_index, waveDesc->tableId))
+ if(data.copyTable(m_index, waveDesc->tableIds.front()))
{
setSelected(true, true, juce::dontSendNotification);
m_editor.setSelectedTable(m_index);
diff --git a/source/xtJucePlugin/weWaveCategoryTreeItem.cpp b/source/xtJucePlugin/weWaveCategoryTreeItem.cpp
@@ -1,5 +1,6 @@
#include "weWaveCategoryTreeItem.h"
+#include "weWaveDesc.h"
#include "weWaveTreeItem.h"
#include "xtWaveEditor.h"
@@ -59,7 +60,14 @@ namespace xtJucePlugin
juce::var WaveCategoryTreeItem::getDragSourceDescription()
{
- return TreeItem::getDragSourceDescription();
+ auto* desc = new WaveDesc(m_editor);
+
+ desc->waveIds = getWaveIds();
+ desc->source = WaveDescSource::WaveList;
+
+ desc->fillData(m_editor.getData());
+
+ return desc;
}
void WaveCategoryTreeItem::itemClicked(const juce::MouseEvent& _mouseEvent)
@@ -99,16 +107,20 @@ namespace xtJucePlugin
void WaveCategoryTreeItem::exportAll(const bool _midi) const
{
- std::vector<xt::WaveId> waveIds;
+ auto waveIds = getWaveIds();
- waveIds.reserve(getNumSubItems());
+ m_editor.exportAsSyxOrMid(waveIds, _midi);
+ }
+ std::vector<xt::WaveId> WaveCategoryTreeItem::getWaveIds() const
+ {
+ std::vector<xt::WaveId> waveIds;
+ waveIds.reserve(getNumSubItems());
for (int i = 0; i < getNumSubItems(); ++i)
{
- if (auto* subItem = dynamic_cast<WaveTreeItem*>(getSubItem(i)))
+ if (const auto* subItem = dynamic_cast<WaveTreeItem*>(getSubItem(i)))
waveIds.push_back(subItem->getWaveId());
}
-
- m_editor.exportAsSyxOrMid(waveIds, _midi);
+ return waveIds;
}
}
diff --git a/source/xtJucePlugin/weWaveCategoryTreeItem.h b/source/xtJucePlugin/weWaveCategoryTreeItem.h
@@ -26,6 +26,8 @@ namespace xtJucePlugin
void exportAll(bool _midi) const;
+ std::vector<xt::WaveId> getWaveIds() const;
+
WaveEditor& m_editor;
const WaveCategory m_category;
};
diff --git a/source/xtJucePlugin/weWaveDesc.cpp b/source/xtJucePlugin/weWaveDesc.cpp
@@ -17,10 +17,13 @@ namespace xtJucePlugin
{
std::vector<xt::SysEx> sysex;
- if(tableData)
- sysex.emplace_back(xt::State::createTableData(*tableData, tableId.rawId(), false));
- if(waveData)
- sysex.emplace_back(xt::State::createWaveData(*waveData, waveId.rawId(), false));
+ sysex.reserve(tableIds.size() + waveIds.size());
+
+ for (size_t i = 0; i<tableIds.size(); ++i)
+ sysex.emplace_back(xt::State::createTableData(tableDatas[i], tableIds[i].rawId(), false));
+
+ for (size_t i = 0; i < waveIds.size(); ++i)
+ sysex.emplace_back(xt::State::createWaveData(waveDatas[i], waveIds[i].rawId(), false));
if(sysex.empty())
return false;
@@ -30,7 +33,7 @@ namespace xtJucePlugin
bool WaveDesc::canDropExternally() const
{
- return waveData || tableData;
+ return !waveDatas.empty() || !tableDatas.empty();
}
std::string WaveDesc::getExportFileName(const pluginLib::Processor& _processor) const
@@ -38,10 +41,14 @@ namespace xtJucePlugin
std::stringstream name;
name << _processor.getProperties().name << " - ";
- if(tableData)
- name << "Table " << m_editor.getTableName(tableId);
- else if(waveData)
- name << "Wave " << WaveTreeItem::getWaveName(waveId);
+ if (tableIds.size() > 1)
+ name << "Table " << m_editor.getTableName(tableIds.front()) << " - " << m_editor.getTableName(tableIds.back());
+ else if (waveIds.size() > 1)
+ name << "Wave " << WaveTreeItem::getWaveName(waveIds.front()) << " - " << WaveTreeItem::getWaveName(waveIds.back());
+ else if(!tableDatas.empty())
+ name << "Table " << m_editor.getTableName(tableIds.front());
+ else if(!waveDatas.empty())
+ name << "Wave " << WaveTreeItem::getWaveName(waveIds.front());
else
return DragAndDropObject::getExportFileName(_processor);
@@ -52,7 +59,19 @@ namespace xtJucePlugin
void WaveDesc::fillData(const WaveEditorData& _data)
{
- waveData = _data.getWave(waveId);
- tableData = _data.getTable(tableId);
+ for (int32_t i=0; i<static_cast<int32_t>(waveIds.size()); ++i)
+ {
+ if (auto wave = _data.getWave(waveIds[i]))
+ waveDatas.push_back(*wave);
+ else
+ waveIds.erase(waveIds.begin() + i);
+ }
+ for (int32_t i = 0; i < static_cast<int32_t>(tableIds.size()); ++i)
+ {
+ if (auto table = _data.getTable(tableIds[i]))
+ tableDatas.push_back(*table);
+ else
+ tableIds.erase(tableIds.begin() + i);
+ }
}
}
diff --git a/source/xtJucePlugin/weWaveDesc.h b/source/xtJucePlugin/weWaveDesc.h
@@ -32,13 +32,13 @@ namespace xtJucePlugin
WaveEditor& m_editor;
- xt::WaveId waveId;
- xt::TableId tableId;
+ std::vector<xt::WaveId> waveIds;
+ std::vector<xt::TableId> tableIds;
xt::TableIndex tableIndex;
- std::optional<xt::WaveData> waveData;
- std::optional<xt::TableData> tableData;
+ std::vector<xt::WaveData> waveDatas;
+ std::vector<xt::TableData> tableDatas;
WaveDescSource source = WaveDescSource::Invalid;
};
diff --git a/source/xtJucePlugin/weWaveTreeItem.cpp b/source/xtJucePlugin/weWaveTreeItem.cpp
@@ -72,7 +72,7 @@ namespace xtJucePlugin
{
auto* desc = new WaveDesc(m_editor);
- desc->waveId = m_waveIndex;
+ desc->waveIds = {m_waveIndex};
desc->source = WaveDescSource::WaveList;
desc->fillData(m_editor.getData());
@@ -87,7 +87,7 @@ namespace xtJucePlugin
const auto* waveDesc = WaveDesc::fromDragSource(dragSourceDetails);
if(!waveDesc)
return false;
- if(!waveDesc->waveId.isValid())
+ if(waveDesc->waveIds.size() != 1)
return false;
return true;
}
@@ -102,7 +102,7 @@ namespace xtJucePlugin
return;
auto& data = m_editor.getData();
- if(data.copyWave(m_waveIndex, waveDesc->waveId))
+ if(data.copyWave(m_waveIndex, waveDesc->waveIds.front()))
{
setSelected(true, true, juce::dontSendNotification);
data.sendWaveToDevice(m_waveIndex);