gearmulator

Emulation of classic VA synths of the late 90s/2000s that are based on Motorola 56300 family DSPs
Log | Files | Refs | Submodules | README | LICENSE

weControlTreeItem.cpp (3975B)


      1 #include "weControlTreeItem.h"
      2 
      3 #include "weWaveDesc.h"
      4 #include "weWaveTreeItem.h"
      5 #include "xtWaveEditor.h"
      6 
      7 namespace xtJucePlugin
      8 {
      9 	class WaveEditor;
     10 
     11 	ControlTreeItem::ControlTreeItem(WaveEditor& _editor, const xt::TableIndex _index) : m_editor(_editor), m_index(_index)
     12 	{
     13 		m_onWaveChanged.set(_editor.getData().onWaveChanged, [this](const xt::WaveId& _wave)
     14 		{
     15 			if(_wave == m_wave)
     16 				onWaveChanged();
     17 		});
     18 
     19 		setPaintRootItemInBold(false);
     20 		setDrawsInLeftMargin(true);
     21 
     22 		// force initial update
     23 		m_wave = xt::WaveId(0);
     24 		setWave(xt::WaveId());
     25 	}
     26 
     27 	void ControlTreeItem::paintItem(juce::Graphics& _g, const int _width, const int _height)
     28 	{
     29 		if(const auto wave = m_editor.getData().getWave(m_wave))
     30 			WaveTreeItem::paintWave(*wave, _g, _width>>1, 0, _width>>1, _height, juce::Colour(0xffffffff));
     31 
     32 		TreeItem::paintItem(_g, _width, _height);
     33 	}
     34 
     35 	void ControlTreeItem::setWave(xt::WaveId _wave)
     36 	{
     37 		switch (m_index.rawId())
     38 		{
     39 		case 61:	_wave = xt::WaveId(101);		break;
     40 		case 62:	_wave = xt::WaveId(100);		break;
     41 		case 63:	_wave = xt::WaveId(104);		break;
     42 		}
     43 		if(m_wave == _wave)
     44 			return;
     45 		m_wave = _wave;
     46 		const auto name = WaveTreeItem::getWaveName(m_wave);
     47 		char prefix[16] = {0};
     48 		(void)snprintf(prefix, std::size(prefix), "%02d: ", m_index.rawId());
     49 		setText(prefix + (name.empty() ? "-" : name));
     50 		repaintItem();
     51 	}
     52 
     53 	void ControlTreeItem::setTable(const xt::TableId _table, const bool _tableHasChanged)
     54 	{
     55 		if(m_table == _table && !_tableHasChanged)
     56 			return;
     57 		m_table = _table;
     58 		setWave(m_editor.getData().getWaveId(_table, m_index));
     59 	}
     60 
     61 	juce::var ControlTreeItem::getDragSourceDescription()
     62 	{
     63 		if(m_wave == g_invalidWaveIndex || xt::wave::isReadOnly(m_table) || xt::wave::isReadOnly(m_index))
     64 			return TreeViewItem::getDragSourceDescription();
     65 
     66 		auto* desc = new WaveDesc(m_editor);
     67 
     68 		desc->waveIds = {m_wave};
     69 		desc->source = WaveDescSource::ControlTableList;
     70 		desc->tableIndex = m_index;
     71 
     72 		desc->fillData(m_editor.getData());
     73 
     74 		return desc;
     75 	}
     76 
     77 	bool ControlTreeItem::isInterestedInDragSource(const juce::DragAndDropTarget::SourceDetails& _dragSourceDetails)
     78 	{
     79 		if(xt::wave::isReadOnly(m_table) || xt::wave::isReadOnly(m_index))
     80 			return false;
     81 		auto* desc = WaveDesc::fromDragSource(_dragSourceDetails);
     82 		if (desc == nullptr)
     83 			return false;
     84 		if (desc->source == WaveDescSource::WaveList && desc->waveIds.size() != 1)
     85 			return false;
     86 		if (desc->source == WaveDescSource::ControlTableList && desc->tableIndex == m_index)
     87 			return false;
     88 		return true;
     89 	}
     90 
     91 	void ControlTreeItem::itemDropped(const juce::DragAndDropTarget::SourceDetails& _dragSourceDetails, int _insertIndex)
     92 	{
     93 		const auto* waveDesc = WaveDesc::fromDragSource(_dragSourceDetails);
     94 		if(!waveDesc)
     95 			return;
     96 
     97 		auto& data = m_editor.getData();
     98 
     99 		// if the source is the control list, we swap two entries. if the source is the wave list, we add a new wave
    100 		if(waveDesc->source == WaveDescSource::ControlTableList)
    101 		{
    102 			if(data.swapTableEntries(m_table, m_index, waveDesc->tableIndex))
    103 			{
    104 				setSelected(true, true, juce::dontSendNotification);
    105 				data.sendTableToDevice(m_table);
    106 			}
    107 		}
    108 		else if(waveDesc->source == WaveDescSource::WaveList && waveDesc->waveIds.size() == 1)
    109 		{
    110 			if(data.setTableWave(m_table, m_index, waveDesc->waveIds.front()))
    111 				data.sendTableToDevice(m_table);
    112 		}
    113 	}
    114 
    115 	void ControlTreeItem::itemClicked(const juce::MouseEvent& _mouseEvent)
    116 	{
    117 		if(!_mouseEvent.mods.isPopupMenu())
    118 		{
    119 			TreeItem::itemClicked(_mouseEvent);
    120 			return;
    121 		}
    122 
    123 		juce::PopupMenu menu;
    124 
    125 		menu.addItem("Remove", [this]
    126 		{
    127 			if (m_editor.getData().setTableWave(m_table, m_index, g_invalidWaveIndex))
    128 				m_editor.getData().sendTableToDevice(m_table);
    129 		});
    130 		menu.addItem("Select Wave", [this]
    131 		{
    132 			m_editor.setSelectedWave(m_wave);
    133 		});
    134 		menu.addSubMenu("Copy to", m_editor.createCopyToSelectedTableMenu(m_wave));
    135 
    136 		menu.showMenuAsync({});
    137 	}
    138 
    139 	void ControlTreeItem::onWaveChanged() const
    140 	{
    141 		repaintItem();
    142 	}
    143 }