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