diff --git a/meshroom/ui/qml/GraphEditor/AttributeControls/Choice.qml b/meshroom/ui/qml/GraphEditor/AttributeControls/Choice.qml new file mode 100644 index 00000000..c4624d50 --- /dev/null +++ b/meshroom/ui/qml/GraphEditor/AttributeControls/Choice.qml @@ -0,0 +1,34 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts + +import MaterialIcons +import Controls + +/** + * A combobox-type control with a single current `value` and a list of possible `values`. + * Provides filtering capabilities and support for custom values (i.e: `value` not in `values`). + */ +RowLayout { + id: root + + required property var value + required property var values + + signal editingFinished(var value) + + FilterComboBox { + id: comboBox + + Layout.fillWidth: true + sourceModel: root.values + inputValue: root.value + onEditingFinished: value => root.editingFinished(value) + } + + MaterialLabel { + visible: !comboBox.validValue + text: MaterialIcons.warning + ToolTip.text: "Custom value detected" + } +} diff --git a/meshroom/ui/qml/GraphEditor/AttributeItemDelegate.qml b/meshroom/ui/qml/GraphEditor/AttributeItemDelegate.qml index 767724fd..e8ad4fe1 100644 --- a/meshroom/ui/qml/GraphEditor/AttributeItemDelegate.qml +++ b/meshroom/ui/qml/GraphEditor/AttributeItemDelegate.qml @@ -6,6 +6,7 @@ import QtQuick.Dialogs import MaterialIcons 2.2 import Utils 1.0 import Controls 1.0 +import "AttributeControls" as AttributeControls /** * Instantiate a control to visualize and edit an Attribute based on its type. @@ -208,7 +209,7 @@ RowLayout { case "PushButtonParam": return pushButtonComponent case "ChoiceParam": - return attribute.desc.exclusive ? comboBoxComponent : multiChoiceComponent + return attribute.desc.exclusive ? choiceComponent : multiChoiceComponent case "IntParam": return sliderComponent case "FloatParam": if (attribute.desc.semantic === 'color/hue') @@ -469,26 +470,15 @@ RowLayout { } Component { - id: comboBoxComponent + id: choiceComponent - RowLayout { - FilterComboBox { - id: comboBox + AttributeControls.Choice { + value: root.attribute.value + values: root.attribute.values + enabled: root.editable - Layout.fillWidth: true - - enabled: root.editable - sourceModel: attribute.values - inputValue: attribute.value - - onEditingFinished: (value) => { - _reconstruction.setAttribute(attribute, value) - } - } - MaterialLabel { - visible: !comboBox.validValue - text: MaterialIcons.warning - ToolTip.text: "Custom value detected" + onEditingFinished: (value) => { + _reconstruction.setAttribute(root.attribute, value) } } }