def dropEvent(self, event):
items = [i for i in self.items(event.pos()) if isinstance(i, WavePlaceHolderItem)]
if not items: return
index = items[0].index
mimedata = event.mimeData()
if mimedata.hasFormat('audio/wavesamples'):
data = mimedata.data('audio/wavesamples')
slice_range = len(data) / 256
self.dropAction.emit(DROP_WAVE, True, self.waveobj_list[index:index + slice_range], '"{}"'.format(mimedata.text()))
for w in xrange(slice_range):
values = []
for s in xrange(128):
values.append(audioop.getsample(data, 2, w * 128 + s) * 31)
self.waveobj_list[index + w].setValues(values)
for r in self.waveobj_list:
r.preview_rect.setHighlight(False)
self.dropAction.emit(DROP_WAVE, False, self.waveobj_list[index:index + slice_range], '')
event.accept()
elif mimedata.hasFormat('audio/waves'):
start, end = map(int, str(mimedata.data('audio/waves')).split(':'))
if start == index:
event.ignore()
return
wave_len = end - start + 1
if start == end:
drop_text = 'wave {}'.format(start + 1)
else:
drop_text = 'wave {} to {}'.format(start + 1, end + 1)
if mimedata.hasFormat('data/reference'):
ref = mimedata.referenceData()
if ref == self.main:
source = self.waveobj_list
else:
source = ref.waveobj_list
drop_text = 'from "{}" {}'.format(ref.wavetable_name, drop_text)
else:
source = self.waveobj_list
data_list = []
self.dropAction.emit(DROP_WAVE, True, self.waveobj_list[index:index + wave_len], drop_text)
for wave_obj in source[start:end + 1]:
data_list.append(wave_obj.values)
for i, wave_obj in enumerate(self.waveobj_list[index:index + wave_len]):
wave_obj.setValues(data_list[i])
for r in self.waveobj_list:
r.preview_rect.setHighlight(False)
selection = tuple(xrange(index, index + wave_len))
for i, r in enumerate(self.waveobj_list):
r.preview_rect.setSelected(True if i in selection else False)
self.selection = selection
self.dropAction.emit(DROP_WAVE, False, self.waveobj_list[index:index + wave_len], '')
event.accept()
else:
event.ignore()
评论列表
文章目录