From 8ab0432793c08e961576be872b41df3a683365c7 Mon Sep 17 00:00:00 2001 From: Aurore LAFAURIE Date: Thu, 12 Sep 2024 12:38:34 +0200 Subject: [PATCH 1/4] [Application] Tooltip for new pipeline is now set in whole component Before it was set dynamically (with ToolTip.text...) --- meshroom/ui/qml/Application.qml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/meshroom/ui/qml/Application.qml b/meshroom/ui/qml/Application.qml index 05b986ab43..93ae4f07ff 100644 --- a/meshroom/ui/qml/Application.qml +++ b/meshroom/ui/qml/Application.qml @@ -591,9 +591,14 @@ Page { elide: Text.ElideLeft elideWidth: newPipelineMenu.maxWidth } - ToolTip.text: modelData["path"] - ToolTip.visible: hovered - ToolTip.delay: 200 + + ToolTip { + id: toolTip + + delay: 200 + text: modelData["path"] + visible: hovered + } } } } From fbfe83e3717112668e14ea70ac885ba02ecb300e Mon Sep 17 00:00:00 2001 From: Aurore LAFAURIE Date: Thu, 12 Sep 2024 12:42:04 +0200 Subject: [PATCH 2/4] [AttributeItemDelegate] Type of attribute in tooltip doesn't need to be bold --- meshroom/ui/qml/GraphEditor/AttributeItemDelegate.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/meshroom/ui/qml/GraphEditor/AttributeItemDelegate.qml b/meshroom/ui/qml/GraphEditor/AttributeItemDelegate.qml index f6f1de7b9e..83f26c1288 100644 --- a/meshroom/ui/qml/GraphEditor/AttributeItemDelegate.qml +++ b/meshroom/ui/qml/GraphEditor/AttributeItemDelegate.qml @@ -33,7 +33,7 @@ RowLayout { var tooltip = "" if (!attribute.validValue && attribute.desc.errorMessage !== "") tooltip += "Error: " + Format.plainToHtml(attribute.desc.errorMessage) + "

" - tooltip += " " + attribute.desc.name + ": " + attribute.type + "
" + Format.plainToHtml(attribute.desc.description) + tooltip += " " + attribute.desc.name + ": " + attribute.type + "
" + Format.plainToHtml(attribute.desc.description) parameterTooltip.text = tooltip } @@ -78,7 +78,7 @@ RowLayout { var tooltip = "" if (!object.validValue && object.desc.errorMessage !== "") tooltip += "Error: " + Format.plainToHtml(object.desc.errorMessage) + "

" - tooltip += "" + object.desc.name + ": " + attribute.type + "
" + Format.plainToHtml(object.description) + tooltip += "" + object.desc.name + ": " + attribute.type + "
" + Format.plainToHtml(object.description) return tooltip } visible: parameterMA.containsMouse From 23310ad3b0a3cee4b8d5229484680de8c1587215 Mon Sep 17 00:00:00 2001 From: Aurore LAFAURIE Date: Thu, 12 Sep 2024 14:19:04 +0200 Subject: [PATCH 3/4] [nodes] Exposed all attributes that are connected in default pipelines --- meshroom/nodes/aliceVision/ConvertSfMFormat.py | 1 + meshroom/nodes/aliceVision/FeatureExtraction.py | 1 + meshroom/nodes/aliceVision/FeatureMatching.py | 2 ++ meshroom/nodes/aliceVision/ImageMatching.py | 1 + meshroom/nodes/aliceVision/ImageMatchingMultiSfM.py | 1 + meshroom/nodes/aliceVision/LdrToHdrCalibration.py | 5 +++++ meshroom/nodes/aliceVision/LdrToHdrMerge.py | 4 ++++ meshroom/nodes/aliceVision/LdrToHdrSampling.py | 5 +++++ meshroom/nodes/aliceVision/PanoramaCompositing.py | 1 + meshroom/nodes/aliceVision/PanoramaEstimation.py | 2 ++ meshroom/nodes/aliceVision/PanoramaMerging.py | 1 + meshroom/nodes/aliceVision/SfMTriangulation.py | 2 ++ meshroom/nodes/aliceVision/StructureFromMotion.py | 3 +++ meshroom/nodes/aliceVision/TracksBuilding.py | 1 + 14 files changed, 30 insertions(+) diff --git a/meshroom/nodes/aliceVision/ConvertSfMFormat.py b/meshroom/nodes/aliceVision/ConvertSfMFormat.py index de64850574..09822aacdf 100644 --- a/meshroom/nodes/aliceVision/ConvertSfMFormat.py +++ b/meshroom/nodes/aliceVision/ConvertSfMFormat.py @@ -38,6 +38,7 @@ class ConvertSfMFormat(desc.AVCommandLineNode): value=["dspsift"], exclusive=False, joinChar=",", + exposed=True, ), desc.ListAttribute( elementDesc=desc.File( diff --git a/meshroom/nodes/aliceVision/FeatureExtraction.py b/meshroom/nodes/aliceVision/FeatureExtraction.py index 29e7afd483..037a02631e 100644 --- a/meshroom/nodes/aliceVision/FeatureExtraction.py +++ b/meshroom/nodes/aliceVision/FeatureExtraction.py @@ -66,6 +66,7 @@ class FeatureExtraction(desc.AVCommandLineNode): value=["dspsift"], exclusive=False, joinChar=",", + exposed=True, ), desc.ChoiceParam( name="describerPreset", diff --git a/meshroom/nodes/aliceVision/FeatureMatching.py b/meshroom/nodes/aliceVision/FeatureMatching.py index 10aba6f0e0..fcff21d7a1 100644 --- a/meshroom/nodes/aliceVision/FeatureMatching.py +++ b/meshroom/nodes/aliceVision/FeatureMatching.py @@ -50,6 +50,7 @@ class FeatureMatching(desc.AVCommandLineNode): name="featuresFolders", label="Features Folders", description="Folder(s) containing the extracted features and descriptors.", + exposed=True, ), desc.File( name="imagePairsList", @@ -65,6 +66,7 @@ class FeatureMatching(desc.AVCommandLineNode): value=["dspsift"], exclusive=False, joinChar=",", + exposed=True, ), desc.ChoiceParam( name="photometricMatchingMethod", diff --git a/meshroom/nodes/aliceVision/ImageMatching.py b/meshroom/nodes/aliceVision/ImageMatching.py index c87e7be20e..e5aa0b728a 100644 --- a/meshroom/nodes/aliceVision/ImageMatching.py +++ b/meshroom/nodes/aliceVision/ImageMatching.py @@ -50,6 +50,7 @@ class ImageMatching(desc.AVCommandLineNode): name="featuresFolders", label="Features Folders", description="Folder(s) containing the extracted features and descriptors.", + exposed=True, ), desc.ChoiceParam( name="method", diff --git a/meshroom/nodes/aliceVision/ImageMatchingMultiSfM.py b/meshroom/nodes/aliceVision/ImageMatchingMultiSfM.py index 8040dce19a..ce90f20554 100644 --- a/meshroom/nodes/aliceVision/ImageMatchingMultiSfM.py +++ b/meshroom/nodes/aliceVision/ImageMatchingMultiSfM.py @@ -41,6 +41,7 @@ class ImageMatchingMultiSfM(desc.AVCommandLineNode): name="featuresFolders", label="Features Folders", description="Folder(s) containing the extracted features and descriptors.", + exposed=True, ), desc.ChoiceParam( name="method", diff --git a/meshroom/nodes/aliceVision/LdrToHdrCalibration.py b/meshroom/nodes/aliceVision/LdrToHdrCalibration.py index 1270e6e743..a461db992d 100644 --- a/meshroom/nodes/aliceVision/LdrToHdrCalibration.py +++ b/meshroom/nodes/aliceVision/LdrToHdrCalibration.py @@ -61,6 +61,7 @@ class LdrToHdrCalibration(desc.AVCommandLineNode): group="user", # not used directly on the command line errorMessage="The set number of brackets is not a multiple of the number of input images.\n" "Errors will occur during the computation.", + exposed=True, ), desc.IntParam( name="nbBrackets", @@ -78,6 +79,7 @@ class LdrToHdrCalibration(desc.AVCommandLineNode): description="Bypass HDR creation and use the medium bracket as the source for the next steps.", value=False, enabled=lambda node: node.nbBrackets.value != 1, + exposed=True, ), desc.ChoiceParam( name="calibrationMethod", @@ -92,6 +94,7 @@ class LdrToHdrCalibration(desc.AVCommandLineNode): value="auto", exclusive=True, enabled=lambda node: node.byPass.enabled and not node.byPass.value, + exposed=True, ), desc.ChoiceParam( name="calibrationWeight", @@ -114,6 +117,7 @@ class LdrToHdrCalibration(desc.AVCommandLineNode): range=(8, 14, 1), advanced=True, enabled=lambda node: node.byPass.enabled and not node.byPass.value, + exposed=True, ), desc.ChoiceParam( name="workingColorSpace", @@ -126,6 +130,7 @@ class LdrToHdrCalibration(desc.AVCommandLineNode): invalidate=False, group="user", # not used directly on the command line enabled=lambda node: node.byPass.enabled and not node.byPass.value, + exposed=True, ), desc.IntParam( name="maxTotalPoints", diff --git a/meshroom/nodes/aliceVision/LdrToHdrMerge.py b/meshroom/nodes/aliceVision/LdrToHdrMerge.py index 624e32ccb4..929de5063e 100644 --- a/meshroom/nodes/aliceVision/LdrToHdrMerge.py +++ b/meshroom/nodes/aliceVision/LdrToHdrMerge.py @@ -60,6 +60,7 @@ class LdrToHdrMerge(desc.AVCommandLineNode): group="user", # not used directly on the command line errorMessage="The set number of brackets is not a multiple of the number of input images.\n" "Errors will occur during the computation.", + exposed=True, ), desc.IntParam( name="nbBrackets", @@ -124,6 +125,7 @@ class LdrToHdrMerge(desc.AVCommandLineNode): description="Bypass HDR creation and use the medium bracket as the source for the next steps.", value=False, enabled=lambda node: node.nbBrackets.value != 1, + exposed=True, ), desc.BoolParam( name="keepSourceImageName", @@ -151,6 +153,7 @@ class LdrToHdrMerge(desc.AVCommandLineNode): range=(8, 14, 1), advanced=True, enabled=lambda node: node.byPass.enabled and not node.byPass.value, + exposed=True, ), desc.ChoiceParam( name="workingColorSpace", @@ -161,6 +164,7 @@ class LdrToHdrMerge(desc.AVCommandLineNode): value="AUTO", exclusive=True, enabled=lambda node: node.byPass.enabled and not node.byPass.value, + exposed=True, ), desc.BoolParam( name="enableHighlight", diff --git a/meshroom/nodes/aliceVision/LdrToHdrSampling.py b/meshroom/nodes/aliceVision/LdrToHdrSampling.py index 19a359fef6..061e994629 100644 --- a/meshroom/nodes/aliceVision/LdrToHdrSampling.py +++ b/meshroom/nodes/aliceVision/LdrToHdrSampling.py @@ -76,6 +76,7 @@ class LdrToHdrSampling(desc.AVCommandLineNode): group="user", # not used directly on the command line errorMessage="The set number of brackets is not a multiple of the number of input images.\n" "Errors will occur during the computation.", + exposed=True, ), desc.IntParam( name="nbBrackets", @@ -93,6 +94,7 @@ class LdrToHdrSampling(desc.AVCommandLineNode): description="Bypass HDR creation and use the medium bracket as the source for the next steps.", value=False, enabled=lambda node: node.nbBrackets.value != 1, + exposed=True, ), desc.ChoiceParam( name="calibrationMethod", @@ -107,6 +109,7 @@ class LdrToHdrSampling(desc.AVCommandLineNode): value="auto", exclusive=True, enabled=lambda node: node.byPass.enabled and not node.byPass.value, + exposed=True, ), desc.IntParam( name="channelQuantizationPower", @@ -116,6 +119,7 @@ class LdrToHdrSampling(desc.AVCommandLineNode): range=(8, 14, 1), advanced=True, enabled=lambda node: node.byPass.enabled and not node.byPass.value, + exposed=True, ), desc.ChoiceParam( name="workingColorSpace", @@ -126,6 +130,7 @@ class LdrToHdrSampling(desc.AVCommandLineNode): value="AUTO", exclusive=True, enabled=lambda node: node.byPass.enabled and not node.byPass.value, + exposed=True, ), desc.IntParam( name="blockSize", diff --git a/meshroom/nodes/aliceVision/PanoramaCompositing.py b/meshroom/nodes/aliceVision/PanoramaCompositing.py index 983f53387c..811a0ddce7 100644 --- a/meshroom/nodes/aliceVision/PanoramaCompositing.py +++ b/meshroom/nodes/aliceVision/PanoramaCompositing.py @@ -75,6 +75,7 @@ class PanoramaCompositing(desc.AVCommandLineNode): label="Use Tiling", description="Enable tiling mode for parallelization.", value=True, + exposed=True, ), desc.ChoiceParam( name="storageDataType", diff --git a/meshroom/nodes/aliceVision/PanoramaEstimation.py b/meshroom/nodes/aliceVision/PanoramaEstimation.py index e1361c0688..80034348c5 100644 --- a/meshroom/nodes/aliceVision/PanoramaEstimation.py +++ b/meshroom/nodes/aliceVision/PanoramaEstimation.py @@ -33,6 +33,7 @@ class PanoramaEstimation(desc.AVCommandLineNode): name="featuresFolders", label="Features Folders", description="Folder(s) containing the extracted features.", + exposed=True, ), desc.ListAttribute( elementDesc=desc.File( @@ -53,6 +54,7 @@ class PanoramaEstimation(desc.AVCommandLineNode): value=["sift"], exclusive=False, joinChar=",", + exposed=True, ), desc.FloatParam( name="offsetLongitude", diff --git a/meshroom/nodes/aliceVision/PanoramaMerging.py b/meshroom/nodes/aliceVision/PanoramaMerging.py index 4e5d792478..b684bd592d 100644 --- a/meshroom/nodes/aliceVision/PanoramaMerging.py +++ b/meshroom/nodes/aliceVision/PanoramaMerging.py @@ -45,6 +45,7 @@ class PanoramaMerging(desc.AVCommandLineNode): label="Use Tiling", description="Enable tiling mode for parallelization.", value=True, + exposed=True, ), desc.ChoiceParam( name="storageDataType", diff --git a/meshroom/nodes/aliceVision/SfMTriangulation.py b/meshroom/nodes/aliceVision/SfMTriangulation.py index e7a87ae540..025dbf47cf 100644 --- a/meshroom/nodes/aliceVision/SfMTriangulation.py +++ b/meshroom/nodes/aliceVision/SfMTriangulation.py @@ -31,6 +31,7 @@ class SfMTriangulation(desc.AVCommandLineNode): name="featuresFolders", label="Features Folders", description="Folder(s) containing the extracted features and descriptors.", + exposed=True, ), desc.ListAttribute( elementDesc=desc.File( @@ -42,6 +43,7 @@ class SfMTriangulation(desc.AVCommandLineNode): name="matchesFolders", label="Matches Folders", description="Folder(s) in which computed matches are stored.", + exposed=True, ), desc.ChoiceParam( name="describerTypes", diff --git a/meshroom/nodes/aliceVision/StructureFromMotion.py b/meshroom/nodes/aliceVision/StructureFromMotion.py index d9b20585db..f16c92f129 100644 --- a/meshroom/nodes/aliceVision/StructureFromMotion.py +++ b/meshroom/nodes/aliceVision/StructureFromMotion.py @@ -82,6 +82,7 @@ class StructureFromMotion(desc.AVCommandLineNode): name="featuresFolders", label="Features Folders", description="Folder(s) containing the extracted features and descriptors.", + exposed=True, ), desc.ListAttribute( elementDesc=desc.File( @@ -93,6 +94,7 @@ class StructureFromMotion(desc.AVCommandLineNode): name="matchesFolders", label="Matches Folders", description="Folder(s) in which the computed matches are stored.", + exposed=True, ), desc.ChoiceParam( name="describerTypes", @@ -102,6 +104,7 @@ class StructureFromMotion(desc.AVCommandLineNode): value=["dspsift"], exclusive=False, joinChar=",", + exposed=True, ), desc.ChoiceParam( name="localizerEstimator", diff --git a/meshroom/nodes/aliceVision/TracksBuilding.py b/meshroom/nodes/aliceVision/TracksBuilding.py index 870c6339d4..c6cb841ea2 100644 --- a/meshroom/nodes/aliceVision/TracksBuilding.py +++ b/meshroom/nodes/aliceVision/TracksBuilding.py @@ -30,6 +30,7 @@ class TracksBuilding(desc.AVCommandLineNode): name="featuresFolders", label="Features Folders", description="Folder(s) containing the extracted features and descriptors.", + exposed=True, ), desc.ListAttribute( elementDesc=desc.File( From 2570c0e9fabf1946faac18e886a845fceaaf7df8 Mon Sep 17 00:00:00 2001 From: Aurore LAFAURIE Date: Thu, 12 Sep 2024 15:00:38 +0200 Subject: [PATCH 4/4] [Application] Put Refresh Nodes Status in graph editor menu --- meshroom/ui/qml/Application.qml | 80 ++++++++------------------------- 1 file changed, 19 insertions(+), 61 deletions(-) diff --git a/meshroom/ui/qml/Application.qml b/meshroom/ui/qml/Application.qml index 93ae4f07ff..02e02e48fa 100644 --- a/meshroom/ui/qml/Application.qml +++ b/meshroom/ui/qml/Application.qml @@ -1042,7 +1042,7 @@ Page { headerBar: RowLayout { MaterialToolButton { - text: MaterialIcons.refresh + text: MaterialIcons.sync ToolTip.text: "Refresh Nodes Status" ToolTip.visible: hovered font.pointSize: 11 @@ -1056,45 +1056,30 @@ Page { enabled: !updatingStatus } MaterialToolButton { - id: filePollerRefreshStatus - text: { - if (_reconstruction.filePollerRefresh === 0) - return MaterialIcons.published_with_changes - else if (_reconstruction.filePollerRefresh === 2) - return MaterialIcons.sync - else - return MaterialIcons.sync_disabled - } + text: MaterialIcons.more_vert font.pointSize: 11 padding: 2 - enabled: true - ToolTip { - id: filePollerTooltip - property string title: "Auto-Refresh Nodes Status For External Changes. " - property string description: "Check if the status of a node is changed by another instance on the same network, " + - "such as when computing in render farm." - text: { - var status = "" - if (_reconstruction.filePollerRefresh === 0) - status = "Enabled" - else if (_reconstruction.filePollerRefresh === 2) - status = "Minimal" - else - status = "Disabled" - return title + "(Current: " + status + ")\n\n" + description - } - visible: filePollerRefreshStatus.hovered - contentWidth: 420 - } - onClicked: { - refreshFilesMenu.open() - } + onClicked: graphEditorMenu.open() + checkable: true + checked: graphEditorMenu.visible Menu { - id: refreshFilesMenu - width: 210 + id: graphEditorMenu y: parent.height x: -width + parent.width MenuItem { + text: "Clear Pending Status" + enabled: _reconstruction ? !_reconstruction.computingLocally : false + onTriggered: _reconstruction.graph.clearSubmittedNodes() + } + MenuItem { + text: "Force Unlock Nodes" + onTriggered: _reconstruction.graph.forceUnlockNodes() + } + + Menu { + title: "Refresh Nodes Status" + + MenuItem { id: enableAutoRefresh text: "Enable Auto-Refresh" checkable: true @@ -1110,8 +1095,6 @@ Page { } // Prevents cases where the user unchecks the currently checked option enableAutoRefresh.checked = true - filePollerRefreshStatus.text = MaterialIcons.published_with_changes - filePollerTooltip.text = filePollerTooltip.title + "(Current: Enabled)\n\n" + filePollerTooltip.description } } MenuItem { @@ -1130,8 +1113,6 @@ Page { } // Prevents cases where the user unchecks the currently checked option disableAutoRefresh.checked = true - filePollerRefreshStatus.text = MaterialIcons.sync_disabled - filePollerTooltip.text = filePollerTooltip.title + "(Current: Disabled)\n\n" + filePollerTooltip.description } } MenuItem { @@ -1150,31 +1131,8 @@ Page { } // Prevents cases where the user unchecks the currently checked option minimalAutoRefresh.checked = true - filePollerRefreshStatus.text = MaterialIcons.sync - filePollerTooltip.text = filePollerTooltip.title + "(Current: Minimal)\n\n" + filePollerTooltip.description } } - } - } - MaterialToolButton { - text: MaterialIcons.more_vert - font.pointSize: 11 - padding: 2 - onClicked: graphEditorMenu.open() - checkable: true - checked: graphEditorMenu.visible - Menu { - id: graphEditorMenu - y: parent.height - x: -width + parent.width - MenuItem { - text: "Clear Pending Status" - enabled: _reconstruction ? !_reconstruction.computingLocally : false - onTriggered: _reconstruction.graph.clearSubmittedNodes() - } - MenuItem { - text: "Force Unlock Nodes" - onTriggered: _reconstruction.graph.forceUnlockNodes() } } }