Warning, /network/tokodon/src/content/ui/Components/FocusedImage.qml is written in an unsupported language. File is not indexed.

0001 // SPDX-FileCopyrightText: 2023 Joshua Goins <josh@redstrate.com>
0002 // SPDX-License-Identifier: LGPL-2.0-or-later
0003 
0004 import QtQuick
0005 import org.kde.kirigami 2 as Kirigami
0006 import QtQuick.Controls 2 as QQC2
0007 import QtQml.Models
0008 import QtQuick.Layouts
0009 
0010 Rectangle {
0011     id: root
0012 
0013     // The aspect ratio of the viewport.
0014     readonly property real aspectRatio: width / height
0015 
0016     property alias source: image.source
0017     property alias sourceSize: image.sourceSize
0018     property alias status: image.status
0019 
0020     property bool crop: true
0021     property real focusX: 0.0
0022     property real focusY: 0.0
0023 
0024     implicitWidth: parent.width
0025     implicitHeight: parent.width * (9.0 / 16.0)
0026 
0027     clip: true
0028 
0029     Image {
0030         id: image
0031 
0032         // The aspect ratio of the image (before it's cropped).
0033         readonly property real aspectRatio: sourceSize.width / Math.max(sourceSize.height, 1)
0034 
0035         // Whether the image is going to be vertically or horizontally cropped, based on if the aspect ratio is bigger
0036         // or smaller.
0037         readonly property bool horizontallyCropped: aspectRatio > parent.aspectRatio
0038         readonly property bool verticallyCropped: aspectRatio < parent.aspectRatio
0039 
0040         // Transforms the focus from [-1, 1] to [0, 1].
0041         readonly property real focusRangeX: (-root.focusX + 1.0) / 2.0
0042         readonly property real focusRangeY: (-root.focusY + 1.0) / 2.0
0043 
0044         // The x, y that centers the image.
0045         readonly property real centerX: parent.width - width
0046         readonly property real centerY: parent.height - height
0047 
0048         // Sets the position from the range of [0, 1] where (0, 0) is the top-left of the image,
0049         // and (1, 1) is the bottom-right. Values of (0.5, 0.5) results in a perfectly centered image.
0050         x: centerX * focusRangeX
0051         y: centerY * focusRangeY
0052 
0053         // Sets the width and height depending on whether the image is horizontally or vertically cropped.
0054         // For example, if it's vertically cropped then the image is set to the viewport size and the height is based on
0055         // the image aspect ratio. Vice versa for horizontally cropped images.
0056         width: horizontallyCropped ? (parent.height * aspectRatio) : parent.width
0057         height: verticallyCropped ? (parent.width * (1.0 / aspectRatio)) : parent.height
0058 
0059         mipmap: true
0060         cache: true
0061     }
0062 }