Skip to content

Commit 1cc93ff

Browse files
authored
Merge pull request #29996 from prodoelmit/feature-27869-restore-transpose-settings
Implement #27869: Recall transpose options
2 parents 9a78673 + a7b9ca3 commit 1cc93ff

File tree

2 files changed

+79
-41
lines changed

2 files changed

+79
-41
lines changed

src/notationscene/widgets/transposedialog.cpp

Lines changed: 57 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ TransposeDialog::TransposeDialog(QWidget* parent)
6262
});
6363
setEnableTransposeChordNames(hasChordNames);
6464

65-
setKey(firstPitchedStaffKey());
65+
restorePreviousState();
6666

6767
connect(this, &TransposeDialog::accepted, this, &TransposeDialog::apply);
6868

@@ -147,7 +147,6 @@ void TransposeDialog::setEnableTransposeToKey(bool val)
147147
void TransposeDialog::setEnableTransposeChordNames(bool val)
148148
{
149149
transposeChordNames->setEnabled(val);
150-
transposeChordNames->setChecked(val);
151150
}
152151

153152
//---------------------------------------------------------
@@ -219,6 +218,8 @@ void TransposeDialog::apply()
219218
options.needTransposeChordNames = getTransposeChordNames();
220219
options.needTransposeDoubleSharpsFlats = useDoubleSharpsFlats();
221220

221+
saveState();
222+
222223
interaction()->transpose(options);
223224

224225
MScoreErrorsController(iocContext()).checkAndShowMScoreError();
@@ -228,39 +229,6 @@ void TransposeDialog::apply()
228229
}
229230
}
230231

231-
Key TransposeDialog::firstPitchedStaffKey() const
232-
{
233-
mu::engraving::staff_idx_t startStaffIdx = 0;
234-
mu::engraving::staff_idx_t endStaffIdx = 0;
235-
Fraction startTick = Fraction(0, 1);
236-
INotationSelectionRangePtr range = selection()->range();
237-
238-
if (selection()->isRange()) {
239-
startStaffIdx = range->startStaffIndex();
240-
endStaffIdx = range->endStaffIndex();
241-
startTick = range->startTick();
242-
}
243-
244-
Key key = Key::C;
245-
246-
muse::async::NotifyList<const Part*> partList = notation()->parts()->partList();
247-
for (const Part* part : partList) {
248-
for (const Staff* staff : part->staves()) {
249-
if (staff->idx() < startStaffIdx || staff->idx() > endStaffIdx) {
250-
continue;
251-
}
252-
253-
if (staff->isPitchedStaff(startTick)) {
254-
key = staff->concertKey(startTick);
255-
256-
break;
257-
}
258-
}
259-
}
260-
261-
return key;
262-
}
263-
264232
void TransposeDialog::setEnableTransposeKeys(bool val)
265233
{
266234
transposeKeys->setEnabled(val);
@@ -290,12 +258,62 @@ int TransposeDialog::transposeInterval() const
290258
: degreeList->currentIndex() + 1;
291259
}
292260

293-
void TransposeDialog::setKey(Key k)
261+
bool TransposeDialog::useDoubleSharpsFlats() const
294262
{
295-
keyList->setCurrentIndex(int(k) + 7);
263+
return accidentalOptions->currentIndex() == 1;
296264
}
297265

298-
bool TransposeDialog::useDoubleSharpsFlats() const
266+
TransposeDialogState& TransposeDialog::previousState()
299267
{
300-
return accidentalOptions->currentIndex() == 1;
268+
static TransposeDialogState options;
269+
return options;
270+
}
271+
272+
void TransposeDialog::restorePreviousState()
273+
{
274+
const TransposeDialogState& state = previousState();
275+
276+
chromaticBox->setChecked(state.chromaticChecked);
277+
diatonicBox->setChecked(!state.chromaticChecked);
278+
279+
transposeByKey->setChecked(state.transposeByKeyChecked);
280+
transposeByInterval->setChecked(!state.transposeByKeyChecked);
281+
282+
keyList->setCurrentIndex(state.keyListIdx);
283+
closestKey->setChecked(state.closestKeyChecked);
284+
upKey->setChecked(state.upKeyChecked);
285+
downKey->setChecked(!state.closestKeyChecked && !state.upKeyChecked);
286+
287+
intervalList->setCurrentIndex(state.chromaticIntervalIdx);
288+
upInterval->setChecked(state.upIntervalChecked);
289+
downInterval->setChecked(!state.upIntervalChecked);
290+
291+
transposeKeys->setChecked(state.needTransposeKeysChecked);
292+
293+
degreeList->setCurrentIndex(state.diatonicIntervalIdx);
294+
upDiatonic->setChecked(state.upDiatonicChecked);
295+
downDiatonic->setChecked(!state.upDiatonicChecked);
296+
keepDegreeAlterations->setChecked(state.keepDegreeAlterationsChecked);
297+
298+
transposeChordNames->setChecked(state.needTransposeChordNamesChecked);
299+
accidentalOptions->setCurrentIndex(state.needTransposeDoubleSharpsFlatsIdx);
300+
}
301+
302+
void TransposeDialog::saveState()
303+
{
304+
TransposeDialogState& state = previousState();
305+
306+
state.chromaticChecked = chromaticBox->isChecked();
307+
state.transposeByKeyChecked = transposeByKey->isChecked();
308+
state.closestKeyChecked = closestKey->isChecked();
309+
state.upKeyChecked = upKey->isChecked();
310+
state.keyListIdx = keyList->currentIndex();
311+
state.upIntervalChecked = upInterval->isChecked();
312+
state.chromaticIntervalIdx = intervalList->currentIndex();
313+
state.upDiatonicChecked = upDiatonic->isChecked();
314+
state.diatonicIntervalIdx = degreeList->currentIndex();
315+
state.keepDegreeAlterationsChecked = keepDegreeAlterations->isChecked();
316+
state.needTransposeKeysChecked = transposeKeys->isChecked();
317+
state.needTransposeChordNamesChecked = transposeChordNames->isChecked();
318+
state.needTransposeDoubleSharpsFlatsIdx = accidentalOptions->currentIndex();
301319
}

src/notationscene/widgets/transposedialog.h

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,30 @@
3030
#include "notation/notationtypes.h"
3131

3232
namespace mu::notation {
33+
struct TransposeDialogState {
34+
bool chromaticChecked = true;
35+
bool transposeByKeyChecked = true;
36+
bool closestKeyChecked = true;
37+
bool upKeyChecked = false;
38+
int keyListIdx = 7;
39+
bool upIntervalChecked = true;
40+
int chromaticIntervalIdx = 0;
41+
bool upDiatonicChecked = true;
42+
int diatonicIntervalIdx = 0;
43+
bool keepDegreeAlterationsChecked = true;
44+
bool needTransposeKeysChecked = true;
45+
bool needTransposeChordNamesChecked = false;
46+
int needTransposeDoubleSharpsFlatsIdx = 1;
47+
};
48+
3349
class TransposeDialog : public QDialog, Ui::TransposeDialogBase, public muse::Injectable
3450
{
3551
Q_OBJECT
3652

3753
muse::Inject<context::IGlobalContext> context = { this };
3854

3955
public:
56+
4057
TransposeDialog(QWidget* parent = 0);
4158

4259
private slots:
@@ -54,7 +71,6 @@ private slots:
5471
INotationSelectionPtr selection() const;
5572
INotationInteractionPtr interaction() const;
5673

57-
Key firstPitchedStaffKey() const;
5874
void setEnableTransposeKeys(bool val);
5975
void setEnableTransposeToKey(bool val);
6076
void setEnableTransposeChordNames(bool val);
@@ -64,9 +80,13 @@ private slots:
6480
int transposeInterval() const;
6581
TransposeDirection direction() const;
6682
TransposeMode mode() const;
67-
void setKey(Key k);
83+
6884
bool useDoubleSharpsFlats() const;
6985

86+
static TransposeDialogState& previousState();
87+
void saveState();
88+
void restorePreviousState();
89+
7090
bool m_allSelected = false;
7191
};
7292
}

0 commit comments

Comments
 (0)