Warning, /multimedia/kdenlive/src/timeline2/view/qml/ClipThumbs.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 QtQml.Models 2.15
0009 import com.enums 1.0
0010 
0011 
0012 Row {
0013     id: thumbRow
0014     anchors.fill: parent
0015     visible: !isAudio
0016     clip: true
0017     property real initialSpeed: 1
0018     opacity: clipState === ClipState.Disabled ? 0.2 : 1
0019     property bool fixedThumbs: clipRoot.itemType === ProducerType.Image || clipRoot.itemType === ProducerType.Text || clipRoot.itemType === ProducerType.TextTemplate
0020     property int thumbWidth: container.height * root.dar
0021     property bool enableCache: clipRoot.itemType === ProducerType.Video || clipRoot.itemType === ProducerType.AV
0022 
0023     Repeater {
0024         id: thumbRepeater
0025         // switching the model allows one to have different view modes.
0026         // We set the model to the number of frames we want to show
0027         model: switch (parentTrack.trackThumbsFormat) {
0028                    case 0:
0029                        // in/out
0030                        if (parent.width > thumbRow.thumbWidth) {
0031                            2 // 2: will display start / end thumbs
0032                        } else {
0033                            1 // 1: if the width of the container is to small, only show first thumbnail
0034                        }
0035                        break;
0036                    case 1:
0037                        // All frames
0038                        // display as many thumbnails as can fit into the container
0039                        Math.ceil(parent.width / thumbRow.thumbWidth)
0040                        break;
0041                    case 2:
0042                        // In frame only
0043                        1 // 1: only show first thumbnail
0044                        break;
0045                    case 3:
0046                    default:
0047                        // No thumbs
0048                        0 // 0: will disable thumbnails
0049                }
0050         property int startFrame: clipRoot.inPoint
0051         property int endFrame: clipRoot.outPoint
0052         property real imageWidth: Math.max(thumbRow.thumbWidth, parent.width / thumbRepeater.count)
0053         property int thumbStartFrame: fixedThumbs ? 0 :
0054                                                     (clipRoot.speed >= 0)
0055                                                     ? Math.round(clipRoot.inPoint * thumbRow.initialSpeed)
0056                                                     : Math.round((clipRoot.maxDuration - clipRoot.inPoint) * -thumbRow.initialSpeed - 1)
0057         property int thumbEndFrame: fixedThumbs ? 0 :
0058                                                   (clipRoot.speed >= 0)
0059                                                   ? Math.round(clipRoot.outPoint * thumbRow.initialSpeed)
0060                                                   : Math.round((clipRoot.maxDuration - clipRoot.outPoint) * -thumbRow.initialSpeed - 1)
0061 
0062         Image {
0063             width: thumbRepeater.imageWidth
0064             height: container.height
0065             fillMode: Image.PreserveAspectFit
0066             asynchronous: true
0067             cache: enableCache
0068             //sourceSize.width: width
0069             //sourceSize.height: height
0070             property int currentFrame: fixedThumbs
0071                                        ? 0
0072                                        : thumbRepeater.count < 3
0073                                          ? (index == 0 ? thumbRepeater.thumbStartFrame : thumbRepeater.thumbEndFrame)
0074                                          : Math.floor(clipRoot.inPoint * thumbRow.initialSpeed + Math.round((index) * width / timeline.scaleFactor)* clipRoot.speed)
0075             horizontalAlignment: thumbRepeater.count < 3
0076                                  ? (index == 0 ? Image.AlignLeft : Image.AlignRight)
0077                                  : Image.AlignLeft
0078             source: thumbRepeater.count < 3
0079                     ? (clipRoot.baseThumbPath + currentFrame)
0080                     : (index * width < clipRoot.scrollStart - width || index * width > clipRoot.scrollStart + scrollView.width) ? '' : clipRoot.baseThumbPath + currentFrame
0081             onStatusChanged: {
0082                 if (status === Image.Ready && (index == 0  || index == thumbRepeater.count - 1)) {
0083                     thumbPlaceholder.source = source
0084                 }
0085             }
0086             Image {
0087                 id: thumbPlaceholder
0088                 visible: parent.status != Image.Ready && (index == 0  || index == thumbRepeater.count - 1)
0089                 anchors.left: parent.left
0090                 anchors.leftMargin: index < thumbRepeater.count - 1 ? 0 : parent.width - thumbRow.thumbWidth - 1
0091                 width: parent.width
0092                 height: parent.height
0093                 horizontalAlignment: Image.AlignLeft
0094                 fillMode: Image.PreserveAspectFit
0095                 asynchronous: true
0096             }
0097             Rectangle {
0098                 visible: thumbRepeater.count < 3
0099                 anchors.left: parent.left
0100                 anchors.leftMargin: index == 0 ? thumbRow.thumbWidth : parent.width - thumbRow.thumbWidth - 1
0101                 color: "#ffffff"
0102                 opacity: 0.3
0103                 width: 1
0104                 height: parent.height
0105             }
0106         }
0107     }
0108 }