Warning, /utilities/kirogi/src/ui/components/PitchBar.qml is written in an unsupported language. File is not indexed.
0001 /* 0002 * Copyright 2019 Eike Hein <hein@kde.org> 0003 * Copyright 2019 Patrick José Pereira <patrickjp@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 import QtQuick 2.12 0023 import QtQuick.Layouts 1.0 0024 0025 Item { 0026 id: root 0027 0028 property real pitch: 0.0 0029 property real tickWidth: 10 0030 width: tickWidth * 2 0031 0032 ColumnLayout { 0033 id: layout 0034 Layout.margins: 0 0035 spacing: 0 0036 height: parent.height 0037 0038 // Calculate position based in the pitch value. 0039 y: { 0040 var middlePos = parent.height / 2 + height / 2; 0041 var perc = ((pitch % 10) / repeater.model) / 10; 0042 var yPos = Math.round(middlePos + perc * height); 0043 0044 return (parent.height - yPos); 0045 } 0046 0047 // Worst case scenario width to allow right alignment. 0048 TextMetrics { 0049 id: textMetrics 0050 font: Text.font 0051 text: "000" 0052 } 0053 0054 // Create bars. 0055 Repeater { 0056 id: repeater 0057 0058 // Use an odd value to create middle bar. 0059 model: 11 0060 0061 Rectangle { 0062 id: rectangle 0063 color: "white" 0064 width: root.tickWidth 0065 height: 2 0066 0067 // Calculate opacity based in the index. 0068 opacity: Math.abs(1 / (index - repeater.model / 2 )) * 2 0069 0070 Text { 0071 id: text 0072 0073 // Display only positive values, the anchors will inform the direction. 0074 text: Math.abs(value * 10) 0075 width: textMetrics.width 0076 height: 10 0077 color: "white" 0078 horizontalAlignment: Text.AlignRight 0079 0080 // Calculate real value. 0081 readonly property var value: { 0082 var multiplier = pitch > 0 ? Math.floor(pitch / 10) : Math.ceil(pitch / 10); 0083 return (index - (repeater.model - 1) / 2) + multiplier; 0084 } 0085 0086 // Change anchors based in value. 0087 onValueChanged: { 0088 if(state !== "positive" && value > 0) { 0089 state = "positive"; 0090 return 0091 } 0092 0093 if(state !== "negative" && value < 0) { 0094 state = "negative"; 0095 return 0096 } 0097 0098 if(state !== "zero" && value === 0) { 0099 state = "zero"; 0100 return 0101 } 0102 } 0103 0104 states: [ 0105 State { 0106 name: "zero" 0107 AnchorChanges { 0108 target: text 0109 anchors.verticalCenter: parent.verticalCenter 0110 anchors.top: undefined 0111 anchors.bottom: undefined 0112 } 0113 }, 0114 State { 0115 name: "positive" 0116 AnchorChanges { 0117 target: text 0118 anchors.verticalCenter: undefined 0119 anchors.top: parent.bottom 0120 anchors.bottom: undefined 0121 } 0122 }, 0123 State { 0124 name: "negative" 0125 AnchorChanges { 0126 target: text 0127 anchors.verticalCenter: undefined 0128 anchors.top: undefined 0129 anchors.bottom: parent.top 0130 } 0131 } 0132 ] 0133 anchors.left: parent.right 0134 anchors.leftMargin: 5 0135 anchors.verticalCenterOffset: -2 0136 anchors.bottomMargin: 2 0137 anchors.topMargin: -3 0138 } 0139 } 0140 0141 } 0142 } 0143 0144 Rectangle { 0145 id: middleBar 0146 0147 anchors.verticalCenter: parent.verticalCenter 0148 anchors.right: parent.left 0149 anchors.rightMargin: 2 0150 0151 width: tickWidth 0152 height: 2 0153 0154 color: "white" 0155 } 0156 }