Skip to content
Snippets Groups Projects
ImageMessage.qml 3.22 KiB
Newer Older
  • Learn to ignore specific revisions
  • Nicolas Werner's avatar
    Nicolas Werner committed
    // SPDX-FileCopyrightText: 2021 Nheko Contributors
    
    // SPDX-FileCopyrightText: 2022 Nheko Contributors
    
    // SPDX-FileCopyrightText: 2023 Nheko Contributors
    
    Nicolas Werner's avatar
    Nicolas Werner committed
    // SPDX-License-Identifier: GPL-3.0-or-later
    
    
    import QtQuick 2.15
    import QtQuick.Window 2.15
    
    Malte E's avatar
    Malte E committed
    import QtQuick.Controls 2.3
    
    Malte E's avatar
    Malte E committed
    AbstractButton {
    
        required property int type
        required property int originalWidth
        required property double proportionalHeight
        required property string url
        required property string blurhash
        required property string body
        required property string filename
        required property bool isReply
    
    Nicolas Werner's avatar
    Nicolas Werner committed
        required property string eventId
    
        property double divisor: isReply ? 5 : 3
    
        property int tempWidth: originalWidth < 1? 400: originalWidth
    
        implicitWidth: Math.round(tempWidth*Math.min((timelineView.height/divisor)/(tempWidth*proportionalHeight), 1))
    
        width: Math.min(parent.width,implicitWidth)
    
        height: width*proportionalHeight
    
    Malte E's avatar
    Malte E committed
        hoverEnabled: true
    
        property int metadataWidth
        property bool fitsMetadata: (parent.width - width) > metadataWidth+4
    
    
        Image {
    
            id: blurhash_
    
    
            anchors.fill: parent
            visible: img.status != Image.Ready
    
            source: blurhash ? ("image://blurhash/" + blurhash) : ("image://colorimage/:/icons/icons/ui/image-failed.svg?" + Nheko.colors.buttonText)
    
            asynchronous: true
            fillMode: Image.PreserveAspectFit
    
            sourceSize.width: parent.width * Screen.devicePixelRatio
            sourceSize.height: parent.height * Screen.devicePixelRatio
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            visible: !mxcimage.loaded
    
            anchors.fill: parent
    
            source: url.replace("mxc://", "image://MxcImage/") + "?scale"
    
            asynchronous: true
            fillMode: Image.PreserveAspectFit
    
            smooth: true
            mipmap: true
    
            sourceSize.width: Math.min(Screen.desktopAvailableWidth, originalWidth < 1 ? Screen.desktopAvailableWidth : originalWidth) * Screen.devicePixelRatio
            sourceSize.height: Math.min(Screen.desktopAvailableHeight, (originalWidth < 1 ? Screen.desktopAvailableHeight : originalWidth*proportionalHeight)) * Screen.devicePixelRatio
    
    Nicolas Werner's avatar
    Nicolas Werner committed
        MxcAnimatedImage {
            id: mxcimage
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            visible: loaded
            anchors.fill: parent
            roomm: room
    
    Malte E's avatar
    Malte E committed
            play: !Settings.animateImagesOnHover || parent.hovered
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            eventId: parent.eventId
        }
    
    Nicolas Werner's avatar
    Nicolas Werner committed
        onClicked :Settings.openImageExternal ? room.openMedia(eventId) : TimelineManager.openImageOverlay(room, url, eventId, originalWidth, proportionalHeight);
    
    Nicolas Werner's avatar
    Nicolas Werner committed
        Item {
            id: overlay
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            anchors.fill: parent
    
    Malte E's avatar
    Malte E committed
            visible: parent.hovered
    
    Nicolas Werner's avatar
    Nicolas Werner committed
            Rectangle {
                id: container
    
                width: parent.width
                implicitHeight: imgcaption.implicitHeight
                anchors.bottom: overlay.bottom
                color: Nheko.colors.window
                opacity: 0.75
            }
    
            Text {
                id: imgcaption
    
    Nicolas Werner's avatar
    Nicolas Werner committed
                anchors.fill: container
                elide: Text.ElideMiddle
                horizontalAlignment: Text.AlignHCenter
                verticalAlignment: Text.AlignVCenter
                // See this MSC: https://github.com/matrix-org/matrix-doc/pull/2530
                text: filename ? filename : body
                color: Nheko.colors.text