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