diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py old mode 100644 new mode 100755 index c911844b58..1b04e0390a --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -385,7 +385,7 @@ class BuildVolume(SceneNode): self.setPosition(Vector(0, -self._raft_thickness, 0), SceneNode.TransformSpace.World) self.raftThicknessChanged.emit() - def _updateExtraZClearance(self): + def _updateExtraZClearance(self) -> None: extra_z = 0.0 extruders = ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId()) use_extruders = False diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 174e894087..301dff3d20 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -366,11 +366,6 @@ class CuraApplication(QtApplication): showPrintMonitor = pyqtSignal(bool, arguments = ["show"]) - def setViewLegendItems(self, items): - self.viewLegendItemsChanged.emit(items) - - viewLegendItemsChanged = pyqtSignal("QVariantList", arguments = ["items"]) - ## Cura has multiple locations where instance containers need to be saved, so we need to handle this differently. # # Note that the AutoSave plugin also calls this method. diff --git a/plugins/LayerView/LayerPass.py b/plugins/LayerView/LayerPass.py index 4fc5f66793..b706f21877 100755 --- a/plugins/LayerView/LayerPass.py +++ b/plugins/LayerView/LayerPass.py @@ -97,11 +97,11 @@ class LayerPass(RenderPass): # Create a new batch that is not range-limited batch = RenderBatch(self._layer_shader, type = RenderBatch.RenderType.Solid) - if self._layer_view._current_layer_mesh: - batch.addItem(node.getWorldTransformation(), self._layer_view._current_layer_mesh) + if self._layer_view.getCurrentLayerMesh(): + batch.addItem(node.getWorldTransformation(), self._layer_view.getCurrentLayerMesh()) - if self._layer_view._current_layer_jumps: - batch.addItem(node.getWorldTransformation(), self._layer_view._current_layer_jumps) + if self._layer_view.getCurrentLayerJumps(): + batch.addItem(node.getWorldTransformation(), self._layer_view.getCurrentLayerJumps()) if len(batch.items) > 0: batch.render(self._scene.getActiveCamera()) diff --git a/plugins/LayerView/LayerView.py b/plugins/LayerView/LayerView.py old mode 100644 new mode 100755 index 0a315b5865..c696081ca3 --- a/plugins/LayerView/LayerView.py +++ b/plugins/LayerView/LayerView.py @@ -67,16 +67,14 @@ class LayerView(View): self._resetSettings() self._legend_items = None + self._show_travel_moves = False Preferences.getInstance().addPreference("view/top_layer_count", 5) Preferences.getInstance().addPreference("view/only_show_top_layers", False) Preferences.getInstance().addPreference("view/force_layer_view_compatibility_mode", False) Preferences.getInstance().addPreference("layerview/layer_view_type", 0) - Preferences.getInstance().addPreference("layerview/extruder0_opacity", 1.0) - Preferences.getInstance().addPreference("layerview/extruder1_opacity", 1.0) - Preferences.getInstance().addPreference("layerview/extruder2_opacity", 1.0) - Preferences.getInstance().addPreference("layerview/extruder3_opacity", 1.0) + Preferences.getInstance().addPreference("layerview/extruder_opacities", "") Preferences.getInstance().addPreference("layerview/show_travel_moves", False) Preferences.getInstance().addPreference("layerview/show_helpers", True) @@ -196,8 +194,9 @@ class LayerView(View): # \param extruder_nr 0..3 # \param opacity 0.0 .. 1.0 def setExtruderOpacity(self, extruder_nr, opacity): - self._extruder_opacity[extruder_nr] = opacity - self.currentLayerNumChanged.emit() + if 0 <= extruder_nr <= 3: + self._extruder_opacity[extruder_nr] = opacity + self.currentLayerNumChanged.emit() def getExtruderOpacities(self): return self._extruder_opacity @@ -278,12 +277,6 @@ class LayerView(View): def endRendering(self): pass - def enableLegend(self): - Application.getInstance().setViewLegendItems(self._getLegendItems()) - - def disableLegend(self): - Application.getInstance().setViewLegendItems([]) - def event(self, event): modifiers = QApplication.keyboardModifiers() ctrl_is_active = modifiers == Qt.ControlModifier @@ -316,9 +309,6 @@ 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 or self._compatibility_mode: - self.enableLegend() - elif event.type == Event.ViewDeactivateEvent: self._wireprint_warning_message.hide() Application.getInstance().globalContainerStackChanged.disconnect(self._onGlobalStackChanged) @@ -328,7 +318,11 @@ class LayerView(View): self._composite_pass.setLayerBindings(self._old_layer_bindings) self._composite_pass.setCompositeShader(self._old_composite_shader) - self.disableLegend() + def getCurrentLayerMesh(self): + return self._current_layer_mesh + + def getCurrentLayerJumps(self): + return self._current_layer_jumps def _onGlobalStackChanged(self): if self._global_container_stack: @@ -370,7 +364,8 @@ class LayerView(View): return self.resetLayerData() # Reset the layer data only when job is done. Doing it now prevents "blinking" data. self._current_layer_mesh = job.getResult().get("layers") - self._current_layer_jumps = job.getResult().get("jumps") + if self._show_travel_moves: + self._current_layer_jumps = job.getResult().get("jumps") self._controller.getScene().sceneChanged.emit(self._controller.getScene().getRoot()) self._top_layers_job = None @@ -383,10 +378,12 @@ class LayerView(View): self.setLayerViewType(int(float(Preferences.getInstance().getValue("layerview/layer_view_type")))); - self.setExtruderOpacity(0, float(Preferences.getInstance().getValue("layerview/extruder0_opacity"))) - self.setExtruderOpacity(1, float(Preferences.getInstance().getValue("layerview/extruder1_opacity"))) - self.setExtruderOpacity(2, float(Preferences.getInstance().getValue("layerview/extruder2_opacity"))) - self.setExtruderOpacity(3, float(Preferences.getInstance().getValue("layerview/extruder3_opacity"))) + for extruder_nr, extruder_opacity in enumerate(Preferences.getInstance().getValue("layerview/extruder_opacities").split("|")): + try: + opacity = float(extruder_opacity) + except ValueError: + opacity = 1.0 + self.setExtruderOpacity(extruder_nr, opacity) self.setShowTravelMoves(bool(Preferences.getInstance().getValue("layerview/show_travel_moves"))) self.setShowHelpers(bool(Preferences.getInstance().getValue("layerview/show_helpers"))) @@ -402,10 +399,7 @@ class LayerView(View): "view/only_show_top_layers", "view/force_layer_view_compatibility_mode", "layerview/layer_view_type", - "layerview/extruder0_opacity", - "layerview/extruder1_opacity", - "layerview/extruder2_opacity", - "layerview/extruder3_opacity", + "layerview/extruder_opacities", "layerview/show_travel_moves", "layerview/show_helpers", "layerview/show_skin", @@ -415,24 +409,6 @@ class LayerView(View): self._updateWithPreferences() - def _getLegendItems(self): - if self._legend_items is None: - theme = Application.getInstance().getTheme() - self._legend_items = [ - {"color": theme.getColor("layerview_inset_0").name(), "title": catalog.i18nc("@label:layerview polygon type", "Outer Wall")}, # Inset0Type - {"color": theme.getColor("layerview_inset_x").name(), "title": catalog.i18nc("@label:layerview polygon type", "Inner Wall")}, # InsetXType - {"color": theme.getColor("layerview_skin").name(), "title": catalog.i18nc("@label:layerview polygon type", "Top / Bottom")}, # SkinType - {"color": theme.getColor("layerview_infill").name(), "title": catalog.i18nc("@label:layerview polygon type", "Infill")}, # InfillType - {"color": theme.getColor("layerview_support").name(), "title": catalog.i18nc("@label:layerview polygon type", "Support Skin")}, # SupportType - {"color": theme.getColor("layerview_support_infill").name(), "title": catalog.i18nc("@label:layerview polygon type", "Support Infill")}, # SupportInfillType - {"color": theme.getColor("layerview_support_interface").name(), "title": catalog.i18nc("@label:layerview polygon type", "Support Interface")}, # SupportInterfaceType - {"color": theme.getColor("layerview_skirt").name(), "title": catalog.i18nc("@label:layerview polygon type", "Build Plate Adhesion")}, # SkirtType - {"color": theme.getColor("layerview_move_combing").name(), "title": catalog.i18nc("@label:layerview polygon type", "Travel Move")}, # MoveCombingType - {"color": theme.getColor("layerview_move_retraction").name(), "title": catalog.i18nc("@label:layerview polygon type", "Retraction Move")}, # MoveRetractionType - #{"color": theme.getColor("layerview_none").name(), "title": catalog.i18nc("@label:layerview polygon type", "Unknown")} # NoneType - ] - return self._legend_items - class _CreateTopLayersJob(Job): def __init__(self, scene, layer_number, solid_layers): diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml index 9da7a0f0d2..a24409e8d6 100644 --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -10,280 +10,194 @@ import UM 1.0 as UM Item { - width: UM.Theme.getSize("button").width - height: UM.Theme.getSize("slider_layerview_size").height - - Slider - { - id: sliderMinimumLayer - width: UM.Theme.getSize("slider_layerview_size").width - height: UM.Theme.getSize("slider_layerview_size").height - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("slider_layerview_margin").width * 0.2 - orientation: Qt.Vertical - minimumValue: 0; - maximumValue: UM.LayerView.numLayers-1; - stepSize: 1 - - property real pixelsPerStep: ((height - UM.Theme.getSize("slider_handle").height) / (maximumValue - minimumValue)) * stepSize; - - value: UM.LayerView.minimumLayer - onValueChanged: { - UM.LayerView.setMinimumLayer(value) - if (value > UM.LayerView.currentLayer) { - UM.LayerView.setCurrentLayer(value); - } + id: base + width: { + if (UM.LayerView.compatibilityMode) { + return UM.Theme.getSize("layerview_menu_size_compatibility").width; + } else { + return UM.Theme.getSize("layerview_menu_size").width; } - - style: UM.Theme.styles.slider; } - - Slider - { - id: slider - width: UM.Theme.getSize("slider_layerview_size").width - height: UM.Theme.getSize("slider_layerview_size").height - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("slider_layerview_margin").width * 0.8 - orientation: Qt.Vertical - minimumValue: 0; - maximumValue: UM.LayerView.numLayers; - stepSize: 1 - - property real pixelsPerStep: ((height - UM.Theme.getSize("slider_handle").height) / (maximumValue - minimumValue)) * stepSize; - - value: UM.LayerView.currentLayer - onValueChanged: { - UM.LayerView.setCurrentLayer(value); - if (value < UM.LayerView.minimumLayer) { - UM.LayerView.setMinimumLayer(value); - } - } - - style: UM.Theme.styles.slider; - - Rectangle - { - x: parent.width + UM.Theme.getSize("slider_layerview_background").width / 2; - y: parent.height - (parent.value * parent.pixelsPerStep) - UM.Theme.getSize("slider_handle").height * 1.25; - - height: UM.Theme.getSize("slider_handle").height + UM.Theme.getSize("default_margin").height - width: valueLabel.width + UM.Theme.getSize("default_margin").width - Behavior on height { NumberAnimation { duration: 50; } } - - border.width: UM.Theme.getSize("default_lining").width - border.color: UM.Theme.getColor("slider_groove_border") - color: UM.Theme.getColor("tool_panel_background") - - visible: UM.LayerView.layerActivity && Printer.platformActivity ? true : false - - TextField - { - id: valueLabel - property string maxValue: slider.maximumValue + 1 - text: slider.value + 1 - horizontalAlignment: TextInput.AlignRight; - onEditingFinished: - { - // Ensure that the cursor is at the first position. On some systems the text isn't fully visible - // Seems to have to do something with different dpi densities that QML doesn't quite handle. - // Another option would be to increase the size even further, but that gives pretty ugly results. - cursorPosition = 0; - if(valueLabel.text != '') - { - slider.value = valueLabel.text - 1; - } - } - validator: IntValidator { bottom: 1; top: slider.maximumValue + 1; } - - anchors.left: parent.left; - anchors.leftMargin: UM.Theme.getSize("default_margin").width / 2; - anchors.verticalCenter: parent.verticalCenter; - - width: Math.max(UM.Theme.getSize("line").width * maxValue.length + 2, 20); - style: TextFieldStyle - { - textColor: UM.Theme.getColor("setting_control_text"); - font: UM.Theme.getFont("default"); - background: Item { } - } - } - - BusyIndicator - { - id: busyIndicator; - anchors.left: parent.right; - anchors.leftMargin: UM.Theme.getSize("default_margin").width / 2; - anchors.verticalCenter: parent.verticalCenter; - - width: UM.Theme.getSize("slider_handle").height; - height: width; - - running: UM.LayerView.busy; - visible: UM.LayerView.busy; - } + height: { + if (UM.LayerView.compatibilityMode) { + return UM.Theme.getSize("layerview_menu_size_compatibility").height; + } else { + return UM.Theme.getSize("layerview_menu_size").height + UM.LayerView.extruderCount * (UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("layerview_row_spacing").height) } } Rectangle { - id: slider_background + id: layerViewMenu anchors.left: parent.left - anchors.verticalCenter: parent.verticalCenter + anchors.top: parent.top + width: parent.width + height: parent.height z: slider.z - 1 - width: UM.Theme.getSize("slider_layerview_background").width - height: slider.height + UM.Theme.getSize("default_margin").height * 2 - color: UM.Theme.getColor("tool_panel_background"); - border.width: UM.Theme.getSize("default_lining").width - border.color: UM.Theme.getColor("lining") - - MouseArea { - id: sliderMouseArea - property double manualStepSize: slider.maximumValue / 11 - anchors.fill: parent - onWheel: { - slider.value = wheel.angleDelta.y < 0 ? slider.value - sliderMouseArea.manualStepSize : slider.value + sliderMouseArea.manualStepSize - } - } - } - - Rectangle { - anchors.left: parent.left - anchors.verticalCenter: parent.verticalCenter - anchors.top: slider_background.bottom - anchors.topMargin: UM.Theme.getSize("default_margin").height - width: UM.Theme.getSize("slider_layerview_background").width * 3 - height: slider.height + UM.Theme.getSize("default_margin").height * 2 - color: UM.Theme.getColor("tool_panel_background"); - border.width: UM.Theme.getSize("default_lining").width - border.color: UM.Theme.getColor("lining") - - ListModel // matches LayerView.py - { - id: layerViewTypes - ListElement { - text: "Material Color" - type_id: 0 - } - ListElement { - text: "Line Type" - type_id: 1 // these ids match the switching in the shader - } - } - - ComboBox - { - id: layerTypeCombobox - anchors.top: parent.top - anchors.left: parent.left - model: layerViewTypes - visible: !UM.LayerView.compatibilityMode - property int layer_view_type: UM.Preferences.getValue("layerview/layer_view_type") - currentIndex: layer_view_type // index matches type_id - onActivated: { - // Combobox selection - var type_id = layerViewTypes.get(index).type_id; - UM.Preferences.setValue("layerview/layer_view_type", type_id); - updateLegend(); - } - onModelChanged: { - updateLegend(); - } - // Update visibility of legend. - function updateLegend() { - var type_id = layerViewTypes.get(currentIndex).type_id; - if (UM.LayerView.compatibilityMode || (type_id == 1)) { - // Line type - UM.LayerView.enableLegend(); - } else { - UM.LayerView.disableLegend(); - } - } - } - - Label - { - id: compatibilityModeLabel - anchors.top: parent.top - anchors.left: parent.left - text: catalog.i18nc("@label","Compatibility Mode") - visible: UM.LayerView.compatibilityMode - } - - Connections { - target: UM.Preferences - onPreferenceChanged: - { - layerTypeCombobox.layer_view_type = UM.Preferences.getValue("layerview/layer_view_type"); - view_settings.extruder0_checked = UM.Preferences.getValue("layerview/extruder0_opacity") > 0.5; - view_settings.extruder1_checked = UM.Preferences.getValue("layerview/extruder1_opacity") > 0.5; - view_settings.extruder2_checked = UM.Preferences.getValue("layerview/extruder2_opacity") > 0.5; - view_settings.extruder3_checked = UM.Preferences.getValue("layerview/extruder3_opacity") > 0.5; - view_settings.show_travel_moves = UM.Preferences.getValue("layerview/show_travel_moves"); - view_settings.show_helpers = UM.Preferences.getValue("layerview/show_helpers"); - view_settings.show_skin = UM.Preferences.getValue("layerview/show_skin"); - view_settings.show_infill = UM.Preferences.getValue("layerview/show_infill"); - } - } + color: UM.Theme.getColor("tool_panel_background") ColumnLayout { id: view_settings - property bool extruder0_checked: UM.Preferences.getValue("layerview/extruder0_opacity") > 0.5 - property bool extruder1_checked: UM.Preferences.getValue("layerview/extruder1_opacity") > 0.5 - property bool extruder2_checked: UM.Preferences.getValue("layerview/extruder2_opacity") > 0.5 - property bool extruder3_checked: UM.Preferences.getValue("layerview/extruder3_opacity") > 0.5 + property var extruder_opacities: UM.Preferences.getValue("layerview/extruder_opacities").split("|") property bool show_travel_moves: UM.Preferences.getValue("layerview/show_travel_moves") property bool show_helpers: UM.Preferences.getValue("layerview/show_helpers") property bool show_skin: UM.Preferences.getValue("layerview/show_skin") property bool show_infill: UM.Preferences.getValue("layerview/show_infill") + property bool show_legend: UM.LayerView.compatibilityMode || UM.Preferences.getValue("layerview/layer_view_type") == 1 + property bool only_show_top_layers: UM.Preferences.getValue("view/only_show_top_layers") + property int top_layer_count: UM.Preferences.getValue("view/top_layer_count") - anchors.top: UM.LayerView.compatibilityMode ? compatibilityModeLabel.bottom : layerTypeCombobox.bottom + anchors.top: parent.top anchors.topMargin: UM.Theme.getSize("default_margin").height anchors.left: parent.left anchors.leftMargin: UM.Theme.getSize("default_margin").width + spacing: UM.Theme.getSize("layerview_row_spacing").height - CheckBox { - checked: view_settings.extruder0_checked - onClicked: { - UM.Preferences.setValue("layerview/extruder0_opacity", checked ? 1.0 : 0.0); + Label + { + id: layersLabel + anchors.left: parent.left + text: catalog.i18nc("@label","View Mode: Layers") + font.bold: true + } + + Label + { + id: spaceLabel + anchors.left: parent.left + text: " " + font.pointSize: 0.5 + } + + Label + { + id: layerViewTypesLabel + anchors.left: parent.left + text: catalog.i18nc("@label","Color scheme") + visible: !UM.LayerView.compatibilityMode + Layout.fillWidth: true + } + + ListModel // matches LayerView.py + { + id: layerViewTypes + } + + Component.onCompleted: + { + layerViewTypes.append({ + text: catalog.i18nc("@label:listbox", "Material Color"), + type_id: 0 + }) + layerViewTypes.append({ + text: catalog.i18nc("@label:listbox", "Line Type"), + type_id: 1 // these ids match the switching in the shader + }) + } + + ComboBox + { + id: layerTypeCombobox + anchors.left: parent.left + Layout.fillWidth: true + Layout.preferredWidth: UM.Theme.getSize("layerview_row").width + model: layerViewTypes + visible: !UM.LayerView.compatibilityMode + + property int layer_view_type: UM.Preferences.getValue("layerview/layer_view_type") + currentIndex: layer_view_type // index matches type_id + onActivated: { + // Combobox selection + var type_id = index; + UM.Preferences.setValue("layerview/layer_view_type", type_id); + updateLegend(type_id); } - text: "Extruder 1" - visible: !UM.LayerView.compatibilityMode && (UM.LayerView.extruderCount >= 1) - } - CheckBox { - checked: view_settings.extruder1_checked - onClicked: { - UM.Preferences.setValue("layerview/extruder1_opacity", checked ? 1.0 : 0.0); + onModelChanged: { + updateLegend(UM.Preferences.getValue("layerview/layer_view_type")); } - text: "Extruder 2" - visible: !UM.LayerView.compatibilityMode && (UM.LayerView.extruderCount >= 2) - } - CheckBox { - checked: view_settings.extruder2_checked - onClicked: { - UM.Preferences.setValue("layerview/extruder2_opacity", checked ? 1.0 : 0.0); + + // Update visibility of legend. + function updateLegend(type_id) { + if (UM.LayerView.compatibilityMode || (type_id == 1)) { + // Line type + view_settings.show_legend = true; + } else { + view_settings.show_legend = false; + } } - text: "Extruder 3" - visible: !UM.LayerView.compatibilityMode && (UM.LayerView.etruderCount >= 3) } - CheckBox { - checked: view_settings.extruder3_checked - onClicked: { - UM.Preferences.setValue("layerview/extruder3_opacity", checked ? 1.0 : 0.0); + + Label + { + id: compatibilityModeLabel + anchors.left: parent.left + text: catalog.i18nc("@label","Compatibility Mode") + visible: UM.LayerView.compatibilityMode + Layout.fillWidth: true + Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + Layout.preferredWidth: UM.Theme.getSize("layerview_row").width + } + + Label + { + id: space2Label + anchors.left: parent.left + text: " " + font.pointSize: 0.5 + } + + Connections { + target: UM.Preferences + onPreferenceChanged: + { + layerTypeCombobox.layer_view_type = UM.Preferences.getValue("layerview/layer_view_type"); + view_settings.extruder_opacities = UM.Preferences.getValue("layerview/extruder_opacities").split("|"); + view_settings.show_travel_moves = UM.Preferences.getValue("layerview/show_travel_moves"); + view_settings.show_helpers = UM.Preferences.getValue("layerview/show_helpers"); + view_settings.show_skin = UM.Preferences.getValue("layerview/show_skin"); + view_settings.show_infill = UM.Preferences.getValue("layerview/show_infill"); + view_settings.only_show_top_layers = UM.Preferences.getValue("view/only_show_top_layers"); + view_settings.top_layer_count = UM.Preferences.getValue("view/top_layer_count"); } - text: "Extruder 4" - visible: !UM.LayerView.compatibilityMode && (UM.LayerView.extruderCount >= 4) } - Label { - text: "Other extruders always visible" - visible: !UM.LayerView.compatibilityMode && (UM.LayerView.extruderCount >= 5) + + Repeater { + model: UM.LayerView.extruderCount + CheckBox { + checked: view_settings.extruder_opacities[index] > 0.5 || view_settings.extruder_opacities[index] == undefined || view_settings.extruder_opacities[index] == "" + onClicked: { + view_settings.extruder_opacities[index] = checked ? 1.0 : 0.0 + UM.Preferences.setValue("layerview/extruder_opacities", view_settings.extruder_opacities.join("|")); + } + text: catalog.i18nc("@label", "Extruder %1").arg(index + 1) + visible: !UM.LayerView.compatibilityMode + enabled: index + 1 <= 4 + Layout.fillWidth: true + Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + Layout.preferredWidth: UM.Theme.getSize("layerview_row").width + } } + CheckBox { checked: view_settings.show_travel_moves onClicked: { UM.Preferences.setValue("layerview/show_travel_moves", checked); } - text: catalog.i18nc("@label", "Show Travel Moves") + text: catalog.i18nc("@label", "Show Travels") + Rectangle { + anchors.top: parent.top + anchors.topMargin: 2 + anchors.right: parent.right + width: UM.Theme.getSize("layerview_legend_size").width + height: UM.Theme.getSize("layerview_legend_size").height + color: UM.Theme.getColor("layerview_move_combing") + border.width: UM.Theme.getSize("default_lining").width + border.color: UM.Theme.getColor("lining") + visible: view_settings.show_legend + } + Layout.fillWidth: true + Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + Layout.preferredWidth: UM.Theme.getSize("layerview_row").width } CheckBox { checked: view_settings.show_helpers @@ -291,6 +205,20 @@ Item UM.Preferences.setValue("layerview/show_helpers", checked); } text: catalog.i18nc("@label", "Show Helpers") + Rectangle { + anchors.top: parent.top + anchors.topMargin: 2 + anchors.right: parent.right + width: UM.Theme.getSize("layerview_legend_size").width + height: UM.Theme.getSize("layerview_legend_size").height + color: UM.Theme.getColor("layerview_support") + border.width: UM.Theme.getSize("default_lining").width + border.color: UM.Theme.getColor("lining") + visible: view_settings.show_legend + } + Layout.fillWidth: true + Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + Layout.preferredWidth: UM.Theme.getSize("layerview_row").width } CheckBox { checked: view_settings.show_skin @@ -298,6 +226,20 @@ Item UM.Preferences.setValue("layerview/show_skin", checked); } text: catalog.i18nc("@label", "Show Shell") + Rectangle { + anchors.top: parent.top + anchors.topMargin: 2 + anchors.right: parent.right + width: UM.Theme.getSize("layerview_legend_size").width + height: UM.Theme.getSize("layerview_legend_size").height + color: UM.Theme.getColor("layerview_inset_0") + border.width: UM.Theme.getSize("default_lining").width + border.color: UM.Theme.getColor("lining") + visible: view_settings.show_legend + } + Layout.fillWidth: true + Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + Layout.preferredWidth: UM.Theme.getSize("layerview_row").width } CheckBox { checked: view_settings.show_infill @@ -305,6 +247,203 @@ Item UM.Preferences.setValue("layerview/show_infill", checked); } text: catalog.i18nc("@label", "Show Infill") + Rectangle { + anchors.top: parent.top + anchors.topMargin: 2 + anchors.right: parent.right + width: UM.Theme.getSize("layerview_legend_size").width + height: UM.Theme.getSize("layerview_legend_size").height + color: UM.Theme.getColor("layerview_infill") + border.width: UM.Theme.getSize("default_lining").width + border.color: UM.Theme.getColor("lining") + visible: view_settings.show_legend + } + Layout.fillWidth: true + Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + Layout.preferredWidth: UM.Theme.getSize("layerview_row").width + } + CheckBox { + checked: view_settings.only_show_top_layers + onClicked: { + UM.Preferences.setValue("view/only_show_top_layers", checked ? 1.0 : 0.0); + } + text: catalog.i18nc("@label", "Only Show Top Layers") + visible: UM.LayerView.compatibilityMode + } + CheckBox { + checked: view_settings.top_layer_count == 5 + onClicked: { + UM.Preferences.setValue("view/top_layer_count", checked ? 5 : 1); + } + text: catalog.i18nc("@label", "Show 5 Detailed Layers On Top") + visible: UM.LayerView.compatibilityMode + } + + Label + { + id: topBottomLabel + anchors.left: parent.left + text: catalog.i18nc("@label","Top / Bottom") + Rectangle { + anchors.top: parent.top + anchors.topMargin: 2 + anchors.right: parent.right + width: UM.Theme.getSize("layerview_legend_size").width + height: UM.Theme.getSize("layerview_legend_size").height + color: UM.Theme.getColor("layerview_skin") + border.width: UM.Theme.getSize("default_lining").width + border.color: UM.Theme.getColor("lining") + } + Layout.fillWidth: true + Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + Layout.preferredWidth: UM.Theme.getSize("layerview_row").width + visible: view_settings.show_legend + } + + Label + { + id: innerWallLabel + anchors.left: parent.left + text: catalog.i18nc("@label","Inner Wall") + Rectangle { + anchors.top: parent.top + anchors.topMargin: 2 + anchors.right: parent.right + width: UM.Theme.getSize("layerview_legend_size").width + height: UM.Theme.getSize("layerview_legend_size").height + color: UM.Theme.getColor("layerview_inset_x") + border.width: UM.Theme.getSize("default_lining").width + border.color: UM.Theme.getColor("lining") + visible: view_settings.show_legend + } + Layout.fillWidth: true + Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + Layout.preferredWidth: UM.Theme.getSize("layerview_row").width + visible: view_settings.show_legend + } + + } + + Slider + { + id: sliderMinimumLayer + + anchors { + top: parent.top + bottom: parent.bottom + right: layerViewMenu.right + margins: UM.Theme.getSize("slider_layerview_margin").height + rightMargin: UM.Theme.getSize("slider_layerview_margin").width * 0.8 + } + width: UM.Theme.getSize("slider_layerview_size").width + orientation: Qt.Vertical + minimumValue: 0; + maximumValue: UM.LayerView.numLayers - 1; + stepSize: 1 + + property real pixelsPerStep: ((height - UM.Theme.getSize("slider_handle").height) / (maximumValue - minimumValue)) * stepSize + + value: UM.LayerView.minimumLayer + onValueChanged: { + UM.LayerView.setMinimumLayer(value) + if (value > UM.LayerView.currentLayer) { + UM.LayerView.setCurrentLayer(value); + } + } + + style: UM.Theme.styles.slider; + } + + Slider + { + id: slider + + anchors { + top: parent.top + bottom: parent.bottom + right: layerViewMenu.right + margins: UM.Theme.getSize("slider_layerview_margin").height + rightMargin: UM.Theme.getSize("slider_layerview_margin").width * 0.2 + } + width: UM.Theme.getSize("slider_layerview_size").width + + orientation: Qt.Vertical + minimumValue: 0; + maximumValue: UM.LayerView.numLayers; + stepSize: 1 + + property real pixelsPerStep: ((height - UM.Theme.getSize("slider_handle").height) / (maximumValue - minimumValue)) * stepSize; + + value: UM.LayerView.currentLayer + onValueChanged: { + UM.LayerView.setCurrentLayer(value); + if (value < UM.LayerView.minimumLayer) { + UM.LayerView.setMinimumLayer(value); + } + } + + style: UM.Theme.styles.slider; + + Rectangle + { + x: parent.width + UM.Theme.getSize("slider_layerview_background").width / 2; + y: parent.height - (parent.value * parent.pixelsPerStep) - UM.Theme.getSize("slider_handle").height * 1.25; + + height: UM.Theme.getSize("slider_handle").height + UM.Theme.getSize("default_margin").height + width: valueLabel.width + UM.Theme.getSize("default_margin").width + Behavior on height { NumberAnimation { duration: 50; } } + + border.width: UM.Theme.getSize("default_lining").width + border.color: UM.Theme.getColor("slider_groove_border") + color: UM.Theme.getColor("tool_panel_background") + + visible: UM.LayerView.layerActivity && Printer.platformActivity ? true : false + + TextField + { + id: valueLabel + property string maxValue: slider.maximumValue + 1 + text: slider.value + 1 + horizontalAlignment: TextInput.AlignRight; + onEditingFinished: + { + // Ensure that the cursor is at the first position. On some systems the text isn't fully visible + // Seems to have to do something with different dpi densities that QML doesn't quite handle. + // Another option would be to increase the size even further, but that gives pretty ugly results. + cursorPosition = 0; + if(valueLabel.text != '') + { + slider.value = valueLabel.text - 1; + } + } + validator: IntValidator { bottom: 1; top: slider.maximumValue + 1; } + + anchors.left: parent.left; + anchors.leftMargin: UM.Theme.getSize("default_margin").width / 2; + anchors.verticalCenter: parent.verticalCenter; + + width: Math.max(UM.Theme.getSize("line").width * maxValue.length + 2, 20); + style: TextFieldStyle + { + textColor: UM.Theme.getColor("setting_control_text"); + font: UM.Theme.getFont("default"); + background: Item { } + } + } + + BusyIndicator + { + id: busyIndicator; + anchors.left: parent.right; + anchors.leftMargin: UM.Theme.getSize("default_margin").width / 2; + anchors.verticalCenter: parent.verticalCenter; + + width: UM.Theme.getSize("slider_handle").height; + height: width; + + running: UM.LayerView.busy; + visible: UM.LayerView.busy; + } } } } diff --git a/plugins/LayerView/LayerViewProxy.py b/plugins/LayerView/LayerViewProxy.py index d214f36407..bc372aeaf8 100644 --- a/plugins/LayerView/LayerViewProxy.py +++ b/plugins/LayerView/LayerViewProxy.py @@ -30,8 +30,7 @@ class LayerViewProxy(QObject): active_view = self._controller.getActiveView() if type(active_view) == LayerView.LayerView.LayerView: return active_view.getMaxLayers() - #return 100 - + @pyqtProperty(int, notify = currentLayerChanged) def currentLayer(self): active_view = self._controller.getActiveView() @@ -124,25 +123,13 @@ class LayerViewProxy(QObject): return active_view.getExtruderCount() return 0 - @pyqtSlot() - def enableLegend(self): - active_view = self._controller.getActiveView() - if type(active_view) == LayerView.LayerView.LayerView: - active_view.enableLegend() - - @pyqtSlot() - def disableLegend(self): - active_view = self._controller.getActiveView() - if type(active_view) == LayerView.LayerView.LayerView: - active_view.disableLegend() - def _layerActivityChanged(self): self.activityChanged.emit() def _onLayerChanged(self): self.currentLayerChanged.emit() self._layerActivityChanged() - + def _onMaxLayersChanged(self): self.maxLayersChanged.emit() diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml old mode 100644 new mode 100755 index 8b70e293b4..5573b97e5d --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -306,18 +306,6 @@ UM.MainWindow } } - Legend - { - id: legend - anchors - { - top: parent.top - topMargin: UM.Theme.getSize("default_margin").height - right: sidebar.left - rightMargin: UM.Theme.getSize("default_margin").width - } - } - JobSpecs { id: jobSpecs diff --git a/resources/qml/Legend.qml b/resources/qml/Legend.qml deleted file mode 100644 index 94eeb1e903..0000000000 --- a/resources/qml/Legend.qml +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (c) 2015 Ultimaker B.V. -// Cura is released under the terms of the AGPLv3 or higher. - -import QtQuick 2.2 -import QtQuick.Controls 1.1 -import QtQuick.Controls.Styles 1.1 -import QtQuick.Layouts 1.1 - -import UM 1.1 as UM -import Cura 1.0 as Cura - -Item { - id: base - - UM.I18nCatalog { id: catalog; name:"cura"} - - width: childrenRect.width - height: childrenRect.height - - Connections - { - target: Printer - onViewLegendItemsChanged: - { - legendItemRepeater.model = items - } - } - - Column - { - Repeater - { - id: legendItemRepeater - - Item { - anchors.right: parent.right - height: childrenRect.height - width: childrenRect.width - - Rectangle { - id: swatch - - anchors.right: parent.right - anchors.verticalCenter: label.verticalCenter - height: UM.Theme.getSize("setting_control").height / 2 - width: height - - color: modelData.color - border.width: UM.Theme.getSize("default_lining").width - border.color: UM.Theme.getColor("text_subtext") - } - Label { - id: label - - text: modelData.title - font: UM.Theme.getFont("small") - color: UM.Theme.getColor("text_subtext") - - anchors.right: swatch.left - anchors.rightMargin: UM.Theme.getSize("default_margin").width / 2 - } - } - } - } -} diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml old mode 100644 new mode 100755 index b0646d5287..d9170ec597 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -259,44 +259,6 @@ UM.PreferencesPage } } - 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(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) - } - } - } - } - - UM.TooltipArea { - width: childrenRect.width - height: childrenRect.height - text: catalog.i18nc("@info:tooltip", "Should only the top layers be displayed in layerview?") - - 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) - } - } - UM.TooltipArea { width: childrenRect.width height: childrenRect.height diff --git a/resources/themes/cura/theme.json b/resources/themes/cura/theme.json index acce27b74e..bd3fbb6dc6 100644 --- a/resources/themes/cura/theme.json +++ b/resources/themes/cura/theme.json @@ -290,9 +290,15 @@ "slider_groove": [0.5, 0.5], "slider_handle": [1.5, 1.5], - "slider_layerview_size": [1.0, 16.0], + "slider_layerview_size": [1.0, 22.0], "slider_layerview_background": [4.0, 0.0], - "slider_layerview_margin": [3.0, 3.0], + "slider_layerview_margin": [3.0, 1.0], + + "layerview_menu_size": [16.5, 21.0], + "layerview_menu_size_compatibility": [22, 23.0], + "layerview_legend_size": [1.0, 1.0], + "layerview_row": [11.0, 1.5], + "layerview_row_spacing": [0.0, 0.5], "checkbox": [2.0, 2.0],