import QtQuick 2.13 import QtGraphicalEffects 1.0 import shared 1.0 import shared.panels 1.0 import shared.controls 1.0 import utils 1.0 import StatusQ.Core.Utils 0.1 as StatusQUtils Item { id: root property string message: "" property var store property bool longChatText: true property bool veryLongChatText: globalUtils.plainText(message).length > Constants.limitLongChatTextCompactMode property bool readMore: false property alias textField: chatText signal linkActivated(url link) property alias hoveredLink: chatText.hoveredLink property bool linkHovered: chatText.hoveredLink !== "" z: 51 implicitHeight: { if (!visible) return 0; if (!chatText.visible && showMoreLoader.active) return childrenRect.height - 10; if (root.veryLongChatText && !root.readMore) return Math.min(chatText.contentHeight, 200); if (chatText.getText(0, chatText.text.length) !== "") return chatText.contentHeight; return 0; } // This function is to avoid the binding loop warning function setWidths() { if (longChatText) { root.width = 0; chatText.width = Qt.binding(function () {return root.width}) } else { chatText.width = Qt.binding(function () {return chatText.implicitWidth}) root.width = Qt.binding(function () {return chatText.width}) } } Component.onCompleted: { root.setWidths() } StyledTextEdit { id: chatText objectName: "chatText" textFormat: Text.RichText wrapMode: Text.Wrap font.pixelSize: Style.current.primaryTextFontSize readOnly: true selectByMouse: true color: Style.current.textColor clip: height < implicitHeight onLinkActivated: { root.linkActivated(link) // Not Refactored Yet // if(link.startsWith("#")) { // const channelName = link.substring(1); // const foundChannelObj = root.store.chatsModelInst.getChannel(channelName); // if (!foundChannelObj) // { // root.store.chatsModelInst.channelView.joinPublicChat(channelName) // if(root.store.chatsModelInst.communities.activeCommunity.active) // { // root.store.chatsModelInst.channelView.joinPublicChat(channelName) // Global.changeAppSectionBySectionType(Constants.appSection.chat) // } // return // } // let obj = JSON.parse(foundChannelObj) // if(obj.chatType === -1 || obj.chatType === Constants.chatTypePublic) // { // if(root.store.chatsModelInst.communities.activeCommunity.active) { // root.store.chatsModelInst.channelView.joinPublicChat(channelName) // Global.changeAppSectionBySectionType(Constants.appSection.chat) // } // root.store.chatsModelInst.channelView.setActiveChannel(channelName); // } // else if(obj.communityId === root.store.chatsModelInst.communities.activeCommunity.id && // obj.chatType === Constants.chatTypeCommunity && // root.store.chatsModelInst.channelView.activeChannel.id !== obj.id // ) // { // root.store.chatsModelInst.channelView.setActiveChannel(channelName); // } // return // } if (link.startsWith('//')) { let pk = link.replace("//", ""); Global.openProfilePopup(pk) return; } // Not Refactored Yet // const data = Utils.getLinkDataForStatusLinks(link) // if (data && data.callback) { // return data.callback() // } Global.openLink(link) } onLinkHovered: { cursorShape: Qt.PointingHandCursor } text: { if (contentType === Constants.messageContentType.stickerType) return ""; let msg = StatusQUtils.Utils.linkifyAndXSS(message); if (isEmoji) return StatusQUtils.Emoji.parse(msg, StatusQUtils.Emoji.size.middle, StatusQUtils.Emoji.format.png); if (isEdited) { let index = msg.endsWith("code>") ? msg.length : msg.length - 4 return StatusQUtils.Utils.getMessageWithStyle(StatusQUtils.Emoji.parse(msg.slice(0, index) + Constants.editLabel + msg.slice(index)), isCurrentUser, hoveredLink) } return StatusQUtils.Utils.getMessageWithStyle(StatusQUtils.Emoji.parse(msg), isCurrentUser, hoveredLink) } } Loader { id: mask anchors.fill: chatText active: showMoreLoader.active visible: false sourceComponent: LinearGradient { start: Qt.point(0, 0) end: Qt.point(0, chatText.height) gradient: Gradient { GradientStop { position: 0.0; color: "white" } GradientStop { position: 0.85; color: "white" } GradientStop { position: 1; color: "transparent" } } } } Loader { id: opMask active: showMoreLoader.active && !root.readMore anchors.fill: chatText sourceComponent: OpacityMask { source: chatText maskSource: mask } } Loader { id: showMoreLoader active: root.veryLongChatText anchors.top: chatText.bottom anchors.topMargin: - Style.current.padding anchors.horizontalCenter: parent.horizontalCenter sourceComponent: Component { SVGImage { id: emojiImage width: 256 height: 44 fillMode: Image.PreserveAspectFit source: Style.svg("read-more") z: 100 rotation: root.readMore ? 180 : 0 MouseArea { anchors.fill: parent cursorShape: Qt.PointingHandCursor onClicked: { root.readMore = !root.readMore } } } } } }