Warning, /multimedia/kdenlive/src/timeline2/view/qml/ClipAudioThumbs.qml is written in an unsupported language. File is not indexed.

0001 /*
0002     SPDX-FileCopyrightText: 2018 Jean-Baptiste Mardelle <jb@kdenlive.org>
0003     SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0004 */
0005 
0006 import QtQuick 2.15
0007 import QtQuick.Controls 2.15
0008 import Kdenlive.Controls 1.0
0009 import QtQml.Models 2.15
0010 import com.enums 1.0
0011 
0012 Row {
0013     id: waveform
0014     opacity: clipState === ClipState.Disabled ? 0.2 : 1
0015     property int maxWidth: 2048
0016     property int totalChunks: 0
0017     property bool usesOffset: false
0018     property int offset: -1
0019     property real timeScale: root.timeScale
0020     anchors.fill: parent
0021 
0022     Timer {
0023         id: waveTimer
0024         interval: 50; running: false; repeat: false
0025         onTriggered: processReload()
0026     }
0027     
0028     onHeightChanged: {
0029         waveTimer.start()
0030     }
0031 
0032     function reload(reset) {
0033         if (reset === 0) {
0034             waveform.offset = 0
0035             waveform.totalChunks = 0
0036             waveformRepeater.model = 0
0037         }
0038         waveTimer.start()
0039     }
0040 
0041     onTimeScaleChanged: {
0042         waveTimer.start()
0043     }
0044 
0045     function processReload() {
0046         // This is needed to make the model have the correct count.
0047         // Model as a property expression is not working in all cases.
0048         if (!waveform.visible || !timeline.showAudioThumbnails) {
0049             return;
0050         }
0051         var total = Math.ceil(waveform.width / waveform.maxWidth)
0052         var chunks = total
0053         var updatedOffset = 0
0054         if (chunks > 10) {
0055             // Having too many chunks causes major slowdowns. In this case, we use an offset and only allow up to 20 chunks
0056             waveform.usesOffset = true
0057             updatedOffset = Math.max(0, Math.floor(clipRoot.scrollStart / waveform.maxWidth - 2))
0058             if (updatedOffset < waveform.offset || updatedOffset > (waveform.offset + 5) || total != waveform.totalChunks) {
0059                 // Enforce repaint
0060                 //waveformRepeater.model = 0
0061             } else {
0062                 // All required audio thumbs chunks are already painted
0063                 return
0064             }
0065             chunks = Math.min(10, total - updatedOffset)
0066         } else {
0067             waveform.usesOffset = false
0068             updatedOffset = 0
0069         }
0070         waveform.offset = updatedOffset
0071         waveform.totalChunks = total
0072         if (waveformRepeater.model === undefined || chunks !== waveformRepeater.model) {
0073             waveformRepeater.model = chunks
0074         } else {
0075             // Enforce repaint
0076             waveformRepeater.repaintNodes = !waveformRepeater.repaintNodes
0077         }
0078     }
0079     Item {
0080         width: waveform.offset * waveform.maxWidth
0081         height: parent.height
0082     }
0083 
0084     Repeater {
0085         id: waveformRepeater
0086         property bool repaintNodes: false
0087         TimelineWaveform {
0088             width: waveform.maxWidth < waveform.width ? (index + waveform.offset == waveform.totalChunks - 1 ? waveform.width % waveform.maxWidth : waveform.maxWidth) : Math.round(waveform.width)
0089             height: waveform.height
0090             ix: index
0091             channels: clipRoot.audioChannels
0092             binId: clipRoot.binId
0093             audioStream: clipRoot.audioStream
0094             isFirstChunk: index + waveform.offset == 0
0095             isOpaque: true
0096             scaleFactor: waveform.timeScale
0097             format: timeline.audioThumbFormat
0098             normalize: timeline.audioThumbNormalize
0099             speed: clipRoot.speed
0100             waveInPoint: clipRoot.speed < 0 ? (Math.ceil((clipRoot.maxDuration - 1 - clipRoot.inPoint) * Math.abs(clipRoot.speed)  - ((index + waveform.offset) * waveform.maxWidth / waveform.timeScale) * Math.abs(clipRoot.speed)) * clipRoot.audioChannels) : (Math.round((clipRoot.inPoint + ((index + waveform.offset) * waveform.maxWidth / waveform.timeScale)) * clipRoot.speed) * clipRoot.audioChannels)
0101             waveOutPoint: clipRoot.speed < 0 ? Math.max(0, (waveInPoint - Math.round(width / waveform.timeScale * Math.abs(clipRoot.speed)) * clipRoot.audioChannels)) : (waveInPoint + Math.round(width / waveform.timeScale * clipRoot.speed) * clipRoot.audioChannels)
0102             fillColor0: clipRoot.color
0103             fillColor1: root.thumbColor1
0104             fillColor2: root.thumbColor2
0105             enforceRepaint: waveformRepeater.repaintNodes
0106         }
0107     }
0108 }