diff --git a/src/libs/core/score/tbeamobject.cpp b/src/libs/core/score/tbeamobject.cpp
index ed736d46d68588f04f5396b37bc6b9d9dbd7b4af..e85fec4e811a8a27b8c13e62b724c569b4c53b23 100644
--- a/src/libs/core/score/tbeamobject.cpp
+++ b/src/libs/core/score/tbeamobject.cpp
@@ -67,6 +67,7 @@ TbeamObject::~TbeamObject()
qDebug() << " [BEAM] deleted of id" << first()->index();
for (TnotePair* note : m_notes) {
note->note()->rtm.setBeam(Trhythm::e_noBeam); // restore beams
+ note->setBeam(nullptr);
}
}
@@ -114,7 +115,7 @@ void TbeamObject::prepareBeam() {
bool stemsUpPossible = true;
qreal hiNote = 99.0, loNote = 0.0;
for (TnotePair* np : m_notes) {
- stemDirStrength += np->item()->notePosY() - 18;
+ stemDirStrength += np->item()->notePosY() - (m_measure->staff()->upperLine() + 4.0);
if (np->item()->notePosY() < MIN_STEM_HEIGHT)
stemsUpPossible = false;
hiNote = qMin(hiNote, np->item()->notePosY());
@@ -137,10 +138,9 @@ void TbeamObject::prepareBeam() {
/**
- * Poligons are painted, single for 8ths and possible a few for 16ths.
- * Paiter canvas orientation depends on are stems up or down,
- * for stems-up, top beam is 8ths and bottom are 16ths,
- * for stems-down the opposite.
+ * Polygons are painted, single for 8ths and possible a few for 16ths.
+ * Painter canvas orientation depends on stems direction (up or down),
+ * for stems-up, top beam is 8ths and bottom are 16ths in contrary to stems-down
*/
void TbeamObject::paint(QPainter* painter) {
if (count() > 1) {
diff --git a/src/libs/core/score/tmeasureobject.cpp b/src/libs/core/score/tmeasureobject.cpp
index 521dd6f9ef145031c5152a938434afa2ca65565c..0de538f737b38395c97484dbc86d69780766ba8e 100644
--- a/src/libs/core/score/tmeasureobject.cpp
+++ b/src/libs/core/score/tmeasureobject.cpp
@@ -25,7 +25,6 @@
#include "music/tmeter.h"
#include "music/tnote.h"
-#include <QtQml/qqmlengine.h>
#include <QtQml/qqmlcomponent.h>
#include <QtCore/qdebug.h>
@@ -46,6 +45,11 @@ TmeasureObject::TmeasureObject(int nr, TscoreObject* parent) :
TmeasureObject::~TmeasureObject()
{
+ // delete beams
+ for (TnotePair* np : m_notes) {
+ if (np->beam() && np == np->beam()->last())
+ delete np->beam();
+ }
// qDebug() << debug() << "is going delete";
}
@@ -89,6 +93,7 @@ void TmeasureObject::appendNewNotes(int segmentId, int count) {
ns->beam()->prepareBeam();
break;
}
+ ++firstInGrId;
}
}
refresh();
@@ -173,10 +178,8 @@ void TmeasureObject::checkBarLine() {
if (m_free == 0 && m_score->meter()->meter() != Tmeter::NoMeter) {
auto lastNote = last()->item();
if (!m_barLine) {
- QQmlEngine engine;
- QQmlComponent comp(&engine, this);
- comp.setData("import QtQuick 2.7; Rectangle { width: 0.3; height: 8 }", QUrl());
- m_barLine = qobject_cast<QQuickItem*>(comp.create());
+ m_staff->score()->component()->setData("import QtQuick 2.7; Rectangle { width: 0.3; height: 8 }", QUrl());
+ m_barLine = qobject_cast<QQuickItem*>(m_staff->score()->component()->create());
m_barLine->setParentItem(lastNote);
m_barLine->setProperty("color", lastNote->color());
m_barLine->setY(m_staff->upperLine());
diff --git a/src/libs/core/score/tmeasureobject.h b/src/libs/core/score/tmeasureobject.h
index 9d9675f160c8bcebdd6ce0e6192bfe053e1ce36c..0ced27d89a4f7446fe048924180036a06e403ff2 100644
--- a/src/libs/core/score/tmeasureobject.h
+++ b/src/libs/core/score/tmeasureobject.h
@@ -128,8 +128,8 @@ protected:
/**
* Checks notes rhythms of group @p segmentId belongs to
* for 8ths and 16ths and crates beams (@p TbeamObject) if they occurs
- * It can be called before @p TnoteObject will be created
- * When beam was set or note was added to it it returns number of that group
+ * It can be called before @p TnoteObject creation.
+ * When beam was set or note was added to it, it returns number of that group
* or -1 if no beams were added
*/
int beamGroup(int segmentId);
diff --git a/src/libs/core/score/tnoteobject.cpp b/src/libs/core/score/tnoteobject.cpp
index d3a67c096672d35b1f41b794df1c32b0a0d317da..8abe39482aa5c954d84a075e68edde0b41a61feb 100644
--- a/src/libs/core/score/tnoteobject.cpp
+++ b/src/libs/core/score/tnoteobject.cpp
@@ -24,7 +24,6 @@
#include "tnotepair.h"
#include "music/tnote.h"
-#include <QtQml/qqmlengine.h>
#include <QtGui/qguiapplication.h>
#include <QtGui/qpalette.h>
#include <QtCore/qtimer.h>
@@ -84,8 +83,6 @@ TnoteObject::TnoteObject(TstaffObject* staffObj, TnotePair* wrapper) :
{
setParent(m_staff->score()); // to avoid deleting with parent staff
m_note = new Tnote();
- QQmlEngine engine;
- QQmlComponent comp(&engine, this);
m_staff->score()->component()->setData("import QtQuick 2.7; Rectangle {}", QUrl());
m_stem = qobject_cast<QQuickItem*>(m_staff->score()->component()->create());
@@ -130,6 +127,8 @@ TnoteObject::TnoteObject(TstaffObject* staffObj, TnotePair* wrapper) :
TnoteObject::~TnoteObject() {
// qDebug() << debug() << "is going deleted";
delete m_note;
+ if (m_name)
+ delete m_name;
}
@@ -140,12 +139,19 @@ int TnoteObject::index() const {
void TnoteObject::setStaff(TstaffObject* staffObj) {
if (staffObj != m_staff) {
- m_staff = staffObj;
- setParentItem(m_staff->staffItem());
- if (m_wrapper->beam() && m_wrapper->beam()->last()->item() == this)
- m_wrapper->beam()->changeStaff(m_staff);
- if (m_name)
- m_name->setParentItem(parentItem());
+ m_staff = staffObj;
+ if (m_staff) {
+ setParentItem(m_staff->staffItem());
+ if (m_wrapper->beam() && m_wrapper->beam()->last()->item() == this)
+ m_wrapper->beam()->changeStaff(m_staff);
+ // TODO This is good point to delete beam here, when staff becomes null
+ } else {
+ setParentItem(nullptr);
+ if (m_name)
+ m_name->setParentItem(parentItem());
+ }
+ if (m_name)
+ m_name->setParentItem(parentItem());
} else
qDebug() << debug() << "has staff set already";
}
diff --git a/src/libs/core/score/tnotepair.cpp b/src/libs/core/score/tnotepair.cpp
index 3c0a2c53f35926f2f97ccf821449c7416d5c6b79..5ce1473f249568802495f2c4a776b51c57821b55 100644
--- a/src/libs/core/score/tnotepair.cpp
+++ b/src/libs/core/score/tnotepair.cpp
@@ -31,6 +31,12 @@ TnotePair::TnotePair(int index, Tnote* n, TnoteObject* ob) :
}
+TnotePair::~TnotePair()
+{
+ delete m_noteItem;
+}
+
+
void TnotePair::setNoteObject(TnoteObject* ob) {
m_noteItem = ob;
}
diff --git a/src/libs/core/score/tnotepair.h b/src/libs/core/score/tnotepair.h
index d1b4b9ae5914e41a7c6b85b7262f6df09a460e3a..fb95d10a1015a1691a21c6cf4255946298511dd7 100644
--- a/src/libs/core/score/tnotepair.h
+++ b/src/libs/core/score/tnotepair.h
@@ -43,6 +43,7 @@ class TnotePair
public:
TnotePair(int index = -1, Tnote* n = nullptr, TnoteObject* ob = nullptr);
+ ~TnotePair();
Tnote* note() { return m_note; }
TnoteObject* item() { return m_noteItem; }
diff --git a/src/libs/core/score/tscoreobject.cpp b/src/libs/core/score/tscoreobject.cpp
index 0b945d6211634aa2d6e8781ad5a5706ca5318ecd..882f9bdff5478b98844feaa64721ac6d18854350 100644
--- a/src/libs/core/score/tscoreobject.cpp
+++ b/src/libs/core/score/tscoreobject.cpp
@@ -125,14 +125,33 @@ void TscoreObject::setClefType(Tclef::EclefType ct) {
void TscoreObject::setMeter(int m) {
+CHECKTIME (
// set notes grouping
m_meter->setMeter(static_cast<Tmeter::Emeter>(m));
updateMeterGroups();
- for (TmeasureObject* m : m_measures) {
- m->meterChanged();
+
+ if (measuresCount() && firstMeasure()->noteCount() > 0) {
+ qDeleteAll(m_measures);
+ m_measures.clear();
+ qDeleteAll(m_segments);
+ m_segments.clear();
+ while (m_staves.count() > 1) {
+ auto ls = m_staves.takeLast();
+ ls->staffItem()->deleteLater();
+ }
+ m_measures << new TmeasureObject(0, this);
+ lastStaff()->appendMeasure(firstMeasure());
+ firstStaff()->setFirstMeasureId(0);
+ QList<Tnote> oldList = m_notes;
+ m_notes.clear();
+ for (int n = 0; n < oldList.size(); ++n) {
+ addNote(oldList[n]);
+ }
+ adjustScoreWidth();
}
qDebug() << "[TscoreObject] Meter changed" << m_meterGroups;
emit meterChanged();
+)
}