2020-09-23 19:57:54 -04:00
|
|
|
// Copyright Mirage authors & contributors <https://github.com/mirukana/mirage>
|
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
|
|
|
|
|
2020-08-23 16:57:53 -04:00
|
|
|
property string clientUserId
|
|
|
|
|
2020-07-20 14:27:52 -04:00
|
|
|
property string thumbnailTitle
|
|
|
|
property string thumbnailMxc
|
|
|
|
property string thumbnailPath: ""
|
|
|
|
property var thumbnailCryptDict
|
2020-08-23 16:57:53 -04:00
|
|
|
|
2020-07-20 14:27:52 -04:00
|
|
|
property string fullTitle
|
|
|
|
property string fullMxc
|
|
|
|
property var fullCryptDict
|
2020-07-21 17:34:45 -04:00
|
|
|
property int fullFileSize
|
2020-08-23 16:57:53 -04:00
|
|
|
|
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
|
2020-07-21 19:42:29 -04:00
|
|
|
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
|
|
|
|
|
2020-07-21 19:42:29 -04:00
|
|
|
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
|
|
|
|
2020-07-21 19:42:29 -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
|
2020-10-07 20:12:32 -04:00
|
|
|
interval: window.settings.Chat.Files.autohide_image_controls_after
|
2020-07-21 19:42:29 -04:00
|
|
|
}
|
|
|
|
|
2020-07-21 17:34:45 -04:00
|
|
|
ViewerInfo {
|
|
|
|
id: info
|
|
|
|
viewer: popup
|
|
|
|
width: parent.width
|
2020-07-21 19:42:29 -04:00
|
|
|
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 {} }
|
2020-07-21 19:42:29 -04:00
|
|
|
|
|
|
|
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)
|
2020-07-21 19:42:29 -04:00
|
|
|
y: parent.height - (popup.autoHide ? 0 : height)
|
2020-07-20 19:32:22 -04:00
|
|
|
viewer: popup
|
2020-07-21 19:42:29 -04:00
|
|
|
|
|
|
|
Behavior on y { HNumberAnimation {} }
|
|
|
|
|
|
|
|
HoverHandler { id: buttonsHover }
|
2020-07-20 19:32:22 -04:00
|
|
|
}
|
2020-07-20 14:27:52 -04:00
|
|
|
}
|
|
|
|
}
|