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 }