Warning, /frameworks/kirigami/src/controls/templates/InlineMessage.qml is written in an unsupported language. File is not indexed.
0001 /* 0002 * SPDX-FileCopyrightText: 2018 Eike Hein <hein@kde.org> 0003 * SPDX-FileCopyrightText: 2022 ivan tkachenko <me@ratijas.tk> 0004 * 0005 * SPDX-License-Identifier: LGPL-2.0-or-later 0006 */ 0007 0008 import QtQuick 0009 import QtQuick.Layouts 0010 import QtQuick.Controls as QQC2 0011 import QtQuick.Templates as T 0012 import org.kde.kirigami as Kirigami 0013 import org.kde.kirigami.templates.private as TP 0014 0015 /** 0016 * An inline message item with support for informational, positive, 0017 * warning and error types, and with support for associated actions. 0018 * 0019 * InlineMessage can be used to give information to the user or 0020 * interact with the user, without requiring the use of a dialog. 0021 * 0022 * The InlineMessage item is hidden by default. It also manages its 0023 * height (and implicitHeight) during an animated reveal when shown. 0024 * You should avoid setting height on an InlineMessage unless it is 0025 * already visible. 0026 * 0027 * Optionally an icon can be set, defaulting to an icon appropriate 0028 * to the message type otherwise. 0029 * 0030 * Optionally a close button can be shown. 0031 * 0032 * Actions are added from left to right. If more actions are set than 0033 * can fit, an overflow menu is provided. 0034 * 0035 * Example: 0036 * @code 0037 * InlineMessage { 0038 * type: Kirigami.MessageType.Error 0039 * 0040 * text: "My error message" 0041 * 0042 * actions: [ 0043 * Kirigami.Action { 0044 * icon.name: "edit" 0045 * text: "Action text" 0046 * onTriggered: { 0047 * // do stuff 0048 * } 0049 * }, 0050 * Kirigami.Action { 0051 * icon.name: "edit" 0052 * text: "Action text" 0053 * onTriggered: { 0054 * // do stuff 0055 * } 0056 * } 0057 * ] 0058 * } 0059 * @endcode 0060 * 0061 * @since 5.45 0062 * @inherit QtQuick.Templates.Control 0063 */ 0064 T.Control { 0065 id: root 0066 0067 visible: false 0068 0069 /** 0070 * This signal is emitted when a link is hovered in the message text. 0071 * @param The hovered link. 0072 */ 0073 signal linkHovered(string link) 0074 0075 /** 0076 * This signal is emitted when a link is clicked or tapped in the message text. 0077 * @param The clicked or tapped link. 0078 */ 0079 signal linkActivated(string link) 0080 0081 /** 0082 * This property holds the link embedded in the message text that the user is hovering over. 0083 */ 0084 readonly property alias hoveredLink: label.hoveredLink 0085 0086 /** 0087 * This property holds the message type. One of Information, Positive, Warning or Error. 0088 * 0089 * The default is Kirigami.MessageType.Information. 0090 */ 0091 property int type: Kirigami.MessageType.Information 0092 0093 /** 0094 * This grouped property holds the description of an optional icon. 0095 * 0096 * * source: The source of the icon, a freedesktop-compatible icon name is recommended. 0097 * * color: An optional tint color for the icon. 0098 * 0099 * If no custom icon is set, an icon appropriate to the message type 0100 * is shown. 0101 */ 0102 property TP.IconPropertiesGroup icon: TP.IconPropertiesGroup {} 0103 0104 /** 0105 * This property holds the message text. 0106 */ 0107 property string text 0108 0109 /** 0110 * This property holds whether the close button is displayed. 0111 * 0112 * The default is false. 0113 */ 0114 property bool showCloseButton: false 0115 0116 /** 0117 * This property holds the list of actions to show. Actions are added from left to 0118 * right. If more actions are set than can fit, an overflow menu is 0119 * provided. 0120 */ 0121 property list<T.Action> actions 0122 0123 /** 0124 * This property holds whether the current message item is animating. 0125 */ 0126 readonly property bool animating: _animating 0127 0128 property bool _animating: false 0129 0130 implicitHeight: visible ? (contentLayout.implicitHeight + topPadding + bottomPadding) : 0 0131 0132 padding: Kirigami.Units.smallSpacing 0133 0134 Behavior on implicitHeight { 0135 enabled: !root.visible 0136 0137 SequentialAnimation { 0138 PropertyAction { targets: root; property: "_animating"; value: true } 0139 NumberAnimation { duration: Kirigami.Units.longDuration } 0140 } 0141 } 0142 0143 onVisibleChanged: { 0144 if (!visible) { 0145 contentLayout.opacity = 0; 0146 } 0147 } 0148 0149 opacity: visible ? 1 : 0 0150 0151 Behavior on opacity { 0152 enabled: !root.visible 0153 0154 NumberAnimation { duration: Kirigami.Units.shortDuration } 0155 } 0156 0157 onOpacityChanged: { 0158 if (opacity === 0) { 0159 contentLayout.opacity = 0; 0160 } else if (opacity === 1) { 0161 contentLayout.opacity = 1; 0162 } 0163 } 0164 0165 onImplicitHeightChanged: { 0166 height = implicitHeight; 0167 } 0168 0169 contentItem: Item { 0170 id: contentLayout 0171 0172 // Used to defer opacity animation until we know if InlineMessage was 0173 // initialized visible. 0174 property bool complete: false 0175 0176 Behavior on opacity { 0177 enabled: root.visible && contentLayout.complete 0178 0179 SequentialAnimation { 0180 NumberAnimation { duration: Kirigami.Units.shortDuration * 2 } 0181 PropertyAction { targets: root; property: "_animating"; value: false } 0182 } 0183 } 0184 0185 implicitHeight: { 0186 if (atBottom) { 0187 return label.implicitHeight + actionsLayout.implicitHeight + actionsLayout.anchors.topMargin 0188 } else { 0189 return Math.max(icon.implicitHeight, label.implicitHeight, closeButton.implicitHeight, actionsLayout.implicitHeight) 0190 } 0191 } 0192 0193 readonly property real remainingWidth: width - ( 0194 icon.width 0195 + label.anchors.leftMargin + label.implicitWidth + label.anchors.rightMargin 0196 + (root.showCloseButton ? closeButton.width : 0) 0197 ) 0198 readonly property bool multiline: remainingWidth <= 0 || atBottom 0199 0200 readonly property bool atBottom: (root.actions.length > 0) && (label.lineCount > 1 || actionsLayout.implicitWidth > remainingWidth) 0201 0202 Kirigami.Icon { 0203 id: icon 0204 0205 width: Kirigami.Units.iconSizes.smallMedium 0206 height: Kirigami.Units.iconSizes.smallMedium 0207 0208 anchors.left: parent.left 0209 0210 source: { 0211 if (root.icon.name) { 0212 return root.icon.name; 0213 } else if (root.icon.source) { 0214 return root.icon.source; 0215 } 0216 0217 switch (root.type) { 0218 case Kirigami.MessageType.Positive: 0219 return "emblem-positive"; 0220 case Kirigami.MessageType.Warning: 0221 return "emblem-warning"; 0222 case Kirigami.MessageType.Error: 0223 return "emblem-error"; 0224 default: 0225 return "emblem-information"; 0226 } 0227 } 0228 0229 color: root.icon.color 0230 0231 states: [ 0232 State { 0233 when: contentLayout.atBottom 0234 AnchorChanges { 0235 target: icon 0236 anchors.top: contentLayout.top 0237 } 0238 }, 0239 // States are evaluated in the order they are declared. 0240 // This is a fallback state. 0241 State { 0242 when: true 0243 AnchorChanges { 0244 target: icon 0245 anchors.verticalCenter: contentLayout.verticalCenter 0246 } 0247 } 0248 ] 0249 } 0250 0251 Kirigami.SelectableLabel { 0252 id: label 0253 0254 anchors { 0255 left: icon.right 0256 leftMargin: Kirigami.Units.smallSpacing 0257 right: root.showCloseButton ? closeButton.left : parent.right 0258 rightMargin: root.showCloseButton ? Kirigami.Units.smallSpacing : 0 0259 top: parent.top 0260 } 0261 0262 color: Kirigami.Theme.textColor 0263 wrapMode: Text.WordWrap 0264 0265 text: root.text 0266 0267 verticalAlignment: Text.AlignVCenter 0268 0269 // QTBUG-117667 TextEdit (super-type of SelectableLabel) needs 0270 // very specific state-management trick so it doesn't get stuck. 0271 // State names serve purely as a description. 0272 states: [ 0273 State { 0274 name: "multi-line" 0275 when: contentLayout.multiline 0276 AnchorChanges { 0277 target: label 0278 anchors.bottom: undefined 0279 } 0280 PropertyChanges { 0281 target: label 0282 height: label.implicitHeight 0283 } 0284 }, 0285 // States are evaluated in the order they are declared. 0286 // This is a fallback state. 0287 State { 0288 name: "single-line" 0289 when: true 0290 AnchorChanges { 0291 target: label 0292 anchors.bottom: label.parent.bottom 0293 } 0294 } 0295 ] 0296 0297 onLinkHovered: link => root.linkHovered(link) 0298 onLinkActivated: link => root.linkActivated(link) 0299 } 0300 0301 Kirigami.ActionToolBar { 0302 id: actionsLayout 0303 0304 flat: false 0305 actions: root.actions 0306 visible: root.actions.length > 0 0307 alignment: Qt.AlignRight 0308 0309 anchors { 0310 left: parent.left 0311 top: contentLayout.atBottom ? label.bottom : parent.top 0312 topMargin: contentLayout.atBottom ? Kirigami.Units.largeSpacing : 0 0313 right: (!contentLayout.atBottom && root.showCloseButton) ? closeButton.left : parent.right 0314 rightMargin: !contentLayout.atBottom && root.showCloseButton ? Kirigami.Units.smallSpacing : 0 0315 } 0316 } 0317 0318 QQC2.ToolButton { 0319 id: closeButton 0320 0321 visible: root.showCloseButton 0322 0323 anchors { 0324 right: parent.right 0325 top: contentLayout.atBottom ? parent.top : undefined 0326 verticalCenter: contentLayout.atBottom ? undefined : parent.verticalCenter 0327 } 0328 0329 height: contentLayout.atBottom ? implicitHeight : implicitHeight 0330 0331 icon.name: "dialog-close" 0332 0333 onClicked: root.visible = false 0334 } 0335 0336 Component.onCompleted: complete = true 0337 } 0338 }