Reduce plugin width by 102px and fix bottom panel layout to scale proportionally

This commit is contained in:
Armin 2026-07-22 23:10:55 +02:00
commit f035e89ba9
9 changed files with 305 additions and 106 deletions

View file

@ -40,7 +40,8 @@ void SliceManager::autoSlice()
if (!sampleBuffer || sampleBuffer->getNumSamples() == 0)
return;
pushHistory();
if (beforeChangeCallback) beforeChangeCallback();
const int numSamples = sampleBuffer->getNumSamples();
const int numChannels = sampleBuffer->getNumChannels();
@ -106,7 +107,8 @@ void SliceManager::autoSlice()
void SliceManager::clearSlices()
{
const juce::CriticalSection::ScopedLockType lock(mutex);
pushHistory();
if (beforeChangeCallback) beforeChangeCallback();
slices.clear();
}
@ -121,12 +123,13 @@ void SliceManager::addSliceManual(int samplePos)
{
const juce::CriticalSection::ScopedLockType lock(mutex);
if (!sampleBuffer) return;
if (beforeChangeCallback) beforeChangeCallback();
const int numSamples = sampleBuffer->getNumSamples();
samplePos = juce::jlimit(1, numSamples - 1, samplePos);
if (slices.empty())
{
pushHistory();
slices.push_back({ 0, numSamples, 0 });
assignMidiNotes();
return;
@ -135,7 +138,7 @@ void SliceManager::addSliceManual(int samplePos)
int idx = findSliceIndexForSample(samplePos);
if (idx < 0)
{
pushHistory();
slices.push_back({ samplePos, numSamples, 0 });
sortSlices();
assignMidiNotes();
@ -146,7 +149,7 @@ void SliceManager::addSliceManual(int samplePos)
if (samplePos <= parent.startSample || samplePos >= parent.endSample)
return;
pushHistory();
int oldEnd = parent.endSample;
parent.endSample = samplePos;
@ -159,12 +162,13 @@ void SliceManager::addSliceManual(int samplePos)
void SliceManager::removeSliceAt(int samplePos, int tolerance)
{
const juce::CriticalSection::ScopedLockType lock(mutex);
if (beforeChangeCallback) beforeChangeCallback();
for (auto it = slices.begin(); it != slices.end(); ++it)
{
int dist = std::abs(it->startSample - samplePos);
if (dist <= tolerance)
{
pushHistory();
int removedEnd = it->endSample;
auto idx = static_cast<int>(std::distance(slices.begin(), it));
slices.erase(it);
@ -179,11 +183,12 @@ void SliceManager::removeSliceAt(int samplePos, int tolerance)
void SliceManager::moveSlice(int fromSample, int toSample)
{
const juce::CriticalSection::ScopedLockType lock(mutex);
if (beforeChangeCallback) beforeChangeCallback();
for (size_t i = 0; i < slices.size(); ++i)
{
if (std::abs(slices[i].startSample - fromSample) < 10)
{
pushHistory();
slices[i].startSample = juce::jlimit(0, sampleBuffer->getNumSamples() - 1, toSample);
if (i > 0)
slices[i - 1].endSample = slices[i].startSample;
@ -199,10 +204,11 @@ void SliceManager::trimStart(int sample)
{
const juce::CriticalSection::ScopedLockType lock(mutex);
if (!sampleBuffer || sampleBuffer->getNumSamples() == 0) return;
if (beforeChangeCallback) beforeChangeCallback();
sample = juce::jlimit(0, sampleBuffer->getNumSamples() - 1, sample);
if (sample <= 0) return;
pushHistory();
const int numChannels = sampleBuffer->getNumChannels();
const int oldNumSamples = sampleBuffer->getNumSamples();
@ -239,11 +245,12 @@ void SliceManager::trimEnd(int sample)
{
const juce::CriticalSection::ScopedLockType lock(mutex);
if (!sampleBuffer || sampleBuffer->getNumSamples() == 0) return;
if (beforeChangeCallback) beforeChangeCallback();
const int numSamples = sampleBuffer->getNumSamples();
sample = juce::jlimit(0, numSamples, sample);
if (sample >= numSamples) return;
pushHistory();
const int numChannels = sampleBuffer->getNumChannels();
@ -283,8 +290,10 @@ void SliceManager::sortSlices()
void SliceManager::assignMidiNotes()
{
const int numRows = 25;
const int baseMidiNote = 60;
for (int i = 0; i < static_cast<int>(slices.size()); ++i)
slices[static_cast<size_t>(i)].midiNote = i % 12;
slices[static_cast<size_t>(i)].midiNote = baseMidiNote + (i % numRows);
}
std::vector<float> SliceManager::computeEnvelope(const float* data, int numSamples)
@ -364,37 +373,3 @@ std::vector<float> SliceManager::detectOnsets(const std::vector<float>& envelope
return onsets;
}
void SliceManager::pushHistory()
{
undoStack.push_back(slices);
if (undoStack.size() > maxHistory)
undoStack.erase(undoStack.begin());
redoStack.clear();
}
void SliceManager::truncateHistory()
{
undoStack.clear();
redoStack.clear();
}
void SliceManager::undo()
{
const juce::CriticalSection::ScopedLockType lock(mutex);
if (undoStack.empty()) return;
redoStack.push_back(slices);
slices = undoStack.back();
undoStack.pop_back();
}
void SliceManager::redo()
{
const juce::CriticalSection::ScopedLockType lock(mutex);
if (redoStack.empty()) return;
undoStack.push_back(slices);
slices = redoStack.back();
redoStack.pop_back();
}
bool SliceManager::canUndo() const { return !undoStack.empty(); }
bool SliceManager::canRedo() const { return !redoStack.empty(); }