Compare commits
11 Commits
Author | SHA1 | Date |
---|---|---|
RomanPudashkin | 18a3978926 | |
Michele Spagnolo | 97ffb7e979 | |
Casper Jeukendrup | c6bc56732d | |
cbjeukendrup | 3de3b745b3 | |
Casper Jeukendrup | 5b1fa37a41 | |
Jesse Greene | 615b6ec344 | |
Joachim Schmitz | 5753938d29 | |
Casper Jeukendrup | 90a86203c1 | |
Calum Matheson | cce1f17f16 | |
RomanPudashkin | 23f39256b6 | |
Roman Pudashkin | f25b3d41ae |
|
@ -4,6 +4,7 @@ on:
|
|||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
- 4.2.0
|
||||
|
||||
jobs:
|
||||
codestyle:
|
||||
|
|
|
@ -4,6 +4,7 @@ on:
|
|||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
- 4.2.0
|
||||
|
||||
schedule:
|
||||
- cron: '0 3 */1 */1 *' # At 03:00 on every day-of-month for master
|
||||
|
|
|
@ -4,6 +4,7 @@ on:
|
|||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
- 4.2.0
|
||||
|
||||
schedule:
|
||||
- cron: '0 3 */1 */1 *' # At 03:00 on every day-of-month for master
|
||||
|
|
|
@ -4,6 +4,7 @@ on:
|
|||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
- 4.2.0
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
|
|
|
@ -4,6 +4,7 @@ on:
|
|||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
- 4.2.0
|
||||
|
||||
jobs:
|
||||
setup:
|
||||
|
|
|
@ -4,6 +4,7 @@ on:
|
|||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
- 4.2.0
|
||||
|
||||
schedule:
|
||||
- cron: '0 3 */1 */1 *' # At 03:00 on every day-of-month for master
|
||||
|
|
|
@ -4,6 +4,7 @@ on:
|
|||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
- 4.2.0
|
||||
|
||||
jobs:
|
||||
run_tests:
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -3596,6 +3596,34 @@ bool Note::isGraceBendStart() const
|
|||
return bend && bend->type() == GuitarBendType::GRACE_NOTE_BEND;
|
||||
}
|
||||
|
||||
bool Note::hasAnotherStraightAboveOrBelow(bool above) const
|
||||
{
|
||||
if (!chord()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const std::vector<Note*>& notes = chord()->notes();
|
||||
|
||||
if ((above && this == notes.back()) || (!above && this == notes.front())) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const double limitDiff = 0.5 * spatium();
|
||||
for (Note* note : notes) {
|
||||
if (note == this) {
|
||||
continue;
|
||||
}
|
||||
if (abs(note->pos().x() - pos().x()) > limitDiff) {
|
||||
return false;
|
||||
}
|
||||
if ((above && note->line() < m_line) || (!above && note->line() > m_line)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
mu::PointF Note::posInStaffCoordinates()
|
||||
{
|
||||
double X = x() + chord()->x() + chord()->segment()->x() + chord()->measure()->x() + headWidth() / 2;
|
||||
|
|
|
@ -431,6 +431,8 @@ public:
|
|||
bool isPreBendStart() const;
|
||||
bool isGraceBendStart() const;
|
||||
|
||||
bool hasAnotherStraightAboveOrBelow(bool above) const;
|
||||
|
||||
void addLineAttachPoint(mu::PointF point, EngravingItem* line);
|
||||
std::vector<LineAttachPoint>& lineAttachPoints() { return m_lineAttachPoints; }
|
||||
const std::vector<LineAttachPoint>& lineAttachPoints() const { return m_lineAttachPoints; }
|
||||
|
|
|
@ -3603,6 +3603,7 @@ void Score::selectRange(EngravingItem* e, staff_idx_t staffIdx)
|
|||
void Score::collectMatch(void* data, EngravingItem* e)
|
||||
{
|
||||
ElementPattern* p = static_cast<ElementPattern*>(data);
|
||||
auto eMeasure = e->findMeasure();
|
||||
|
||||
if (p->type != int(ElementType::INVALID) && p->type != int(e->type())) {
|
||||
return;
|
||||
|
@ -3649,8 +3650,21 @@ void Score::collectMatch(void* data, EngravingItem* e)
|
|||
}
|
||||
}
|
||||
|
||||
if (p->measure && (p->measure != e->findMeasure())) {
|
||||
return;
|
||||
if (p->measure) {
|
||||
if (!eMeasure && e->isSpannerSegment()) {
|
||||
if (auto ss = toSpannerSegment(e)) {
|
||||
if (auto s = ss->spanner()) {
|
||||
if (auto se = s->startElement()) {
|
||||
if (auto mse = se->findMeasure()) {
|
||||
eMeasure = mse;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (p->measure != eMeasure) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if ((p->beat.isValid()) && (p->beat != e->beat())) {
|
||||
|
|
|
@ -182,13 +182,21 @@ void TieSegment::editDrag(EditData& ed)
|
|||
|
||||
void TieSegment::computeMidThickness(double tieLengthInSp)
|
||||
{
|
||||
m_midThickness = style().styleMM(Sid::SlurMidWidth) - style().styleMM(Sid::SlurEndWidth);
|
||||
if (staff()) {
|
||||
m_midThickness *= staff()->staffMag(tie()->tick());
|
||||
}
|
||||
static constexpr double shortTieLimit = 2;
|
||||
if (tieLengthInSp < shortTieLimit) {
|
||||
m_midThickness *= sqrt(tieLengthInSp / shortTieLimit);
|
||||
const double mag = staff() ? staff()->staffMag(tie()->tick()) : 1.0;
|
||||
const double minTieLength = mag * style().styleS(Sid::MinTieLength).val();
|
||||
const double shortTieLimit = mag * 4.0;
|
||||
const double minTieThickness = mag * (0.15 * spatium() - style().styleMM(Sid::SlurEndWidth));
|
||||
const double normalThickness = mag * (style().styleMM(Sid::SlurMidWidth) - style().styleMM(Sid::SlurEndWidth));
|
||||
|
||||
bool invalid = RealIsEqualOrMore(minTieLength, shortTieLimit);
|
||||
|
||||
if (tieLengthInSp > shortTieLimit || invalid) {
|
||||
m_midThickness = normalThickness;
|
||||
} else {
|
||||
const double A = 1 / (shortTieLimit - minTieLength);
|
||||
const double B = normalThickness - minTieThickness;
|
||||
const double C = shortTieLimit * minTieThickness - minTieLength * normalThickness;
|
||||
m_midThickness = A * (B * tieLengthInSp + C);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -266,8 +266,8 @@ SpannerSegment* SlurTieLayout::layoutSystem(Slur* item, System* system, LayoutCo
|
|||
Chord* sc = item->startCR()->isChord() ? toChord(item->startCR()) : nullptr;
|
||||
|
||||
// on chord
|
||||
if (sc && sc->notes().size() == 1) {
|
||||
Tie* tie = sc->notes()[0]->tieFor();
|
||||
if (sc) {
|
||||
Tie* tie = (item->up() ? sc->upNote() : sc->downNote())->tieFor();
|
||||
PointF endPoint = PointF();
|
||||
if (tie && (tie->isInside() || tie->up() != item->up())) {
|
||||
// there is a tie that starts on this chordrest
|
||||
|
@ -367,8 +367,8 @@ SpannerSegment* SlurTieLayout::layoutSystem(Slur* item, System* system, LayoutCo
|
|||
Chord* ec = item->endCR()->isChord() ? toChord(item->endCR()) : nullptr;
|
||||
|
||||
// on chord
|
||||
if (ec && ec->notes().size() == 1) {
|
||||
Tie* tie = ec->notes()[0]->tieBack();
|
||||
if (ec) {
|
||||
Tie* tie = (item->up() ? ec->upNote() : ec->downNote())->tieBack();
|
||||
PointF endPoint;
|
||||
if (tie && (tie->isInside() || tie->up() != item->up())) {
|
||||
tie = nullptr;
|
||||
|
@ -1147,7 +1147,7 @@ TieSegment* SlurTieLayout::tieLayoutFor(Tie* item, System* system)
|
|||
}
|
||||
}
|
||||
|
||||
adjustForLedgerLines(segment, sPos);
|
||||
adjustYforLedgerLines(segment, sPos);
|
||||
|
||||
segment->ups(Grip::START).p = sPos.p1;
|
||||
segment->ups(Grip::END).p = sPos.p2;
|
||||
|
@ -1194,7 +1194,7 @@ TieSegment* SlurTieLayout::tieLayoutBack(Tie* item, System* system)
|
|||
adjustX(segment, sPos, Grip::END);
|
||||
}
|
||||
|
||||
adjustForLedgerLines(segment, sPos);
|
||||
adjustYforLedgerLines(segment, sPos);
|
||||
|
||||
segment->ups(Grip::START).p = sPos.p1;
|
||||
segment->ups(Grip::END).p = sPos.p2;
|
||||
|
@ -1262,7 +1262,16 @@ PointF SlurTieLayout::computeDefaultStartOrEndPoint(const Tie* tie, Grip startOr
|
|||
|
||||
result += PointF(baseX, baseY);
|
||||
|
||||
const double visualInset = (inside ? 0.20 : 0.1) * spatium * leftRightSign; // TODO: style
|
||||
double visualInsetSp = 0.0;
|
||||
if (inside) {
|
||||
visualInsetSp = 0.2;
|
||||
} else if (note->hasAnotherStraightAboveOrBelow(up)) {
|
||||
visualInsetSp = 0.45;
|
||||
} else {
|
||||
visualInsetSp = 0.1;
|
||||
}
|
||||
|
||||
double visualInset = visualInsetSp * spatium * leftRightSign;
|
||||
const double yOffset = 0.20 * spatium * upSign; // TODO: style
|
||||
|
||||
result += PointF(visualInset, yOffset);
|
||||
|
@ -1370,8 +1379,9 @@ void SlurTieLayout::adjustX(TieSegment* tieSegment, SlurTiePos& sPos, Grip start
|
|||
chordSystemPos += PointF(0.0, yDiff);
|
||||
}
|
||||
Shape chordShape = chord->shape().translate(chordSystemPos);
|
||||
chordShape.remove_if([note](ShapeElement& s) {
|
||||
return !s.item() || (s.item() == note || s.item()->isHook() || s.item()->isLedgerLine());
|
||||
bool ignoreDot = start && isOuterTieOfChord;
|
||||
chordShape.remove_if([&](ShapeElement& s) {
|
||||
return !s.item() || (s.item() == note || s.item()->isHook() || s.item()->isLedgerLine() || (s.item()->isNoteDot() && ignoreDot));
|
||||
});
|
||||
|
||||
const double arcSideMargin = 0.3 * spatium;
|
||||
|
@ -1386,11 +1396,53 @@ void SlurTieLayout::adjustX(TieSegment* tieSegment, SlurTiePos& sPos, Grip start
|
|||
|
||||
resultingX = start ? std::max(resultingX, pointToClear) : std::min(resultingX, pointToClear);
|
||||
|
||||
adjustXforLedgerLines(tieSegment, start, chord, note, chordSystemPos, padding, resultingX);
|
||||
|
||||
tieSegment->addAdjustmentOffset(PointF(resultingX - tiePoint.x(), 0.0), startOrEnd);
|
||||
tiePoint.setX(resultingX);
|
||||
}
|
||||
|
||||
void SlurTieLayout::adjustForLedgerLines(TieSegment* tieSegment, SlurTiePos& sPos)
|
||||
void SlurTieLayout::adjustXforLedgerLines(TieSegment* tieSegment, bool start, Chord* chord, Note* note,
|
||||
const PointF& chordSystemPos, double padding, double& resultingX)
|
||||
{
|
||||
if (tieSegment->tie()->isInside() || !chord->ledgerLines()) {
|
||||
return;
|
||||
}
|
||||
|
||||
bool isOuterNote = note == chord->upNote() || note == chord->downNote();
|
||||
if (isOuterNote) {
|
||||
return;
|
||||
}
|
||||
|
||||
bool ledgersAbove = false;
|
||||
bool ledgersBelow = false;
|
||||
for (LedgerLine* ledger = chord->ledgerLines(); ledger; ledger = ledger->next()) {
|
||||
if (ledger->y() < 0.0) {
|
||||
ledgersAbove = true;
|
||||
} else {
|
||||
ledgersBelow = true;
|
||||
}
|
||||
if (ledgersAbove && ledgersBelow) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
int noteLine = note->line();
|
||||
bool isOddLine = noteLine % 2 != 0;
|
||||
bool isAboveStaff = noteLine <= 0;
|
||||
bool isBelowStaff = noteLine >= 2 * (note->staff()->lines(note->tick()) - 1);
|
||||
bool isInsideStaff = !isAboveStaff && !isBelowStaff;
|
||||
if (isOddLine || isInsideStaff || (isAboveStaff && !ledgersAbove) || (isBelowStaff && !ledgersBelow)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Shape noteShape = note->shape().translated(note->pos() + chordSystemPos);
|
||||
double xNoteEdge = (start ? noteShape.right() : -noteShape.left()) + padding;
|
||||
|
||||
resultingX = start ? std::max(resultingX, xNoteEdge) : std::min(resultingX, xNoteEdge);
|
||||
}
|
||||
|
||||
void SlurTieLayout::adjustYforLedgerLines(TieSegment* tieSegment, SlurTiePos& sPos)
|
||||
{
|
||||
Tie* tie = tieSegment->tie();
|
||||
Note* note = tieSegment->isSingleBeginType() ? tie->startNote() : tie->endNote();
|
||||
|
@ -1497,9 +1549,7 @@ void SlurTieLayout::adjustY(TieSegment* tieSegment)
|
|||
bool isInside = tie2->isInside();
|
||||
bool isOuterOfChord = tie2->isOuterTieOfChord(Grip::START) || tie2->isOuterTieOfChord(Grip::END);
|
||||
bool hasTiedSecondInside = tie2->hasTiedSecondInside();
|
||||
bool hasEndPointAboveNote = abs(tieSegment->adjustmentOffset(Grip::START).x()) < 0.5 * note->width()
|
||||
|| abs(tieSegment->adjustmentOffset(Grip::END).x()) < 0.5 * note->width();
|
||||
if (!isInside && !isOuterOfChord && !hasTiedSecondInside && !hasEndPointAboveNote) {
|
||||
if (!isInside && !isOuterOfChord && !hasTiedSecondInside && !hasEndPointAboveNote(tieSegment)) {
|
||||
double currentY = tieSegment->ups(Grip::START).p.y();
|
||||
double yCorrection = -upSign * (badArcIntersectionLimit - outwardMargin);
|
||||
tieSegment->addAdjustmentOffset(PointF(0.0, yCorrection), Grip::START);
|
||||
|
@ -1532,6 +1582,27 @@ void SlurTieLayout::adjustY(TieSegment* tieSegment)
|
|||
}
|
||||
}
|
||||
|
||||
bool SlurTieLayout::hasEndPointAboveNote(TieSegment* tieSegment)
|
||||
{
|
||||
Note* startNote = tieSegment->tie()->startNote();
|
||||
Note* endNote = tieSegment->tie()->endNote();
|
||||
|
||||
if ((tieSegment->isSingleBeginType() && !startNote) || (tieSegment->isSingleEndType() && !endNote)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Chord* startChord = startNote->chord();
|
||||
PointF startNotePos = startNote->pos() + startChord->pos() + startChord->segment()->pos() + startChord->measure()->pos();
|
||||
|
||||
Chord* endChord = endNote->chord();
|
||||
PointF endNotePos = endNote->pos() + endChord->pos() + endChord->segment()->pos() + endChord->measure()->pos();
|
||||
|
||||
PointF tieStartPos = tieSegment->ups(Grip::START).pos();
|
||||
PointF tieEndPos = tieSegment->ups(Grip::END).pos();
|
||||
|
||||
return tieStartPos.x() < startNotePos.x() + startNote->width() || tieEndPos.x() > endNotePos.x();
|
||||
}
|
||||
|
||||
void SlurTieLayout::resolveVerticalTieCollisions(const std::vector<TieSegment*>& stackedTies)
|
||||
{
|
||||
if (stackedTies.size() < 2) {
|
||||
|
@ -1567,7 +1638,7 @@ void SlurTieLayout::resolveVerticalTieCollisions(const std::vector<TieSegment*>&
|
|||
double yMidPoint = 0.5 * (thisTieOuterY + nextTieInnerY);
|
||||
double halfLineDist = 0.5 * staff->lineDistance(tick) * spatium;
|
||||
int midLine = round(yMidPoint / halfLineDist);
|
||||
bool insideStaff = midLine > 0 && midLine < 2 * (staff->lines(tick) - 1) - 1;
|
||||
bool insideStaff = midLine >= -1 && midLine <= 2 * (staff->lines(tick) - 1) + 1;
|
||||
if (insideStaff) {
|
||||
yMidPoint = midLine * halfLineDist;
|
||||
}
|
||||
|
|
|
@ -63,8 +63,12 @@ private:
|
|||
static void correctForCrossStaff(Tie* tie, SlurTiePos& sPos);
|
||||
static void forceHorizontal(Tie* tie, SlurTiePos& sPos);
|
||||
static void adjustX(TieSegment* tieSegment, SlurTiePos& sPos, Grip startOrEnd);
|
||||
static void adjustForLedgerLines(TieSegment* tieSegment, SlurTiePos& sPos);
|
||||
static void adjustXforLedgerLines(TieSegment* tieSegment, bool start, Chord* chord, Note* note, const PointF& chordSystemPos,
|
||||
double padding, double& resultingX);
|
||||
static void adjustYforLedgerLines(TieSegment* tieSegment, SlurTiePos& sPos);
|
||||
static void adjustY(TieSegment* tieSegment);
|
||||
static bool hasEndPointAboveNote(TieSegment* tieSegment);
|
||||
|
||||
static TieSegment* layoutTieWithNoEndNote(Tie* item);
|
||||
|
||||
static double defaultStemLengthStart(Tremolo* tremolo);
|
||||
|
|
|
@ -206,6 +206,8 @@ ElementPattern* NotationElements::constructElementPattern(const FilterElementsOp
|
|||
pattern->voice = elementOptions->voice;
|
||||
pattern->system = elementOptions->system;
|
||||
pattern->durationTicks = elementOptions->durationTicks;
|
||||
pattern->beat = elementOptions->beat;
|
||||
pattern->measure = elementOptions->measure;
|
||||
|
||||
return pattern;
|
||||
}
|
||||
|
@ -224,6 +226,8 @@ mu::engraving::NotePattern* NotationElements::constructNotePattern(const FilterN
|
|||
pattern->staffEnd = notesOptions->staffEnd;
|
||||
pattern->voice = notesOptions->voice;
|
||||
pattern->system = notesOptions->system;
|
||||
pattern->beat = notesOptions->beat;
|
||||
pattern->measure = notesOptions->measure;
|
||||
|
||||
return pattern;
|
||||
}
|
||||
|
|
|
@ -442,6 +442,8 @@ struct FilterElementsOptions
|
|||
int voice = -1;
|
||||
const mu::engraving::System* system = nullptr;
|
||||
Fraction durationTicks{ -1, 1 };
|
||||
Fraction beat{ -1, 1 };
|
||||
const Measure* measure = nullptr;
|
||||
|
||||
bool bySubtype = false;
|
||||
int subtype = -1;
|
||||
|
|
|
@ -1421,6 +1421,11 @@ QString EditStyle::pageCodeForElement(const EngravingItem* element)
|
|||
return "vibrato";
|
||||
|
||||
case ElementType::BEND:
|
||||
case ElementType::GUITAR_BEND:
|
||||
case ElementType::GUITAR_BEND_SEGMENT:
|
||||
case ElementType::GUITAR_BEND_HOLD:
|
||||
case ElementType::GUITAR_BEND_HOLD_SEGMENT:
|
||||
case ElementType::GUITAR_BEND_TEXT:
|
||||
return "bend";
|
||||
|
||||
case ElementType::TEXTLINE:
|
||||
|
|
|
@ -114,6 +114,32 @@ FilterElementsOptions SelectDialog::elementOptions() const
|
|||
options.durationTicks = Fraction(-1, 1);
|
||||
}
|
||||
|
||||
if (sameBeat->isChecked()) {
|
||||
options.beat = m_element->beat();
|
||||
} else {
|
||||
options.beat = Fraction(0, 0);
|
||||
}
|
||||
|
||||
if (sameMeasure->isChecked()) {
|
||||
auto m = m_element->findMeasure();
|
||||
if (!m && m_element->isSpannerSegment()) {
|
||||
if (auto ss = toSpannerSegment(m_element)) {
|
||||
if (auto s = ss->spanner()) {
|
||||
if (auto se = s->startElement()) {
|
||||
if (auto mse = se->findMeasure()) {
|
||||
m = mse;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (m) {
|
||||
options.measure = m;
|
||||
}
|
||||
} else {
|
||||
options.measure = nullptr;
|
||||
}
|
||||
|
||||
options.voice = sameVoice->isChecked() ? static_cast<int>(m_element->voice()) : -1;
|
||||
options.bySubtype = sameSubtype->isChecked();
|
||||
|
||||
|
|
|
@ -29,18 +29,22 @@
|
|||
<number>9</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_2">
|
||||
<widget class="QGroupBox" name="select">
|
||||
<property name="title">
|
||||
<string>Select</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_2">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label">
|
||||
<item row="1" column="0">
|
||||
<widget class="QCheckBox" name="sameSubtype">
|
||||
<property name="text">
|
||||
<string>Element type:</string>
|
||||
<string>Same subtype:</string>
|
||||
</property>
|
||||
<property name="buddy">
|
||||
<cstring>type</cstring>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1" colspan="2">
|
||||
<widget class="QLineEdit" name="type">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
@ -65,20 +69,6 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QCheckBox" name="sameSubtype">
|
||||
<property name="text">
|
||||
<string>Same subtype:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1" colspan="2">
|
||||
<widget class="QLineEdit" name="type">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1" colspan="2">
|
||||
<widget class="QLineEdit" name="subtype">
|
||||
<property name="readOnly">
|
||||
|
@ -86,14 +76,38 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1" colspan="2">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>Element type:</string>
|
||||
</property>
|
||||
<property name="buddy">
|
||||
<cstring>type</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0">
|
||||
<widget class="QCheckBox" name="sameBeat">
|
||||
<property name="text">
|
||||
<string>Same beat</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="1">
|
||||
<widget class="QCheckBox" name="sameMeasure">
|
||||
<property name="text">
|
||||
<string>Same measure</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1">
|
||||
<widget class="QCheckBox" name="sameSystem">
|
||||
<property name="text">
|
||||
<string>Same system</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<item row="3" column="1">
|
||||
<widget class="QCheckBox" name="inSelection">
|
||||
<property name="text">
|
||||
<string>In selection</string>
|
||||
|
@ -104,7 +118,7 @@
|
|||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox">
|
||||
<widget class="QGroupBox" name="action">
|
||||
<property name="title">
|
||||
<string>Action</string>
|
||||
</property>
|
||||
|
@ -171,13 +185,14 @@
|
|||
<tabstop>sameSubtype</tabstop>
|
||||
<tabstop>subtype</tabstop>
|
||||
<tabstop>sameStaff</tabstop>
|
||||
<tabstop>inSelection</tabstop>
|
||||
<tabstop>sameVoice</tabstop>
|
||||
<tabstop>sameSystem</tabstop>
|
||||
<tabstop>inSelection</tabstop>
|
||||
<tabstop>sameDuration</tabstop>
|
||||
<tabstop>sameSystem</tabstop>
|
||||
<tabstop>sameBeat</tabstop>
|
||||
<tabstop>sameMeasure</tabstop>
|
||||
<tabstop>replace</tabstop>
|
||||
<tabstop>add</tabstop>
|
||||
<tabstop>fromSelection</tabstop>
|
||||
<tabstop>subtract</tabstop>
|
||||
</tabstops>
|
||||
<resources/>
|
||||
|
|
|
@ -139,6 +139,18 @@ FilterNotesOptions SelectNoteDialog::noteOptions() const
|
|||
options.durationTicks = mu::engraving::Fraction(-1, 1);
|
||||
}
|
||||
|
||||
if (sameBeat->isChecked()) {
|
||||
options.beat = m_note->beat();
|
||||
} else {
|
||||
options.beat = Fraction(0, 0);
|
||||
}
|
||||
|
||||
if (sameMeasure->isChecked()) {
|
||||
options.measure = m_note->findMeasure();
|
||||
} else {
|
||||
options.measure = nullptr;
|
||||
}
|
||||
|
||||
if (sameStaff->isChecked()) {
|
||||
options.staffStart = static_cast<int>(m_note->staffIdx());
|
||||
options.staffEnd = static_cast<int>(m_note->staffIdx() + 1);
|
||||
|
|
|
@ -29,32 +29,25 @@
|
|||
<number>9</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_2">
|
||||
<widget class="QGroupBox" name="select">
|
||||
<property name="title">
|
||||
<string>Select</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_2">
|
||||
<item row="0" column="1">
|
||||
<widget class="QLabel" name="notehead">
|
||||
<item row="3" column="0">
|
||||
<widget class="QCheckBox" name="sameType">
|
||||
<property name="text">
|
||||
<string>Same type:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="1">
|
||||
<widget class="QLabel" name="durationTicks">
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QCheckBox" name="sameNotehead">
|
||||
<property name="text">
|
||||
<string>Same notehead:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="8" column="1" colspan="2">
|
||||
<widget class="QCheckBox" name="sameSystem">
|
||||
<property name="text">
|
||||
<string>Same system</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="8" column="0">
|
||||
<widget class="QCheckBox" name="sameVoice">
|
||||
<property name="text">
|
||||
|
@ -62,6 +55,13 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QCheckBox" name="samePitch">
|
||||
<property name="text">
|
||||
<string>Same pitch:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1">
|
||||
<widget class="QLabel" name="durationType">
|
||||
<property name="text">
|
||||
|
@ -69,15 +69,29 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QCheckBox" name="sameDurationType">
|
||||
<item row="7" column="0">
|
||||
<widget class="QCheckBox" name="sameStaff">
|
||||
<property name="text">
|
||||
<string>Same note type:</string>
|
||||
<string>Same staff</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="1">
|
||||
<widget class="QLabel" name="durationTicks">
|
||||
<item row="6" column="0">
|
||||
<widget class="QCheckBox" name="sameName">
|
||||
<property name="text">
|
||||
<string>Same note name:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QLabel" name="type">
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="1">
|
||||
<widget class="QLabel" name="name">
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
|
@ -90,10 +104,10 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QCheckBox" name="samePitch">
|
||||
<item row="0" column="0">
|
||||
<widget class="QCheckBox" name="sameNotehead">
|
||||
<property name="text">
|
||||
<string>Same pitch:</string>
|
||||
<string>Same notehead:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
@ -111,38 +125,17 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="7" column="0">
|
||||
<widget class="QCheckBox" name="sameStaff">
|
||||
<property name="text">
|
||||
<string>Same staff</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QCheckBox" name="sameType">
|
||||
<property name="text">
|
||||
<string>Same type:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QLabel" name="type">
|
||||
<item row="0" column="1">
|
||||
<widget class="QLabel" name="notehead">
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="0">
|
||||
<widget class="QCheckBox" name="sameName">
|
||||
<item row="8" column="1" colspan="2">
|
||||
<widget class="QCheckBox" name="sameSystem">
|
||||
<property name="text">
|
||||
<string>Same note name:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="1">
|
||||
<widget class="QLabel" name="name">
|
||||
<property name="text">
|
||||
<string/>
|
||||
<string>Same system</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
@ -153,6 +146,13 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QCheckBox" name="sameDurationType">
|
||||
<property name="text">
|
||||
<string>Same note type:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QLabel" name="string">
|
||||
<property name="text">
|
||||
|
@ -160,11 +160,25 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="9" column="0">
|
||||
<widget class="QCheckBox" name="sameBeat">
|
||||
<property name="text">
|
||||
<string>Same beat</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="9" column="1">
|
||||
<widget class="QCheckBox" name="sameMeasure">
|
||||
<property name="text">
|
||||
<string>Same measure</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox">
|
||||
<widget class="QGroupBox" name="action">
|
||||
<property name="title">
|
||||
<string>Action</string>
|
||||
</property>
|
||||
|
@ -238,9 +252,10 @@
|
|||
<tabstop>inSelection</tabstop>
|
||||
<tabstop>sameVoice</tabstop>
|
||||
<tabstop>sameSystem</tabstop>
|
||||
<tabstop>sameBeat</tabstop>
|
||||
<tabstop>sameMeasure</tabstop>
|
||||
<tabstop>replace</tabstop>
|
||||
<tabstop>add</tabstop>
|
||||
<tabstop>fromSelection</tabstop>
|
||||
<tabstop>subtract</tabstop>
|
||||
</tabstops>
|
||||
<resources/>
|
||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue