251 lines
5.2 KiB
QML
251 lines
5.2 KiB
QML
import QtQuick
|
|
import QtQuick.Layouts
|
|
import qs.Components
|
|
import qs.Config
|
|
|
|
Item {
|
|
id: root
|
|
|
|
required property int index
|
|
required property var modelData
|
|
|
|
signal addActiveActionRequested
|
|
signal fieldEdited(string key, var value)
|
|
|
|
Layout.fillWidth: true
|
|
Layout.preferredHeight: row.implicitHeight + Appearance.padding.smaller * 2
|
|
|
|
CustomRect {
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
anchors.top: parent.top
|
|
anchors.topMargin: -(Appearance.spacing.smaller / 2)
|
|
color: DynamicColors.tPalette.m3outlineVariant
|
|
implicitHeight: 1
|
|
visible: root.index !== 0
|
|
}
|
|
|
|
RowLayout {
|
|
id: row
|
|
|
|
anchors.left: parent.left
|
|
anchors.margins: Appearance.padding.small
|
|
anchors.right: parent.right
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
spacing: Appearance.spacing.large
|
|
|
|
Item {
|
|
id: nameCell
|
|
|
|
property string draftName: ""
|
|
property bool editing: false
|
|
|
|
function beginEdit() {
|
|
draftName = root.modelData.name ?? "";
|
|
editing = true;
|
|
nameEditor.forceActiveFocus();
|
|
}
|
|
|
|
function cancelEdit() {
|
|
draftName = root.modelData.name ?? "";
|
|
editing = false;
|
|
}
|
|
|
|
function commitEdit() {
|
|
editing = false;
|
|
|
|
if (draftName !== (root.modelData.name ?? "")) {
|
|
root.fieldEdited("name", draftName);
|
|
}
|
|
}
|
|
|
|
Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter
|
|
Layout.fillHeight: true
|
|
Layout.preferredWidth: root.width / 2
|
|
|
|
HoverHandler {
|
|
id: nameHover
|
|
|
|
}
|
|
|
|
CustomText {
|
|
anchors.left: parent.left
|
|
anchors.right: editButton.left
|
|
anchors.rightMargin: Appearance.spacing.small
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
elide: Text.ElideRight // enable if CustomText supports it
|
|
font.pointSize: Appearance.font.size.larger
|
|
text: root.modelData.name
|
|
visible: !nameCell.editing
|
|
}
|
|
|
|
IconButton {
|
|
id: editButton
|
|
|
|
anchors.right: parent.right
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
font.pointSize: Appearance.font.size.large
|
|
icon: "edit"
|
|
visible: nameHover.hovered && !nameCell.editing
|
|
|
|
onClicked: nameCell.beginEdit()
|
|
}
|
|
|
|
CustomRect {
|
|
anchors.fill: parent
|
|
color: DynamicColors.tPalette.m3surface
|
|
radius: Appearance.rounding.small
|
|
visible: nameCell.editing
|
|
|
|
CustomTextField {
|
|
id: nameEditor
|
|
|
|
anchors.fill: parent
|
|
text: nameCell.draftName
|
|
|
|
Keys.onEscapePressed: {
|
|
nameCell.cancelEdit();
|
|
}
|
|
onEditingFinished: {
|
|
nameCell.commitEdit();
|
|
}
|
|
onTextEdited: {
|
|
nameCell.draftName = nameEditor.text;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
VSeparator {
|
|
}
|
|
|
|
ColumnLayout {
|
|
id: cLayout
|
|
|
|
Layout.fillWidth: true
|
|
|
|
RowLayout {
|
|
Layout.fillWidth: true
|
|
|
|
CustomText {
|
|
Layout.fillWidth: true
|
|
text: qsTr("Timeout")
|
|
}
|
|
|
|
CustomRect {
|
|
Layout.preferredHeight: 33
|
|
Layout.preferredWidth: Math.max(Math.min(timeField.contentWidth + Appearance.padding.normal * 3, 200), 50)
|
|
color: DynamicColors.tPalette.m3surface
|
|
radius: Appearance.rounding.small
|
|
|
|
CustomTextField {
|
|
id: timeField
|
|
|
|
anchors.centerIn: parent
|
|
horizontalAlignment: Text.AlignHCenter
|
|
text: String(root.modelData.timeout ?? "")
|
|
|
|
onEditingFinished: {
|
|
root.fieldEdited("timeout", Number(text));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Separator {
|
|
}
|
|
|
|
RowLayout {
|
|
Layout.fillWidth: true
|
|
|
|
CustomText {
|
|
Layout.fillWidth: true
|
|
text: qsTr("Idle Action")
|
|
}
|
|
|
|
CustomRect {
|
|
Layout.preferredHeight: 33
|
|
Layout.preferredWidth: Math.max(Math.min(idleField.contentWidth + Appearance.padding.normal * 3, 200), 50)
|
|
color: DynamicColors.tPalette.m3surface
|
|
radius: Appearance.rounding.small
|
|
|
|
CustomTextField {
|
|
id: idleField
|
|
|
|
anchors.centerIn: parent
|
|
horizontalAlignment: Text.AlignHCenter
|
|
text: root.modelData.idleAction ?? ""
|
|
|
|
onEditingFinished: {
|
|
root.fieldEdited("idleAction", text);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Separator {
|
|
}
|
|
|
|
Item {
|
|
Layout.fillWidth: true
|
|
implicitHeight: activeActionRow.visible ? activeActionRow.implicitHeight : addButtonRow.implicitHeight
|
|
|
|
RowLayout {
|
|
id: activeActionRow
|
|
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
visible: root.modelData.activeAction !== undefined
|
|
|
|
CustomText {
|
|
Layout.fillWidth: true
|
|
text: qsTr("Active Action")
|
|
}
|
|
|
|
CustomRect {
|
|
Layout.preferredHeight: 33
|
|
Layout.preferredWidth: Math.max(Math.min(actionField.contentWidth + Appearance.padding.normal * 3, 200), 50)
|
|
color: DynamicColors.tPalette.m3surface
|
|
radius: Appearance.rounding.small
|
|
|
|
CustomTextField {
|
|
id: actionField
|
|
|
|
anchors.centerIn: parent
|
|
horizontalAlignment: Text.AlignHCenter
|
|
text: root.modelData.activeAction ?? ""
|
|
|
|
onEditingFinished: {
|
|
root.fieldEdited("activeAction", text);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
RowLayout {
|
|
id: addButtonRow
|
|
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
visible: root.modelData.activeAction === undefined
|
|
|
|
IconButton {
|
|
id: button
|
|
|
|
Layout.alignment: Qt.AlignLeft
|
|
font.pointSize: Appearance.font.size.large
|
|
icon: "add"
|
|
|
|
onClicked: root.addActiveActionRequested()
|
|
}
|
|
|
|
CustomText {
|
|
Layout.alignment: Qt.AlignLeft
|
|
text: qsTr("Add active action")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|