diff options
Diffstat (limited to 'dgedit/samplesorter.cc')
-rw-r--r-- | dgedit/samplesorter.cc | 100 |
1 files changed, 79 insertions, 21 deletions
diff --git a/dgedit/samplesorter.cc b/dgedit/samplesorter.cc index 57af071..402bc37 100644 --- a/dgedit/samplesorter.cc +++ b/dgedit/samplesorter.cc @@ -36,8 +36,8 @@ #define MAXFLOAT (3.40282347e+38F) #endif -SampleSorter::SampleSorter(Selections &s) - : selections(s) +SampleSorter::SampleSorter(Selections &s, Selections &p) + : selections(s), selections_preview(p) { setMouseTracking(true); @@ -48,6 +48,12 @@ SampleSorter::SampleSorter(Selections &s) sel_moving = SEL_NONE; } +void SampleSorter::setShowPreview(bool s) +{ + show_preview = s; + update(); +} + void SampleSorter::setWavData(const float *data, size_t size) { this->data = data; @@ -84,20 +90,53 @@ void SampleSorter::addSelection(sel_id_t id) relayout(); } +void SampleSorter::addSelectionPreview(sel_id_t id) +{ + Selection s = selections_preview.get(id); + + double energy = 0.0; + for(size_t idx = s.from; + (idx < (size_t)s.from + (size_t)attackLength()) && + (idx < (size_t)s.to) && (idx < size); + idx++) { + energy += data[idx] * data[idx]; + } + + s.energy = energy; + selections_preview.update(id, s); + + relayout(); +} + void SampleSorter::relayout() { min = MAXFLOAT; max = 0.0; - QVector<sel_id_t> ids = selections.ids(); - QVector<sel_id_t>::iterator i = ids.begin(); - while(i != ids.end()) { - Selection sel = selections.get(*i); - - if(sel.energy < min) min = sel.energy; - if(sel.energy > max) max = sel.energy; + { + QVector<sel_id_t> ids = selections.ids(); + QVector<sel_id_t>::iterator i = ids.begin(); + while(i != ids.end()) { + Selection sel = selections.get(*i); + + if(sel.energy < min) min = sel.energy; + if(sel.energy > max) max = sel.energy; + + i++; + } + } - i++; + if(show_preview) { + QVector<sel_id_t> ids = selections_preview.ids(); + QVector<sel_id_t>::iterator i = ids.begin(); + while(i != ids.end()) { + Selection sel = selections_preview.get(*i); + + if(sel.energy < min) min = sel.energy; + if(sel.energy > max) max = sel.energy; + + i++; + } } update(); @@ -123,6 +162,7 @@ void SampleSorter::paintEvent(QPaintEvent *event) QColor colBg = QColor(180, 200, 180); QColor colFg = QColor(160, 180, 160); QColor colPt = QColor(255, 100, 100); + QColor colPtPreview = QColor(0, 0, 255); QColor colPtSel = QColor(255, 255, 100); painter.setPen(colBg); @@ -131,19 +171,37 @@ void SampleSorter::paintEvent(QPaintEvent *event) painter.setPen(colFg); painter.drawLine(0,height(),width(),0); + + { + QVector<sel_id_t> ids = selections.ids(); + QVector<sel_id_t>::iterator i = ids.begin(); + while(i != ids.end()) { + Selection sel = selections.get(*i); + if(*i == selections.active()) painter.setPen(colPtSel); + else painter.setPen(colPt); + float x = sel.energy / max; + x = sqrt(x); + x *= (float)width(); + drawCircle(painter, x, MAP(x)); + i++; + } + } - QVector<sel_id_t> ids = selections.ids(); - QVector<sel_id_t>::iterator i = ids.begin(); - while(i != ids.end()) { - Selection sel = selections.get(*i); - if(*i == selections.active()) painter.setPen(colPtSel); - else painter.setPen(colPt); - float x = sel.energy / max; - x = sqrt(x); - x *= (float)width(); - drawCircle(painter, x, MAP(x)); - i++; + if(show_preview) { + QVector<sel_id_t> ids = selections_preview.ids(); + QVector<sel_id_t>::iterator i = ids.begin(); + while(i != ids.end()) { + Selection sel = selections_preview.get(*i); + painter.setPen(colPtPreview); + float x = sel.energy / max; + x = sqrt(x); + x *= (float)width(); + drawCircle(painter, x, MAP(x)); + i++; + } } + + } sel_id_t SampleSorter::getSelectionByCoordinate(int px, int py) |