From cf0e3effc7777237a0aa7cb0bf11d66330f08006 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 18 Mar 2019 08:48:29 +0100 Subject: [PATCH] WIP: Refactor NumericTextFieldWithUnit --- plugins/Toolbox/src/Toolbox.py | 1 - .../NumericTextFieldWithUnit.qml | 147 +++++++++++++----- 2 files changed, 109 insertions(+), 39 deletions(-) diff --git a/plugins/Toolbox/src/Toolbox.py b/plugins/Toolbox/src/Toolbox.py index 7d8d359831..add138b859 100644 --- a/plugins/Toolbox/src/Toolbox.py +++ b/plugins/Toolbox/src/Toolbox.py @@ -50,7 +50,6 @@ class Toolbox(QObject, Extension): self._request_headers = [] # type: List[Tuple[bytes, bytes]] self._updateRequestHeader() - self._request_urls = {} # type: Dict[str, QUrl] self._to_update = [] # type: List[str] # Package_ids that are waiting to be updated self._old_plugin_ids = set() # type: Set[str] diff --git a/resources/qml/MachineSettings/NumericTextFieldWithUnit.qml b/resources/qml/MachineSettings/NumericTextFieldWithUnit.qml index bb431cb6ad..473f90d863 100644 --- a/resources/qml/MachineSettings/NumericTextFieldWithUnit.qml +++ b/resources/qml/MachineSettings/NumericTextFieldWithUnit.qml @@ -21,6 +21,9 @@ UM.TooltipArea height: childrenRect.height width: childrenRect.width + property int controlWidth: UM.Theme.getSize("setting_control").width + property int controlHeight: UM.Theme.getSize("setting_control").height + text: tooltipText property alias containerStackId: propertyProvider.containerStackId @@ -63,62 +66,130 @@ UM.TooltipArea visible: text != "" elide: Text.ElideRight renderType: Text.NativeRendering - //width: Math.max(0, settingsTabs.labelColumnWidth) } - Item + TextField { id: textFieldWithUnit - width: textField.width - height: textField.height + width: numericTextFieldWithUnit.controlWidth + height: numericTextFieldWithUnit.controlHeight - TextField + // Background is a rounded-cornered box with filled color as state indication (normal, warning, error, etc.) + background: Rectangle { - id: textField - text: + anchors.fill: parent + anchors.margins: Math.round(UM.Theme.getSize("default_lining").width) + radius: UM.Theme.getSize("setting_control_radius").width + + border.color: { - const value = propertyProvider.properties.value - return value ? value : "" - } - validator: RegExpValidator { regExp: allowNegativeValue ? /-?[0-9\.,]{0,6}/ : /[0-9\.,]{0,6}/ } - onEditingFinished: - { - if (propertyProvider && text != propertyProvider.properties.value) + if (!textFieldWithUnit.enabled) { - // For some properties like the extruder-compatible material diameter, they need to - // trigger many updates, such as the available materials, the current material may - // need to be switched, etc. Although setting the diameter can be done directly via - // the provider, all the updates that need to be triggered then need to depend on - // the metadata update, a signal that can be fired way too often. The update functions - // can have if-checks to filter out the irrelevant updates, but still it incurs unnecessary - // overhead. - // The ExtruderStack class has a dedicated function for this call "setCompatibleMaterialDiameter()", - // and it triggers the diameter update signals only when it is needed. Here it is optionally - // choose to use setCompatibleMaterialDiameter() or other more specific functions that - // are available. - if (setValueFunction !== null) - { - setValueFunction(text) - } - else - { - propertyProvider.setPropertyValue("value", text) - } - forceUpdateOnChangeFunction() - afterOnEditingFinished() + return UM.Theme.getColor("setting_control_disabled_border") } + switch (propertyProvider.properties.validationState) + { + case "ValidatorState.Exception": + case "ValidatorState.MinimumError": + case "ValidatorState.MaximumError": + return UM.Theme.getColor("setting_validation_error") + case "ValidatorState.MinimumWarning": + case "ValidatorState.MaximumWarning": + return UM.Theme.getColor("setting_validation_warning") + } + // Validation is OK. + if (textFieldWithUnit.hovered || textFieldWithUnit.activeFocus) + { + return UM.Theme.getColor("setting_control_border_highlight") + } + return UM.Theme.getColor("setting_control_border") + } + + color: + { + if (!textFieldWithUnit.enabled) + { + return UM.Theme.getColor("setting_control_disabled") + } + switch (propertyProvider.properties.validationState) + { + case "ValidatorState.Exception": + case "ValidatorState.MinimumError": + case "ValidatorState.MaximumError": + return UM.Theme.getColor("setting_validation_error_background") + case "ValidatorState.MinimumWarning": + case "ValidatorState.MaximumWarning": + return UM.Theme.getColor("setting_validation_warning_background") + case "ValidatorState.Valid": + return UM.Theme.getColor("setting_validation_ok") + default: + return UM.Theme.getColor("setting_control") + } + } + } + + hoverEnabled: true + selectByMouse: true + font: UM.Theme.getFont("default") + renderType: Text.NativeRendering + + // When the textbox gets focused by TAB, select all text + onActiveFocusChanged: + { + if (activeFocus && (focusReason == Qt.TabFocusReason || focusReason == Qt.BacktabFocusReason)) + { + selectAll() + } + } + + text: + { + const value = propertyProvider.properties.value + return value ? value : "" + } + validator: RegExpValidator { regExp: allowNegativeValue ? /-?[0-9\.,]{0,6}/ : /[0-9\.,]{0,6}/ } + + onEditingFinished: + { + if (propertyProvider && text != propertyProvider.properties.value) + { + // For some properties like the extruder-compatible material diameter, they need to + // trigger many updates, such as the available materials, the current material may + // need to be switched, etc. Although setting the diameter can be done directly via + // the provider, all the updates that need to be triggered then need to depend on + // the metadata update, a signal that can be fired way too often. The update functions + // can have if-checks to filter out the irrelevant updates, but still it incurs unnecessary + // overhead. + // The ExtruderStack class has a dedicated function for this call "setCompatibleMaterialDiameter()", + // and it triggers the diameter update signals only when it is needed. Here it is optionally + // choose to use setCompatibleMaterialDiameter() or other more specific functions that + // are available. + if (setValueFunction !== null) + { + setValueFunction(text) + } + else + { + propertyProvider.setPropertyValue("value", text) + } + forceUpdateOnChangeFunction() + afterOnEditingFinished() } } Label { id: unitLabel - anchors.right: textField.right - anchors.rightMargin: y - textField.y - anchors.verticalCenter: textField.verticalCenter + anchors.right: parent.right + anchors.rightMargin: Math.round(UM.Theme.getSize("setting_unit_margin").width) + anchors.verticalCenter: parent.verticalCenter text: unitText + textFormat: Text.PlainText + verticalAlignment: Text.AlignVCenter renderType: Text.NativeRendering + color: UM.Theme.getColor("setting_unit") + font: UM.Theme.getFont("default") } } }