From ac1dfb8e227104f686d97c909ed760d1bd967c7d Mon Sep 17 00:00:00 2001 From: stoneface86 <44489054+stoneface86@users.noreply.github.com> Date: Wed, 17 Apr 2024 01:06:09 -0400 Subject: [PATCH] add insert row Pressing `Ins` in the pattern editor will insert an empty row at the cursor, shifting all rows below it down by 1. --- .gitignore | 2 ++ src/config/data/ShortcutTable.cpp | 2 ++ src/config/data/ShortcutTable.hpp | 1 + src/config/tabs/KeyboardConfigTab.cpp | 1 + src/forms/MainWindow/actions.cpp | 5 ++++ src/model/PatternModel.cpp | 7 +++++ src/model/PatternModel.hpp | 3 +++ src/model/commands/pattern.cpp | 37 +++++++++++++++++++++++++++ src/model/commands/pattern.hpp | 17 ++++++++++++ src/widgets/PatternEditor.cpp | 4 +++ src/widgets/PatternEditor.hpp | 2 ++ 11 files changed, 81 insertions(+) diff --git a/.gitignore b/.gitignore index 94ef511d..d99ead5c 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,5 @@ out/ tools/ CMakeSettings.json CMakeLists.txt.user +*.kdev4 +.kdev4/ diff --git a/src/config/data/ShortcutTable.cpp b/src/config/data/ShortcutTable.cpp index a8224832..66a0dc60 100644 --- a/src/config/data/ShortcutTable.cpp +++ b/src/config/data/ShortcutTable.cpp @@ -52,6 +52,8 @@ QKeySequence ShortcutTable::getDefault(Shortcut shortcut) noexcept { return tr("Return"); case PasteMix: return tr("Ctrl+M"); + case InsertRow: + return tr("Ins"); case TransposeDecNote: return tr("Ctrl+F1"); case TransposeIncNote: diff --git a/src/config/data/ShortcutTable.hpp b/src/config/data/ShortcutTable.hpp index b431e001..d5ef4ae0 100644 --- a/src/config/data/ShortcutTable.hpp +++ b/src/config/data/ShortcutTable.hpp @@ -30,6 +30,7 @@ class ShortcutTable { PlayStop, // QAction PasteMix, + InsertRow, TransposeDecNote, TransposeIncNote, TransposeDecOctave, diff --git a/src/config/tabs/KeyboardConfigTab.cpp b/src/config/tabs/KeyboardConfigTab.cpp index 4540e7c7..5b62eb43 100644 --- a/src/config/tabs/KeyboardConfigTab.cpp +++ b/src/config/tabs/KeyboardConfigTab.cpp @@ -39,6 +39,7 @@ static std::array const SHORTCUT_NAMES = { QT_TR_NOOP("Decrement octave"), QT_TR_NOOP("Play / Stop"), QT_TR_NOOP("Mix paste"), + QT_TR_NOOP("Insert row"), QT_TR_NOOP("Transpose, decrease note"), QT_TR_NOOP("Transpose, increase note"), QT_TR_NOOP("Transpose, decrease octave"), diff --git a/src/forms/MainWindow/actions.cpp b/src/forms/MainWindow/actions.cpp index bf169f06..7922ca63 100644 --- a/src/forms/MainWindow/actions.cpp +++ b/src/forms/MainWindow/actions.cpp @@ -118,6 +118,11 @@ void MainWindow::createActions(TableActions const& instrumentActions, TableActio act->setData(ShortcutTable::PasteMix); connectActionTo(act, mPatternEditor, pasteMix); + act = setupAction(menuEdit, tr("&Insert Row"), tr("Inserts an empty row at the cursor")); + act->setData(ShortcutTable::InsertRow); + connectActionTo(act, mPatternEditor, insertRow); + + act = setupAction(menuEdit, tr("&Erase"), tr("Erases selection contents"), QKeySequence::Delete); connectActionTo(act, mPatternEditor, erase); diff --git a/src/model/PatternModel.cpp b/src/model/PatternModel.cpp index b95cff64..c567a770 100644 --- a/src/model/PatternModel.cpp +++ b/src/model/PatternModel.cpp @@ -934,6 +934,13 @@ void PatternModel::backspace() { } } +void PatternModel::insertRow() { + auto cmd = new InsertRowCmd(*this); + cmd->setText(tr("insert row")); + mModule.undoStack()->push(cmd); + +} + void PatternModel::setOrderRow(trackerboy::OrderRow row) { if (order()[mCursorPattern] != row) { auto cmd = new OrderEditCmd(*this, row, mCursorPattern); diff --git a/src/model/PatternModel.hpp b/src/model/PatternModel.hpp index aa370262..720add90 100644 --- a/src/model/PatternModel.hpp +++ b/src/model/PatternModel.hpp @@ -180,6 +180,8 @@ class PatternModel : public QObject { void backspace(); + void insertRow(); + // order // @@ -281,6 +283,7 @@ class PatternModel : public QObject { friend class OrderRemoveCmd; friend class OrderDuplicateCmd; friend class OrderSwapCmd; + friend class InsertRowCmd; Q_DISABLE_COPY(PatternModel) diff --git a/src/model/commands/pattern.cpp b/src/model/commands/pattern.cpp index 5ff5a4fc..b15c8f94 100644 --- a/src/model/commands/pattern.cpp +++ b/src/model/commands/pattern.cpp @@ -381,3 +381,40 @@ void BackspaceCmd::undo() { mModel.invalidate(mPattern, true); } +InsertRowCmd::InsertRowCmd(PatternModel& model, QUndoCommand* parent) : + QUndoCommand(parent), + mModel(model), + mPattern(model.mCursorPattern), + mTrack(model.mCursor.track), + mRow(model.mCursor.row), + mLastRow(model.source()->patterns().length() - 1), + mTruncated(model.currentPattern()[mLastRow][mTrack]) +{ +} + +void InsertRowCmd::redo() { + { + auto editor = mModel.mModule.edit(); + auto &track = mModel.source()->patterns().getTrack(static_cast(mTrack), mPattern); + // shift down + for (auto i = mLastRow; i > mRow; --i) { + track[i] = track[i - 1]; + } + track[mRow] = {}; + } + mModel.invalidate(mPattern, true); +} + +void InsertRowCmd::undo() { + { + auto editor = mModel.mModule.edit(); + auto &track = mModel.source()->patterns().getTrack(static_cast(mTrack), mPattern); + // shift up + for (auto i = mRow; i < mLastRow; ++i) { + track[i] = track[i + 1]; + } + track[mLastRow] = mTruncated; + } + mModel.invalidate(mPattern, true); +} + diff --git a/src/model/commands/pattern.hpp b/src/model/commands/pattern.hpp index 29f271bc..cd0e7c70 100644 --- a/src/model/commands/pattern.hpp +++ b/src/model/commands/pattern.hpp @@ -258,3 +258,20 @@ class BackspaceCmd : public QUndoCommand { virtual void undo() override; }; + +class InsertRowCmd : public QUndoCommand { + + PatternModel &mModel; + int const mPattern; + int const mTrack; + int const mRow; + int const mLastRow; + trackerboy::TrackRow const mTruncated; + +public: + explicit InsertRowCmd(PatternModel &model, QUndoCommand *parent = nullptr); + + virtual void redo() override; + + virtual void undo() override; +}; diff --git a/src/widgets/PatternEditor.cpp b/src/widgets/PatternEditor.cpp index c5e97c1f..81aa36be 100644 --- a/src/widgets/PatternEditor.cpp +++ b/src/widgets/PatternEditor.cpp @@ -459,6 +459,10 @@ void PatternEditor::pasteMix() { pasteImpl(true); } +void PatternEditor::insertRow() { + mModel.insertRow(); +} + void PatternEditor::pasteImpl(bool mix) { if (mClipboard.hasClip()) { auto &clip = mClipboard.clip(); diff --git a/src/widgets/PatternEditor.hpp b/src/widgets/PatternEditor.hpp index c83f91d8..f9bba046 100644 --- a/src/widgets/PatternEditor.hpp +++ b/src/widgets/PatternEditor.hpp @@ -60,6 +60,8 @@ class PatternEditor : public QFrame, public IMidiReceiver { void pasteMix(); + void insertRow(); + void erase(); void selectAll();