13 changed files with 354 additions and 11 deletions
			
			
		@ -0,0 +1,32 @@ | 
				
			|||
import QtQuick 2.10 | 
				
			|||
import QtQuick.Controls 2.3 | 
				
			|||
import de.skycoder42.QtMvvm.Core 1.0 | 
				
			|||
 | 
				
			|||
QtObject { | 
				
			|||
	id: _dialogPresenter | 
				
			|||
 | 
				
			|||
	property Item rootItem: null | 
				
			|||
 | 
				
			|||
	function showDialog(config, result) { | 
				
			|||
		if(config.type == "msgbox") { | 
				
			|||
			createMsgBox(config, result) | 
				
			|||
			return true; | 
				
			|||
		} else | 
				
			|||
			return false; | 
				
			|||
	} | 
				
			|||
 | 
				
			|||
	property Component _msgBoxComponent: Component { | 
				
			|||
		MsgBox { | 
				
			|||
			id: __msgBox | 
				
			|||
			Component.onCompleted: __msgBox.open() | 
				
			|||
		} | 
				
			|||
	} | 
				
			|||
 | 
				
			|||
	function createMsgBox(config, result) { | 
				
			|||
		var props = config.viewProperties; | 
				
			|||
		props["msgConfig"] = config; | 
				
			|||
		props["msgResult"] = result; | 
				
			|||
		var incubator = _msgBoxComponent.incubateObject(rootItem, props); | 
				
			|||
		return incubator.status !== Component.Error; | 
				
			|||
	} | 
				
			|||
} | 
				
			|||
@ -0,0 +1,128 @@ | 
				
			|||
import QtQuick 2.10 | 
				
			|||
import QtQuick.Controls 2.3 | 
				
			|||
import QtQuick.Window 2.2 | 
				
			|||
import QtQuick.Layouts 1.3 | 
				
			|||
import de.skycoder42.QtMvvm.Core 1.0 | 
				
			|||
 | 
				
			|||
Dialog { | 
				
			|||
	id: _msgBox | 
				
			|||
 | 
				
			|||
	property var msgConfig | 
				
			|||
	property MessageResult msgResult | 
				
			|||
 | 
				
			|||
	property real extraHeight: 0 | 
				
			|||
 | 
				
			|||
	x: parent ? (parent.width - width) / 2 : 0 | 
				
			|||
	y: parent ? deltaY() : 0 | 
				
			|||
	width: parent ? Math.min(Math.max(implicitWidth, 300), parent.width - 28) : implicitWidth | 
				
			|||
	height: parent ? Math.min(implicitHeight, parent.height - 28) : implicitWidth | 
				
			|||
	modal: true | 
				
			|||
	focus: true | 
				
			|||
	closePolicy: Popup.CloseOnEscape | 
				
			|||
 | 
				
			|||
	function deltaY() { | 
				
			|||
		var unscaled = Qt.inputMethod.keyboardRectangle.height / Screen.devicePixelRatio; | 
				
			|||
		var availHeight = (parent.height + extraHeight) - unscaled - 28;//spacing | 
				
			|||
		var rawDelta = (Math.max(0, availHeight - height) / 2); | 
				
			|||
		return rawDelta + 14 - extraHeight;//spacing | 
				
			|||
	} | 
				
			|||
 | 
				
			|||
	header: RowLayout { | 
				
			|||
		spacing: 14 | 
				
			|||
 | 
				
			|||
		TintIcon { | 
				
			|||
			id: icon | 
				
			|||
			property int iconType | 
				
			|||
 | 
				
			|||
			Layout.preferredWidth: 24 | 
				
			|||
			Layout.preferredHeight: 24 | 
				
			|||
			Layout.margins: 24 | 
				
			|||
			Layout.bottomMargin: 0 | 
				
			|||
			Layout.rightMargin: 0 | 
				
			|||
			visible: msgConfig.subType != "about" | 
				
			|||
			source: { | 
				
			|||
				var base = "image://svg/de/skycoder42/qtmvvm/quick/icons/ic_%1"; | 
				
			|||
				switch(msgConfig.subType) { | 
				
			|||
				case "information": | 
				
			|||
					base = base.arg("info"); | 
				
			|||
					break; | 
				
			|||
				case "question": | 
				
			|||
					base = base.arg("help"); | 
				
			|||
					break; | 
				
			|||
				case "warning": | 
				
			|||
					base = base.arg("warning"); | 
				
			|||
					break; | 
				
			|||
				case "critical": | 
				
			|||
					base = base.arg("error"); | 
				
			|||
					break; | 
				
			|||
				case "about": | 
				
			|||
				default: | 
				
			|||
					return ""; | 
				
			|||
				} | 
				
			|||
				return base; | 
				
			|||
			} | 
				
			|||
		} | 
				
			|||
 | 
				
			|||
		Label { | 
				
			|||
			text: msgConfig.title | 
				
			|||
			visible: msgConfig.title | 
				
			|||
			elide: Label.ElideRight | 
				
			|||
			font.bold: true | 
				
			|||
			font.pixelSize: 16 | 
				
			|||
			Layout.fillWidth: true | 
				
			|||
			Layout.margins: 24 | 
				
			|||
			Layout.bottomMargin: 0 | 
				
			|||
			Layout.leftMargin: icon.visible ? 0 : 24 | 
				
			|||
		} | 
				
			|||
	} | 
				
			|||
 | 
				
			|||
	Label { | 
				
			|||
		id: _contentLabel | 
				
			|||
		text: msgConfig.text.replace(/<\/p>/g, "</p><br/>")  //needed because qml does not put space between paragraphs... | 
				
			|||
		visible: text != "" | 
				
			|||
		anchors.fill: parent | 
				
			|||
		wrapMode: Text.Wrap | 
				
			|||
		onLinkActivated: Qt.openUrlExternally(link) | 
				
			|||
	} | 
				
			|||
 | 
				
			|||
	footer: DialogButtonBox { | 
				
			|||
		id: _btnBox | 
				
			|||
 | 
				
			|||
		readonly property var _allBtns: [ | 
				
			|||
			DialogButtonBox.NoButton, | 
				
			|||
			DialogButtonBox.Ok, | 
				
			|||
			DialogButtonBox.Save, | 
				
			|||
			DialogButtonBox.SaveAll, | 
				
			|||
			DialogButtonBox.Open, | 
				
			|||
			DialogButtonBox.Yes, | 
				
			|||
			DialogButtonBox.YesToAll, | 
				
			|||
			DialogButtonBox.No, | 
				
			|||
			DialogButtonBox.NoToAll, | 
				
			|||
			DialogButtonBox.Abort, | 
				
			|||
			DialogButtonBox.Retry, | 
				
			|||
			DialogButtonBox.Ignore, | 
				
			|||
			DialogButtonBox.Close, | 
				
			|||
			DialogButtonBox.Cancel, | 
				
			|||
			DialogButtonBox.Discard, | 
				
			|||
			DialogButtonBox.Help, | 
				
			|||
			DialogButtonBox.Apply, | 
				
			|||
			DialogButtonBox.Reset, | 
				
			|||
			DialogButtonBox.RestoreDefaults, | 
				
			|||
		] | 
				
			|||
 | 
				
			|||
		standardButtons: msgConfig.buttons | 
				
			|||
		onStandardButtonsChanged: { | 
				
			|||
			for(var key in msgConfig.buttonTexts) | 
				
			|||
				standardButton(DialogButtonBox.Ok).text = msgConfig.buttonTexts[key] | 
				
			|||
		} | 
				
			|||
 | 
				
			|||
		onClicked: { | 
				
			|||
			if(msgResult) { | 
				
			|||
				_allBtns.forEach(function(sBtn) { | 
				
			|||
					if(button === standardButton(sBtn)) | 
				
			|||
						msgResult.complete(sBtn) | 
				
			|||
				}) | 
				
			|||
			} | 
				
			|||
		} | 
				
			|||
	} | 
				
			|||
} | 
				
			|||
@ -0,0 +1,39 @@ | 
				
			|||
import QtQuick 2.10 | 
				
			|||
import QtQuick.Controls.Material 2.3 | 
				
			|||
import QtQuick.Controls.Universal 2.3 | 
				
			|||
import QtGraphicalEffects 1.0 | 
				
			|||
import de.skycoder42.QtMvvm.Quick 1.0 | 
				
			|||
 | 
				
			|||
Item { | 
				
			|||
	id: _tintIcon | 
				
			|||
 | 
				
			|||
	property size iconSize: Qt.size(24, 24) | 
				
			|||
	property alias tintColor: _overlay.color | 
				
			|||
	property alias source: _image.source | 
				
			|||
 | 
				
			|||
	Image { | 
				
			|||
		id: _image | 
				
			|||
		anchors.centerIn: parent | 
				
			|||
		fillMode: Image.PreserveAspectFit | 
				
			|||
		horizontalAlignment: Image.AlignHCenter | 
				
			|||
		verticalAlignment: Image.AlignVCenter | 
				
			|||
		width: iconSize.width | 
				
			|||
		height: iconSize.height | 
				
			|||
		sourceSize: iconSize | 
				
			|||
		visible: false | 
				
			|||
	} | 
				
			|||
 | 
				
			|||
	ColorOverlay { | 
				
			|||
		id: _overlay | 
				
			|||
		anchors.fill: _image | 
				
			|||
		source: _image | 
				
			|||
		color: { | 
				
			|||
			if(QuickPresenter.currentStyle === "Material") | 
				
			|||
				return Material.foreground; | 
				
			|||
			else if(QuickPresenter.currentStyle === "Universal") | 
				
			|||
				return Universal.foreground; | 
				
			|||
			else | 
				
			|||
				return "black"; | 
				
			|||
		} | 
				
			|||
	} | 
				
			|||
} | 
				
			|||
					Loading…
					
					
				
		Reference in new issue