9 changed files with 539 additions and 2 deletions
			
			
		@ -0,0 +1,211 @@ | 
				
			|||
import QtQuick 2.10 | 
				
			|||
import QtQuick.Controls 2.3 | 
				
			|||
import QtQuick.Controls.Material 2.3 | 
				
			|||
import QtQuick.Controls.Universal 2.3 | 
				
			|||
import QtQuick.Layouts 1.3 | 
				
			|||
import de.skycoder42.QtDataSync 4.0 | 
				
			|||
import de.skycoder42.QtMvvm.Core 1.1 | 
				
			|||
import de.skycoder42.QtMvvm.Quick 1.1 | 
				
			|||
import de.skycoder42.QtMvvm.DataSync.Core 1.1 | 
				
			|||
import de.skycoder42.QtMvvm.Quick.Private 1.0 | 
				
			|||
 | 
				
			|||
Page { | 
				
			|||
	id: _changeRemoteView | 
				
			|||
	property PChangeRemoteViewModel viewModel: null | 
				
			|||
 | 
				
			|||
	header: ContrastToolBar { | 
				
			|||
		id: _toolBar | 
				
			|||
 | 
				
			|||
		RowLayout { | 
				
			|||
			id: _toolLayout | 
				
			|||
			anchors.fill: parent | 
				
			|||
			spacing: 0 | 
				
			|||
 | 
				
			|||
			ActionButton { | 
				
			|||
				id: _cancelButton | 
				
			|||
				icon.name: "gtk-cancel" | 
				
			|||
				icon.source: "qrc:/de/skycoder42/qtmvvm/quick/icons/ic_close.svg" | 
				
			|||
				text: qsTr("Cancel") | 
				
			|||
				onClicked: QuickPresenter.popView() | 
				
			|||
			} | 
				
			|||
 | 
				
			|||
			ToolBarLabel { | 
				
			|||
				id: _titleLabel | 
				
			|||
				Layout.fillWidth: true | 
				
			|||
				text: qsTr("Change Remote") | 
				
			|||
			} | 
				
			|||
 | 
				
			|||
			ToolButton { | 
				
			|||
				id: _syncButton | 
				
			|||
				implicitHeight: 48 | 
				
			|||
				text: qsTr("Change") | 
				
			|||
				enabled: viewModel.valid | 
				
			|||
				icon.width: 24 | 
				
			|||
				icon.height: 24 | 
				
			|||
				icon.name: "gtk-apply" | 
				
			|||
				icon.source: "qrc:/de/skycoder42/qtmvvm/quick/icons/ic_check.svg" | 
				
			|||
				display: AbstractButton.TextBesideIcon | 
				
			|||
				rightPadding: 16 | 
				
			|||
 | 
				
			|||
				onClicked: { | 
				
			|||
					if(viewModel.completeSetup()) | 
				
			|||
						QuickPresenter.popView() | 
				
			|||
				} | 
				
			|||
			} | 
				
			|||
		} | 
				
			|||
	} | 
				
			|||
 | 
				
			|||
	Pane { | 
				
			|||
		anchors.fill: parent | 
				
			|||
		ColumnLayout { | 
				
			|||
			id: _layout | 
				
			|||
			anchors.fill: parent | 
				
			|||
 | 
				
			|||
			DecorLabel { | 
				
			|||
				text: qsTr("Remote url:") | 
				
			|||
				Layout.fillWidth: true | 
				
			|||
				edit: _urlEdit | 
				
			|||
			} | 
				
			|||
 | 
				
			|||
			TextField { | 
				
			|||
				id: _urlEdit | 
				
			|||
				Layout.fillWidth: true | 
				
			|||
 | 
				
			|||
				validator: UrlValidator { | 
				
			|||
					allowedSchemes: ["ws", "wss"] | 
				
			|||
				} | 
				
			|||
 | 
				
			|||
				MvvmBinding { | 
				
			|||
					viewModel: _changeRemoteView.viewModel | 
				
			|||
					viewModelProperty: "url" | 
				
			|||
					view: _urlEdit | 
				
			|||
					viewProperty: "text" | 
				
			|||
					type: MvvmBinding.OneWayToViewModel | 
				
			|||
				} | 
				
			|||
			} | 
				
			|||
 | 
				
			|||
			DecorLabel { | 
				
			|||
				text: qsTr("Access key:") | 
				
			|||
				Layout.fillWidth: true | 
				
			|||
				edit: _accessKeyEdit | 
				
			|||
			} | 
				
			|||
 | 
				
			|||
			TextField { | 
				
			|||
				id: _accessKeyEdit | 
				
			|||
				Layout.fillWidth: true | 
				
			|||
				echoMode: TextInput.Password | 
				
			|||
 | 
				
			|||
				MvvmBinding { | 
				
			|||
					viewModel: _changeRemoteView.viewModel | 
				
			|||
					viewModelProperty: "accessKey" | 
				
			|||
					view: _accessKeyEdit | 
				
			|||
					viewProperty: "text" | 
				
			|||
					type: MvvmBinding.OneWayToViewModel | 
				
			|||
				} | 
				
			|||
			} | 
				
			|||
 | 
				
			|||
			DecorLabel { | 
				
			|||
				text: qsTr("Keep-Alive timout:") | 
				
			|||
				Layout.fillWidth: true | 
				
			|||
				edit: _keepAliveEdit | 
				
			|||
			} | 
				
			|||
 | 
				
			|||
			SpinBox { | 
				
			|||
				id: _keepAliveEdit | 
				
			|||
				Layout.fillWidth: true | 
				
			|||
				editable: true | 
				
			|||
				from: 1 | 
				
			|||
				to: 1440 | 
				
			|||
 | 
				
			|||
				MvvmBinding { | 
				
			|||
					viewModel: _changeRemoteView.viewModel | 
				
			|||
					viewModelProperty: "accessKey" | 
				
			|||
					view: _keepAliveEdit | 
				
			|||
					viewProperty: "value" | 
				
			|||
				} | 
				
			|||
			} | 
				
			|||
 | 
				
			|||
			CheckBox { | 
				
			|||
				id: _keepDataBox | 
				
			|||
				text: qsTr("Keep data") | 
				
			|||
 | 
				
			|||
				MvvmBinding { | 
				
			|||
					viewModel: _changeRemoteView.viewModel | 
				
			|||
					viewModelProperty: "keepData" | 
				
			|||
					view: _keepDataBox | 
				
			|||
					viewProperty: "checked" | 
				
			|||
				} | 
				
			|||
			} | 
				
			|||
 | 
				
			|||
			DecorLabel { | 
				
			|||
				text: qsTr("Extra Headers:") | 
				
			|||
				Layout.fillWidth: true | 
				
			|||
				edit: _headerScrollView | 
				
			|||
			} | 
				
			|||
 | 
				
			|||
			ScrollView { | 
				
			|||
				id: _headerScrollView | 
				
			|||
				Layout.fillWidth: true | 
				
			|||
				Layout.fillHeight: true | 
				
			|||
				clip: true | 
				
			|||
 | 
				
			|||
				ListView { | 
				
			|||
					id: _headerList | 
				
			|||
 | 
				
			|||
					model: viewModel.headerModel | 
				
			|||
 | 
				
			|||
					delegate: ItemDelegate { | 
				
			|||
						width: _headerScrollView.width | 
				
			|||
						text: qsTr("%1: %2").arg(key).arg(value) | 
				
			|||
 | 
				
			|||
						Button { | 
				
			|||
							id: _rmButton | 
				
			|||
							flat: true | 
				
			|||
							icon.width: 24 | 
				
			|||
							icon.height: 24 | 
				
			|||
							icon.name: "user-trash" | 
				
			|||
							icon.source: "qrc:/de/skycoder42/qtmvvm/quick/icons/ic_delete_forever.svg" | 
				
			|||
							anchors.right: parent.right | 
				
			|||
							implicitHeight: parent.height | 
				
			|||
							implicitWidth: implicitHeight | 
				
			|||
 | 
				
			|||
							onClicked: viewModel.removeHeaderConfig(index) | 
				
			|||
						} | 
				
			|||
					} | 
				
			|||
 | 
				
			|||
					footer: RowLayout { | 
				
			|||
						width: _headerScrollView.width | 
				
			|||
 | 
				
			|||
						TextField { | 
				
			|||
							id: _keyEdit | 
				
			|||
							placeholderText: qsTr("Key") | 
				
			|||
							Layout.fillWidth: true | 
				
			|||
						} | 
				
			|||
 | 
				
			|||
						TextField { | 
				
			|||
							id: _valueEdit | 
				
			|||
							placeholderText: qsTr("Value") | 
				
			|||
							Layout.fillWidth: true | 
				
			|||
						} | 
				
			|||
 | 
				
			|||
						Button { | 
				
			|||
							id: _addButton | 
				
			|||
							flat: true | 
				
			|||
							enabled: _keyEdit.text !== "" | 
				
			|||
							icon.width: 24 | 
				
			|||
							icon.height: 24 | 
				
			|||
							icon.name: "list-add" | 
				
			|||
							icon.source: "qrc:/de/skycoder42/qtmvvm/quick/icons/ic_add.svg" | 
				
			|||
 | 
				
			|||
							onClicked: { | 
				
			|||
								viewModel.addHeaderConfig(_keyEdit.text, _valueEdit.text); | 
				
			|||
								_keyEdit.clear(); | 
				
			|||
								_valueEdit.clear(); | 
				
			|||
							} | 
				
			|||
						} | 
				
			|||
					} | 
				
			|||
				} | 
				
			|||
			} | 
				
			|||
		} | 
				
			|||
	} | 
				
			|||
} | 
				
			|||
@ -0,0 +1,74 @@ | 
				
			|||
import QtQuick 2.10 | 
				
			|||
import QtQuick.Controls 2.3 | 
				
			|||
import QtQuick.Layouts 1.3 | 
				
			|||
import QtQuick.Window 2.2 | 
				
			|||
import de.skycoder42.QtMvvm.Core 1.1 | 
				
			|||
import de.skycoder42.QtMvvm.Quick 1.1 | 
				
			|||
import de.skycoder42.QtMvvm.DataSync.Core 1.1 | 
				
			|||
 | 
				
			|||
AlertDialog { | 
				
			|||
	id: _exportSetupView | 
				
			|||
 | 
				
			|||
	property PExportSetupViewModel viewModel: null | 
				
			|||
 | 
				
			|||
	title: viewModel.label | 
				
			|||
 | 
				
			|||
	ColumnLayout { | 
				
			|||
		id: _layout | 
				
			|||
		anchors.fill: parent | 
				
			|||
 | 
				
			|||
		CheckBox { | 
				
			|||
			id: _trustBox | 
				
			|||
			text: qsTr("Trusted") | 
				
			|||
			Layout.fillWidth: true | 
				
			|||
 | 
				
			|||
			MvvmBinding { | 
				
			|||
				viewModel: _exportSetupView.viewModel | 
				
			|||
				viewModelProperty: "trusted" | 
				
			|||
				view: _trustBox | 
				
			|||
				viewProperty: "checked" | 
				
			|||
			} | 
				
			|||
		} | 
				
			|||
 | 
				
			|||
		CheckBox { | 
				
			|||
			id: _includeBox | 
				
			|||
			text: qsTr("Include Server") | 
				
			|||
			Layout.fillWidth: true | 
				
			|||
 | 
				
			|||
			MvvmBinding { | 
				
			|||
				viewModel: _exportSetupView.viewModel | 
				
			|||
				viewModelProperty: "includeServer" | 
				
			|||
				view: _includeBox | 
				
			|||
				viewProperty: "checked" | 
				
			|||
			} | 
				
			|||
		} | 
				
			|||
 | 
				
			|||
		DecorLabel { | 
				
			|||
			text: qsTr("Password:") | 
				
			|||
			Layout.fillWidth: true | 
				
			|||
			edit: _passwordEdit | 
				
			|||
			enabled: viewModel.trusted | 
				
			|||
		} | 
				
			|||
 | 
				
			|||
		TextField { | 
				
			|||
			id: _passwordEdit | 
				
			|||
			echoMode: TextInput.Password | 
				
			|||
			Layout.fillWidth: true | 
				
			|||
			enabled: viewModel.trusted | 
				
			|||
 | 
				
			|||
			MvvmBinding { | 
				
			|||
				viewModel: _exportSetupView.viewModel | 
				
			|||
				viewModelProperty: "password" | 
				
			|||
				view: _passwordEdit | 
				
			|||
				viewProperty: "text" | 
				
			|||
				type: MvvmBinding.OneWayToViewModel | 
				
			|||
			} | 
				
			|||
		} | 
				
			|||
	} | 
				
			|||
 | 
				
			|||
	standardButtons: Dialog.Ok | Dialog.Cancel | 
				
			|||
 | 
				
			|||
	onAccepted: viewModel.completeSetup() | 
				
			|||
 | 
				
			|||
	Component.onCompleted: standardButton(Dialog.Ok).enabled = Qt.binding(function(){ return viewModel.valid; }) | 
				
			|||
} | 
				
			|||
@ -0,0 +1,62 @@ | 
				
			|||
import QtQuick 2.10 | 
				
			|||
import QtQuick.Controls 2.3 | 
				
			|||
import QtQuick.Layouts 1.3 | 
				
			|||
import QtQuick.Window 2.2 | 
				
			|||
import de.skycoder42.QtMvvm.Core 1.1 | 
				
			|||
import de.skycoder42.QtMvvm.Quick 1.1 | 
				
			|||
import de.skycoder42.QtMvvm.DataSync.Core 1.1 | 
				
			|||
 | 
				
			|||
AlertDialog { | 
				
			|||
	id: _identityEditView | 
				
			|||
 | 
				
			|||
	property PIdentityEditViewModel viewModel: null | 
				
			|||
 | 
				
			|||
	title: qsTr("Edit Identity") | 
				
			|||
 | 
				
			|||
	ColumnLayout { | 
				
			|||
		id: _layout | 
				
			|||
		anchors.fill: parent | 
				
			|||
 | 
				
			|||
		DecorLabel { | 
				
			|||
			text: qsTr("Device Name:") | 
				
			|||
			Layout.fillWidth: true | 
				
			|||
			edit: _nameEdit | 
				
			|||
		} | 
				
			|||
 | 
				
			|||
		TextField { | 
				
			|||
			id: _nameEdit | 
				
			|||
			Layout.fillWidth: true | 
				
			|||
 | 
				
			|||
			MvvmBinding { | 
				
			|||
				viewModel: _identityEditView.viewModel | 
				
			|||
				viewModelProperty: "name" | 
				
			|||
				view: _nameEdit | 
				
			|||
				viewProperty: "text" | 
				
			|||
			} | 
				
			|||
		} | 
				
			|||
 | 
				
			|||
		DecorLabel { | 
				
			|||
			id: _fpLabel | 
				
			|||
			text: qsTr("Device Fingerprint:") | 
				
			|||
			Layout.fillWidth: true | 
				
			|||
			Layout.topMargin: 16 | 
				
			|||
			edit: _fpText | 
				
			|||
		} | 
				
			|||
 | 
				
			|||
		Label { | 
				
			|||
			id: _fpText | 
				
			|||
			text: viewModel.fingerPrint | 
				
			|||
			Layout.fillWidth: true | 
				
			|||
			wrapMode: Text.Wrap | 
				
			|||
			verticalAlignment: Qt.AlignVCenter | 
				
			|||
			font.pointSize: _fpLabel.font.pointSize * 0.8 | 
				
			|||
			Layout.topMargin: 8 | 
				
			|||
		} | 
				
			|||
	} | 
				
			|||
 | 
				
			|||
	standardButtons: Dialog.Save | Dialog.Cancel | 
				
			|||
 | 
				
			|||
	onAccepted: viewModel.save() | 
				
			|||
 | 
				
			|||
	Component.onCompleted: standardButton(Dialog.Save).enabled = Qt.binding(function(){ return viewModel.valid; }) | 
				
			|||
} | 
				
			|||
@ -0,0 +1,155 @@ | 
				
			|||
import QtQuick 2.10 | 
				
			|||
import QtQuick.Controls 2.3 | 
				
			|||
import QtQuick.Controls.Material 2.3 | 
				
			|||
import QtQuick.Controls.Universal 2.3 | 
				
			|||
import QtQuick.Layouts 1.3 | 
				
			|||
import de.skycoder42.QtDataSync 4.0 | 
				
			|||
import de.skycoder42.QtMvvm.Core 1.1 | 
				
			|||
import de.skycoder42.QtMvvm.Quick 1.1 | 
				
			|||
import de.skycoder42.QtMvvm.DataSync.Core 1.1 | 
				
			|||
 | 
				
			|||
/*! @brief The view implementation for the QtMvvm::NetworkExchangeViewModel | 
				
			|||
 * | 
				
			|||
 * @extends QtQuick.Controls.Page | 
				
			|||
 * | 
				
			|||
 * @details This is the view used to present a network exchange view model. You can extend the | 
				
			|||
 * class if you need to extend that view. | 
				
			|||
 * | 
				
			|||
 * @sa QtMvvm::NetworkExchangeViewModel | 
				
			|||
 */ | 
				
			|||
Page { | 
				
			|||
	id: _networkExchangeView | 
				
			|||
 | 
				
			|||
	/*! @brief The viewmodel to use | 
				
			|||
	 * | 
				
			|||
	 * @default{<i>Injected</i>} | 
				
			|||
	 * | 
				
			|||
	 * @accessors{ | 
				
			|||
	 *	@memberAc{viewModel} | 
				
			|||
	 *  @notifyAc{viewModelChanged()} | 
				
			|||
	 * } | 
				
			|||
	 * | 
				
			|||
	 * @sa QtMvvm::NetworkExchangeViewModel | 
				
			|||
	 */ | 
				
			|||
	property NetworkExchangeViewModel viewModel: null | 
				
			|||
 | 
				
			|||
	header: ContrastToolBar { | 
				
			|||
		ToolBarLabel { | 
				
			|||
			id: _titleLabel | 
				
			|||
			anchors.fill: parent | 
				
			|||
			text: qsTr("Network Exchange") | 
				
			|||
		} | 
				
			|||
	} | 
				
			|||
 | 
				
			|||
	Pane { | 
				
			|||
		anchors.fill: parent | 
				
			|||
		ColumnLayout { | 
				
			|||
			id: _layout | 
				
			|||
			anchors.fill: parent | 
				
			|||
 | 
				
			|||
			DecorLabel { | 
				
			|||
				text: qsTr("Port:") | 
				
			|||
				Layout.fillWidth: true | 
				
			|||
				edit: _portEdit | 
				
			|||
			} | 
				
			|||
 | 
				
			|||
			SpinBox { | 
				
			|||
				id: _portEdit | 
				
			|||
				Layout.fillWidth: true | 
				
			|||
				editable: true | 
				
			|||
				from: 0 | 
				
			|||
				to: 65535 | 
				
			|||
 | 
				
			|||
				MvvmBinding { | 
				
			|||
					viewModel: _networkExchangeView.viewModel | 
				
			|||
					viewModelProperty: "port" | 
				
			|||
					view: _portEdit | 
				
			|||
					viewProperty: "value" | 
				
			|||
				} | 
				
			|||
			} | 
				
			|||
 | 
				
			|||
			DecorLabel { | 
				
			|||
				text: qsTr("Name:") | 
				
			|||
				Layout.fillWidth: true | 
				
			|||
				edit: _nameEdit | 
				
			|||
			} | 
				
			|||
 | 
				
			|||
			TextField { | 
				
			|||
				id: _nameEdit | 
				
			|||
				Layout.fillWidth: true | 
				
			|||
 | 
				
			|||
				MvvmBinding { | 
				
			|||
					viewModel: _networkExchangeView.viewModel | 
				
			|||
					viewModelProperty: "deviceName" | 
				
			|||
					view: _nameEdit | 
				
			|||
					viewProperty: "text" | 
				
			|||
				} | 
				
			|||
			} | 
				
			|||
 | 
				
			|||
			Rectangle { | 
				
			|||
				Layout.fillWidth: true | 
				
			|||
				Layout.minimumHeight: 1 | 
				
			|||
				Layout.maximumHeight: 1 | 
				
			|||
				color: { | 
				
			|||
					if(QuickPresenter.currentStyle === "Material") | 
				
			|||
						return Material.foreground; | 
				
			|||
					else if(QuickPresenter.currentStyle === "Universal") | 
				
			|||
						return Universal.foreground; | 
				
			|||
					else | 
				
			|||
						return "black"; | 
				
			|||
				} | 
				
			|||
			} | 
				
			|||
 | 
				
			|||
			Switch { | 
				
			|||
				id: _exchangeSwitch | 
				
			|||
				text: qsTr("Exchange active:") | 
				
			|||
 | 
				
			|||
				MvvmBinding { | 
				
			|||
					viewModel: _networkExchangeView.viewModel | 
				
			|||
					viewModelProperty: "active" | 
				
			|||
					view: _exchangeSwitch | 
				
			|||
					viewProperty: "checked" | 
				
			|||
				} | 
				
			|||
			} | 
				
			|||
 | 
				
			|||
			ScrollView { | 
				
			|||
				id: _exchangeScrollView | 
				
			|||
 | 
				
			|||
				Layout.fillWidth: true | 
				
			|||
				Layout.fillHeight: true | 
				
			|||
				clip: true | 
				
			|||
 | 
				
			|||
				ListView { | 
				
			|||
					id: _exchangeList | 
				
			|||
 | 
				
			|||
					model: viewModel.sortedModel | 
				
			|||
					delegate: ItemDelegate { | 
				
			|||
						width: _exchangeScrollView.width | 
				
			|||
 | 
				
			|||
						contentItem: ColumnLayout { | 
				
			|||
							id: _delegateLayout | 
				
			|||
							spacing: 8 | 
				
			|||
 | 
				
			|||
							Label { | 
				
			|||
								id: _nameLabel | 
				
			|||
								Layout.fillWidth: true | 
				
			|||
								text: name | 
				
			|||
							} | 
				
			|||
 | 
				
			|||
							Label { | 
				
			|||
								id: _addressLabel | 
				
			|||
								font.pointSize: _nameLabel.font.pointSize * 0.8 | 
				
			|||
								Layout.fillWidth: true | 
				
			|||
								Layout.leftMargin: 8 | 
				
			|||
								text: address | 
				
			|||
								opacity: 0.75 | 
				
			|||
							} | 
				
			|||
						} | 
				
			|||
 | 
				
			|||
						onClicked: viewModel.exportTo(index) | 
				
			|||
					} | 
				
			|||
				} | 
				
			|||
			} | 
				
			|||
		} | 
				
			|||
	} | 
				
			|||
} | 
				
			|||
@ -0,0 +1,25 @@ | 
				
			|||
import QtQuick 2.10 | 
				
			|||
import QtQuick.Controls 2.3 | 
				
			|||
import QtQuick.Controls.Material 2.3 | 
				
			|||
import QtQuick.Controls.Universal 2.3 | 
				
			|||
import de.skycoder42.QtMvvm.Quick 1.1 | 
				
			|||
 | 
				
			|||
Label { | 
				
			|||
	id: _decorLabel | 
				
			|||
 | 
				
			|||
	property Item edit: _decorLabel.nextItemInFocusChain() | 
				
			|||
 | 
				
			|||
	readonly property bool editHasFocus: edit && edit.focus | 
				
			|||
 | 
				
			|||
	function highlightColor() { | 
				
			|||
		if(QuickPresenter.currentStyle === "Material") | 
				
			|||
			return Material.accentColor; | 
				
			|||
		else if(QuickPresenter.currentStyle === "Universal") | 
				
			|||
			return Universal.accent; | 
				
			|||
		else | 
				
			|||
			return palette.highlight; | 
				
			|||
	} | 
				
			|||
 | 
				
			|||
	color: editHasFocus ? highlightColor() : palette.text | 
				
			|||
	opacity: editHasFocus ? 1 : 0.5 | 
				
			|||
} | 
				
			|||
					Loading…
					
					
				
		Reference in new issue