diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index de2511d283..530ce2637b 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -704,7 +704,7 @@ class CuraApplication(QtApplication): sceneBoundingBoxChanged = pyqtSignal() @pyqtProperty(bool, notify = activityChanged) - def getPlatformActivity(self): + def platformActivity(self): return self._platform_activity @pyqtProperty(str, notify = sceneBoundingBoxChanged) diff --git a/cura/Settings/MaterialSettingsVisibilityHandler.py b/cura/Settings/MaterialSettingsVisibilityHandler.py index 5aa5cc02ab..a533a0cabd 100644 --- a/cura/Settings/MaterialSettingsVisibilityHandler.py +++ b/cura/Settings/MaterialSettingsVisibilityHandler.py @@ -1,19 +1,19 @@ -# Copyright (c) 2016 Ultimaker B.V. +# Copyright (c) 2017 Ultimaker B.V. # Uranium is released under the terms of the AGPLv3 or higher. -from UM.Settings.Models.SettingVisibilityHandler import SettingVisibilityHandler +import UM.Settings.Models.SettingVisibilityHandler -class MaterialSettingsVisibilityHandler(SettingVisibilityHandler): +class MaterialSettingsVisibilityHandler(UM.Settings.Models.SettingVisibilityHandler.SettingVisibilityHandler): def __init__(self, parent = None, *args, **kwargs): super().__init__(parent = parent, *args, **kwargs) - material_settings = set([ + material_settings = { "default_material_print_temperature", "material_bed_temperature", "material_standby_temperature", "cool_fan_speed", "retraction_amount", "retraction_speed", - ]) + } self.setVisible(material_settings) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 10cc7b5c88..b0d0da66c4 100644 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -182,7 +182,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): self._dialog.setMachineType(machine_type) self._dialog.setExtruders(extruders) self._dialog.setVariantType(variant_type_name) - self._dialog.setHasObjectsOnPlate(Application.getInstance().getPlatformActivity) + self._dialog.setHasObjectsOnPlate(Application.getInstance().platformActivity) self._dialog.show() # Block until the dialog is closed. diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 2d9903e5a1..bd347f3416 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -247,7 +247,7 @@ class CuraEngineBackend(Backend): return if job.getResult() == StartSliceJob.StartJobResult.MaterialIncompatible: - if Application.getInstance().getPlatformActivity: + if Application.getInstance().platformActivity: self._error_message = Message(catalog.i18nc("@info:status", "The selected material is incompatible with the selected machine or configuration.")) self._error_message.show() @@ -257,7 +257,7 @@ class CuraEngineBackend(Backend): return if job.getResult() == StartSliceJob.StartJobResult.SettingError: - if Application.getInstance().getPlatformActivity: + if Application.getInstance().platformActivity: extruders = list(ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId())) error_keys = [] for extruder in extruders: @@ -278,7 +278,7 @@ class CuraEngineBackend(Backend): return if job.getResult() == StartSliceJob.StartJobResult.BuildPlateError: - if Application.getInstance().getPlatformActivity: + if Application.getInstance().platformActivity: self._error_message = Message(catalog.i18nc("@info:status", "Unable to slice because the prime tower or prime position(s) are invalid.")) self._error_message.show() self.backendStateChange.emit(BackendState.Error) @@ -286,7 +286,7 @@ class CuraEngineBackend(Backend): self.backendStateChange.emit(BackendState.NotStarted) if job.getResult() == StartSliceJob.StartJobResult.NothingToSlice: - if Application.getInstance().getPlatformActivity: + if Application.getInstance().platformActivity: self._error_message = Message(catalog.i18nc("@info:status", "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit.")) self._error_message.show() self.backendStateChange.emit(BackendState.Error) diff --git a/plugins/LayerView/LayerView.py b/plugins/LayerView/LayerView.py index e95c63c159..fc75026475 100644 --- a/plugins/LayerView/LayerView.py +++ b/plugins/LayerView/LayerView.py @@ -325,7 +325,7 @@ class LayerView(View): self._old_composite_shader = self._composite_pass.getCompositeShader() self._composite_pass.setCompositeShader(self._layerview_composite_shader) - if self.getLayerViewType() == self.LAYER_VIEW_TYPE_LINE_TYPE: + if self.getLayerViewType() == self.LAYER_VIEW_TYPE_LINE_TYPE or self._compatibility_mode: self.enableLegend() elif event.type == Event.ViewDeactivateEvent: diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml index a2d86144fe..174fa8f146 100644 --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -75,7 +75,7 @@ Item border.color: UM.Theme.getColor("slider_groove_border") color: UM.Theme.getColor("tool_panel_background") - visible: UM.LayerView.getLayerActivity && Printer.getPlatformActivity ? true : false + visible: UM.LayerView.layerActivity && Printer.platformActivity ? true : false TextField { @@ -250,7 +250,7 @@ Item UM.Preferences.setValue("layerview/extruder0_opacity", checked ? 1.0 : 0.0); } text: "Extruder 1" - visible: !UM.LayerView.compatibilityMode && (UM.LayerView.getExtruderCount >= 1) + visible: !UM.LayerView.compatibilityMode && (UM.LayerView.extruderCount >= 1) } CheckBox { checked: view_settings.extruder1_checked @@ -258,7 +258,7 @@ Item UM.Preferences.setValue("layerview/extruder1_opacity", checked ? 1.0 : 0.0); } text: "Extruder 2" - visible: !UM.LayerView.compatibilityMode && (UM.LayerView.getExtruderCount >= 2) + visible: !UM.LayerView.compatibilityMode && (UM.LayerView.extruderCount >= 2) } CheckBox { checked: view_settings.extruder2_checked @@ -266,7 +266,7 @@ Item UM.Preferences.setValue("layerview/extruder2_opacity", checked ? 1.0 : 0.0); } text: "Extruder 3" - visible: !UM.LayerView.compatibilityMode && (UM.LayerView.getExtruderCount >= 3) + visible: !UM.LayerView.compatibilityMode && (UM.LayerView.etruderCount >= 3) } CheckBox { checked: view_settings.extruder3_checked @@ -274,11 +274,11 @@ Item UM.Preferences.setValue("layerview/extruder3_opacity", checked ? 1.0 : 0.0); } text: "Extruder 4" - visible: !UM.LayerView.compatibilityMode && (UM.LayerView.getExtruderCount >= 4) + visible: !UM.LayerView.compatibilityMode && (UM.LayerView.extruderCount >= 4) } Label { text: "Other extruders always visible" - visible: !UM.LayerView.compatibilityMode && (UM.LayerView.getExtruderCount >= 5) + visible: !UM.LayerView.compatibilityMode && (UM.LayerView.extruderCount >= 5) } CheckBox { checked: view_settings.show_travel_moves diff --git a/plugins/LayerView/LayerViewProxy.py b/plugins/LayerView/LayerViewProxy.py index b3a1cca87d..75cbb12578 100644 --- a/plugins/LayerView/LayerViewProxy.py +++ b/plugins/LayerView/LayerViewProxy.py @@ -20,7 +20,7 @@ class LayerViewProxy(QObject): preferencesChanged = pyqtSignal() @pyqtProperty(bool, notify = activityChanged) - def getLayerActivity(self): + def layerActivity(self): active_view = self._controller.getActiveView() if type(active_view) == LayerView.LayerView.LayerView: return active_view.getActivity() @@ -79,7 +79,7 @@ class LayerViewProxy(QObject): if type(active_view) == LayerView.LayerView.LayerView: active_view.setLayerViewType(layer_view_type) - @pyqtProperty(bool) + @pyqtSlot(result = int) def getLayerViewType(self): active_view = self._controller.getActiveView() if type(active_view) == LayerView.LayerView.LayerView: @@ -124,7 +124,7 @@ class LayerViewProxy(QObject): active_view.setShowInfill(show) @pyqtProperty(int, notify = globalStackChanged) - def getExtruderCount(self): + def extruderCount(self): active_view = self._controller.getActiveView() if type(active_view) == LayerView.LayerView.LayerView: return active_view.getExtruderCount() diff --git a/resources/qml/AboutDialog.qml b/resources/qml/AboutDialog.qml index 79e6030922..c1e441e4ca 100644 --- a/resources/qml/AboutDialog.qml +++ b/resources/qml/AboutDialog.qml @@ -73,68 +73,76 @@ UM.Dialog anchors.topMargin: UM.Theme.getSize("default_margin").height } - ListView + ScrollView { - id: projectsList - anchors.top: creditsNotes.bottom - anchors.topMargin: 10 + anchors.topMargin: UM.Theme.getSize("default_margin").height width: parent.width - height: childrenRect.height + height: base.height - y - (2 * UM.Theme.getSize("default_margin").height + closeButton.height) - delegate: Row + ListView { - Label - { - text: "%2".arg(model.url).arg(model.name) - width: projectsList.width * 0.25 - elide: Text.ElideRight - onLinkActivated: Qt.openUrlExternally(link) - } - Label - { - text: model.description - elide: Text.ElideRight - width: projectsList.width * 0.6 - } - Label - { - text: model.license - elide: Text.ElideRight - width: projectsList.width * 0.15 - } - } - model: ListModel - { - id: projectsModel - } - Component.onCompleted: - { - projectsModel.append({ name:"Cura", description: catalog.i18nc("@label", "Graphical user interface"), license: "AGPLv3", url: "https://github.com/Ultimaker/Cura" }); - projectsModel.append({ name:"Uranium", description: catalog.i18nc("@label", "Application framework"), license: "AGPLv3", url: "https://github.com/Ultimaker/Uranium" }); - projectsModel.append({ name:"CuraEngine", description: catalog.i18nc("@label", "GCode generator"), license: "AGPLv3", url: "https://github.com/Ultimaker/CuraEngine" }); - projectsModel.append({ name:"libArcus", description: catalog.i18nc("@label", "Interprocess communication library"), license: "AGPLv3", url: "https://github.com/Ultimaker/libArcus" }); + id: projectsList - projectsModel.append({ name:"Python", description: catalog.i18nc("@label", "Programming language"), license: "Python", url: "http://python.org/" }); - projectsModel.append({ name:"Qt5", description: catalog.i18nc("@label", "GUI framework"), license: "LGPLv3", url: "https://www.qt.io/" }); - projectsModel.append({ name:"PyQt", description: catalog.i18nc("@label", "GUI framework bindings"), license: "GPL", url: "https://riverbankcomputing.com/software/pyqt" }); - projectsModel.append({ name:"SIP", description: catalog.i18nc("@label", "C/C++ Binding library"), license: "GPL", url: "https://riverbankcomputing.com/software/sip" }); - projectsModel.append({ name:"Protobuf", description: catalog.i18nc("@label", "Data interchange format"), license: "BSD", url: "https://developers.google.com/protocol-buffers" }); - projectsModel.append({ name:"SciPy", description: catalog.i18nc("@label", "Support library for scientific computing "), license: "BSD-new", url: "https://www.scipy.org/" }); - projectsModel.append({ name:"NumPy", description: catalog.i18nc("@label", "Support library for faster math"), license: "BSD", url: "http://www.numpy.org/" }); - projectsModel.append({ name:"NumPy-STL", description: catalog.i18nc("@label", "Support library for handling STL files"), license: "BSD", url: "https://github.com/WoLpH/numpy-stl" }); - projectsModel.append({ name:"PySerial", description: catalog.i18nc("@label", "Serial communication library"), license: "Python", url: "http://pyserial.sourceforge.net/" }); - projectsModel.append({ name:"python-zeroconf", description: catalog.i18nc("@label", "ZeroConf discovery library"), license: "LGPL", url: "https://github.com/jstasiak/python-zeroconf" }); - projectsModel.append({ name:"Clipper", description: catalog.i18nc("@label", "Polygon clipping library"), license: "Boost", url: "http://www.angusj.com/delphi/clipper.php" }); - projectsModel.append({ name:"Open Sans", description: catalog.i18nc("@label", "Font"), license: "Apache 2.0", url: "https://fonts.google.com/specimen/Open+Sans" }); - projectsModel.append({ name:"Font-Awesome-SVG-PNG", description: catalog.i18nc("@label", "SVG icons"), license: "SIL OFL 1.1", url: "https://github.com/encharm/Font-Awesome-SVG-PNG" }); + width: parent.width + + delegate: Row + { + Label + { + text: "%2".arg(model.url).arg(model.name) + width: (projectsList.width * 0.25) | 0 + elide: Text.ElideRight + onLinkActivated: Qt.openUrlExternally(link) + } + Label + { + text: model.description + elide: Text.ElideRight + width: (projectsList.width * 0.6) | 0 + } + Label + { + text: model.license + elide: Text.ElideRight + width: (projectsList.width * 0.15) | 0 + } + } + model: ListModel + { + id: projectsModel + } + Component.onCompleted: + { + projectsModel.append({ name:"Cura", description: catalog.i18nc("@label", "Graphical user interface"), license: "AGPLv3", url: "https://github.com/Ultimaker/Cura" }); + projectsModel.append({ name:"Uranium", description: catalog.i18nc("@label", "Application framework"), license: "AGPLv3", url: "https://github.com/Ultimaker/Uranium" }); + projectsModel.append({ name:"CuraEngine", description: catalog.i18nc("@label", "GCode generator"), license: "AGPLv3", url: "https://github.com/Ultimaker/CuraEngine" }); + projectsModel.append({ name:"libArcus", description: catalog.i18nc("@label", "Interprocess communication library"), license: "AGPLv3", url: "https://github.com/Ultimaker/libArcus" }); + + projectsModel.append({ name:"Python", description: catalog.i18nc("@label", "Programming language"), license: "Python", url: "http://python.org/" }); + projectsModel.append({ name:"Qt5", description: catalog.i18nc("@label", "GUI framework"), license: "LGPLv3", url: "https://www.qt.io/" }); + projectsModel.append({ name:"PyQt", description: catalog.i18nc("@label", "GUI framework bindings"), license: "GPL", url: "https://riverbankcomputing.com/software/pyqt" }); + projectsModel.append({ name:"SIP", description: catalog.i18nc("@label", "C/C++ Binding library"), license: "GPL", url: "https://riverbankcomputing.com/software/sip" }); + projectsModel.append({ name:"Protobuf", description: catalog.i18nc("@label", "Data interchange format"), license: "BSD", url: "https://developers.google.com/protocol-buffers" }); + projectsModel.append({ name:"SciPy", description: catalog.i18nc("@label", "Support library for scientific computing "), license: "BSD-new", url: "https://www.scipy.org/" }); + projectsModel.append({ name:"NumPy", description: catalog.i18nc("@label", "Support library for faster math"), license: "BSD", url: "http://www.numpy.org/" }); + projectsModel.append({ name:"NumPy-STL", description: catalog.i18nc("@label", "Support library for handling STL files"), license: "BSD", url: "https://github.com/WoLpH/numpy-stl" }); + projectsModel.append({ name:"libSavitar", description: catalog.i18nc("@label", "Support library for handling 3MF files"), license: "AGPLv3", url: "https://github.com/ultimaker/libsavitar" }); + projectsModel.append({ name:"PySerial", description: catalog.i18nc("@label", "Serial communication library"), license: "Python", url: "http://pyserial.sourceforge.net/" }); + projectsModel.append({ name:"python-zeroconf", description: catalog.i18nc("@label", "ZeroConf discovery library"), license: "LGPL", url: "https://github.com/jstasiak/python-zeroconf" }); + projectsModel.append({ name:"Clipper", description: catalog.i18nc("@label", "Polygon clipping library"), license: "Boost", url: "http://www.angusj.com/delphi/clipper.php" }); + + projectsModel.append({ name:"Open Sans", description: catalog.i18nc("@label", "Font"), license: "Apache 2.0", url: "https://fonts.google.com/specimen/Open+Sans" }); + projectsModel.append({ name:"Font-Awesome-SVG-PNG", description: catalog.i18nc("@label", "SVG icons"), license: "SIL OFL 1.1", url: "https://github.com/encharm/Font-Awesome-SVG-PNG" }); + } } } rightButtons: Button { //: Close about dialog button + id: closeButton text: catalog.i18nc("@action:button","Close"); onClicked: base.visible = false; diff --git a/resources/qml/JobSpecs.qml b/resources/qml/JobSpecs.qml index 70c306f1bc..9de3c4d687 100644 --- a/resources/qml/JobSpecs.qml +++ b/resources/qml/JobSpecs.qml @@ -12,7 +12,7 @@ import Cura 1.0 as Cura Item { id: base - property bool activity: Printer.getPlatformActivity + property bool activity: Printer.platformActivity property string fileBaseName property variant activeMachineName: Cura.MachineManager.activeMachineName diff --git a/resources/qml/MonitorButton.qml b/resources/qml/MonitorButton.qml index 1b8f36b264..1f156563d1 100644 --- a/resources/qml/MonitorButton.qml +++ b/resources/qml/MonitorButton.qml @@ -80,7 +80,7 @@ Item } } - property bool activity: Printer.getPlatformActivity; + property bool activity: Printer.platformActivity; property int totalHeight: childrenRect.height + UM.Theme.getSize("default_margin").height property string fileBaseName property string statusText: diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index 9b6f32f114..94b589a636 100644 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -58,337 +58,343 @@ UM.PreferencesPage } } - Column + ScrollView { - //: Model used to check if a plugin exists - UM.PluginsModel { id: plugins } + width: parent.width + height: parent.height - //: Language selection label - UM.I18nCatalog{id: catalog; name:"cura"} - - Label + Column { - font.bold: true - text: catalog.i18nc("@label","Interface") - } + //: Model used to check if a plugin exists + UM.PluginsModel { id: plugins } + + //: Language selection label + UM.I18nCatalog{id: catalog; name:"cura"} - Row - { - spacing: UM.Theme.getSize("default_margin").width Label { - id: languageLabel - text: catalog.i18nc("@label","Language:") - anchors.verticalCenter: languageComboBox.verticalCenter + font.bold: true + text: catalog.i18nc("@label","Interface") } - ComboBox + Row { - id: languageComboBox - model: ListModel + spacing: UM.Theme.getSize("default_margin").width + Label { - id: languageList + id: languageLabel + text: catalog.i18nc("@label","Language:") + anchors.verticalCenter: languageComboBox.verticalCenter + } - Component.onCompleted: { - append({ text: "English", code: "en" }) - append({ text: "Deutsch", code: "de" }) - append({ text: "Español", code: "es" }) - append({ text: "Suomi", code: "fi" }) - append({ text: "Français", code: "fr" }) - append({ text: "Italiano", code: "it" }) - append({ text: "Nederlands", code: "nl" }) - append({ text: "Português do Brasil", code: "ptbr" }) - append({ text: "Русский", code: "ru" }) - append({ text: "Türkçe", code: "tr" }) + ComboBox + { + id: languageComboBox + model: ListModel + { + id: languageList + + Component.onCompleted: { + append({ text: "English", code: "en" }) + append({ text: "Deutsch", code: "de" }) + append({ text: "Español", code: "es" }) + append({ text: "Suomi", code: "fi" }) + append({ text: "Français", code: "fr" }) + append({ text: "Italiano", code: "it" }) + append({ text: "Nederlands", code: "nl" }) + append({ text: "Português do Brasil", code: "ptbr" }) + append({ text: "Русский", code: "ru" }) + append({ text: "Türkçe", code: "tr" }) + } + } + + currentIndex: + { + var code = UM.Preferences.getValue("general/language"); + for(var i = 0; i < languageList.count; ++i) + { + if(model.get(i).code == code) + { + return i + } + } + } + onActivated: UM.Preferences.setValue("general/language", model.get(index).code) + + Component.onCompleted: + { + // Because ListModel is stupid and does not allow using qsTr() for values. + for(var i = 0; i < languageList.count; ++i) + { + languageList.setProperty(i, "text", catalog.i18n(languageList.get(i).text)); + } + + // Glorious hack time. ComboBox does not update the text properly after changing the + // model. So change the indices around to force it to update. + currentIndex += 1; + currentIndex -= 1; } } - currentIndex: + Label { - var code = UM.Preferences.getValue("general/language"); - for(var i = 0; i < languageList.count; ++i) + id: currencyLabel + text: catalog.i18nc("@label","Currency:") + anchors.verticalCenter: languageComboBox.verticalCenter + } + TextField + { + id: currencyField + text: UM.Preferences.getValue("cura/currency") + onTextChanged: UM.Preferences.setValue("cura/currency", text) + } + } + + Label + { + id: languageCaption + + //: Language change warning + text: catalog.i18nc("@label", "You will need to restart the application for language changes to have effect.") + wrapMode: Text.WordWrap + font.italic: true + } + + Item + { + //: Spacer + height: UM.Theme.getSize("default_margin").height + width: UM.Theme.getSize("default_margin").width + } + + Label + { + font.bold: true + text: catalog.i18nc("@label","Viewport behavior") + } + + UM.TooltipArea + { + width: childrenRect.width; + height: childrenRect.height; + + text: catalog.i18nc("@info:tooltip","Highlight unsupported areas of the model in red. Without support these areas will not print properly.") + + CheckBox + { + id: showOverhangCheckbox + + checked: boolCheck(UM.Preferences.getValue("view/show_overhang")) + onClicked: UM.Preferences.setValue("view/show_overhang", checked) + + text: catalog.i18nc("@option:check","Display overhang"); + } + } + + UM.TooltipArea { + width: childrenRect.width; + height: childrenRect.height; + text: catalog.i18nc("@info:tooltip","Moves the camera so the model is in the center of the view when an model is selected") + + CheckBox + { + id: centerOnSelectCheckbox + text: catalog.i18nc("@action:button","Center camera when item is selected"); + checked: boolCheck(UM.Preferences.getValue("view/center_on_select")) + onClicked: UM.Preferences.setValue("view/center_on_select", checked) + } + } + + UM.TooltipArea { + width: childrenRect.width + height: childrenRect.height + text: catalog.i18nc("@info:tooltip", "Should models on the platform be moved so that they no longer intersect?") + + CheckBox + { + id: pushFreeCheckbox + text: catalog.i18nc("@option:check", "Ensure models are kept apart") + checked: boolCheck(UM.Preferences.getValue("physics/automatic_push_free")) + onCheckedChanged: UM.Preferences.setValue("physics/automatic_push_free", checked) + } + } + UM.TooltipArea { + width: childrenRect.width + height: childrenRect.height + text: catalog.i18nc("@info:tooltip", "Should models on the platform be moved down to touch the build plate?") + + CheckBox + { + id: dropDownCheckbox + text: catalog.i18nc("@option:check", "Automatically drop models to the build plate") + checked: boolCheck(UM.Preferences.getValue("physics/automatic_drop_down")) + onCheckedChanged: UM.Preferences.setValue("physics/automatic_drop_down", checked) + } + } + + UM.TooltipArea { + width: childrenRect.width; + height: childrenRect.height; + text: catalog.i18nc("@info:tooltip","Display 5 top layers in layer view or only the top-most layer. Rendering 5 layers takes longer, but may show more information.") + + CheckBox + { + id: topLayerCountCheckbox + text: catalog.i18nc("@action:button","Display five top layers in layer view compatibility mode"); + checked: UM.Preferences.getValue("view/top_layer_count") == 5 + onClicked: { - if(model.get(i).code == code) + if(UM.Preferences.getValue("view/top_layer_count") == 5) { - return i + UM.Preferences.setValue("view/top_layer_count", 1) + } + else + { + UM.Preferences.setValue("view/top_layer_count", 5) } } } - onActivated: UM.Preferences.setValue("general/language", model.get(index).code) + } - Component.onCompleted: + UM.TooltipArea { + width: childrenRect.width + height: childrenRect.height + text: catalog.i18nc("@info:tooltip", "Should only the top layers be displayed in layerview?") + + CheckBox { - // Because ListModel is stupid and does not allow using qsTr() for values. - for(var i = 0; i < languageList.count; ++i) - { - languageList.setProperty(i, "text", catalog.i18n(languageList.get(i).text)); - } - - // Glorious hack time. ComboBox does not update the text properly after changing the - // model. So change the indices around to force it to update. - currentIndex += 1; - currentIndex -= 1; + id: topLayersOnlyCheckbox + text: catalog.i18nc("@option:check", "Only display top layer(s) in layer view compatibility mode") + checked: boolCheck(UM.Preferences.getValue("view/only_show_top_layers")) + onCheckedChanged: UM.Preferences.setValue("view/only_show_top_layers", checked) } } + UM.TooltipArea { + width: childrenRect.width + height: childrenRect.height + text: catalog.i18nc("@info:tooltip", "Should layer be forced into compatibility mode?") + + CheckBox + { + id: forceLayerViewCompatibilityModeCheckbox + text: catalog.i18nc("@option:check", "Force layer view compatibility mode (restart required)") + checked: boolCheck(UM.Preferences.getValue("view/force_layer_view_compatibility_mode")) + onCheckedChanged: UM.Preferences.setValue("view/force_layer_view_compatibility_mode", checked) + } + } + + Item + { + //: Spacer + height: UM.Theme.getSize("default_margin").height + width: UM.Theme.getSize("default_margin").height + } + Label { - id: currencyLabel - text: catalog.i18nc("@label","Currency:") - anchors.verticalCenter: languageComboBox.verticalCenter + font.bold: true + text: catalog.i18nc("@label","Opening files") } - TextField - { - id: currencyField - text: UM.Preferences.getValue("cura/currency") - onTextChanged: UM.Preferences.setValue("cura/currency", text) - } - } - Label - { - id: languageCaption + UM.TooltipArea { + width: childrenRect.width + height: childrenRect.height + text: catalog.i18nc("@info:tooltip","Should models be scaled to the build volume if they are too large?") - //: Language change warning - text: catalog.i18nc("@label", "You will need to restart the application for language changes to have effect.") - wrapMode: Text.WordWrap - font.italic: true - } - - Item - { - //: Spacer - height: UM.Theme.getSize("default_margin").height - width: UM.Theme.getSize("default_margin").width - } - - Label - { - font.bold: true - text: catalog.i18nc("@label","Viewport behavior") - } - - UM.TooltipArea - { - width: childrenRect.width; - height: childrenRect.height; - - text: catalog.i18nc("@info:tooltip","Highlight unsupported areas of the model in red. Without support these areas will not print properly.") - - CheckBox - { - id: showOverhangCheckbox - - checked: boolCheck(UM.Preferences.getValue("view/show_overhang")) - onClicked: UM.Preferences.setValue("view/show_overhang", checked) - - text: catalog.i18nc("@option:check","Display overhang"); - } - } - - UM.TooltipArea { - width: childrenRect.width; - height: childrenRect.height; - text: catalog.i18nc("@info:tooltip","Moves the camera so the model is in the center of the view when an model is selected") - - CheckBox - { - id: centerOnSelectCheckbox - text: catalog.i18nc("@action:button","Center camera when item is selected"); - checked: boolCheck(UM.Preferences.getValue("view/center_on_select")) - onClicked: UM.Preferences.setValue("view/center_on_select", checked) - } - } - - UM.TooltipArea { - width: childrenRect.width - height: childrenRect.height - text: catalog.i18nc("@info:tooltip", "Should models on the platform be moved so that they no longer intersect?") - - CheckBox - { - id: pushFreeCheckbox - text: catalog.i18nc("@option:check", "Ensure models are kept apart") - checked: boolCheck(UM.Preferences.getValue("physics/automatic_push_free")) - onCheckedChanged: UM.Preferences.setValue("physics/automatic_push_free", checked) - } - } - UM.TooltipArea { - width: childrenRect.width - height: childrenRect.height - text: catalog.i18nc("@info:tooltip", "Should models on the platform be moved down to touch the build plate?") - - CheckBox - { - id: dropDownCheckbox - text: catalog.i18nc("@option:check", "Automatically drop models to the build plate") - checked: boolCheck(UM.Preferences.getValue("physics/automatic_drop_down")) - onCheckedChanged: UM.Preferences.setValue("physics/automatic_drop_down", checked) - } - } - - UM.TooltipArea { - width: childrenRect.width; - height: childrenRect.height; - text: catalog.i18nc("@info:tooltip","Display 5 top layers in layer view or only the top-most layer. Rendering 5 layers takes longer, but may show more information.") - - CheckBox - { - id: topLayerCountCheckbox - text: catalog.i18nc("@action:button","Display five top layers in layer view compatibility mode"); - checked: UM.Preferences.getValue("view/top_layer_count") == 5 - onClicked: + CheckBox { - if(UM.Preferences.getValue("view/top_layer_count") == 5) - { - UM.Preferences.setValue("view/top_layer_count", 1) - } - else - { - UM.Preferences.setValue("view/top_layer_count", 5) - } + id: scaleToFitCheckbox + text: catalog.i18nc("@option:check","Scale large models") + checked: boolCheck(UM.Preferences.getValue("mesh/scale_to_fit")) + onCheckedChanged: UM.Preferences.setValue("mesh/scale_to_fit", checked) } } - } - UM.TooltipArea { - width: childrenRect.width - height: childrenRect.height - text: catalog.i18nc("@info:tooltip", "Should only the top layers be displayed in layerview?") + UM.TooltipArea { + width: childrenRect.width + height: childrenRect.height + text: catalog.i18nc("@info:tooltip","An model may appear extremely small if its unit is for example in meters rather than millimeters. Should these models be scaled up?") - CheckBox - { - id: topLayersOnlyCheckbox - text: catalog.i18nc("@option:check", "Only display top layer(s) in layer view compatibility mode") - checked: boolCheck(UM.Preferences.getValue("view/only_show_top_layers")) - onCheckedChanged: UM.Preferences.setValue("view/only_show_top_layers", checked) + CheckBox + { + id: scaleTinyCheckbox + text: catalog.i18nc("@option:check","Scale extremely small models") + checked: boolCheck(UM.Preferences.getValue("mesh/scale_tiny_meshes")) + onCheckedChanged: UM.Preferences.setValue("mesh/scale_tiny_meshes", checked) + } } - } - UM.TooltipArea { - width: childrenRect.width - height: childrenRect.height - text: catalog.i18nc("@info:tooltip", "Should layer be forced into compatibility mode?") + UM.TooltipArea { + width: childrenRect.width + height: childrenRect.height + text: catalog.i18nc("@info:tooltip", "Should a prefix based on the printer name be added to the print job name automatically?") - CheckBox - { - id: forceLayerViewCompatibilityModeCheckbox - text: catalog.i18nc("@option:check", "Force layer view compatibility mode (restart required)") - checked: boolCheck(UM.Preferences.getValue("view/force_layer_view_compatibility_mode")) - onCheckedChanged: UM.Preferences.setValue("view/force_layer_view_compatibility_mode", checked) + CheckBox + { + id: prefixJobNameCheckbox + text: catalog.i18nc("@option:check", "Add machine prefix to job name") + checked: boolCheck(UM.Preferences.getValue("cura/jobname_prefix")) + onCheckedChanged: UM.Preferences.setValue("cura/jobname_prefix", checked) + } } - } - Item - { - //: Spacer - height: UM.Theme.getSize("default_margin").height - width: UM.Theme.getSize("default_margin").height - } + UM.TooltipArea { + width: childrenRect.width + height: childrenRect.height + text: catalog.i18nc("@info:tooltip", "Should a summary be shown when saving a project file?") - Label - { - font.bold: true - text: catalog.i18nc("@label","Opening files") - } - - UM.TooltipArea { - width: childrenRect.width - height: childrenRect.height - text: catalog.i18nc("@info:tooltip","Should models be scaled to the build volume if they are too large?") - - CheckBox - { - id: scaleToFitCheckbox - text: catalog.i18nc("@option:check","Scale large models") - checked: boolCheck(UM.Preferences.getValue("mesh/scale_to_fit")) - onCheckedChanged: UM.Preferences.setValue("mesh/scale_to_fit", checked) + CheckBox + { + text: catalog.i18nc("@option:check", "Show summary dialog when saving project") + checked: boolCheck(UM.Preferences.getValue("cura/dialog_on_project_save")) + onCheckedChanged: UM.Preferences.setValue("cura/dialog_on_project_save", checked) + } } - } - UM.TooltipArea { - width: childrenRect.width - height: childrenRect.height - text: catalog.i18nc("@info:tooltip","An model may appear extremely small if its unit is for example in meters rather than millimeters. Should these models be scaled up?") - CheckBox + Item { - id: scaleTinyCheckbox - text: catalog.i18nc("@option:check","Scale extremely small models") - checked: boolCheck(UM.Preferences.getValue("mesh/scale_tiny_meshes")) - onCheckedChanged: UM.Preferences.setValue("mesh/scale_tiny_meshes", checked) + //: Spacer + height: UM.Theme.getSize("default_margin").height + width: UM.Theme.getSize("default_margin").height } - } - UM.TooltipArea { - width: childrenRect.width - height: childrenRect.height - text: catalog.i18nc("@info:tooltip", "Should a prefix based on the printer name be added to the print job name automatically?") - - CheckBox + Label { - id: prefixJobNameCheckbox - text: catalog.i18nc("@option:check", "Add machine prefix to job name") - checked: boolCheck(UM.Preferences.getValue("cura/jobname_prefix")) - onCheckedChanged: UM.Preferences.setValue("cura/jobname_prefix", checked) + font.bold: true + visible: checkUpdatesCheckbox.visible || sendDataCheckbox.visible + text: catalog.i18nc("@label","Privacy") } - } - UM.TooltipArea { - width: childrenRect.width - height: childrenRect.height - text: catalog.i18nc("@info:tooltip", "Should a summary be shown when saving a project file?") + UM.TooltipArea { + visible: plugins.find("id", "UpdateChecker") > -1 + width: childrenRect.width + height: visible ? childrenRect.height : 0 + text: catalog.i18nc("@info:tooltip","Should Cura check for updates when the program is started?") - CheckBox - { - text: catalog.i18nc("@option:check", "Show summary dialog when saving project") - checked: boolCheck(UM.Preferences.getValue("cura/dialog_on_project_save")) - onCheckedChanged: UM.Preferences.setValue("cura/dialog_on_project_save", checked) + CheckBox + { + id: checkUpdatesCheckbox + text: catalog.i18nc("@option:check","Check for updates on start") + checked: boolCheck(UM.Preferences.getValue("info/automatic_update_check")) + onCheckedChanged: UM.Preferences.setValue("info/automatic_update_check", checked) + } } - } + UM.TooltipArea { + visible: plugins.find("id", "SliceInfoPlugin") > -1 + width: childrenRect.width + height: visible ? childrenRect.height : 0 + text: catalog.i18nc("@info:tooltip","Should anonymous data about your print be sent to Ultimaker? Note, no models, IP addresses or other personally identifiable information is sent or stored.") - Item - { - //: Spacer - height: UM.Theme.getSize("default_margin").height - width: UM.Theme.getSize("default_margin").height - } - - Label - { - font.bold: true - visible: checkUpdatesCheckbox.visible || sendDataCheckbox.visible - text: catalog.i18nc("@label","Privacy") - } - - UM.TooltipArea { - visible: plugins.find("id", "UpdateChecker") > -1 - width: childrenRect.width - height: visible ? childrenRect.height : 0 - text: catalog.i18nc("@info:tooltip","Should Cura check for updates when the program is started?") - - CheckBox - { - id: checkUpdatesCheckbox - text: catalog.i18nc("@option:check","Check for updates on start") - checked: boolCheck(UM.Preferences.getValue("info/automatic_update_check")) - onCheckedChanged: UM.Preferences.setValue("info/automatic_update_check", checked) - } - } - - UM.TooltipArea { - visible: plugins.find("id", "SliceInfoPlugin") > -1 - width: childrenRect.width - height: visible ? childrenRect.height : 0 - text: catalog.i18nc("@info:tooltip","Should anonymous data about your print be sent to Ultimaker? Note, no models, IP addresses or other personally identifiable information is sent or stored.") - - CheckBox - { - id: sendDataCheckbox - text: catalog.i18nc("@option:check","Send (anonymous) print information") - checked: boolCheck(UM.Preferences.getValue("info/send_slice_info")) - onCheckedChanged: UM.Preferences.setValue("info/send_slice_info", checked) + CheckBox + { + id: sendDataCheckbox + text: catalog.i18nc("@option:check","Send (anonymous) print information") + checked: boolCheck(UM.Preferences.getValue("info/send_slice_info")) + onCheckedChanged: UM.Preferences.setValue("info/send_slice_info", checked) + } } } } diff --git a/resources/qml/SaveButton.qml b/resources/qml/SaveButton.qml index 2b435aad1b..bf63ec518b 100644 --- a/resources/qml/SaveButton.qml +++ b/resources/qml/SaveButton.qml @@ -14,7 +14,7 @@ Item { property real progress: UM.Backend.progress; property int backendState: UM.Backend.state; - property bool activity: Printer.getPlatformActivity; + property bool activity: Printer.platformActivity; property int totalHeight: childrenRect.height + UM.Theme.getSize("default_margin").height property string fileBaseName property string statusText: