Warning, /network/neochat/src/qml/LinkPreviewDelegate.qml is written in an unsupported language. File is not indexed.
0001 // SPDX-FileCopyrightText: 2022 Bharadwaj Raju <bharadwaj.raju777@protonmail.com> 0002 // SPDX-FileCopyrightText: 2023 James Graham <james.h.graham@protonmail.com> 0003 // SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-or-later OR LicenseRef-KDE-Accepted-GPL 0004 0005 import QtQuick 0006 import QtQuick.Controls as QQC2 0007 import QtQuick.Layouts 0008 0009 import org.kde.kirigami as Kirigami 0010 0011 import org.kde.neochat 0012 0013 Loader { 0014 id: root 0015 0016 /** 0017 * @brief The link preview properties. 0018 * 0019 * This is a list or object containing the following: 0020 * - url - The URL being previewed. 0021 * - loaded - Whether the URL preview has been loaded. 0022 * - title - the title of the URL preview. 0023 * - description - the description of the URL preview. 0024 * - imageSource - a source URL for the preview image. 0025 */ 0026 required property var linkPreviewer 0027 0028 /** 0029 * @brief Standard height for the link preview. 0030 * 0031 * When the content of the link preview is larger than this it will be 0032 * elided/hidden until maximized. 0033 */ 0034 property var defaultHeight: Kirigami.Units.gridUnit * 3 + Kirigami.Units.smallSpacing * 2 0035 0036 /** 0037 * @brief Whether the loading indicator should animate if visible. 0038 */ 0039 property bool indicatorEnabled: false 0040 0041 visible: active 0042 sourceComponent: linkPreviewer && linkPreviewer.loaded ? linkPreviewComponent : loadingComponent 0043 0044 Component { 0045 id: linkPreviewComponent 0046 QQC2.Control { 0047 id: componentRoot 0048 property bool truncated: linkPreviewDescription.truncated || !linkPreviewDescription.visible 0049 0050 leftPadding: 0 0051 rightPadding: 0 0052 topPadding: 0 0053 bottomPadding: 0 0054 0055 contentItem: RowLayout { 0056 spacing: Kirigami.Units.smallSpacing 0057 0058 Rectangle { 0059 Layout.fillHeight: true 0060 width: Kirigami.Units.smallSpacing 0061 color: Kirigami.Theme.highlightColor 0062 } 0063 Image { 0064 visible: root.linkPreviewer.imageSource 0065 Layout.maximumHeight: root.defaultHeight 0066 Layout.maximumWidth: root.defaultHeight 0067 source: root.linkPreviewer.imageSource 0068 fillMode: Image.PreserveAspectFit 0069 } 0070 ColumnLayout { 0071 id: column 0072 spacing: Kirigami.Units.smallSpacing 0073 Kirigami.Heading { 0074 id: linkPreviewTitle 0075 Layout.fillWidth: true 0076 level: 3 0077 wrapMode: Text.Wrap 0078 textFormat: Text.RichText 0079 text: "<style> 0080 a { 0081 text-decoration: none; 0082 } 0083 </style> 0084 <a href=\"" + root.linkPreviewer.url + "\">" + (maximizeButton.checked ? root.linkPreviewer.title : titleTextMetrics.elidedText).replace("–", "—") + "</a>" 0085 onLinkActivated: RoomManager.resolveResource(link, "join") 0086 0087 TextMetrics { 0088 id: titleTextMetrics 0089 text: root.linkPreviewer.title 0090 font: linkPreviewTitle.font 0091 elide: Text.ElideRight 0092 elideWidth: (linkPreviewTitle.width - Kirigami.Units.largeSpacing * 2.5) * 3 0093 } 0094 } 0095 QQC2.Label { 0096 id: linkPreviewDescription 0097 Layout.fillWidth: true 0098 Layout.maximumHeight: maximizeButton.checked ? -1 : root.defaultHeight - linkPreviewTitle.height - column.spacing 0099 visible: linkPreviewTitle.height + column.spacing <= root.defaultHeight || maximizeButton.checked 0100 text: linkPreviewer.description 0101 wrapMode: Text.Wrap 0102 elide: Text.ElideRight 0103 } 0104 } 0105 } 0106 0107 QQC2.Button { 0108 id: maximizeButton 0109 anchors.right: parent.right 0110 anchors.bottom: parent.bottom 0111 visible: componentRoot.hovered && (componentRoot.truncated || checked) 0112 checkable: true 0113 text: checked ? i18n("Shrink preview") : i18n("Expand preview") 0114 icon.name: checked ? "go-up" : "go-down" 0115 display: QQC2.AbstractButton.IconOnly 0116 0117 QQC2.ToolTip { 0118 text: maximizeButton.text 0119 visible: hovered 0120 delay: Kirigami.Units.toolTipDelay 0121 } 0122 } 0123 } 0124 } 0125 0126 Component { 0127 id: loadingComponent 0128 RowLayout { 0129 id: componentRoot 0130 property bool truncated: false 0131 0132 Rectangle { 0133 Layout.fillHeight: true 0134 width: Kirigami.Units.smallSpacing 0135 color: Kirigami.Theme.highlightColor 0136 } 0137 QQC2.BusyIndicator { 0138 running: root.indicatorEnabled 0139 } 0140 Kirigami.Heading { 0141 Layout.fillWidth: true 0142 Layout.minimumHeight: root.defaultHeight 0143 level: 2 0144 text: i18n("Loading URL preview") 0145 } 0146 } 0147 } 0148 }