Warning, /education/minuet/src/app/qml/SheetMusicView/Note.qml is written in an unsupported language. File is not indexed.
0001 /****************************************************************************
0002 **
0003 ** Copyright (C) 2017 by Sandro S. Andrade <sandroandrade@kde.org>
0004 **
0005 ** This program is free software; you can redistribute it and/or
0006 ** modify it under the terms of the GNU General Public License as
0007 ** published by the Free Software Foundation; either version 2 of
0008 ** the License or (at your option) version 3 or any later version
0009 ** accepted by the membership of KDE e.V. (or its successor approved
0010 ** by the membership of KDE e.V.), which shall act as a proxy
0011 ** defined in Section 14 of version 3 of the license.
0012 **
0013 ** This program is distributed in the hope that it will be useful,
0014 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
0015 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
0016 ** GNU General Public License for more details.
0017 **
0018 ** You should have received a copy of the GNU General Public License
0019 ** along with this program. If not, see <http://www.gnu.org/licenses/>.
0020 **
0021 ****************************************************************************/
0022
0023 import QtQuick 2.7
0024
0025 BravuraText {
0026 id: note
0027
0028 property int number;
0029 property int octave;
0030 property int midiKey;
0031 property int rhythm: 4;
0032 property int accident: 0 // [-2 double flat, -1 flat, 1 sharp, 2 double sharp]
0033 property bool spaced: true
0034
0035 objectName: "symbol"
0036
0037 onNumberChanged: {
0038 if (!internal.updating) {
0039 internal.updating = true;
0040 midiKey = 24 + (12*(octave-1))+number+accident;
0041 internal.updating = false
0042 }
0043 }
0044 onOctaveChanged: {
0045 if (!internal.updating) {
0046 internal.updating = true;
0047 midiKey = 24 + (12*(octave-1))+number+accident;
0048 internal.updating = false
0049 }
0050 }
0051 onAccidentChanged: {
0052 if (!internal.updating) {
0053 internal.updating = true;
0054 midiKey = 24 + (12*(octave-1))+number+accident;
0055 internal.updating = false
0056 }
0057 }
0058 onMidiKeyChanged: {
0059 if (!internal.updating) {
0060 internal.updating = true;
0061 number = (midiKey % 12);
0062 octave = (((midiKey-24) - number) / 12) + 1;
0063 accident = internal.accidentMap[number][1];
0064 internal.updating = false
0065 }
0066 }
0067
0068 QtObject {
0069 id: internal
0070
0071 property bool updating: false;
0072 property var accidentMap: [
0073 // [vertical offset, accident]
0074 [0, 0],
0075 [0, 1],
0076 [1, 0],
0077 [1, 1],
0078 [2, 0],
0079 [3, 0],
0080 [3, 1],
0081 [4, 0],
0082 [4, 1],
0083 [5, 0],
0084 [5, 1],
0085 [6, 0],
0086 ]
0087
0088 function itemIndex(item) {
0089 if (item.parent == null)
0090 return -1
0091 var siblings = item.parent.children
0092 for (var i = siblings.length - 1; i >=0 ; i--)
0093 if (siblings[i] == item)
0094 return i
0095 return -1 // will never happen
0096 }
0097 function previousItem(item) {
0098 if (item.parent == null)
0099 return null
0100 var siblings = item.parent.children
0101 for (var i = itemIndex(item) - 1; i >=0 ; i--)
0102 if (siblings[i].objectName == "symbol")
0103 return item.parent.children[i]
0104 return null
0105 }
0106
0107 property var rhythmTable: { "1": "\ue1d2", "2": "\ue1d3", "4": "\ue1d5", "8": "\ue1d7", "16": "\ue1d9", "32": "\ue1db", "64": "\ue1dd" }
0108 }
0109
0110 anchors {
0111 bottom: parent.children[0].bottom;
0112 bottomMargin: {
0113 (parent.clef.type == 0) ?
0114 ((internal.accidentMap[number][0])*5)+(octave-4)*35
0115 :
0116 -10+((internal.accidentMap[number][0])*5)+(octave-2)*35;
0117 }
0118 left: spaced ? internal.previousItem(note).right:internal.previousItem(note).left;
0119 leftMargin: spaced ? parent.spacing:0
0120 }
0121 text: ((accident == -1) ? "\ue260":(accident == 1) ? "\ue262":(accident == -2) ? "\ue264":(accident == 2) ? "\ue263":" ") + internal.rhythmTable[rhythm]
0122 font.pixelSize: 35
0123 }