commit 3719c0e6d88c074fa4a451f3cfcde7567d9aa29a
parent 982bac3425919b0cf3a41d1fdc164bb49614898b
Author: dsp56300 <dsp56300@users.noreply.github.com>
Date: Sat, 28 Sep 2024 23:55:49 +0200
add save functionality for wave
Diffstat:
7 files changed, 101 insertions(+), 0 deletions(-)
diff --git a/source/xtJucePlugin/weWaveCategoryTreeItem.cpp b/source/xtJucePlugin/weWaveCategoryTreeItem.cpp
@@ -34,6 +34,22 @@ namespace xtJucePlugin
}
}
+ bool WaveCategoryTreeItem::setSelectedWave(const xt::WaveId _id)
+ {
+ for(int i=0; i<getNumSubItems(); ++i)
+ {
+ auto* subItem = dynamic_cast<WaveTreeItem*>(getSubItem(i));
+ if(subItem && subItem->getWaveId() == _id)
+ {
+ subItem->setSelected(true, true, juce::dontSendNotification);
+ setOpen(true);
+ getOwnerView()->scrollToKeepItemVisible(subItem);
+ return true;
+ }
+ }
+ return false;
+ }
+
std::string WaveCategoryTreeItem::getCategoryName(WaveCategory _category)
{
return g_categoryNames[static_cast<uint32_t>(_category)];
diff --git a/source/xtJucePlugin/weWaveCategoryTreeItem.h b/source/xtJucePlugin/weWaveCategoryTreeItem.h
@@ -12,6 +12,7 @@ namespace xtJucePlugin
public:
explicit WaveCategoryTreeItem(WaveEditor& _editor, WaveCategory _category);
bool mightContainSubItems() override { return true; }
+ bool setSelectedWave(xt::WaveId _id);
static std::string getCategoryName(WaveCategory _category);
diff --git a/source/xtJucePlugin/weWaveTree.cpp b/source/xtJucePlugin/weWaveTree.cpp
@@ -12,6 +12,16 @@ namespace xtJucePlugin
addCategory(WaveCategory::User);
}
+ bool WaveTree::setSelectedWave(const xt::WaveId _id)
+ {
+ for (const auto& [category, item] : m_items)
+ {
+ if(item->setSelectedWave(_id))
+ return true;
+ }
+ return false;
+ }
+
void WaveTree::addCategory(WaveCategory _category)
{
if(m_items.find(_category) != m_items.end())
diff --git a/source/xtJucePlugin/weWaveTree.h b/source/xtJucePlugin/weWaveTree.h
@@ -12,6 +12,8 @@ namespace xtJucePlugin
public:
explicit WaveTree(WaveEditor& _editor);
+ bool setSelectedWave(xt::WaveId _id);
+
private:
void addCategory(WaveCategory _category);
diff --git a/source/xtJucePlugin/weWaveTreeItem.h b/source/xtJucePlugin/weWaveTreeItem.h
@@ -15,6 +15,8 @@ namespace xtJucePlugin
public:
WaveTreeItem(WaveEditor& _editor, WaveCategory _category, xt::WaveId _waveIndex);
+ auto getWaveId() const { return m_waveIndex; }
+
bool mightContainSubItems() override { return false; }
static void paintWave(const xt::WaveData& _data, juce::Graphics& _g, int _x, int _y, int _width, int _height, const juce::Colour& _colour);
diff --git a/source/xtJucePlugin/xtWaveEditor.cpp b/source/xtJucePlugin/xtWaveEditor.cpp
@@ -6,6 +6,7 @@
#include "weGraphFreq.h"
#include "weGraphPhase.h"
#include "weGraphTime.h"
+#include "weWaveTreeItem.h"
#include "xtController.h"
#include "xtEditor.h"
@@ -70,9 +71,11 @@ namespace xtJucePlugin
m_btWavePreview = m_editor.findComponentT<juce::Button>("btWavePreview");
m_ledWavePreview = m_editor.findComponentT<juce::Button>("ledWavePreview");
+ m_btWaveSave = m_editor.findComponentT<juce::Button>("btWaveSave");
m_btWavetablePreview = m_editor.findComponentT<juce::Button>("btWavetablePreview");
m_ledWavetablePreview = m_editor.findComponentT<juce::Button>("ledWavetablePreview");
+ m_btWavetableSave = m_editor.findComponentT<juce::Button>("btWavetableSave");
m_btWavePreview->onClick = [this]
{
@@ -83,6 +86,16 @@ namespace xtJucePlugin
{
toggleWavetablePreview(m_btWavePreview->getToggleState());
};
+
+ m_btWaveSave->onClick = [this]
+ {
+ saveWave();
+ };
+
+ m_btWavetableSave->onClick = [this]
+ {
+ saveWavetable();
+ };
}
void WaveEditor::destroy()
@@ -136,6 +149,53 @@ namespace xtJucePlugin
}
}
+ void WaveEditor::saveWave()
+ {
+ if(WaveEditorData::isReadOnly(m_selectedWave))
+ {
+ // open menu and let user select one of the wave slots
+ juce::PopupMenu menu;
+
+
+ uint16_t count = 0;
+ for(uint16_t i=xt::Wave::g_firstRamWaveIndex; i<xt::Wave::g_firstRamWaveIndex+xt::Wave::g_ramWaveCount; ++i)
+ {
+ const auto id = xt::WaveId(i);
+ menu.addItem(WaveTreeItem::getWaveName(id), true, false, [this, id]
+ {
+ saveWaveTo(id);
+ });
+
+ ++count;
+ if((count % 25) == 0)
+ menu.addColumnBreak();
+ }
+
+ menu.showMenuAsync({});
+ }
+ else
+ {
+ saveWaveTo(m_selectedWave);
+ }
+ }
+
+ bool WaveEditor::saveWaveTo(const xt::WaveId _target)
+ {
+ if(WaveEditorData::isReadOnly(_target))
+ return false;
+
+ m_data.setWave(_target, m_graphData.getSource());
+
+ if(_target != m_selectedWave)
+ setSelectedWave(_target);
+
+ return true;
+ }
+
+ void WaveEditor::saveWavetable()
+ {
+ }
+
void WaveEditor::onReceiveWave(const pluginLib::MidiPacket::Data& _data, const std::vector<uint8_t>& _msg)
{
m_data.onReceiveWave(_data, _msg);
@@ -162,6 +222,8 @@ namespace xtJucePlugin
m_selectedWave = _waveIndex;
+ m_waveTree->setSelectedWave(m_selectedWave);
+
if(const auto wave = m_data.getWave(_waveIndex))
{
m_graphData.set(*wave);
diff --git a/source/xtJucePlugin/xtWaveEditor.h b/source/xtJucePlugin/xtWaveEditor.h
@@ -61,6 +61,11 @@ namespace xtJucePlugin
void onWaveDataChanged(const xt::WaveData& _data) const;
+ void saveWave();
+ bool saveWaveTo(xt::WaveId _target);
+
+ void saveWavetable();
+
Editor& m_editor;
std::unique_ptr<WaveTree> m_waveTree;
@@ -77,6 +82,9 @@ namespace xtJucePlugin
juce::Button* m_btWavetablePreview = nullptr;
juce::Button* m_ledWavetablePreview = nullptr;
+ juce::Button* m_btWaveSave = nullptr;
+ juce::Button* m_btWavetableSave = nullptr;
+
WaveEditorData m_data;
GraphData m_graphData;