/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Quick Dialogs module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 3 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL3 included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 3 requirements ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 2.0 or (at your option) the GNU General ** Public license version 3 or any later version approved by the KDE Free ** Qt Foundation. The licenses are as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-2.0.html and ** https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.2 import QtQuick.Controls 1.2 import QtQuick.Controls.Private 1.0 import QtQuick.Dialogs 1.1 import QtQuick.Window 2.1 import "qml" AbstractMessageDialog { id: root Rectangle { id: content property real spacing: 6 property real outerSpacing: 12 property real buttonsRowImplicitWidth: Screen.pixelDensity * 50 implicitHeight: contentColumn.implicitHeight + outerSpacing * 2 onImplicitHeightChanged: root.height = implicitHeight implicitWidth: Math.min(root.__maximumDimension, Math.max( mainText.implicitWidth, buttonsRowImplicitWidth) + outerSpacing * 2); onImplicitWidthChanged: root.width = implicitWidth color: palette.window focus: root.visible Keys.onPressed: { event.accepted = true if (event.modifiers === Qt.ControlModifier) switch (event.key) { case Qt.Key_A: detailedText.selectAll() break case Qt.Key_C: detailedText.copy() break case Qt.Key_Period: if (Qt.platform.os === "osx") reject() break } else switch (event.key) { case Qt.Key_Escape: case Qt.Key_Back: reject() break case Qt.Key_Enter: case Qt.Key_Return: accept() break } } Column { id: contentColumn spacing: content.spacing x: content.outerSpacing y: content.outerSpacing width: content.width - content.outerSpacing * 2 SystemPalette { id: palette } Item { width: parent.width height: Math.max(icon.height, mainText.height + informativeText.height + content.spacing) Image { id: icon source: root.standardIconSource } Text { id: mainText anchors { left: icon.right leftMargin: content.spacing right: parent.right } text: root.text font.weight: Font.Bold wrapMode: Text.WordWrap renderType: Settings.isMobile ? Text.QtRendering : Text.NativeRendering } Text { id: informativeText anchors { left: icon.right right: parent.right top: mainText.bottom leftMargin: content.spacing topMargin: content.spacing } text: root.informativeText wrapMode: Text.WordWrap renderType: Settings.isMobile ? Text.QtRendering : Text.NativeRendering } } Flow { id: buttons spacing: content.spacing layoutDirection: Qt.RightToLeft width: parent.width + content.outerSpacing x: -content.outerSpacing Button { id: okButton text: qsTr("OK") onClicked: root.click(StandardButton.Ok) visible: root.standardButtons & StandardButton.Ok } Button { id: openButton text: qsTr("Open") onClicked: root.click(StandardButton.Open) visible: root.standardButtons & StandardButton.Open } Button { id: saveButton text: qsTr("Save") onClicked: root.click(StandardButton.Save) visible: root.standardButtons & StandardButton.Save } Button { id: saveAllButton text: qsTr("Save All") onClicked: root.click(StandardButton.SaveAll) visible: root.standardButtons & StandardButton.SaveAll } Button { id: retryButton text: qsTr("Retry") onClicked: root.click(StandardButton.Retry) visible: root.standardButtons & StandardButton.Retry } Button { id: ignoreButton text: qsTr("Ignore") onClicked: root.click(StandardButton.Ignore) visible: root.standardButtons & StandardButton.Ignore } Button { id: applyButton text: qsTr("Apply") onClicked: root.click(StandardButton.Apply) visible: root.standardButtons & StandardButton.Apply } Button { id: yesButton text: qsTr("Yes") onClicked: root.click(StandardButton.Yes) visible: root.standardButtons & StandardButton.Yes } Button { id: yesAllButton text: qsTr("Yes to All") onClicked: root.click(StandardButton.YesToAll) visible: root.standardButtons & StandardButton.YesToAll } Button { id: noButton text: qsTr("No") onClicked: root.click(StandardButton.No) visible: root.standardButtons & StandardButton.No } Button { id: noAllButton text: qsTr("No to All") onClicked: root.click(StandardButton.NoToAll) visible: root.standardButtons & StandardButton.NoToAll } Button { id: discardButton text: qsTr("Discard") onClicked: root.click(StandardButton.Discard) visible: root.standardButtons & StandardButton.Discard } Button { id: resetButton text: qsTr("Reset") onClicked: root.click(StandardButton.Reset) visible: root.standardButtons & StandardButton.Reset } Button { id: restoreDefaultsButton text: qsTr("Restore Defaults") onClicked: root.click(StandardButton.RestoreDefaults) visible: root.standardButtons & StandardButton.RestoreDefaults } Button { id: cancelButton text: qsTr("Cancel") onClicked: root.click(StandardButton.Cancel) visible: root.standardButtons & StandardButton.Cancel } Button { id: abortButton text: qsTr("Abort") onClicked: root.click(StandardButton.Abort) visible: root.standardButtons & StandardButton.Abort } Button { id: closeButton text: qsTr("Close") onClicked: root.click(StandardButton.Close) visible: root.standardButtons & StandardButton.Close } Button { id: moreButton text: qsTr("Show Details...") onClicked: content.state = (content.state === "" ? "expanded" : "") visible: root.detailedText.length > 0 } Button { id: helpButton text: qsTr("Help") onClicked: root.click(StandardButton.Help) visible: root.standardButtons & StandardButton.Help } onVisibleChildrenChanged: calculateImplicitWidth() } } Item { id: details width: parent.width implicitHeight: detailedText.implicitHeight + content.spacing height: 0 clip: true anchors { left: parent.left right: parent.right top: contentColumn.bottom topMargin: content.spacing leftMargin: content.outerSpacing rightMargin: content.outerSpacing } Flickable { id: flickable contentHeight: detailedText.height anchors.fill: parent anchors.topMargin: content.spacing anchors.bottomMargin: content.outerSpacing TextEdit { id: detailedText text: root.detailedText width: details.width wrapMode: Text.WordWrap readOnly: true selectByMouse: true renderType: Settings.isMobile ? Text.QtRendering : Text.NativeRendering } } } states: [ State { name: "expanded" PropertyChanges { target: details height: content.height - contentColumn.height - content.spacing - content.outerSpacing } PropertyChanges { target: content implicitHeight: contentColumn.implicitHeight + content.spacing * 2 + detailedText.implicitHeight + content.outerSpacing * 2 } PropertyChanges { target: moreButton text: qsTr("Hide Details") } } ] } function calculateImplicitWidth() { if (buttons.visibleChildren.length < 2) return; var calcWidth = 0; for (var i = 0; i < buttons.visibleChildren.length; ++i) calcWidth += Math.max(100, buttons.visibleChildren[i].implicitWidth) + content.spacing content.buttonsRowImplicitWidth = content.outerSpacing + calcWidth } Component.onCompleted: calculateImplicitWidth() }