moment/src/gui/Popups/ImageViewerPopup/ImageViewerPopup.qml

158 lines
4.4 KiB
QML
Raw Normal View History

2020-07-20 14:27:52 -04:00
// SPDX-License-Identifier: LGPL-3.0-or-later
import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Window 2.12
import "../../Base"
HPopup {
id: popup
property string thumbnailTitle
property string thumbnailMxc
property string thumbnailPath: ""
property var thumbnailCryptDict
property string fullTitle
property string fullMxc
property var fullCryptDict
2020-07-21 17:34:45 -04:00
property int fullFileSize
2020-07-20 14:27:52 -04:00
property size overallSize
property bool alternateScaling: false
property bool activedFullScreen: false
2020-07-20 19:32:22 -04:00
property bool imagesPaused: false
property real imagesRotation: 0
property real animatedRotationTarget: 0
property real imagesSpeed: 1
property var availableSpeeds: [16, 8, 2, 1.75, 1.5, 1.25, 1, 0.75, 0.5]
2020-07-20 14:27:52 -04:00
2020-07-21 17:34:45 -04:00
readonly property alias info: info
2020-07-20 14:27:52 -04:00
readonly property alias canvas: canvas
2020-07-20 19:32:22 -04:00
readonly property alias buttons: buttons
readonly property alias autoHideTimer: autoHideTimer
2020-07-20 19:32:22 -04:00
readonly property bool isAnimated:
canvas.thumbnail.animated || canvas.full.animated
2020-07-20 14:27:52 -04:00
readonly property bool imageLargerThanWindow:
overallSize.width > window.width || overallSize.height > window.height
readonly property bool imageEqualToWindow:
overallSize.width == window.width &&
overallSize.height == window.height
readonly property int paintedWidth:
canvas.full.status === Image.Ready ?
canvas.full.animatedPaintedWidth || canvas.full.paintedWidth :
canvas.thumbnail.animatedPaintedWidth || canvas.thumbnail.paintedWidth
readonly property int paintedHeight:
canvas.full.status === Image.Ready ?
canvas.full.animatedPaintedHeight || canvas.full.paintedHeight :
canvas.thumbnail.animatedPaintedHeight || canvas.thumbnail.paintedHeight
readonly property bool canAutoHide:
paintedHeight * canvas.thumbnail.scale >
height - info.implicitHeight - buttons.implicitHeight &&
! infoHover.hovered &&
! buttonsHover.hovered
readonly property bool autoHide: canAutoHide && ! autoHideTimer.running
2020-07-20 14:27:52 -04:00
signal openExternallyRequested()
function showFullScreen() {
if (activedFullScreen) return
window.showFullScreen()
popup.activedFullScreen = true
if (! imageLargerThanWindow) popup.alternateScaling = true
}
function exitFullScreen() {
if (! activedFullScreen) return
window.showNormal()
popup.activedFullScreen = false
if (! imageLargerThanWindow) popup.alternateScaling = false
}
2020-07-20 19:32:22 -04:00
function toggleFullScreen() {
2020-07-20 14:27:52 -04:00
const isFull = window.visibility === Window.FullScreen
return isFull ? exitFullScreen() : showFullScreen()
}
margins: 0
background: null
onAboutToHide: exitFullScreen()
2020-07-20 19:32:22 -04:00
HNumberAnimation {
target: popup
property: "imagesRotation"
from: popup.imagesRotation
to: popup.animatedRotationTarget
easing.type: Easing.OutCirc
onToChanged: restart()
}
2020-07-20 14:27:52 -04:00
Item {
implicitWidth: window.width
implicitHeight: window.height
ViewerCanvas {
id: canvas
anchors.fill: parent
viewer: popup
}
2020-07-20 19:32:22 -04:00
HoverHandler {
readonly property point position: point.position
enabled: popup.canAutoHide
onPositionChanged:
if (Math.abs(point.velocity.x + point.velocity.y) >= 0.05)
autoHideTimer.restart()
}
Timer {
id: autoHideTimer
interval: 3000
}
2020-07-21 17:34:45 -04:00
ViewerInfo {
id: info
viewer: popup
width: parent.width
y:
(parent.width < buttons.width * 4 || layout.vertical) &&
popup.autoHide ?
-height :
parent.width < buttons.width * 4 || layout.vertical ?
0 :
parent.height - (popup.autoHide ? 0 : height)
maxTitleWidth: y <= 0 ? -1 : buttons.x - buttons.width / 2
2020-07-21 17:34:45 -04:00
Behavior on y { HNumberAnimation {} }
HoverHandler { id: infoHover }
2020-07-21 17:34:45 -04:00
}
2020-07-20 19:32:22 -04:00
ViewerButtons {
id: buttons
anchors.horizontalCenter: parent.horizontalCenter
width: Math.min(calculatedWidth, parent.width)
y: parent.height - (popup.autoHide ? 0 : height)
2020-07-20 19:32:22 -04:00
viewer: popup
Behavior on y { HNumberAnimation {} }
HoverHandler { id: buttonsHover }
2020-07-20 19:32:22 -04:00
}
2020-07-20 14:27:52 -04:00
}
}