Warning, /plasma/plasma-desktop/desktoppackage/contents/applet/AppletError.qml is written in an unsupported language. File is not indexed.
0001 /* 0002 SPDX-FileCopyrightText: 2013 Marco Martin <mart@kde.org> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 import QtQuick 2.15 0008 import QtQuick.Layouts 1.15 0009 import QtQuick.Window 2.15 0010 import QtQuick.Controls 2.15 as QQC2 0011 import org.kde.plasma.core as PlasmaCore 0012 import org.kde.plasma.components 3.0 as PC3 0013 import org.kde.kirigami 2.20 as Kirigami 0014 import org.kde.plasma.plasmoid 2.0 0015 0016 PlasmoidItem { 0017 id: root 0018 0019 enum LayoutType { 0020 HorizontalPanel, 0021 VerticalPanel, 0022 Desktop, 0023 DesktopCompact 0024 } 0025 0026 property var errorInformation 0027 0028 readonly property real minimumPreferredWidth: Kirigami.Units.gridUnit * 12 0029 readonly property real minimumPreferredHeight: Kirigami.Units.gridUnit * 12 0030 0031 // To properly show the error message in panel 0032 readonly property int layoutForm: { 0033 if (fullRepresentationItem.width >= root.minimumPreferredWidth) { 0034 if (fullRepresentationItem.height >= root.minimumPreferredHeight) { 0035 return AppletError.Desktop; 0036 } else if (fullRepresentationItem.height >= Kirigami.Units.iconSizes.huge + root.fullRepresentationItem.buttonLayout.implicitHeight) { 0037 return AppletError.DesktopCompact; 0038 } 0039 } 0040 0041 return Plasmoid.formFactor === PlasmaCore.Types.Vertical ? AppletError.VerticalPanel : AppletError.HorizontalPanel; 0042 } 0043 preloadFullRepresentation: true 0044 fullRepresentation: GridLayout { 0045 id: fullRep 0046 property alias buttonLayout: buttonLayout 0047 Layout.minimumWidth: { 0048 switch (root.layoutForm) { 0049 case AppletError.Desktop: 0050 case AppletError.DesktopCompact: 0051 // [Icon] [Text] 0052 // [Button] 0053 // [Information] 0054 return Math.max(root.minimumPreferredWidth, buttonLayout.implicitWidth); 0055 case AppletError.VerticalPanel: 0056 // [Icon] 0057 // [Copy] 0058 // [Open] 0059 return Math.max(headerIcon.implicitWidth, buttonLayout.implicitWidth); 0060 case AppletError.HorizontalPanel: 0061 // [Icon] [Copy] [Open] 0062 return headingLayout.implicitWidth + rowSpacing + buttonLayout.implicitWidth; 0063 } 0064 } 0065 Layout.minimumHeight: { 0066 switch (root.layoutForm) { 0067 case AppletError.Desktop: 0068 return headingLayout.implicitHeight + fullRep.columnSpacing + buttonLayout.implicitHeight + fullRep.columnSpacing + fullContentView.implicitHeight; 0069 case AppletError.DesktopCompact: 0070 return Math.max(headingLayout.implicitHeight, buttonLayout.implicitHeight); 0071 case AppletError.VerticalPanel: 0072 return headingLayout.implicitHeight + fullRep.columnSpacing + buttonLayout.implicitHeight; 0073 case AppletError.HorizontalPanel: 0074 return Math.max(headingLayout.implicitHeight, buttonLayout.implicitHeight); 0075 } 0076 } 0077 // Same as systray popups 0078 Layout.preferredWidth: Kirigami.Units.gridUnit * 24 0079 Layout.preferredHeight: Kirigami.Units.gridUnit * 24 0080 Layout.maximumWidth: Kirigami.Units.gridUnit * 34 0081 Layout.maximumHeight: Kirigami.Units.gridUnit * 34 0082 0083 rowSpacing: textArea.topPadding 0084 columnSpacing: rowSpacing 0085 flow: { 0086 switch (root.layoutForm) { 0087 case AppletError.HorizontalPanel: 0088 return GridLayout.LeftToRight; 0089 default: 0090 return GridLayout.TopToBottom; 0091 } 0092 } 0093 0094 RowLayout { 0095 id: headingLayout 0096 0097 Layout.margins: root.layoutForm !== AppletError.Desktop ? 0 : Kirigami.Units.gridUnit 0098 Layout.maximumWidth: fullRep.width 0099 spacing: 0 0100 Layout.fillWidth: true 0101 0102 Kirigami.Icon { 0103 id: headerIcon 0104 implicitWidth: Math.min(Kirigami.Units.iconSizes.huge, fullRep.width, fullRep.height) 0105 implicitHeight: implicitWidth 0106 0107 activeFocusOnTab: true 0108 source: "dialog-error" 0109 0110 Accessible.description: heading.text 0111 0112 PlasmaCore.ToolTipArea { 0113 anchors.fill: parent 0114 enabled: !heading.visible || heading.truncated 0115 mainText: heading.text 0116 textFormat: Text.PlainText 0117 } 0118 } 0119 0120 Kirigami.Heading { 0121 id: heading 0122 visible: root.layoutForm !== AppletError.VerticalPanel 0123 // Descent is equal to the amount of space above and below capital letters. 0124 // Add descent to the sides to make the spacing around Latin text look more even. 0125 leftPadding: headingFontMetrics.descent 0126 rightPadding: headingFontMetrics.descent 0127 text: root.errorInformation && root.errorInformation.appletName ? 0128 i18nd("plasma_shell_org.kde.plasma.desktop", "Sorry! There was an error loading %1.", root.errorInformation.appletName) 0129 // This is just to suppress warnings. Users should never see this. 0130 : "No error information." 0131 textFormat: Text.PlainText 0132 level: 2 0133 wrapMode: Text.Wrap 0134 horizontalAlignment: Text.AlignHCenter 0135 verticalAlignment: Text.AlignVCenter 0136 elide: Text.ElideRight 0137 Layout.fillWidth: true 0138 Layout.maximumHeight: headerIcon.implicitHeight 0139 0140 FontMetrics { 0141 id: headingFontMetrics 0142 font: heading.font 0143 } 0144 } 0145 } 0146 0147 GridLayout { 0148 id: buttonLayout 0149 0150 Layout.alignment: Qt.AlignCenter 0151 0152 rowSpacing: fullRep.rowSpacing 0153 columnSpacing: parent.columnSpacing 0154 flow: { 0155 switch (root.layoutForm) { 0156 case AppletError.HorizontalPanel: 0157 case AppletError.VerticalPanel: 0158 return fullRep.flow; 0159 default: 0160 return GridLayout.LeftToRight; 0161 } 0162 } 0163 0164 PC3.Button { 0165 id: copyButton 0166 display: root.layoutForm === AppletError.HorizontalPanel || root.layoutForm === AppletError.VerticalPanel ? PC3.AbstractButton.IconOnly : PC3.AbstractButton.TextBesideIcon 0167 text: i18nd("plasma_shell_org.kde.plasma.desktop", "Copy to Clipboard") 0168 icon.name: "edit-copy" 0169 onClicked: { 0170 textArea.selectAll() 0171 textArea.copy() 0172 textArea.deselect() 0173 } 0174 0175 PlasmaCore.ToolTipArea { 0176 anchors.fill: parent 0177 enabled: parent.display === PC3.AbstractButton.IconOnly 0178 mainText: parent.text 0179 textFormat: Text.PlainText 0180 } 0181 } 0182 0183 Loader { 0184 id: compactContentLoader 0185 active: root.layoutForm !== AppletError.Desktop 0186 visible: active 0187 sourceComponent: PC3.Button { 0188 display: copyButton.display 0189 icon.name: "window-new" 0190 text: i18nd("plasma_shell_org.kde.plasma.desktop", "View Error Details…") 0191 checked: dialog.visible 0192 onClicked: dialog.visible = !dialog.visible 0193 0194 PlasmaCore.ToolTipArea { 0195 anchors.fill: parent 0196 enabled: parent.display === PC3.AbstractButton.IconOnly 0197 mainText: parent.text 0198 textFormat: Text.PlainText 0199 } 0200 0201 QQC2.ApplicationWindow { 0202 id: dialog 0203 flags: Qt.Dialog | Qt.WindowStaysOnTopHint | Qt.WindowMinMaxButtonsHint | Qt.WindowCloseButtonHint 0204 minimumWidth: dialogFontMetrics.height * 12 0205 + dialogTextArea.leftPadding + dialogTextArea.rightPadding 0206 minimumHeight: dialogFontMetrics.height * 12 0207 + dialogTextArea.topPadding + dialogTextArea.bottomPadding 0208 width: Kirigami.Units.gridUnit * 24 0209 height: Kirigami.Units.gridUnit * 24 0210 color: palette.base 0211 QQC2.ScrollView { 0212 id: dialogScrollView 0213 anchors.fill: parent 0214 QQC2.TextArea { 0215 id: dialogTextArea 0216 // HACK: silence binding loop warnings. 0217 // contentWidth seems to be causing the binding loop, 0218 // but contentWidth is read-only and we have no control 0219 // over how it is calculated. 0220 implicitWidth: 0 0221 wrapMode: TextEdit.Wrap 0222 text: textArea.text 0223 font.family: "monospace" 0224 readOnly: true 0225 selectByMouse: true 0226 background: null 0227 FontMetrics { 0228 id: dialogFontMetrics 0229 font: dialogTextArea.font 0230 } 0231 } 0232 background: null 0233 } 0234 } 0235 } 0236 } 0237 } 0238 0239 PC3.ScrollView { 0240 id: fullContentView 0241 // Not handled by a Loader because we need 0242 // TextEdit::copy() to copy to clipboard. 0243 visible: !compactContentLoader.active 0244 Layout.fillHeight: true 0245 Layout.fillWidth: true 0246 PC3.TextArea { 0247 id: textArea 0248 // HACK: silence binding loop warnings. 0249 // contentWidth seems to be causing the binding loop, 0250 // but contentWidth is read-only and we have no control 0251 // over how it is calculated. 0252 implicitWidth: 0 0253 wrapMode: TextEdit.Wrap 0254 text: root.errorInformation && root.errorInformation.errors ? 0255 root.errorInformation.errors.join("\n\n") 0256 // This is just to suppress warnings. Users should never see this. 0257 : "No error information." 0258 font.family: "monospace" 0259 readOnly: true 0260 selectByMouse: true 0261 } 0262 } 0263 } 0264 }