From e50f31281862ab0d58a6b398d46a757c6727a056 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petar=20Kati=C4=87?= Date: Tue, 6 May 2025 01:03:53 +0200 Subject: [PATCH] Add option to clear all notes in SlicerT (#7850) --- plugins/SlicerT/SlicerTView.cpp | 27 +++++++++++++++++++--- plugins/SlicerT/SlicerTView.h | 2 ++ plugins/SlicerT/clear_slices_active.png | Bin 0 -> 1162 bytes plugins/SlicerT/clear_slices_inactive.png | Bin 0 -> 1180 bytes 4 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 plugins/SlicerT/clear_slices_active.png create mode 100644 plugins/SlicerT/clear_slices_inactive.png diff --git a/plugins/SlicerT/SlicerTView.cpp b/plugins/SlicerT/SlicerTView.cpp index 7af2db143..1fc3effe7 100644 --- a/plugins/SlicerT/SlicerTView.cpp +++ b/plugins/SlicerT/SlicerTView.cpp @@ -71,6 +71,12 @@ SlicerTView::SlicerTView(SlicerT* instrument, QWidget* parent) m_syncToggle->setToolTip(tr("Enable BPM sync")); m_syncToggle->setModel(&m_slicerTParent->m_enableSync); + m_clearButton = new PixmapButton(this, tr("Clear all slices")); + m_clearButton->setActiveGraphic(PLUGIN_NAME::getIconPixmap("clear_slices_active")); + m_clearButton->setInactiveGraphic(PLUGIN_NAME::getIconPixmap("clear_slices_inactive")); + m_clearButton->setToolTip(tr("Clear all slices")); + connect(m_clearButton, &PixmapButton::clicked, this, &SlicerTView::clearSlices); + m_bpmBox = new LcdSpinBox(3, "19purple", this); m_bpmBox->setToolTip(tr("Original sample BPM")); m_bpmBox->setModel(&m_slicerTParent->m_originalBPM); @@ -111,6 +117,19 @@ Knob* SlicerTView::createStyledKnob() return newKnob; } +// Clear all notes +void SlicerTView::clearSlices() +{ + m_slicerTParent->m_slicePoints.clear(); + + // Points are added to the start (0) and end (1) of the sample, + // so the whole sample can still be copied using MIDI. + m_slicerTParent->m_slicePoints.emplace_back(0); + m_slicerTParent->m_slicePoints.emplace_back(1); + + emit m_slicerTParent->dataChanged(); +} + // copied from piano roll void SlicerTView::exportMidi() { @@ -261,7 +280,7 @@ void SlicerTView::resizeEvent(QResizeEvent* re) { m_y1 = height() - s_bottomBoxOffset; - // left box + // Left box m_noteThresholdKnob->move(s_x1 - 25, m_y1); m_fadeOutKnob->move(s_x2 - 25, m_y1); @@ -271,8 +290,10 @@ void SlicerTView::resizeEvent(QResizeEvent* re) m_bpmBox->move(s_x5 - 13, m_y1 + 4); m_snapSetting->move(s_x6 - 8, m_y1 + 3); - // right box - m_syncToggle->move((width() - 100), m_y1 + 5); + // Right box + // For explanation on the choice of constants, look at #7850 + m_syncToggle->move((width() - 100), m_y1 - 7); + m_clearButton->move((width() - 100), m_y1 + 17); m_folderButton->move(width() - 20, height() - s_bottomBoxHeight - s_sampleBoxHeight + 1); diff --git a/plugins/SlicerT/SlicerTView.h b/plugins/SlicerT/SlicerTView.h index f24246621..c4d0da959 100644 --- a/plugins/SlicerT/SlicerTView.h +++ b/plugins/SlicerT/SlicerTView.h @@ -49,6 +49,7 @@ class SlicerTView : public InstrumentView public slots: void exportMidi(); void openFiles(); + void clearSlices(); public: SlicerTView(SlicerT* instrument, QWidget* parent); @@ -87,6 +88,7 @@ private: LcdSpinBox* m_bpmBox; ComboBox* m_snapSetting; PixmapButton* m_syncToggle; + PixmapButton* m_clearButton; PixmapButton* m_folderButton; QPushButton* m_resetButton; diff --git a/plugins/SlicerT/clear_slices_active.png b/plugins/SlicerT/clear_slices_active.png new file mode 100644 index 0000000000000000000000000000000000000000..36b7f0f7e84e60d66ce1476e543eb9ccef0c92b4 GIT binary patch literal 1162 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