global insert: handle generated ties

This commit is contained in:
Werner Schweer 2016-12-03 20:27:21 +01:00
parent 27a26c8ae0
commit b8fe9e6332
6 changed files with 492 additions and 11 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

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