diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7870759cd1..1c372ffa55 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -45,11 +45,19 @@ if(NOT APPLE AND NOT WIN32)
DESTINATION ${CMAKE_INSTALL_BINDIR}
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
RENAME cura)
- install(DIRECTORY cura
+ if(EXISTS /etc/debian_version)
+ install(DIRECTORY cura
DESTINATION lib/python${PYTHON_VERSION_MAJOR}/dist-packages
FILES_MATCHING PATTERN *.py)
- install(FILES ${CMAKE_BINARY_DIR}/CuraVersion.py
+ install(FILES ${CMAKE_BINARY_DIR}/CuraVersion.py
DESTINATION lib/python${PYTHON_VERSION_MAJOR}/dist-packages/cura)
+ else()
+ install(DIRECTORY cura
+ DESTINATION lib/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages
+ FILES_MATCHING PATTERN *.py)
+ install(FILES ${CMAKE_BINARY_DIR}/CuraVersion.py
+ DESTINATION lib/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages/cura)
+ endif()
install(FILES ${CMAKE_BINARY_DIR}/cura.desktop
DESTINATION ${CMAKE_INSTALL_DATADIR}/applications)
install(FILES ${CMAKE_SOURCE_DIR}/resources/images/cura-icon.png
diff --git a/README.md b/README.md
index e3fa497933..f8d809df16 100644
--- a/README.md
+++ b/README.md
@@ -34,9 +34,11 @@ Dependencies
Configuring Cura
----------------
-* Link your CuraEngine backend by inserting the following line in home/.config/cura/config.cfg :
+Link your CuraEngine backend by inserting the following lines in `$HOME/.config/cura/config.cfg` :
+```
[backend]
location = /[path_to_the..]/CuraEngine/build/CuraEngine
+```
Build scripts
-------------
diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py
index 1c9a0708fd..4e55528f5d 100755
--- a/cura/BuildVolume.py
+++ b/cura/BuildVolume.py
@@ -956,14 +956,14 @@ class BuildVolume(SceneNode):
if adhesion_type == "skirt":
skirt_distance = self._getSettingFromAdhesionExtruder("skirt_gap")
skirt_line_count = self._getSettingFromAdhesionExtruder("skirt_line_count")
- bed_adhesion_size = skirt_distance + (skirt_line_count * self._getSettingFromAdhesionExtruder("skirt_brim_line_width")) * self._getSettingFromAdhesionExtruder("initial_layer_line_width_factor") / 100.0
+ bed_adhesion_size = skirt_distance + (self._getSettingFromAdhesionExtruder("skirt_brim_line_width") * skirt_line_count) * self._getSettingFromAdhesionExtruder("initial_layer_line_width_factor") / 100.0
if len(used_extruders) > 1:
for extruder_stack in used_extruders:
bed_adhesion_size += extruder_stack.getProperty("skirt_brim_line_width", "value") * extruder_stack.getProperty("initial_layer_line_width_factor", "value") / 100.0
#We don't create an additional line for the extruder we're printing the skirt with.
bed_adhesion_size -= self._getSettingFromAdhesionExtruder("skirt_brim_line_width", "value") * self._getSettingFromAdhesionExtruder("initial_layer_line_width_factor", "value") / 100.0
elif adhesion_type == "brim":
- bed_adhesion_size = self._getSettingFromAdhesionExtruder("brim_line_count") * self._getSettingFromAdhesionExtruder("skirt_brim_line_width") * self._getSettingFromAdhesionExtruder("initial_layer_line_width_factor") / 100.0
+ bed_adhesion_size = self._getSettingFromAdhesionExtruder("skirt_brim_line_width") * self._getSettingFromAdhesionExtruder("brim_line_count") * self._getSettingFromAdhesionExtruder("initial_layer_line_width_factor") / 100.0
if self._global_container_stack.getProperty("machine_extruder_count", "value") > 1:
for extruder_stack in used_extruders:
bed_adhesion_size += extruder_stack.getProperty("skirt_brim_line_width", "value") * extruder_stack.getProperty("initial_layer_line_width_factor", "value") / 100.0
diff --git a/cura/PlatformPhysics.py b/cura/PlatformPhysics.py
index dc5594dc7b..aca91f866a 100755
--- a/cura/PlatformPhysics.py
+++ b/cura/PlatformPhysics.py
@@ -41,7 +41,7 @@ class PlatformPhysics:
def _onSceneChanged(self, source):
self._change_timer.start()
- def _onChangeTimerFinished(self):
+ def _onChangeTimerFinished(self, was_triggered_by_tool=False):
if not self._enabled:
return
@@ -71,14 +71,15 @@ class PlatformPhysics:
# Check if this is the first time a project file node was loaded (disable auto drop in that case), defaults to True
should_auto_drop = node.getSetting("auto_drop", True)
+ # This should NOT happen if the scene change was triggered by a tool (like translate), only on project load
+ if was_triggered_by_tool:
+ should_auto_drop = True
+
# If a node is grouped or it's loaded from a project file (auto-drop disabled), don't move it down
if Preferences.getInstance().getValue("physics/automatic_drop_down") and not (node.getParent() and node.getParent().callDecoration("isGroup")) and node.isEnabled() and should_auto_drop:
z_offset = node.callDecoration("getZOffset") if node.getDecorator(ZOffsetDecorator.ZOffsetDecorator) else 0
move_vector = move_vector.set(y=-bbox.bottom + z_offset)
- # Enable auto-drop after processing the project file node for the first time
- node.setSetting("auto_drop", False)
-
# If there is no convex hull for the node, start calculating it and continue.
if not node.getDecorator(ConvexHullDecorator):
node.addDecorator(ConvexHullDecorator())
@@ -167,4 +168,4 @@ class PlatformPhysics:
node.removeDecorator(ZOffsetDecorator.ZOffsetDecorator)
self._enabled = True
- self._onChangeTimerFinished()
+ self._onChangeTimerFinished(True)
diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py
index 2b7a35995b..155d0a6d02 100644
--- a/cura/PrintInformation.py
+++ b/cura/PrintInformation.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2015 Ultimaker B.V.
+# Copyright (c) 2017 Ultimaker B.V.
# Cura is released under the terms of the AGPLv3 or higher.
from PyQt5.QtCore import QObject, pyqtSignal, pyqtProperty
@@ -51,20 +51,7 @@ class PrintInformation(QObject):
def __init__(self, parent = None):
super().__init__(parent)
- self._current_print_time = Duration(None, self)
- self._print_times_per_feature = {
- "none": Duration(None, self),
- "inset_0": Duration(None, self),
- "inset_x": Duration(None, self),
- "skin": Duration(None, self),
- "support": Duration(None, self),
- "skirt": Duration(None, self),
- "infill": Duration(None, self),
- "support_infill": Duration(None, self),
- "travel": Duration(None, self),
- "retract": Duration(None, self),
- "support_interface": Duration(None, self)
- }
+ self.initializeCuraMessagePrintTimeProperties()
self._material_lengths = []
self._material_weights = []
@@ -91,6 +78,33 @@ class PrintInformation(QObject):
self._material_amounts = []
+
+ # Crate cura message translations and using translation keys initialize empty time Duration object for total time
+ # and time for each feature
+ def initializeCuraMessagePrintTimeProperties(self):
+ self._current_print_time = Duration(None, self)
+
+ self._print_time_message_translations = {
+ "inset_0": catalog.i18nc("@tooltip", "Outer Wall"),
+ "inset_x": catalog.i18nc("@tooltip", "Inner Walls"),
+ "skin": catalog.i18nc("@tooltip", "Skin"),
+ "infill": catalog.i18nc("@tooltip", "Infill"),
+ "support_infill": catalog.i18nc("@tooltip", "Support Infill"),
+ "support_interface": catalog.i18nc("@tooltip", "Support Interface"),
+ "support": catalog.i18nc("@tooltip", "Support"),
+ "skirt": catalog.i18nc("@tooltip", "Skirt"),
+ "travel": catalog.i18nc("@tooltip", "Travel"),
+ "retract": catalog.i18nc("@tooltip", "Retractions"),
+ "none": catalog.i18nc("@tooltip", "Other")
+ }
+
+ self._print_time_message_values = {}
+
+ # Full fill message values using keys from _print_time_message_translations
+ for key in self._print_time_message_translations.keys():
+ self._print_time_message_values[key] = Duration(None, self)
+
+
currentPrintTimeChanged = pyqtSignal()
preSlicedChanged = pyqtSignal()
@@ -107,10 +121,6 @@ class PrintInformation(QObject):
def currentPrintTime(self):
return self._current_print_time
- @pyqtProperty("QVariantMap", notify = currentPrintTimeChanged)
- def printTimesPerFeature(self):
- return self._print_times_per_feature
-
materialLengthsChanged = pyqtSignal()
@pyqtProperty("QVariantList", notify = materialLengthsChanged)
@@ -129,22 +139,28 @@ class PrintInformation(QObject):
def materialCosts(self):
return self._material_costs
- def _onPrintDurationMessage(self, time_per_feature, material_amounts):
- total_time = 0
- for feature, time in time_per_feature.items():
- if time != time: # Check for NaN. Engine can sometimes give us weird values.
- self._print_times_per_feature[feature].setDuration(0)
- Logger.log("w", "Received NaN for print duration message")
- continue
- total_time += time
- self._print_times_per_feature[feature].setDuration(time)
- self._current_print_time.setDuration(total_time)
+ def _onPrintDurationMessage(self, print_time, material_amounts):
+ self._updateTotalPrintTimePerFeature(print_time)
self.currentPrintTimeChanged.emit()
self._material_amounts = material_amounts
self._calculateInformation()
+ def _updateTotalPrintTimePerFeature(self, print_time):
+ total_estimated_time = 0
+
+ for feature, time in print_time.items():
+ if time != time: # Check for NaN. Engine can sometimes give us weird values.
+ self._print_time_message_values.get(feature).setDuration(0)
+ Logger.log("w", "Received NaN for print duration message")
+ continue
+
+ total_estimated_time += time
+ self._print_time_message_values.get(feature).setDuration(time)
+
+ self._current_print_time.setDuration(total_estimated_time)
+
def _calculateInformation(self):
if Application.getInstance().getGlobalContainerStack() is None:
return
@@ -294,3 +310,23 @@ class PrintInformation(QObject):
## Utility method that strips accents from characters (eg: รข -> a)
def _stripAccents(self, str):
return ''.join(char for char in unicodedata.normalize('NFD', str) if unicodedata.category(char) != 'Mn')
+
+ @pyqtSlot(result = "QVariantMap")
+ def getFeaturePrintTimes(self):
+ result = {}
+ for feature, time in self._print_time_message_values.items():
+ if feature in self._print_time_message_translations:
+ result[self._print_time_message_translations[feature]] = time
+ else:
+ result[feature] = time
+ return result
+
+ # Simulate message with zero time duration
+ def setToZeroPrintInformation(self):
+ temp_message = {}
+ for key in self._print_time_message_values.keys():
+ temp_message[key] = 0
+
+ temp_material_amounts = [0]
+ self._onPrintDurationMessage(temp_message, temp_material_amounts)
+
diff --git a/plugins/3MFReader/ThreeMFReader.py b/plugins/3MFReader/ThreeMFReader.py
index 66dfb6130e..b947c4eb39 100755
--- a/plugins/3MFReader/ThreeMFReader.py
+++ b/plugins/3MFReader/ThreeMFReader.py
@@ -77,7 +77,10 @@ class ThreeMFReader(MeshReader):
# \returns Uranium SceneNode.
def _convertSavitarNodeToUMNode(self, savitar_node):
um_node = SceneNode()
- um_node.setSetting("auto_drop", False) # Disable the auto-drop feature when loading a project file and processing the nodes for the first time
+
+ # Disable the auto-drop feature when loading a project file and processing the nodes for the first time
+ um_node.setSetting("auto_drop", False)
+
transformation = self._createMatrixFromTransformationString(savitar_node.getTransformation())
um_node.setTransformation(transformation)
mesh_builder = MeshBuilder()
diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py
index ea1f8c39b4..d642fdfe08 100755
--- a/plugins/CuraEngineBackend/CuraEngineBackend.py
+++ b/plugins/CuraEngineBackend/CuraEngineBackend.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2015 Ultimaker B.V.
+# Copyright (c) 2017 Ultimaker B.V.
# Cura is released under the terms of the AGPLv3 or higher.
from UM.Backend.Backend import Backend, BackendState
@@ -196,19 +196,7 @@ class CuraEngineBackend(QObject, Backend):
Logger.log("w", "Slice unnecessary, nothing has changed that needs reslicing.")
return
- self.printDurationMessage.emit({
- "none": 0,
- "inset_0": 0,
- "inset_x": 0,
- "skin": 0,
- "support": 0,
- "skirt": 0,
- "infill": 0,
- "support_infill": 0,
- "travel": 0,
- "retract": 0,
- "support_interface": 0
- }, [0])
+ Application.getInstance().getPrintInformation().setToZeroPrintInformation()
self._stored_layer_data = []
self._stored_optimized_layer_data = []
@@ -278,7 +266,7 @@ class CuraEngineBackend(QObject, Backend):
if job.getResult() == StartSliceJob.StartJobResult.MaterialIncompatible:
if Application.getInstance().platformActivity:
self._error_message = Message(catalog.i18nc("@info:status",
- "The selected material is incompatible with the selected machine or configuration."), title = catalog.i18nc("@info:title", "Material Details"))
+ "The selected material is incompatible with the selected machine or configuration."), title = catalog.i18nc("@info:title", "Incompatible material"))
self._error_message.show()
self.backendStateChange.emit(BackendState.Error)
else:
@@ -306,7 +294,7 @@ class CuraEngineBackend(QObject, Backend):
error_labels = ", ".join(error_labels)
self._error_message = Message(catalog.i18nc("@info:status", "Unable to slice with the current settings. The following settings have errors: {0}".format(error_labels)),
- title = catalog.i18nc("@info:title", "Setting Details"))
+ title = catalog.i18nc("@info:title", "Invalid settings"))
self._error_message.show()
self.backendStateChange.emit(BackendState.Error)
else:
@@ -514,29 +502,6 @@ class CuraEngineBackend(QObject, Backend):
def _onGCodePrefixMessage(self, message):
self._scene.gcode_list.insert(0, message.data.decode("utf-8", "replace"))
- ## Called when a print time message is received from the engine.
- #
- # \param message The protobuf message containing the print time per feature and
- # material amount per extruder
- def _onPrintTimeMaterialEstimates(self, message):
- material_amounts = []
- for index in range(message.repeatedMessageCount("materialEstimates")):
- material_amounts.append(message.getRepeatedMessage("materialEstimates", index).material_amount)
- feature_times = {
- "none": message.time_none,
- "inset_0": message.time_inset_0,
- "inset_x": message.time_inset_x,
- "skin": message.time_skin,
- "support": message.time_support,
- "skirt": message.time_skirt,
- "infill": message.time_infill,
- "support_infill": message.time_support_infill,
- "travel": message.time_travel,
- "retract": message.time_retract,
- "support_interface": message.time_support_interface
- }
- self.printDurationMessage.emit(feature_times, material_amounts)
-
## Creates a new socket connection.
def _createSocket(self):
super()._createSocket(os.path.abspath(os.path.join(PluginRegistry.getInstance().getPluginPath(self.getPluginId()), "Cura.proto")))
@@ -555,6 +520,38 @@ class CuraEngineBackend(QObject, Backend):
else:
self._change_timer.start()
+ ## Called when a print time message is received from the engine.
+ #
+ # \param message The protobuf message containing the print time per feature and
+ # material amount per extruder
+ def _onPrintTimeMaterialEstimates(self, message):
+ material_amounts = []
+ for index in range(message.repeatedMessageCount("materialEstimates")):
+ material_amounts.append(message.getRepeatedMessage("materialEstimates", index).material_amount)
+
+ times = self._parseMessagePrintTimes(message)
+ self.printDurationMessage.emit(times, material_amounts)
+
+ ## Called for parsing message to retrieve estimated time per feature
+ #
+ # \param message The protobuf message containing the print time per feature
+ def _parseMessagePrintTimes(self, message):
+
+ result = {
+ "inset_0": message.time_inset_0,
+ "inset_x": message.time_inset_x,
+ "skin": message.time_skin,
+ "infill": message.time_infill,
+ "support_infill": message.time_support_infill,
+ "support_interface": message.time_support_interface,
+ "support": message.time_support,
+ "skirt": message.time_skirt,
+ "travel": message.time_travel,
+ "retract": message.time_retract,
+ "none": message.time_none
+ }
+ return result
+
## Called when the back-end connects to the front-end.
def _onBackendConnected(self):
if self._restart:
diff --git a/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py b/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py
index 4b6a6e8071..e9ee47e810 100644
--- a/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py
+++ b/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py
@@ -60,7 +60,7 @@ class RemovableDriveOutputDevice(OutputDevice):
if len(file_formats) == 0:
Logger.log("e", "There are no file formats available to write with!")
- raise OutputDeviceError.WriteRequestFailedError()
+ raise OutputDeviceError.WriteRequestFailedError(catalog.i18nc("There are no file formats available to write with!"))
# Just take the first file format available.
if file_handler is not None:
@@ -115,7 +115,7 @@ class RemovableDriveOutputDevice(OutputDevice):
name = child.getName()
if name:
return name
- raise OutputDeviceError.WriteRequestFailedError("Could not find a file name when trying to write to {device}.".format(device = self.getName()))
+ raise OutputDeviceError.WriteRequestFailedError(catalog.i18nc("@info:status Don't translate the tag {device}!", "Could not find a file name when trying to write to {device}.").format(device = self.getName()))
def _onProgress(self, job, progress):
self.writeProgress.emit(self, progress)
diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py
index 09373d0c2f..a4859f6d7f 100755
--- a/plugins/SliceInfoPlugin/SliceInfo.py
+++ b/plugins/SliceInfoPlugin/SliceInfo.py
@@ -162,7 +162,7 @@ class SliceInfo(Extension):
data["models"].append(model)
- print_times = print_information.printTimesPerFeature
+ print_times = print_information._print_time_message_values
data["print_times"] = {"travel": int(print_times["travel"].getDisplayString(DurationFormat.Format.Seconds)),
"support": int(print_times["support"].getDisplayString(DurationFormat.Format.Seconds)),
"infill": int(print_times["infill"].getDisplayString(DurationFormat.Format.Seconds)),
diff --git a/resources/qml/SaveButton.qml b/resources/qml/SaveButton.qml
index 616017ebf6..2b7930793f 100644
--- a/resources/qml/SaveButton.qml
+++ b/resources/qml/SaveButton.qml
@@ -238,22 +238,22 @@ Item {
if(!control.enabled)
return UM.Theme.getColor("action_button_disabled_border");
else if(control.pressed)
- return UM.Theme.getColor("action_button_active_border");
+ return UM.Theme.getColor("print_button_ready_pressed_border");
else if(control.hovered)
- return UM.Theme.getColor("action_button_hovered_border");
+ return UM.Theme.getColor("print_button_ready_hovered_border");
else
- return UM.Theme.getColor("action_button_border");
+ return UM.Theme.getColor("print_button_ready_border");
}
color:
{
if(!control.enabled)
return UM.Theme.getColor("action_button_disabled");
else if(control.pressed)
- return UM.Theme.getColor("action_button_active");
+ return UM.Theme.getColor("print_button_ready_pressed");
else if(control.hovered)
- return UM.Theme.getColor("action_button_hovered");
+ return UM.Theme.getColor("print_button_ready_hovered");
else
- return UM.Theme.getColor("action_button");
+ return UM.Theme.getColor("print_button_ready");
}
Behavior on color { ColorAnimation { duration: 50; } }
@@ -268,11 +268,11 @@ Item {
if(!control.enabled)
return UM.Theme.getColor("action_button_disabled_text");
else if(control.pressed)
- return UM.Theme.getColor("action_button_active_text");
+ return UM.Theme.getColor("print_button_ready_text");
else if(control.hovered)
- return UM.Theme.getColor("action_button_hovered_text");
+ return UM.Theme.getColor("print_button_ready_text");
else
- return UM.Theme.getColor("action_button_text");
+ return UM.Theme.getColor("print_button_ready_text");
}
font: UM.Theme.getFont("action_button")
text: control.text;
diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml
index ccaff1cd9a..2db3bed7c4 100755
--- a/resources/qml/Sidebar.qml
+++ b/resources/qml/Sidebar.qml
@@ -26,7 +26,6 @@ Rectangle
property bool monitoringPrint: false
property variant printDuration: PrintInformation.currentPrintTime
- property variant printDurationPerFeature: PrintInformation.printTimesPerFeature
property variant printMaterialLengths: PrintInformation.materialLengths
property variant printMaterialWeights: PrintInformation.materialWeights
property variant printMaterialCosts: PrintInformation.materialCosts
@@ -314,54 +313,53 @@ Rectangle
anchors.bottom: parent.bottom
anchors.leftMargin: UM.Theme.getSize("sidebar_margin").width
anchors.bottomMargin: UM.Theme.getSize("sidebar_margin").height
- height: childrenRect.height
+ height: timeDetails.height + timeSpecDescription.height + lengthSpec.height
visible: !monitoringPrint
- UM.TooltipArea
+ Text
{
- id: timeSpecPerFeatureTooltipArea
- width: timeSpec.width
- height: timeSpec.height
+ id: timeDetails
anchors.left: parent.left
anchors.bottom: timeSpecDescription.top
+ font: UM.Theme.getFont("large")
+ color: UM.Theme.getColor("text_subtext")
+ text: (!base.printDuration || !base.printDuration.valid) ? catalog.i18nc("@label", "00h 00min") : base.printDuration.getDisplayString(UM.DurationFormat.Short)
- text: {
- var order = ["inset_0", "inset_x", "skin", "infill", "support_infill", "support_interface", "support", "travel", "retract", "none"];
- var visible_names = {
- "inset_0": catalog.i18nc("@tooltip", "Outer Wall"),
- "inset_x": catalog.i18nc("@tooltip", "Inner Walls"),
- "skin": catalog.i18nc("@tooltip", "Skin"),
- "infill": catalog.i18nc("@tooltip", "Infill"),
- "support_infill": catalog.i18nc("@tooltip", "Support Infill"),
- "support_interface": catalog.i18nc("@tooltip", "Support Interface"),
- "support": catalog.i18nc("@tooltip", "Support"),
- "travel": catalog.i18nc("@tooltip", "Travel"),
- "retract": catalog.i18nc("@tooltip", "Retractions"),
- "none": catalog.i18nc("@tooltip", "Other")
- };
- var result = "";
- for(var feature in order)
+ MouseArea
+ {
+ id: infillMouseArea
+ anchors.fill: parent
+ hoverEnabled: true
+ //enabled: base.settingsEnabled
+
+ onEntered:
{
- feature = order[feature];
- if(base.printDurationPerFeature[feature] && base.printDurationPerFeature[feature].totalSeconds > 0)
+
+ if(base.printDuration.valid && !base.printDuration.isTotalDurationZero)
{
- result += "
" + visible_names[feature] + ": " + base.printDurationPerFeature[feature].getDisplayString(UM.DurationFormat.Short);
+ // All the time information for the different features is achieved
+ var print_time = PrintInformation.getFeaturePrintTimes()
+
+ // A message is created and displayed when the user hover the time label
+ var content = catalog.i18nc("@tooltip", "Time information")
+ for(var feature in print_time)
+ {
+ if(!print_time[feature].isTotalDurationZero)
+ {
+ content += "
" + feature + ": " + print_time[feature].getDisplayString(UM.DurationFormat.Short)
+ }
+ }
+
+ base.showTooltip(parent, Qt.point(-UM.Theme.getSize("sidebar_margin").width, 0), content)
}
}
- result = result.replace(/^\
/, ""); // remove newline before first item
- return result;
- }
-
- Text
- {
- id: timeSpec
- anchors.left: parent.left
- anchors.bottom: parent.bottom
- font: UM.Theme.getFont("large")
- color: UM.Theme.getColor("text_subtext")
- text: (!base.printDuration || !base.printDuration.valid) ? catalog.i18nc("@label", "00h 00min") : base.printDuration.getDisplayString(UM.DurationFormat.Short)
+ onExited:
+ {
+ base.hideTooltip();
+ }
}
}
+
Text
{
id: timeSpecDescription
diff --git a/resources/qml/SidebarSimple.qml b/resources/qml/SidebarSimple.qml
index efcd2f15df..f4dc04b2c8 100644
--- a/resources/qml/SidebarSimple.qml
+++ b/resources/qml/SidebarSimple.qml
@@ -44,10 +44,8 @@ Item
{
id: resolutionLabel
anchors.top: resolutionSlider.top
- anchors.topMargin: UM.Theme.getSize("default_margin").height * 1.2
anchors.left: parent.left
anchors.leftMargin: UM.Theme.getSize("sidebar_margin").width
- width: UM.Theme.getSize("sidebar").width * .45 - UM.Theme.getSize("sidebar_margin").width
text: catalog.i18nc("@label", "Layer Height")
font: UM.Theme.getFont("default")
@@ -57,10 +55,9 @@ Item
Text
{
id: speedLabel
- anchors.top: resolutionLabel.bottom
+ anchors.bottom: resolutionSlider.bottom
anchors.left: parent.left
anchors.leftMargin: UM.Theme.getSize("sidebar_margin").width
- anchors.topMargin: UM.Theme.getSize("default_margin").height * 1.5
text: catalog.i18nc("@label", "Print Speed")
font: UM.Theme.getFont("default")
@@ -70,7 +67,7 @@ Item
Text
{
id: speedLabelSlower
- anchors.top: speedLabel.top
+ anchors.bottom: speedLabel.bottom
anchors.left: resolutionSlider.left
text: catalog.i18nc("@label", "Slower")
@@ -82,7 +79,7 @@ Item
Text
{
id: speedLabelFaster
- anchors.top: speedLabel.top
+ anchors.bottom: speedLabel.bottom
anchors.right: resolutionSlider.right
text: catalog.i18nc("@label", "Faster")
@@ -95,11 +92,11 @@ Item
{
id: resolutionSlider
anchors.top: parent.top
-
anchors.left: infillCellRight.left
anchors.right: infillCellRight.right
+
width: UM.Theme.getSize("sidebar").width * .55
- height: UM.Theme.getSize("quality_slider_bar").height * 30
+ height: UM.Theme.getSize("quality_slider_bar").height * 25
property var model: Cura.ProfilesModel
@@ -349,23 +346,12 @@ Item
}
else if (i == total_tick_count - 1)
{
- start_x = current_start_x - offset * 2;
+ start_x = current_start_x - offset * 2.5;
}
ctx.fillText(resolutionSlider.model.getItem(i).layer_height_without_unit, start_x, text_top);
current_start_x += step_size;
}
-
- // print currently selected quality text
- if (resolutionSlider.showQualityText && resolutionSlider.currentQualityIndex != undefine)
- {
- const text_top = parent.height / 2 + tick_height + tick_text_height * 2;
- total_tick_count = resolutionSlider.totalTickCount;
- const step_size = resolutionSlider.tickStepSize;
- current_start_x = (tick_left_right_margin) + step_size * (resolutionSlider.currentQualityIndex - resolutionSlider.fullRangeMin);
- ctx.fillStyle = UM.Theme.getColor("quality_slider_text");
- ctx.fillText(resolutionSlider.model.getItem(resolutionSlider.currentQualityIndex).name, current_start_x - 6, text_top);
- }
}
MouseArea
diff --git a/resources/themes/cura-light/theme.json b/resources/themes/cura-light/theme.json
index fb6e43d0be..8624760e3a 100644
--- a/resources/themes/cura-light/theme.json
+++ b/resources/themes/cura-light/theme.json
@@ -116,20 +116,6 @@
"sync_button_text": [120, 120, 120, 255],
"sync_button_text_hovered": [0, 0, 0, 255],
- "tab_checked": [255, 255, 255, 255],
- "tab_checked_border": [255, 255, 255, 255],
- "tab_checked_text": [24, 41, 77, 255],
- "tab_unchecked": [245, 245, 245, 255],
- "tab_unchecked_border": [245, 245, 245, 255],
- "tab_unchecked_text": [127, 127, 127, 255],
- "tab_hovered": [245, 245, 245, 255],
- "tab_hovered_border": [245, 245, 245, 255],
- "tab_hovered_text": [32, 166, 219, 255],
- "tab_active": [255, 255, 255, 255],
- "tab_active_border": [255, 255, 255, 255],
- "tab_active_text": [24, 41, 77, 255],
- "tab_background": [245, 245, 245, 255],
-
"action_button": [255, 255, 255, 255],
"action_button_text": [0, 0, 0, 255],
"action_button_border": [127, 127, 127, 255],
@@ -143,6 +129,14 @@
"action_button_disabled_text": [127, 127, 127, 255],
"action_button_disabled_border": [245, 245, 245, 255],
+ "print_button_ready": [12, 169, 227, 255],
+ "print_button_ready_border": [12, 169, 227, 255],
+ "print_button_ready_text": [255, 255, 255, 255],
+ "print_button_ready_hovered": [12, 169, 255, 255],
+ "print_button_ready_hovered_border": [12, 169, 227, 255],
+ "print_button_ready_pressed": [12, 169, 220, 255],
+ "print_button_ready_pressed_border": [12, 169, 227, 255],
+
"scrollbar_background": [255, 255, 255, 255],
"scrollbar_handle": [24, 41, 77, 255],
"scrollbar_handle_hover": [12, 159, 227, 255],