diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml index 4f4fd1c027..93c34cf603 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml @@ -44,7 +44,7 @@ Item text: printJob ? Math.round(printJob.progress * 100) + "%" : "0%" color: printJob && printJob.isActive ? UM.Theme.getColor("text") : UM.Theme.getColor("monitor_text_disabled") width: contentWidth - + wrapMode: Text.NoWrap // FIXED-LINE-HEIGHT: height: UM.Theme.getSize("monitor_text_line").height } @@ -57,6 +57,7 @@ Item leftMargin: UM.Theme.getSize("monitor_margin").width verticalCenter: parent.verticalCenter } + wrapMode: Text.NoWrap text: { if (!printJob) diff --git a/resources/qml/Account/SyncState.qml b/resources/qml/Account/SyncState.qml index e370c653f7..e5731ff9d7 100644 --- a/resources/qml/Account/SyncState.qml +++ b/resources/qml/Account/SyncState.qml @@ -84,6 +84,8 @@ Row // Sync state icon + message font: UM.Theme.getFont("medium") anchors.leftMargin: UM.Theme.getSize("default_margin").width anchors.rightMargin: UM.Theme.getSize("default_margin").width + wrapMode: Text.NoWrap + height: contentHeight visible: !Cura.API.account.manualSyncEnabled && !Cura.API.account.updatePackagesEnabled } @@ -94,6 +96,7 @@ Row // Sync state icon + message color: UM.Theme.getColor("text_link") font: UM.Theme.getFont("medium") height: contentHeight + wrapMode: Text.NoWrap width: contentWidth + UM.Theme.getSize("default_margin").height visible: Cura.API.account.updatePackagesEnabled @@ -113,6 +116,7 @@ Row // Sync state icon + message text: catalog.i18nc("@button", "Check for account updates") color: UM.Theme.getColor("text_link") font: UM.Theme.getFont("medium") + wrapMode: Text.NoWrap height: contentHeight width: contentWidth + UM.Theme.getSize("default_margin").height visible: Cura.API.account.manualSyncEnabled diff --git a/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml b/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml index 9860a522e5..c9d0cd3e1b 100644 --- a/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml +++ b/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml @@ -195,6 +195,7 @@ Cura.ExpandablePopup text: model.material_brand + " " + model.material_name elide: Text.ElideRight + wrapMode: Text.NoWrap width: parent.width visible: !truncated } diff --git a/resources/qml/Menus/ContextMenu.qml b/resources/qml/Menus/ContextMenu.qml index 41309ec82f..30e1d206f7 100644 --- a/resources/qml/Menus/ContextMenu.qml +++ b/resources/qml/Menus/ContextMenu.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2016 Ultimaker B.V. +// Copyright (c) 2022 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.2 @@ -118,15 +118,18 @@ Menu { spacing: UM.Theme.getSize("default_margin").width - Label + UM.Label { text: catalog.i18nc("@label", "Number of Copies") anchors.verticalCenter: copiesField.verticalCenter + width: contentWidth + wrapMode: Text.NoWrap } - SpinBox + Cura.SpinBox { id: copiesField + editable: true focus: true from: 1 to: 99 diff --git a/resources/qml/Menus/SettingsMenu.qml b/resources/qml/Menus/SettingsMenu.qml index e02d146296..6ee126890c 100644 --- a/resources/qml/Menus/SettingsMenu.qml +++ b/resources/qml/Menus/SettingsMenu.qml @@ -19,7 +19,7 @@ Cura.Menu { id: extruderInstantiator model: activeMachine == null ? null : activeMachine.extruderList - Menu + Cura.Menu { title: modelData.name property var extruder: (base.activeMachine === null) ? null : activeMachine.extruderList[model.index] diff --git a/resources/qml/Preferences/Materials/MaterialsView.qml b/resources/qml/Preferences/Materials/MaterialsView.qml index 72a78fe03b..cbbe5828bb 100644 --- a/resources/qml/Preferences/Materials/MaterialsView.qml +++ b/resources/qml/Preferences/Materials/MaterialsView.qml @@ -230,30 +230,31 @@ Item Label { width: parent.width; height: parent.rowHeight; font.bold: true; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Properties") } Label { width: informationPage.columnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Density") } - ReadOnlySpinBox + + Cura.SpinBox { + enabled: base.editingEnabled id: densitySpinBox width: informationPage.columnWidth value: properties.density decimals: 2 suffix: " g/cm³" stepSize: 0.01 - readOnly: !base.editingEnabled onEditingFinished: base.setMetaDataEntry("properties/density", properties.density, value) onValueChanged: updateCostPerMeter() } Label { width: informationPage.columnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Diameter") } - ReadOnlySpinBox + Cura.SpinBox { + enabled: base.editingEnabled id: diameterSpinBox width: informationPage.columnWidth value: properties.diameter decimals: 2 suffix: " mm" stepSize: 0.01 - readOnly: !base.editingEnabled onEditingFinished: { @@ -279,44 +280,26 @@ Item } Label { width: informationPage.columnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Filament Cost") } - SpinBox + + Cura.SpinBox { id: spoolCostSpinBox width: informationPage.columnWidth value: base.getMaterialPreferenceValue(properties.guid, "spool_cost") to: 100000000 editable: true - - contentItem: TextField - { - text: spoolCostSpinBox.textFromValue(spoolCostSpinBox.value, spoolCostSpinBox.locale) - selectByMouse: true - background: Item {} - validator: RegExpValidator { regExp: new RegExp("^" + base.currency + " ([0-9]+[.]?[0-9]*)?$") } - } - - property int decimals: 2 - - valueFromText: function(text) { - // remove all non-number tokens from input string so value can be parsed correctly - var value = Number(text.replace(",", ".").replace(/[^0-9.]+/g, "")); - var precision = Math.pow(10, spoolCostSpinBox.decimals); - return Math.round(value * precision) / precision; - } - - textFromValue: function(value) { - return base.currency + " " + value.toFixed(spoolCostSpinBox.decimals) - } + prefix: base.currency + " " + decimals: 2 onValueChanged: { - base.setMaterialPreferenceValue(properties.guid, "spool_cost", parseFloat(value, decimals)) + base.setMaterialPreferenceValue(properties.guid, "spool_cost", parseFloat(value)) updateCostPerMeter() } } Label { width: informationPage.columnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Filament weight") } - SpinBox + Cura.SpinBox { id: spoolWeightSpinBox width: informationPage.columnWidth @@ -324,24 +307,7 @@ Item stepSize: 100 to: 10000 editable: true - - contentItem: TextField - { - text: spoolWeightSpinBox.textFromValue(spoolWeightSpinBox.value, spoolWeightSpinBox.locale) - selectByMouse: true - background: Item {} - validator: RegExpValidator { regExp: new RegExp("^([0-9]+[.]?[0-9]*)? g$") } - } - - valueFromText: function(text, locale) { - // remove all non-number tokens from input string so value can be parsed correctly - var value = Number(text.replace(",", ".").replace(/[^0-9.]+/g, "")); - return Math.round(value); - } - - textFromValue: function(value, locale) { - return value + " g" - } + suffix: " g" onValueChanged: { @@ -455,7 +421,7 @@ Item elide: Text.ElideRight verticalAlignment: Qt.AlignVCenter } - ReadOnlySpinBox + Cura.SpinBox { id: spinBox anchors.left: label.right @@ -479,9 +445,8 @@ Item return 0; } width: base.secondColumnWidth - readOnly: !base.editingEnabled suffix: " " + model.unit - maximumValue: 99999 + to: 99999 decimals: model.unit == "mm" ? 2 : 0 onEditingFinished: materialPropertyProvider.setPropertyValue("value", value) @@ -637,4 +602,10 @@ Item base.setMetaDataEntry("brand", old_brand, new_brand) properties.brand = new_brand } + + function updateCostPerMeter() + { + base.spoolLength = calculateSpoolLength(diameterSpinBox.value, densitySpinBox.value, spoolWeightSpinBox.value); + base.costPerMeter = calculateCostPerMeter(spoolCostSpinBox.value); + } } diff --git a/resources/qml/Preferences/ReadOnlySpinBox.qml b/resources/qml/Preferences/ReadOnlySpinBox.qml index df066ef3ab..e69de29bb2 100644 --- a/resources/qml/Preferences/ReadOnlySpinBox.qml +++ b/resources/qml/Preferences/ReadOnlySpinBox.qml @@ -1,53 +0,0 @@ -// Copyright (c) 2016 Ultimaker B.V. -// Cura is released under the terms of the LGPLv3 or higher. - -import QtQuick 2.1 -import QtQuick.Controls 1.1 - -Item -{ - id: base - - property alias value: spinBox.value - property alias minimumValue: spinBox.minimumValue - property alias maximumValue: spinBox.maximumValue - property alias stepSize: spinBox.stepSize - property alias prefix: spinBox.prefix - property alias suffix: spinBox.suffix - property alias decimals: spinBox.decimals - - signal editingFinished(); - - property bool readOnly: false - - width: spinBox.width - height: spinBox.height - - SpinBox - { - id: spinBox - - enabled: !base.readOnly - opacity: base.readOnly ? 0.5 : 1.0 - - anchors.fill: parent - - onEditingFinished: base.editingFinished() - Keys.onEnterPressed: spinBox.focus = false - Keys.onReturnPressed: spinBox.focus = false - } - - Label - { - visible: base.readOnly - text: base.prefix + base.value.toFixed(spinBox.decimals) + base.suffix - - anchors.verticalCenter: parent.verticalCenter - anchors.left: parent.left - anchors.leftMargin: spinBox.__style ? spinBox.__style.padding.left : 0 - - color: palette.buttonText - } - - SystemPalette { id: palette } -} diff --git a/resources/qml/Preferences/SettingVisibilityPage.qml b/resources/qml/Preferences/SettingVisibilityPage.qml index dcd5c154d9..06f7dfcc36 100644 --- a/resources/qml/Preferences/SettingVisibilityPage.qml +++ b/resources/qml/Preferences/SettingVisibilityPage.qml @@ -11,7 +11,7 @@ import Cura 1.0 as Cura UM.PreferencesPage { - title: catalog.i18nc("@title:tab", "Setting Visibility"); + title: catalog.i18nc("@title:tab", "Setting Visibility") property QtObject settingVisibilityPresetsModel: CuraApplication.getSettingVisibilityPresetsModel() @@ -31,16 +31,16 @@ UM.PreferencesPage Item { - id: base; - anchors.fill: parent; + id: base + anchors.fill: parent OldControls.CheckBox { id: toggleVisibleSettings anchors { - verticalCenter: filter.verticalCenter; - left: parent.left; + verticalCenter: filter.verticalCenter + left: parent.left leftMargin: UM.Theme.getSize("default_margin").width } text: catalog.i18nc("@label:textbox", "Check all") @@ -80,7 +80,7 @@ UM.PreferencesPage TextField { - id: filter; + id: filter anchors { @@ -96,7 +96,7 @@ UM.PreferencesPage onTextChanged: definitionsModel.filter = {"i18n_label|i18n_description": "*" + text} } - ComboBox + Cura.ComboBox { id: visibilityPreset width: 150 * screenScaleFactor @@ -104,7 +104,7 @@ UM.PreferencesPage { top: parent.top right: parent.right - bottom: settingsListView.top + verticalCenter: filter.verticalCenter } model: settingVisibilityPresetsModel.items @@ -136,11 +136,11 @@ UM.PreferencesPage id: settingsListView anchors { - top: filter.bottom; + top: filter.bottom topMargin: UM.Theme.getSize("default_margin").height - left: parent.left; - right: parent.right; - bottom: parent.bottom; + left: parent.left + right: parent.right + bottom: parent.bottom } clip: true @@ -182,8 +182,8 @@ UM.PreferencesPage } } - UM.I18nCatalog { name: "cura"; } - SystemPalette { id: palette; } + UM.I18nCatalog { name: "cura" } + SystemPalette { id: palette } Component { diff --git a/resources/qml/SpinBox.qml b/resources/qml/SpinBox.qml new file mode 100644 index 0000000000..d064da4f18 --- /dev/null +++ b/resources/qml/SpinBox.qml @@ -0,0 +1,84 @@ +// Copyright (c) 2022 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 or higher. + +import QtQuick 2.2 +import QtQuick.Controls 2.15 + +// This component extends the funtionality of QtControls 2.x Spinboxes to +// - be able to contain fractional values +// - hava a "prefix" and a "suffix". A validator is added that recognizes this pre-, suf-fix combo. When adding a custom +// validator the pre-, suf-fix should be added (e.g. new RegExp("^" + prefix + \regex\ + suffix + "$") + +Item +{ + id: base + + property string prefix: "" + property string suffix: "" + property int decimals: 0 + property real stepSize: 1 + property real value: 0 + property real from: 0 + property real to: 99 + + property alias wrap: spinBox.wrap + + property bool editable: true + + property var validator: RegExpValidator + { + regExp: new RegExp("^" + prefix + "([0-9]+[.|,]?[0-9]*)?" + suffix + "$") + } + + signal editingFinished() + implicitWidth: spinBox.implicitWidth + implicitHeight: spinBox.implicitHeight + SpinBox + { + id: spinBox + anchors.fill: base + editable: base.editable + + // The stepSize of the SpinBox is intentionally set to be always `1` + // As SpinBoxes can only contain integer values the `base.stepSize` is concidered the precision/resolution + // increasing the spinBox.value by one increases the actual/real value of the component by `base.stepSize` + // as such spinBox.value * base.stepSizes produces the real value of the component + stepSize: 1 + value: Math.floor(base.value / base.stepSize) + from: Math.floor(base.from / base.stepSize) + to: Math.floor(base.to / base.stepSize) + + valueFromText: function(text) + { + return parseFloat(text.substring(prefix.length, text.length - suffix.length).replace(",", ".")) / base.stepSize; + } + + textFromValue: function(value) + { + return prefix + (value * base.stepSize).toFixed(decimals) + suffix; + } + + validator: base.validator + + onValueModified: + { + base.value = value * base.stepSize; + } + + contentItem: TextField + { + text: spinBox.textFromValue(spinBox.value, spinBox.locale) + selectByMouse: base.editable + background: Item {} + validator: base.validator + + onActiveFocusChanged: + { + if(!activeFocus) + { + base.editingFinished(); + } + } + } + } +}