[ui] GraphEditor: Move ChoiceParam control to its own file

Start modularization of attribute controls for better readability
and maintenance.
Make Choice control independent from the MeshroomUI API.
This commit is contained in:
Yann Lanthony 2025-02-13 11:40:09 +01:00
parent cfc2979653
commit ba272eddc7
2 changed files with 43 additions and 19 deletions

View file

@ -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"
}
}

View file

@ -6,6 +6,7 @@ import QtQuick.Dialogs
import MaterialIcons 2.2 import MaterialIcons 2.2
import Utils 1.0 import Utils 1.0
import Controls 1.0 import Controls 1.0
import "AttributeControls" as AttributeControls
/** /**
* Instantiate a control to visualize and edit an Attribute based on its type. * Instantiate a control to visualize and edit an Attribute based on its type.
@ -208,7 +209,7 @@ RowLayout {
case "PushButtonParam": case "PushButtonParam":
return pushButtonComponent return pushButtonComponent
case "ChoiceParam": case "ChoiceParam":
return attribute.desc.exclusive ? comboBoxComponent : multiChoiceComponent return attribute.desc.exclusive ? choiceComponent : multiChoiceComponent
case "IntParam": return sliderComponent case "IntParam": return sliderComponent
case "FloatParam": case "FloatParam":
if (attribute.desc.semantic === 'color/hue') if (attribute.desc.semantic === 'color/hue')
@ -469,26 +470,15 @@ RowLayout {
} }
Component { Component {
id: comboBoxComponent id: choiceComponent
RowLayout { AttributeControls.Choice {
FilterComboBox { value: root.attribute.value
id: comboBox values: root.attribute.values
enabled: root.editable
Layout.fillWidth: true onEditingFinished: (value) => {
_reconstruction.setAttribute(root.attribute, value)
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"
} }
} }
} }