diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py
index cd1a194254..c6412e2f6f 100644
--- a/cura/PrintInformation.py
+++ b/cura/PrintInformation.py
@@ -52,6 +52,19 @@ class PrintInformation(QObject):
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._material_lengths = []
self._material_weights = []
@@ -93,6 +106,10 @@ 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)
@@ -115,9 +132,11 @@ class PrintInformation(QObject):
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)
self.currentPrintTimeChanged.emit()
diff --git a/resources/qml/JobSpecs.qml b/resources/qml/JobSpecs.qml
index 6013117728..c702cb1ac2 100644
--- a/resources/qml/JobSpecs.qml
+++ b/resources/qml/JobSpecs.qml
@@ -24,6 +24,7 @@ Item {
UM.I18nCatalog { id: catalog; name:"cura"}
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
@@ -159,7 +160,7 @@ Item {
UM.RecolorImage
{
id: timeIcon
- anchors.right: timeSpec.left
+ anchors.right: timeSpecPerFeatureTooltipArea.left
anchors.rightMargin: UM.Theme.getSize("default_margin").width/2
anchors.verticalCenter: parent.verticalCenter
width: UM.Theme.getSize("save_button_specs_icons").width
@@ -169,15 +170,48 @@ Item {
color: UM.Theme.getColor("text_subtext")
source: UM.Theme.getIcon("print_time")
}
- Text
+ UM.TooltipArea
{
- id: timeSpec
+ id: timeSpecPerFeatureTooltipArea
+ text: {
+ var result = "";
+ if(base.printDurationPerFeature["inset_0"] && base.printDurationPerFeature["inset_0"].totalSeconds > 0)
+ result += "Outer Walls: " + base.printDurationPerFeature["inset_0"].getDisplayString(UM.DurationFormat.Short)
+ if(base.printDurationPerFeature["inset_x"] && base.printDurationPerFeature["inset_x"].totalSeconds > 0)
+ result += "
Inner Walls: " + base.printDurationPerFeature["inset_x"].getDisplayString(UM.DurationFormat.Short)
+ if(base.printDurationPerFeature["skin"] && base.printDurationPerFeature["skin"].totalSeconds > 0)
+ result += "
Skin: " + base.printDurationPerFeature["skin"].getDisplayString(UM.DurationFormat.Short)
+ if(base.printDurationPerFeature["infill"] && base.printDurationPerFeature["infill"].totalSeconds > 0)
+ result += "
Infill: " + base.printDurationPerFeature["infill"].getDisplayString(UM.DurationFormat.Short)
+ if(base.printDurationPerFeature["support_infill"] && base.printDurationPerFeature["support_infill"].totalSeconds > 0)
+ result += "
Support: " + base.printDurationPerFeature["support_infill"].getDisplayString(UM.DurationFormat.Short)
+ if(base.printDurationPerFeature["support_interface"] && base.printDurationPerFeature["support_interface"].totalSeconds > 0)
+ result += "
Support Interface: " + base.printDurationPerFeature["support_interface"].getDisplayString(UM.DurationFormat.Short)
+ if(base.printDurationPerFeature["support"] && base.printDurationPerFeature["support"].totalSeconds > 0)
+ result += "
Helper Structures: " + base.printDurationPerFeature["support"].getDisplayString(UM.DurationFormat.Short)
+ if(base.printDurationPerFeature["travel"] && base.printDurationPerFeature["travel"].totalSeconds > 0)
+ result += "
Travel: " + base.printDurationPerFeature["travel"].getDisplayString(UM.DurationFormat.Short)
+ if(base.printDurationPerFeature["retract"] && base.printDurationPerFeature["retract"].totalSeconds > 0)
+ result += "
Retractions: " + base.printDurationPerFeature["retract"].getDisplayString(UM.DurationFormat.Short)
+ if(base.printDurationPerFeature["none"] && base.printDurationPerFeature["none"].totalSeconds > 0)
+ result += "
Other: " + base.printDurationPerFeature["none"].getDisplayString(UM.DurationFormat.Short)
+ return result;
+ }
+ width: childrenRect.width
+ height: childrenRect.height
anchors.right: lengthIcon.left
anchors.rightMargin: UM.Theme.getSize("default_margin").width
anchors.verticalCenter: parent.verticalCenter
- font: UM.Theme.getFont("small")
- color: UM.Theme.getColor("text_subtext")
- text: (!base.printDuration || !base.printDuration.valid) ? catalog.i18nc("@label", "00h 00min") : base.printDuration.getDisplayString(UM.DurationFormat.Short)
+
+ Text
+ {
+ id: timeSpec
+ anchors.left: parent.left
+ anchors.top: parent.top
+ font: UM.Theme.getFont("small")
+ color: UM.Theme.getColor("text_subtext")
+ text: (!base.printDuration || !base.printDuration.valid) ? catalog.i18nc("@label", "00h 00min") : base.printDuration.getDisplayString(UM.DurationFormat.Short)
+ }
}
UM.RecolorImage
{