global insert: handle generated ties
This commit is contained in:
parent
27a26c8ae0
commit
b8fe9e6332
6 changed files with 492 additions and 11 deletions
|
@ -561,6 +561,17 @@ void Score::globalInsertChord(const Position& pos)
|
|||
ScoreRange r;
|
||||
|
||||
r.read(s1, s2);
|
||||
|
||||
int sTrack = 0;
|
||||
int eTrack = nstaves() * VOICES;
|
||||
int stick = s1->tick();
|
||||
int etick = s2->tick();
|
||||
foreach (auto i, spanner()) {
|
||||
Spanner* s = i.second;
|
||||
if (s->tick() >= stick && s->tick() < etick && s->track() >= sTrack && s->track() < eTrack)
|
||||
undoRemoveElement(s);
|
||||
}
|
||||
|
||||
Fraction len = r.duration();
|
||||
if (!r.truncate(fraction))
|
||||
appendMeasures(1);
|
||||
|
|
|
@ -95,11 +95,8 @@ void TrackList::append(Element* e)
|
|||
d += toRest(e)->duration();
|
||||
rest->setDuration(d);
|
||||
}
|
||||
else
|
||||
{
|
||||
else {
|
||||
Element* element = e->clone();
|
||||
element->setSelected(false);
|
||||
QList<Element*>::append(element);
|
||||
if (e->isTuplet()) {
|
||||
Tuplet* srcTuplet = toTuplet(e);
|
||||
Tuplet* dstTuplet = toTuplet(element);
|
||||
|
@ -112,6 +109,35 @@ void TrackList::append(Element* e)
|
|||
if (ee->track() == e->track())
|
||||
_range->annotations.push_back({ s->tick(), ee->clone() });
|
||||
}
|
||||
if (e->isChord()) {
|
||||
Chord* chord = toChord(e);
|
||||
bool akkumulateChord = true;
|
||||
for (Note* n : chord->notes()) {
|
||||
if (!n->tieBack() || !n->tieBack()->generated()) {
|
||||
akkumulateChord = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (akkumulateChord && back()->isChord()) {
|
||||
Chord* bc = toChord(back());
|
||||
Fraction d = bc->duration();
|
||||
d += bc->duration();
|
||||
bc->setDuration(d);
|
||||
|
||||
// forward ties
|
||||
int idx = 0;
|
||||
for (Note* n : bc->notes()) {
|
||||
n->setTieFor(chord->notes()[idx]->tieFor());
|
||||
++idx;
|
||||
}
|
||||
delete element;
|
||||
element = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (element) {
|
||||
element->setSelected(false);
|
||||
QList<Element*>::append(element);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -307,6 +333,8 @@ Tuplet* TrackList::writeTuplet(Tuplet* parent, Tuplet* tuplet, Measure*& measure
|
|||
for (Note* note : c->notes()) {
|
||||
if (!duration.isZero() || note->tieFor()) {
|
||||
Tie* tie = new Tie(score);
|
||||
if (!note->tieFor())
|
||||
tie->setGenerated(true);
|
||||
note->add(tie);
|
||||
}
|
||||
else
|
||||
|
@ -438,7 +466,6 @@ bool TrackList::write(Score* score, int tick) const
|
|||
for (Element* e : *this) {
|
||||
if (e->isDurationElement()) {
|
||||
Fraction duration = toDurationElement(e)->duration();
|
||||
|
||||
if (duration > rest && e->isTuplet()) {
|
||||
// experimental: allow tuplet split in the middle
|
||||
if (duration != rest * 2) {
|
||||
|
@ -503,6 +530,8 @@ bool TrackList::write(Score* score, int tick) const
|
|||
for (Note* note : c->notes()) {
|
||||
if (!duration.isZero() || note->tieFor()) {
|
||||
Tie* tie = new Tie(score);
|
||||
if (!note->tieFor())
|
||||
tie->setGenerated(true);
|
||||
note->add(tie);
|
||||
}
|
||||
else
|
||||
|
@ -636,13 +665,13 @@ void ScoreRange::read(Segment* first, Segment* last)
|
|||
int endTrack = score->nstaves() * VOICES;
|
||||
|
||||
spanner.clear();
|
||||
int stick = first->tick();
|
||||
int etick = last->tick();
|
||||
for (auto i : first->score()->spanner()) {
|
||||
Spanner* s = i.second;
|
||||
if (s->tick() >= first->tick() && s->tick() < last->tick() &&
|
||||
s->track() >= startTrack && s->track() < endTrack) {
|
||||
if (s->tick() >= stick && s->tick() < etick && s->track() >= startTrack && s->track() < endTrack) {
|
||||
Spanner* ns = static_cast<Spanner*>(s->clone());
|
||||
ns->setTick(ns->tick() - first->tick());
|
||||
ns->setTick2(ns->tick2() - first->tick());
|
||||
ns->setTick(ns->tick() - stick);
|
||||
spanner.push_back(ns);
|
||||
}
|
||||
}
|
||||
|
@ -684,8 +713,7 @@ bool ScoreRange::write(Score* score, int tick) const
|
|||
++track;
|
||||
}
|
||||
for (Spanner* s : spanner) {
|
||||
s->setTick(s->tick() + first()->tick());
|
||||
s->setTick2(s->tick2() + first()->tick());
|
||||
s->setTick(s->tick() + tick);
|
||||
if (s->isSlur()) {
|
||||
Slur* slur = toSlur(s);
|
||||
if (slur->startCR()->isGrace()) {
|
||||
|
|
|
@ -63,6 +63,7 @@ QT5_WRAP_UI (ui_headers
|
|||
debugger/accidental.ui
|
||||
debugger/clef.ui
|
||||
debugger/slursegment.ui
|
||||
debugger/tiesegment.ui
|
||||
debugger/spanner.ui
|
||||
debugger/tremolo.ui
|
||||
debugger/beam.ui
|
||||
|
|
|
@ -630,6 +630,7 @@ void Debugger::updateElement(Element* el)
|
|||
case Element::Type::OTTAVA: ew = new OttavaView; break;
|
||||
case Element::Type::OTTAVA_SEGMENT: ew = new TextLineSegmentView; break;
|
||||
case Element::Type::SLUR_SEGMENT: ew = new SlurSegmentView; break;
|
||||
case Element::Type::TIE_SEGMENT: ew = new TieSegmentView; break;
|
||||
case Element::Type::ACCIDENTAL: ew = new AccidentalView; break;
|
||||
case Element::Type::ARTICULATION: ew = new ArticulationView; break;
|
||||
case Element::Type::STEM: ew = new StemView; break;
|
||||
|
@ -2319,6 +2320,55 @@ void OttavaView::setElement(Element* e)
|
|||
TextLineView::setElement(e);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------
|
||||
// TieSegmentView
|
||||
//---------------------------------------------------------
|
||||
|
||||
TieSegmentView::TieSegmentView()
|
||||
: ShowElementBase()
|
||||
{
|
||||
ss.setupUi(addWidget());
|
||||
connect(ss.slurTie, SIGNAL(clicked()), SLOT(slurTieClicked()));
|
||||
}
|
||||
|
||||
//---------------------------------------------------------
|
||||
// stemClicked
|
||||
//---------------------------------------------------------
|
||||
|
||||
void TieSegmentView::slurTieClicked()
|
||||
{
|
||||
emit elementChanged(toTieSegment(element())->slurTie());
|
||||
}
|
||||
|
||||
//---------------------------------------------------------
|
||||
// TieSegmentView
|
||||
//---------------------------------------------------------
|
||||
|
||||
void TieSegmentView::setElement(Element* e)
|
||||
{
|
||||
TieSegment* s = toTieSegment(e);
|
||||
ShowElementBase::setElement(e);
|
||||
ss.up1px->setValue(s->ups(Grip::START).p.x());
|
||||
ss.up1py->setValue(s->ups(Grip::START).p.y());
|
||||
ss.up1ox->setValue(s->ups(Grip::START).off.x());
|
||||
ss.up1oy->setValue(s->ups(Grip::START).off.y());
|
||||
|
||||
ss.up2px->setValue(s->ups(Grip::BEZIER1).p.x());
|
||||
ss.up2py->setValue(s->ups(Grip::BEZIER1).p.y());
|
||||
ss.up2ox->setValue(s->ups(Grip::BEZIER1).off.x());
|
||||
ss.up2oy->setValue(s->ups(Grip::BEZIER1).off.y());
|
||||
|
||||
ss.up3px->setValue(s->ups(Grip::BEZIER2).p.x());
|
||||
ss.up3py->setValue(s->ups(Grip::BEZIER2).p.y());
|
||||
ss.up3ox->setValue(s->ups(Grip::BEZIER2).off.x());
|
||||
ss.up3oy->setValue(s->ups(Grip::BEZIER2).off.y());
|
||||
|
||||
ss.up4px->setValue(s->ups(Grip::END).p.x());
|
||||
ss.up4py->setValue(s->ups(Grip::END).p.y());
|
||||
ss.up4ox->setValue(s->ups(Grip::END).off.x());
|
||||
ss.up4oy->setValue(s->ups(Grip::END).off.y());
|
||||
}
|
||||
|
||||
//---------------------------------------------------------
|
||||
// SlurSegmentView
|
||||
//---------------------------------------------------------
|
||||
|
|
|
@ -44,6 +44,7 @@
|
|||
#include "ui_tremolo.h"
|
||||
#include "ui_spanner.h"
|
||||
#include "ui_slursegment.h"
|
||||
#include "ui_tiesegment.h"
|
||||
#include "ui_accidental.h"
|
||||
#include "ui_clef.h"
|
||||
#include "ui_articulationbase.h"
|
||||
|
@ -649,6 +650,23 @@ class SlurSegmentView : public ShowElementBase {
|
|||
virtual void setElement(Element*);
|
||||
};
|
||||
|
||||
//---------------------------------------------------------
|
||||
// TieSegmentView
|
||||
//---------------------------------------------------------
|
||||
|
||||
class TieSegmentView : public ShowElementBase {
|
||||
Q_OBJECT;
|
||||
|
||||
Ui::TieSegment ss;
|
||||
|
||||
private slots:
|
||||
void slurTieClicked();
|
||||
|
||||
public:
|
||||
TieSegmentView();
|
||||
virtual void setElement(Element*);
|
||||
};
|
||||
|
||||
//---------------------------------------------------------
|
||||
// AccidentalView
|
||||
//---------------------------------------------------------
|
||||
|
|
373
mscore/debugger/tiesegment.ui
Normal file
373
mscore/debugger/tiesegment.ui
Normal file
|
@ -0,0 +1,373 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>TieSegment</class>
|
||||
<widget class="QWidget" name="TieSegment">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>595</width>
|
||||
<height>243</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string notr="true">0</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout">
|
||||
<property name="spacing">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>8</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>8</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>8</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>8</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox">
|
||||
<property name="title">
|
||||
<string notr="true">TieSegment</string>
|
||||
</property>
|
||||
<property name="flat">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<property name="horizontalSpacing">
|
||||
<number>1</number>
|
||||
</property>
|
||||
<property name="verticalSpacing">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item row="1" column="3">
|
||||
<widget class="QDoubleSpinBox" name="up1ox">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="buttonSymbols">
|
||||
<enum>QAbstractSpinBox::NoButtons</enum>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>-1000000.000000000000000</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>999999.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QDoubleSpinBox" name="up1px">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="buttonSymbols">
|
||||
<enum>QAbstractSpinBox::NoButtons</enum>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>-999999.000000000000000</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>999999.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="4">
|
||||
<widget class="QDoubleSpinBox" name="up4oy">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="buttonSymbols">
|
||||
<enum>QAbstractSpinBox::NoButtons</enum>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>-999999.000000000000000</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>999999.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_5">
|
||||
<property name="text">
|
||||
<string notr="true">UP1:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="4">
|
||||
<widget class="QDoubleSpinBox" name="up1oy">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="buttonSymbols">
|
||||
<enum>QAbstractSpinBox::NoButtons</enum>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>-999999.000000000000000</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>999999.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="2">
|
||||
<widget class="QDoubleSpinBox" name="up1py">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="buttonSymbols">
|
||||
<enum>QAbstractSpinBox::NoButtons</enum>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>-999999.000000000000000</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>999999.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string notr="true">UP2:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QDoubleSpinBox" name="up3px">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="buttonSymbols">
|
||||
<enum>QAbstractSpinBox::NoButtons</enum>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>-999999.000000000000000</double>
|
||||
</property>
|
||||
<property name="value">
|
||||
<double>0.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="2">
|
||||
<widget class="QDoubleSpinBox" name="up2py">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="buttonSymbols">
|
||||
<enum>QAbstractSpinBox::NoButtons</enum>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>-999999.000000000000000</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>999999.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1">
|
||||
<widget class="QDoubleSpinBox" name="up4px">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="buttonSymbols">
|
||||
<enum>QAbstractSpinBox::NoButtons</enum>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>-999999.000000000000000</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>999999.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QDoubleSpinBox" name="up2px">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="buttonSymbols">
|
||||
<enum>QAbstractSpinBox::NoButtons</enum>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>-999999.000000000000000</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>999999.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="2">
|
||||
<widget class="QDoubleSpinBox" name="up3py">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="buttonSymbols">
|
||||
<enum>QAbstractSpinBox::NoButtons</enum>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>-999999.000000000000000</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>999999.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="3">
|
||||
<widget class="QDoubleSpinBox" name="up2ox">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="buttonSymbols">
|
||||
<enum>QAbstractSpinBox::NoButtons</enum>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>-999999.000000000000000</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>999999.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="4">
|
||||
<widget class="QDoubleSpinBox" name="up2oy">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="buttonSymbols">
|
||||
<enum>QAbstractSpinBox::NoButtons</enum>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>-999999.000000000000000</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>999999.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="4">
|
||||
<widget class="QDoubleSpinBox" name="up3oy">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="buttonSymbols">
|
||||
<enum>QAbstractSpinBox::NoButtons</enum>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>-999999.000000000000000</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>999999.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="3">
|
||||
<widget class="QDoubleSpinBox" name="up3ox">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="buttonSymbols">
|
||||
<enum>QAbstractSpinBox::NoButtons</enum>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>-999999.000000000000000</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>999999.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="2">
|
||||
<widget class="QDoubleSpinBox" name="up4py">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="buttonSymbols">
|
||||
<enum>QAbstractSpinBox::NoButtons</enum>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>-999999.000000000000000</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>999999.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="3">
|
||||
<widget class="QDoubleSpinBox" name="up4ox">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="buttonSymbols">
|
||||
<enum>QAbstractSpinBox::NoButtons</enum>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>-999999.000000000000000</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>999999.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string notr="true">UP3:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="text">
|
||||
<string notr="true">UP4:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="text">
|
||||
<string notr="true">pos-x</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="2">
|
||||
<widget class="QLabel" name="label_6">
|
||||
<property name="text">
|
||||
<string notr="true">pos-y</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="3">
|
||||
<widget class="QLabel" name="label_7">
|
||||
<property name="text">
|
||||
<string notr="true">offset-x</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="4">
|
||||
<widget class="QLabel" name="label_8">
|
||||
<property name="text">
|
||||
<string notr="true">offset-y</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0">
|
||||
<widget class="QPushButton" name="slurTie">
|
||||
<property name="text">
|
||||
<string notr="true">Tie</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
Loading…
Reference in a new issue