diff --git a/src/libs/core/score/tbeamobject.cpp b/src/libs/core/score/tbeamobject.cpp index 01479efd5bb4628db4dc3c004192dbe8c454d231..d7202ff5997e003d35f762aaf3023e4020cacb88 100644 --- a/src/libs/core/score/tbeamobject.cpp +++ b/src/libs/core/score/tbeamobject.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2016 by Tomasz Bojczuk * + * Copyright (C) 2016-2018 by Tomasz Bojczuk * * seelook@gmail.com * * * * This program is free software; you can redistribute it and/or modify * @@ -54,7 +54,7 @@ public: TbeamObject::TbeamObject(TnotePair* sn, TmeasureObject* m) : - QQuickPaintedItem(m->staff()->staffItem()), + QQuickPaintedItem(m->staff()), m_measure(m) { setAcceptHoverEvents(true); @@ -62,12 +62,13 @@ TbeamObject::TbeamObject(TnotePair* sn, TmeasureObject* m) : setAntialiasing(true); addNote(sn); setParent(m_measure->score()); + connect(qApp, &QGuiApplication::paletteChanged, [=]{ update(); }); } TbeamObject::~TbeamObject() { - qDebug() << " [BEAM] deleted of id" << first()->index(); +// qDebug() << " [BEAM] deleted of id" << first()->index(); for (TnotePair* np : qAsConst(m_notes)) { resetBeam(np); } @@ -190,7 +191,7 @@ void TbeamObject::drawBeam() { void TbeamObject::changeStaff(TstaffObject* st) { - setParentItem(st->staffItem()); + setParentItem(st); } diff --git a/src/libs/core/score/tmeasureobject.cpp b/src/libs/core/score/tmeasureobject.cpp index 1b7776c4d758f47742127eb6159d58bef0bfc193..72abb963a9ef53c35fdca5c3672f7f4dc624eefe 100644 --- a/src/libs/core/score/tmeasureobject.cpp +++ b/src/libs/core/score/tmeasureobject.cpp @@ -25,6 +25,8 @@ #include "music/tmeter.h" #include "music/tnote.h" +#include <QtGui/qguiapplication.h> +#include <QtGui/qpalette.h> #include <QtCore/qdebug.h> @@ -39,6 +41,11 @@ TmeasureObject::TmeasureObject(int nr, TscoreObject* parent) : clearAccidState(); m_duration = m_score->meter()->duration(); m_free = m_duration; + + connect(qApp, &QGuiApplication::paletteChanged, [=]{ + if (m_barLine) + m_barLine->setProperty("color", qApp->palette().text().color()); + }); } diff --git a/src/libs/core/score/tnoteobject.cpp b/src/libs/core/score/tnoteobject.cpp index 813237b28d5d670d3b586306f12cf5a19f2af70b..0097929a92cb54b28d11a0b0c35e43490ac5e283 100644 --- a/src/libs/core/score/tnoteobject.cpp +++ b/src/libs/core/score/tnoteobject.cpp @@ -77,7 +77,7 @@ QString tieDebug(Trhythm::Etie t) { TnoteObject::TnoteObject(TstaffObject* staffObj, TnotePair* wrapper) : - QQuickItem(staffObj->staffItem()), + QQuickItem(staffObj), m_staff(staffObj), m_wrapper(wrapper), m_stemHeight(STEM_HEIGHT) @@ -114,12 +114,13 @@ TnoteObject::TnoteObject(TstaffObject* staffObj, TnotePair* wrapper) : // m_debug->setParentItem(this); setColor(qApp->palette().text().color()); - setHeight(staffObj->staffItem()->height()); + setHeight(staffObj->height()); setAcceptHoverEvents(true); setZ(10); setAcceptedMouseButtons(Qt::LeftButton); updateNoteHead(); + connect(qApp, &QGuiApplication::paletteChanged, [=]{ setColor(qApp->palette().text().color()); }); } @@ -138,7 +139,7 @@ void TnoteObject::setStaff(TstaffObject* staffObj) { if (staffObj != m_staff) { m_staff = staffObj; if (m_staff) { - setParentItem(m_staff->staffItem()); + setParentItem(m_staff); if (m_wrapper->beam() && m_wrapper->beam()->last()->item() == this) m_wrapper->beam()->changeStaff(m_staff); } else { @@ -172,6 +173,16 @@ void TnoteObject::setColor(const QColor& c) { line->setProperty("color", c); if (m_midLine) m_midLine->setProperty("color", c); + if (m_tie) + m_tie->setProperty("color", c); + if (m_name) + m_name->setProperty("color", c); + if (m_stringNumber) + m_stringNumber->setProperty("color", c); + if (m_bowing) + m_bowing->setProperty("color", c); + if (m_fingerNumber) + m_fingerNumber->setProperty("color", c); } @@ -408,11 +419,6 @@ void TnoteObject::setNoteNameVisible(bool nameVisible) { } -QQuickItem* TnoteObject::staffItem() { - return m_staff->staffItem(); -} - - /** * Used glyphs are: * - note heads: @p 0xf4be @p 0xf4bd (half and black over-sized) and @p 0xf486 (whole smaller) diff --git a/src/libs/core/score/tscoreobject.cpp b/src/libs/core/score/tscoreobject.cpp index 8a0c5154f26164093703e9f7ab5753903fae800c..fe8aa50978d82a04537ec4373cac05aed5291ba4 100644 --- a/src/libs/core/score/tscoreobject.cpp +++ b/src/libs/core/score/tscoreobject.cpp @@ -641,7 +641,7 @@ qreal TscoreObject::stavesHeight() { if (m_staves.isEmpty()) return 0.0; auto last = lastStaff(); - return last->staffItem()->y() + last->staffItem()->height() * last->scale(); + return last->y() + last->height() * last->scale(); } @@ -753,9 +753,9 @@ qreal TscoreObject::midLine(TnoteObject* actNote) { if (stavesCount() == 0) return 0.0; if (actNote && m_activeNote) - return activeNote()->staffItem()->y() + (upperLine() + 4.0) * lastStaff()->scale(); + return activeNote()->y() + (upperLine() + 4.0) * lastStaff()->scale(); else - return lastStaff()->staffItem()->y() + (upperLine() + 4.0) * lastStaff()->scale(); + return lastStaff()->y() + (upperLine() + 4.0) * lastStaff()->scale(); } @@ -902,14 +902,17 @@ void TscoreObject::addStaff(TstaffObject* st) { st->setNumber(stavesCount()); m_staves.append(st); if (m_staves.count() == 1) { // initialize first measure of first staff - st->appendMeasure(m_measures.first()); - connect(st, &TstaffObject::upperLineChanged, this, &TscoreObject::upperLineChanged); + st->appendMeasure(m_measures.first()); + connect(st, &TstaffObject::upperLineChanged, this, &TscoreObject::upperLineChanged); + } else { // redirect destroyed signal to QML score + connect(st, &TstaffObject::destroyed, [=]{ emit staffDestroying(st->number()); }); } + // next staves position can be set only when staffItem is set, see TstaffObject::setStaffItem() then connect(st, &TstaffObject::hiNotePosChanged, [=](int staffNr, qreal offset){ for (int i = staffNr; i < m_staves.size(); ++i) // move every staff about offset - m_staves[i]->staffItem()->setY(m_staves[i]->staffItem()->y() + offset); + m_staves[i]->setY(m_staves[i]->y() + offset); emit stavesHeightChanged(); }); connect(st, &TstaffObject::loNotePosChanged, [=](int staffNr, qreal offset){ @@ -917,7 +920,7 @@ void TscoreObject::addStaff(TstaffObject* st) { staffNr = 1; if (m_staves.size() > 1 && staffNr < m_staves.size() - 1) { // ignore change of the last staff for (int i = staffNr; i < m_staves.size(); ++i) // move every staff about offset - m_staves[i]->staffItem()->setY(m_staves[i]->staffItem()->y() + offset); + m_staves[i]->setY(m_staves[i]->y() + offset); } emit stavesHeightChanged(); }); @@ -948,7 +951,7 @@ void TscoreObject::deleteStaff(TstaffObject* st) { if (st->measuresCount() < 1) { bool fixStaffNumbers = st != lastStaff(); m_staves.removeAt(st->number()); - st->staffItem()->deleteLater(); + st->deleteLater(); if (fixStaffNumbers) { for (int s = 0; s < stavesCount(); ++s) m_staves[s]->setNumber(s); @@ -978,7 +981,7 @@ void TscoreObject::updateStavesPos() { for (QList<TstaffObject*>::iterator s = m_staves.begin(); s != m_staves.end(); ++s) { auto curr = *s; if (curr->number() != 0 && curr->number() < stavesCount()) - curr->staffItem()->setY(prev->staffItem()->y() + (prev->loNotePos() - curr->hiNotePos() + 4.0) * prev->scale()); // TODO scordature! + curr->setY(prev->y() + (prev->loNotePos() - curr->hiNotePos() + 4.0) * prev->scale()); // TODO scordature! prev = curr; } emit stavesHeightChanged(); @@ -1076,7 +1079,7 @@ void TscoreObject::clearScorePrivate() { m_segments.clear(); while (m_staves.count() > 1) { auto ls = m_staves.takeLast(); - ls->staffItem()->deleteLater(); + ls->deleteLater(); } m_measures << new TmeasureObject(0, this); lastStaff()->appendMeasure(firstMeasure()); diff --git a/src/libs/core/score/tscoreobject.h b/src/libs/core/score/tscoreobject.h index adeab80e4181f406dcbb217f96608dfd76cde7d4..8724509874b027ea2c77a2d296e7e4e7808b9497 100644 --- a/src/libs/core/score/tscoreobject.h +++ b/src/libs/core/score/tscoreobject.h @@ -357,6 +357,8 @@ signals: */ void staffCreate(); + void staffDestroying(int staffNr); + /** * Usually those props are managed outside of @p TscoreObject - by QML * but in case @p keySignatureEnabled() and @p keySignature() are changed 'internally' diff --git a/src/libs/core/score/tstafflines.cpp b/src/libs/core/score/tstafflines.cpp index d39c396437d49d7025ff5c89b7f88fbb370f70c5..1246a2d3d4cc60b51d1aa8d7fb57afcef5ddca94 100644 --- a/src/libs/core/score/tstafflines.cpp +++ b/src/libs/core/score/tstafflines.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2017 by Tomasz Bojczuk * + * Copyright (C) 2017-2018 by Tomasz Bojczuk * * seelook@gmail.com * * * * This program is free software; you can redistribute it and/or modify * @@ -37,6 +37,7 @@ TstaffLines::TstaffLines(QQuickItem* parent) : setRenderTarget(QQuickPaintedItem::FramebufferObject); setAntialiasing(true); setHeight(9.0); + connect(qApp, &QGuiApplication::paletteChanged, [=]{ update(); }); } diff --git a/src/libs/core/score/tstaffobject.cpp b/src/libs/core/score/tstaffobject.cpp index 0fd153a47a7186333e61098ac30f6ebf8954f453..536b6f7f5eb60f85b4a613f3bba79cdee6db3442 100644 --- a/src/libs/core/score/tstaffobject.cpp +++ b/src/libs/core/score/tstaffobject.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2017 by Tomasz Bojczuk * + * Copyright (C) 2017-2018 by Tomasz Bojczuk * * seelook@gmail.com * * * * This program is free software; you can redistribute it and/or modify * @@ -29,11 +29,10 @@ #include <QtCore/qdebug.h> -TstaffObject::TstaffObject(QObject* parent) : - QObject(parent), +TstaffObject::TstaffObject(QQuickItem* parent) : + QQuickItem(parent), m_scoreObj(nullptr), m_upperLine(16.0), - m_staffItem(nullptr), m_loNotePos(28.0), m_hiNotePos(12.0), m_number(-1), m_firstMeasureId(0), m_lastMeasureId(-1) @@ -42,7 +41,7 @@ TstaffObject::TstaffObject(QObject* parent) : TstaffObject::~TstaffObject() { - qDebug() << "[TstaffObject] is going delete"; + qDebug() << "[TstaffObject] is going delete" << m_number; } @@ -57,6 +56,10 @@ void TstaffObject::setScordSpace(int hasScord) { void TstaffObject::setScore(TscoreObject* s) { m_scoreObj = s; m_scoreObj->addStaff(this); + if (m_scoreObj->stavesCount() > 1) { // initial staff position, depends on lowest note in the previous staff + auto prevStaff = m_scoreObj->staff(m_scoreObj->stavesCount() - 2); + setY(prevStaff->y() + (prevStaff->loNotePos() - hiNotePos() + 4.0) * prevStaff->scale()); + } } @@ -79,15 +82,6 @@ void TstaffObject::setUpperLine(qreal upLine) { } -void TstaffObject::setStaffItem(QQuickItem* si) { - m_staffItem = si; - if (m_scoreObj->stavesCount() > 1) { // initial staff position, depends on lowest note in the previous staff - auto prevStaff = m_scoreObj->staff(m_scoreObj->stavesCount() - 2); - m_staffItem->setY(prevStaff->staffItem()->y() + (prevStaff->loNotePos() - hiNotePos() + 4.0) * prevStaff->scale()); // TODO hasScordature - } -} - - int TstaffObject::firstMeasureNr() { return m_lastMeasureId == -1 ? 0 : (m_firstMeasureId < m_scoreObj->measuresCount() ? m_scoreObj->measure(m_firstMeasureId)->number() : 0); } @@ -107,9 +101,6 @@ void TstaffObject::setNotesIndent(qreal ni) { } -qreal TstaffObject::scale() { return m_staffItem ? staffItem()->property("scale").toReal() : 1.0; } - - char TstaffObject::debug() { QTextStream o(stdout); o << "\033[01;34m[" << number() + 1 << " STAFF]\033[01;00m"; diff --git a/src/libs/core/score/tstaffobject.h b/src/libs/core/score/tstaffobject.h index d82b1ea843376ccfd9f9f083620fa6b06672412d..c56b32c0afda47a42d5c30a56bfcb4aded5da8f1 100644 --- a/src/libs/core/score/tstaffobject.h +++ b/src/libs/core/score/tstaffobject.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2017 by Tomasz Bojczuk * + * Copyright (C) 2017-2018 by Tomasz Bojczuk * * seelook@gmail.com * * * * This program is free software; you can redistribute it and/or modify * @@ -21,7 +21,7 @@ #include "nootkacoreglobal.h" -#include <QtCore/qobject.h> +#include <QtQuick/qquickitem.h> class QQuickItem; @@ -36,14 +36,13 @@ class Tnote; /** * @class TstaffObject is C++ logic of Staff.qml */ -class NOOTKACORE_EXPORT TstaffObject : public QObject +class NOOTKACORE_EXPORT TstaffObject : public QQuickItem { Q_OBJECT Q_PROPERTY(TscoreObject* scoreObject READ score WRITE setScore) Q_PROPERTY(qreal upperLine READ upperLine WRITE setUpperLine NOTIFY upperLineChanged) - Q_PROPERTY(QQuickItem* staffItem READ staffItem WRITE setStaffItem) Q_PROPERTY(qreal notesIndent READ notesIndent WRITE setNotesIndent) Q_PROPERTY(int firstMeasureNr READ firstMeasureNr NOTIFY firstMeasureNrChanged) Q_PROPERTY(int number READ number WRITE setNumber NOTIFY numberChanged) @@ -53,7 +52,7 @@ class NOOTKACORE_EXPORT TstaffObject : public QObject friend class TnotePair; public: - explicit TstaffObject(QObject* parent = nullptr); + explicit TstaffObject(QQuickItem* parent = nullptr); ~TstaffObject() override; int number() const { return m_number; } @@ -80,9 +79,6 @@ public: qreal upperLine() const { return m_upperLine; } void setUpperLine(qreal upLine); - QQuickItem* staffItem() { return m_staffItem; } - void setStaffItem(QQuickItem* si); - /** * X coordinate of first note (or width of clef + key sign. + meter) */ @@ -94,7 +90,6 @@ public: int measuresCount() { return m_lastMeasureId - m_firstMeasureId + 1; } TmeasureObject* firstMeasure(); TmeasureObject* lastMeasure(); -// TmeasureObject* measure(int id) { return m_measures[id]; } TnotePair* firstNote(); TnotePair* lastNote(); @@ -127,11 +122,6 @@ public: qreal gapsSum() const { return m_gapsSum; } - /** - * Scaling factor of the staff - */ - qreal scale(); - /** * Prints to std out debug info about this staff: [nr STAFF] in color */ @@ -182,7 +172,6 @@ private: private: TscoreObject *m_scoreObj; qreal m_upperLine; - QQuickItem *m_staffItem; qreal m_notesIndent; qreal m_gapFactor; qreal m_loNotePos, m_hiNotePos; diff --git a/src/libs/core/tnootkaqml.cpp b/src/libs/core/tnootkaqml.cpp index 0ef8f99a73fa10e130588d71fd8cf4b711782b99..c52dcd1b1db9d8d11e597f95339ff6751a357ccd 100755 --- a/src/libs/core/tnootkaqml.cpp +++ b/src/libs/core/tnootkaqml.cpp @@ -78,7 +78,7 @@ TnootkaQML::TnootkaQML(QObject* parent) : qRegisterMetaType<Trhythm>(); qmlRegisterType<TscoreObject>("Score", 1, 0, "TscoreObject"); - qmlRegisterType<TstaffObject>("Score", 1, 0, "TstaffObject"); + qmlRegisterType<TstaffObject>("Score", 1, 0, "TstaffItem"); qmlRegisterType<TnoteObject>("Score", 1, 0, "TnoteItem"); qmlRegisterType<TstaffLines>("Score", 1, 0, "TstaffLines"); qmlRegisterType<TaddObject>("Score", 1, 0, "TaddObject"); diff --git a/src/qml/score/Score.qml b/src/qml/score/Score.qml index 8ce34e3074a7318736c75b926534c5817512b1ae..64471291fd4ccaa35358f579458b4ff2f2ef22c6 100644 --- a/src/qml/score/Score.qml +++ b/src/qml/score/Score.qml @@ -1,5 +1,5 @@ /** This file is part of Nootka (http://nootka.sf.net) * - * Copyright (C) 2017 by Tomasz Bojczuk (seelook@gmail.com) * + * Copyright (C) 2017-2018 by Tomasz Bojczuk (seelook@gmail.com) * * on the terms of GNU GPLv3 license (http://www.gnu.org/licenses) */ import QtQuick 2.9 @@ -55,7 +55,6 @@ Flickable { var c = Qt.createComponent("qrc:/Staff.qml") var lastStaff = c.createObject(score.contentItem) staves.push(lastStaff) - lastStaff.onDestroing.connect(removeStaff) score.lastStaff = lastStaff } onStavesHeightChanged: score.contentHeight = Math.max(stavesHeight, score.height) @@ -69,7 +68,7 @@ Flickable { } else workRhythm = Noo.rhythm(Trhythm.NoRhythm, false, false, false) } - function removeStaff(nr) { staves.splice(nr, 1); lastStaff = staves[staves.length - 1] } + onStaffDestroying: { staves.splice(staffNr, 1); lastStaff = staves[staves.length - 1] } onNoteWasAdded: { if (staves.length > 1) ensureVisible(lastNote.staffItem.y, lastNote.staffItem.height * scale) diff --git a/src/qml/score/Staff.qml b/src/qml/score/Staff.qml index 4663e03a429add0ce8badbadea14bc7e2bf290a1..677dbc9de8c2c9bb5fb89c56e43d2f4608ca425d 100644 --- a/src/qml/score/Staff.qml +++ b/src/qml/score/Staff.qml @@ -1,5 +1,5 @@ /** This file is part of Nootka (http://nootka.sf.net) * - * Copyright (C) 2017 by Tomasz Bojczuk (seelook@gmail.com) * + * Copyright (C) 2017-2018 by Tomasz Bojczuk (seelook@gmail.com) * * on the terms of GNU GPLv3 license (http://www.gnu.org/licenses) */ import QtQuick 2.9 @@ -9,19 +9,15 @@ import QtQuick.Window 2.2 import Score 1.0 -Item { +TstaffItem { id: staff property alias clef: clef - property alias upperLine: staffObj.upperLine property real linesCount: score.clef === Tclef.PianoStaffClefs ? 44 : 38 property var keySignItem: null property var meter: null property real firstNoteX: (meter ? meter.x + meter.width : (keySignItem ? keySignItem.x + keySignItem.width : clef.x + clef.width)) + 1.0 - property alias scordSpace: staffObj.scordSpace - - signal destroing(var nr) height: linesCount scale: score.singleNote ? score.height / linesCount : @@ -29,18 +25,15 @@ Item { width: score.width / scale transformOrigin: Item.TopLeft - TstaffObject { - id: staffObj - scoreObject: scoreObj - staffItem: staff; notesIndent: firstNoteX - upperLine: score.clef === Tclef.PianoStaffClefs ? 14 : 16 - } + scoreObject: scoreObj + notesIndent: firstNoteX + upperLine: score.clef === Tclef.PianoStaffClefs ? 14 : 16 TstaffLines { id: upperStaff x: score.clef === Tclef.PianoStaffClefs ? 1.5 : 0.5 width: staff.width - (score.clef === Tclef.PianoStaffClefs ? 2 : 1) - y: staffObj.upperLine - 0.1 + y: upperLine - 0.1 staffScale: staff.scale } @@ -50,7 +43,7 @@ Item { TstaffLines { x: score.clef === Tclef.PianoStaffClefs ? 1.5 : 0.5 width: staff.width - (score.clef === Tclef.PianoStaffClefs ? 2 : 1) - y: staffObj.upperLine - 0.1 + 14 + y: upperLine - 0.1 + 14 staffScale: staff.scale } } @@ -76,10 +69,10 @@ Item { Text { // measure number x: 1 - y: staffObj.upperLine - (score.clef === Tclef.Treble_G || score.clef === Tclef.Treble_G_8down + y: upperLine - (score.clef === Tclef.Treble_G || score.clef === Tclef.Treble_G_8down || score.clef === Tclef.Tenor_C || score.clef === Tclef.PianoStaffClefs ? 8.5 : 6) - text: staffObj.firstMeasureNr + 1 - visible: staffObj.number > 0 && staffObj.firstMeasureNr > 0 + text: firstMeasureNr + 1 + visible: number > 0 && firstMeasureNr > 0 font { pixelSize: score.clef === Tclef.PianoStaffClefs ? 2 : 1.5; family: "Scorek" } color: activPal.text } @@ -99,5 +92,4 @@ Item { } Component.onCompleted: checkIsKeyEnabled() - Component.onDestruction: destroing(staffObj.number) }