Compare commits

...

11 Commits

Author SHA1 Message Date
RomanPudashkin 18a3978926
Merge pull request #20231 from mike-spa/portTieRefinements
[PORTING] Several refinements and improvements of ties
2023-11-29 10:22:46 +02:00
Michele Spagnolo 97ffb7e979 Several refinements and improvements of ties 2023-11-28 17:11:37 +01:00
Casper Jeukendrup c6bc56732d
Merge pull request #20202 from musescore/ci_run_lupdate
Update in-repo translation source files
2023-11-26 13:37:04 +01:00
cbjeukendrup 3de3b745b3 Run lupdate 2023-11-26 12:19:48 +00:00
Casper Jeukendrup 5b1fa37a41
Merge pull request #20187 from Jojo-Schmitz/4.2.0-same-beat-measure
Same Beat and Measure (Select All Similar Filter)
2023-11-25 23:45:20 +01:00
Jesse Greene 615b6ec344 Fix "Same measure" for text lines 2023-11-25 11:16:03 +01:00
Joachim Schmitz 5753938d29 Same Beat and Measure (Select All Similar Filter)
Continuing on #7421, resp. porting (the rest of) #5637
2023-11-25 11:15:48 +01:00
Casper Jeukendrup 90a86203c1
Merge pull request #20176 from mathesoncalum/20163-bends_style_context-420
Fix #20163: Opening styles from bends context menu resolves to correct page (4.2.0)
2023-11-24 20:47:58 +01:00
Calum Matheson cce1f17f16
Fix #20163: Style page from bends context menu corrected 2023-11-24 18:21:41 +00:00
RomanPudashkin 23f39256b6
Merge pull request #20169 from RomanPudashkin/420_ci_checks
420_ci_checks
2023-11-24 13:34:20 +02:00
Roman Pudashkin f25b3d41ae enable the CI checks for 4.2.0 2023-11-24 13:02:00 +02:00
24 changed files with 1005 additions and 767 deletions

View File

@ -4,6 +4,7 @@ on:
pull_request:
branches:
- master
- 4.2.0
jobs:
codestyle:

View File

@ -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

View File

@ -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

View File

@ -4,6 +4,7 @@ on:
pull_request:
branches:
- master
- 4.2.0
workflow_dispatch:
jobs:

View File

@ -4,6 +4,7 @@ on:
pull_request:
branches:
- master
- 4.2.0
jobs:
setup:

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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; }

View File

@ -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())) {

View File

@ -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);
}
}

View File

@ -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;
}

View File

@ -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);

View File

@ -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;
}

View File

@ -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;

View File

@ -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:

View File

@ -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();

View File

@ -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/>

View File

@ -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);

View File

@ -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/>

BIN
vtest/scores/tie-10.mscz Normal file

Binary file not shown.

BIN
vtest/scores/tie-11.mscz Normal file

Binary file not shown.

BIN
vtest/scores/tie-12.mscz Normal file

Binary file not shown.