canvas.gui.widgets PropertyWidgets: Add functionality to temporarily disable property syncedness for property-synced widgets
This is needed for example to prevent writing to the bound property while adding items to a PropertyComboBox
This commit is contained in:
parent
ad266eb743
commit
e5f4915e89
1 changed files with 144 additions and 99 deletions
|
@ -3,8 +3,8 @@
|
|||
# SPDX-FileCopyrightText: (C) 2022 Frederic Croix <thefgfseagle@gmail.com>
|
||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
gui.widgets.PropertySwitch = {
|
||||
new: func(parent, style = nil, cfg = nil) {
|
||||
gui.widgets.PropertyWidget = {
|
||||
new: func(base, parent, style = nil, cfg = nil) {
|
||||
style = style or canvas.style;
|
||||
cfg = cfg or {};
|
||||
if (cfg["node"] == nil) {
|
||||
|
@ -13,18 +13,37 @@ gui.widgets.PropertySwitch = {
|
|||
if (!isa(cfg["node"], props.Node)) {
|
||||
cfg["node"] = props.globals.getNode(cfg["node"], 1);
|
||||
}
|
||||
|
||||
var m = gui.widgets.Switch.new(parent, style, cfg);
|
||||
m._checkable = 1;
|
||||
var m = base.new(parent, style, cfg);
|
||||
m.parents = [gui.widgets.PropertyWidget] ~ m.parents;
|
||||
m._node = cfg["node"];
|
||||
m._propertySynced = 1;
|
||||
|
||||
return m;
|
||||
},
|
||||
|
||||
setPropertySynced: func(synced = 1) {
|
||||
me._propertySynced = synced;
|
||||
},
|
||||
};
|
||||
|
||||
append(m.parents, gui.widgets.PropertySwitch);
|
||||
gui.widgets.PropertySwitch = {
|
||||
new: func(parent, style = nil, cfg = nil) {
|
||||
var m = gui.widgets.PropertyWidget.new(gui.widgets.Switch, parent, style, cfg);
|
||||
m._checkable = 1;
|
||||
|
||||
m.parents = [gui.widgets.PropertySwitch] ~ m.parents;
|
||||
|
||||
m.setChecked(m._node.getBoolValue());
|
||||
m.listen("toggled", func(e) {
|
||||
if (!m._propertySynced) {
|
||||
return;
|
||||
}
|
||||
m._node.setBoolValue(int(e.detail.checked));
|
||||
});
|
||||
m._listener = setlistener(m._node, func(n) {
|
||||
if (!m._propertySynced) {
|
||||
return;
|
||||
}
|
||||
m.setChecked(n.getBoolValue());
|
||||
}, 1, 0);
|
||||
|
||||
|
@ -38,26 +57,22 @@ gui.widgets.PropertySwitch = {
|
|||
|
||||
gui.widgets.PropertyButton = {
|
||||
new: func(parent, style = nil, cfg = nil) {
|
||||
style = style or canvas.style;
|
||||
cfg = cfg or {};
|
||||
if (cfg["node"] == nil) {
|
||||
die("Missing configuration 'node' field");
|
||||
}
|
||||
if (!isa(cfg["node"], props.Node)) {
|
||||
cfg["node"] = props.globals.getNode(cfg["node"], 1);
|
||||
}
|
||||
|
||||
var m = gui.widgets.Button.new(parent, style, cfg);
|
||||
var m = gui.widgets.PropertyWidget.new(gui.widgets.Button, parent, style, cfg);
|
||||
m._checkable = 1;
|
||||
m._node = cfg["node"];
|
||||
|
||||
append(m.parents, gui.widgets.PropertyButton);
|
||||
m.parents = [gui.widgets.PropertyButton] ~ m.parents;
|
||||
|
||||
m.setChecked(m._node.getBoolValue());
|
||||
m.listen("toggled", func(e) {
|
||||
if (!m._propertySynced) {
|
||||
return;
|
||||
}
|
||||
m._node.setBoolValue(int(e.detail.checked));
|
||||
});
|
||||
m._listener = setlistener(m._node, func(n) {
|
||||
if (!m._propertySynced) {
|
||||
return;
|
||||
}
|
||||
m.setChecked(n.getBoolValue());
|
||||
}, 1, 0);
|
||||
|
||||
|
@ -77,8 +92,12 @@ gui.widgets.PropertyRadioButtonsGroup = {
|
|||
var m = gui.widgets.RadioButtonsGroup.new(name);
|
||||
m.parents = [gui.widgets.PropertyRadioButtonsGroup] ~ m.parents;
|
||||
m._node = node;
|
||||
m._propertySynced = 1;
|
||||
m._ignore_radio_toggles = 0;
|
||||
m._nodeListener = setlistener(node, func(n) {
|
||||
if (!m._propertySynced) {
|
||||
return;
|
||||
}
|
||||
m._ignore_radio_toggles = 1;
|
||||
var value = node.getValue();
|
||||
foreach (var radio; m.radios) {
|
||||
|
@ -92,6 +111,10 @@ gui.widgets.PropertyRadioButtonsGroup = {
|
|||
});
|
||||
},
|
||||
|
||||
setPropertySynced: func(synced = 1) {
|
||||
me._propertySynced = synced;
|
||||
},
|
||||
|
||||
_onRadioToggled: func {
|
||||
if (me._ignore_radio_toggles) {
|
||||
return;
|
||||
|
@ -100,33 +123,39 @@ gui.widgets.PropertyRadioButtonsGroup = {
|
|||
foreach (var radio; me.radios) {
|
||||
radio._trigger("group-checked-radio-changed", {checkedRadio: checked});
|
||||
}
|
||||
m._node.setValue(checked != nil ? checked.getData("property-value") : nil);
|
||||
if (m._propertySynced) {
|
||||
m._node.setValue(checked != nil ? checked.getData("property-value") : nil);
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
gui.widgets.PropertyRadioButton = {
|
||||
new: func(parent, style = nil, cfg = nil) {
|
||||
style = style or canvas.style;
|
||||
cfg = cfg or {};
|
||||
cfg["radioButtonGroupClass"] = gui.widgets.PropertyRadioButtonsGroup;
|
||||
if (cfg["node"] == nil) {
|
||||
die("Missing configuration 'node' field");
|
||||
}
|
||||
if (!isa(cfg["node"], props.Node)) {
|
||||
cfg["node"] = props.globals.getNode(cfg["node"], 1);
|
||||
}
|
||||
cfg["radioButtonGroup"] = gui.widgets.PropertyRadioButtonsGroup.new(cfg["node"]);
|
||||
|
||||
var m = gui.widgets.RadioButton.new(parent, style, cfg);
|
||||
var m = gui.widgets.PropertyWidget.new(gui.widgets.RadioButton, parent, style, cfg);
|
||||
m._checkable = 1;
|
||||
m._node = cfg["node"];
|
||||
|
||||
append(m.parents, gui.widgets.PropertyRadioButton);
|
||||
m.parents = [gui.widgets.PropertyRadioButton] ~ m.parents;
|
||||
|
||||
m.setChecked(m._node.getBoolValue());
|
||||
m.listen("toggled", func(e) {
|
||||
if (!m._propertySynced) {
|
||||
return;
|
||||
}
|
||||
m._node.setBoolValue(int(e.detail.checked));
|
||||
});
|
||||
m._listener = setlistener(m._node, func(n) {
|
||||
if (!m._propertySynced) {
|
||||
return;
|
||||
}
|
||||
m.setChecked(n.getBoolValue());
|
||||
}, 1, 0);
|
||||
|
||||
|
@ -140,26 +169,24 @@ gui.widgets.PropertyRadioButton = {
|
|||
|
||||
gui.widgets.PropertyList = {
|
||||
new: func(parent, style = nil, cfg = nil) {
|
||||
if (cfg["node"] == nil) {
|
||||
die("Missing configuration 'node' field");
|
||||
}
|
||||
if (!isa(cfg["node"], props.Node)) {
|
||||
cfg["node"] = props.globals.getNode(cfg["node"], 1);
|
||||
}
|
||||
|
||||
var m = gui.widgets.List.new(parent, style, cfg);
|
||||
var m = gui.widgets.PropertyWidget.new(gui.widgets.List, parent, style, cfg);
|
||||
m._checkable = 1;
|
||||
m._node = cfg["node"];
|
||||
|
||||
append(m.parents, gui.widgets.PropertyList);
|
||||
m.parents = [gui.widgets.PropertyList] ~ m.parents;
|
||||
|
||||
if (str(m.findItemByData(m._node.getValue()))) {
|
||||
m.setItemSelection(m.findItemByData("property-value", m._node.getValue()));
|
||||
}
|
||||
m.listen("selection-changed", func(e) {
|
||||
if (!m._propertySynced) {
|
||||
return;
|
||||
}
|
||||
m._node.setValue(m.getSelectedItems()[0].getData("property-value"));
|
||||
});
|
||||
m._listener = setlistener(m._node, func(n) {
|
||||
if (!m._propertySynced) {
|
||||
return;
|
||||
}
|
||||
if (str(m.findItemByData("property-value", n.getValue()))) {
|
||||
m.setItemSelection(m.findItemByData("property-value", n.getValue()));
|
||||
}
|
||||
|
@ -173,80 +200,106 @@ gui.widgets.PropertyList = {
|
|||
},
|
||||
};
|
||||
|
||||
gui.widgets.PropertyComboBox = {
|
||||
new: func(parent, style = nil, cfg = nil) {
|
||||
var m = gui.widgets.PropertyWidget.new(gui.widgets.ComboBox, parent, style, cfg);
|
||||
m._checkable = 1;
|
||||
|
||||
m.parents = [gui.widgets.PropertyComboBox] ~ m.parents;
|
||||
|
||||
m.setCurrentByValue(m._node.getValue());
|
||||
m.listen("selected-item-changed", func(e) {
|
||||
if (!m._propertySynced) {
|
||||
return;
|
||||
}
|
||||
m._node.setValue(e.detail.value);
|
||||
});
|
||||
m._listener = setlistener(m._node, func(n) {
|
||||
if (!m._propertySynced) {
|
||||
return;
|
||||
}
|
||||
if (n.getValue() != m._items[m._currentIndex].menuValue) {
|
||||
m.setCurrentByValue(n.getValue());
|
||||
}
|
||||
}, 0, 0);
|
||||
|
||||
return m;
|
||||
},
|
||||
|
||||
del: func {
|
||||
removelistener(me._listener);
|
||||
},
|
||||
};
|
||||
|
||||
gui.widgets.PropertyLabel = {
|
||||
new: func(parent, style = nil, cfg = nil) {
|
||||
style = style or canvas.style;
|
||||
cfg = cfg or {};
|
||||
if (cfg["node"] == nil) {
|
||||
die("Missing configuration 'node' field");
|
||||
}
|
||||
if (!isa(cfg["node"], props.Node)) {
|
||||
cfg["node"] = props.globals.getNode(cfg["node"], 1);
|
||||
}
|
||||
var m = gui.widgets.Label.new(parent, style, cfg);
|
||||
var m = gui.widgets.PropertyWidget.new(gui.widgets.Label, parent, style, cfg);
|
||||
m._checkable = 1;
|
||||
m._node = cfg["node"];
|
||||
|
||||
append(m.parents, gui.widgets.PropertyLabel);
|
||||
m.parents = [gui.widgets.PropertyLabel] ~ m.parents;
|
||||
|
||||
m.setText(m._node.getValue());
|
||||
m._listener = setlistener(m._node, func(n) {
|
||||
if (!m._propertySynced) {
|
||||
return;
|
||||
}
|
||||
m.setText(n.getValue());
|
||||
}, 1, 0);
|
||||
}
|
||||
}, 0, 0);
|
||||
},
|
||||
|
||||
del: func {
|
||||
removelistener(m._listener);
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
gui.widgets.PropertyLineEdit = {
|
||||
new: func(parent, style = nil, cfg = nil) {
|
||||
style = style or canvas.style;
|
||||
cfg = cfg or {};
|
||||
if (cfg["node"] == nil) {
|
||||
die("Missing configuration 'node' field");
|
||||
}
|
||||
if (!isa(cfg["node"], props.Node)) {
|
||||
cfg["node"] = props.globals.getNode(cfg["node"], 1);
|
||||
}
|
||||
var m = gui.widgets.LineEdit.new(parent, style, cfg);
|
||||
var m = gui.widgets.PropertyWidget.new(gui.widgets.LineEdit, parent, style, cfg);
|
||||
m._checkable = 1;
|
||||
m._node = cfg["node"];
|
||||
|
||||
append(m.parents, gui.widgets.PropertyLineEdit);
|
||||
m.parents = [gui.widgets.PropertyLineEdit] ~ m.parents;
|
||||
|
||||
m.setText(m._node.getValue());
|
||||
m.listen("text-changed", func(e) {
|
||||
if (!m._propertySynced) {
|
||||
return;
|
||||
}
|
||||
m._node.setValue(m.getText());
|
||||
});
|
||||
m._listener = setlistener(m._node, func(n) {
|
||||
if (!m._propertySynced) {
|
||||
return;
|
||||
}
|
||||
m.setText(n.getValue());
|
||||
}, 1, 0);
|
||||
}
|
||||
}, 0, 0);
|
||||
},
|
||||
|
||||
del: func {
|
||||
removelistener(m._listener);
|
||||
},
|
||||
};
|
||||
|
||||
gui.widgets.PropertyCheckBox = {
|
||||
new: func(parent, style = nil, cfg = nil) {
|
||||
style = style or canvas.style;
|
||||
cfg = cfg or {};
|
||||
if (cfg["node"] == nil) {
|
||||
die("Missing configuration 'node' field");
|
||||
}
|
||||
if (!isa(cfg["node"], props.Node)) {
|
||||
cfg["node"] = props.globals.getNode(cfg["node"], 1);
|
||||
}
|
||||
|
||||
var m = gui.widgets.CheckBox.new(parent, style, cfg);
|
||||
var m = gui.widgets.PropertyWidget.new(gui.widgets.CheckBox, parent, style, cfg);
|
||||
m._checkable = 1;
|
||||
m._node = cfg["node"];
|
||||
|
||||
append(m.parents, gui.widgets.PropertyCheckBox);
|
||||
m.parents = [gui.widgets.PropertyCheckBox] ~ m.parents;
|
||||
|
||||
m.setChecked(m._node.getBoolValue());
|
||||
m.listen("toggled", func(e) {
|
||||
if (!m._propertySynced) {
|
||||
return;
|
||||
}
|
||||
m._node.setBoolValue(int(e.detail.checked));
|
||||
});
|
||||
m._listener = setlistener(m._node, func(n) {
|
||||
if (!m._propertySynced) {
|
||||
return;
|
||||
}
|
||||
m.setChecked(n.getBoolValue());
|
||||
}, 1, 0);
|
||||
}, 0, 0);
|
||||
|
||||
return m;
|
||||
},
|
||||
|
@ -258,27 +311,23 @@ gui.widgets.PropertyCheckBox = {
|
|||
|
||||
gui.widgets.PropertySlider = {
|
||||
new: func(parent, style = nil, cfg = nil) {
|
||||
style = style or canvas.style;
|
||||
cfg = cfg or {};
|
||||
if (cfg["node"] == nil) {
|
||||
die("Missing configuration 'node' field");
|
||||
}
|
||||
if (!isa(cfg["node"], props.Node)) {
|
||||
cfg["node"] = props.globals.getNode(cfg["node"], 1);
|
||||
}
|
||||
|
||||
var m = gui.widgets.Slider.new(parent, style, cfg);
|
||||
m._node = cfg["node"];
|
||||
var m = gui.widgets.PropertyWidget.new(gui.widgets.Slider, parent, style, cfg);
|
||||
|
||||
append(m.parents, gui.widgets.PropertySlider);
|
||||
m.parents = [gui.widgets.PropertySlider] ~ m.parents;
|
||||
|
||||
m.setValue(m._node.getValue());
|
||||
m.listen("value-changed", func(e) {
|
||||
if (!m._propertySynced) {
|
||||
return;
|
||||
}
|
||||
m._node.setValue(num(e.detail.value));
|
||||
});
|
||||
m._listener = setlistener(m._node, func(n) {
|
||||
if (!m._propertySynced) {
|
||||
return;
|
||||
}
|
||||
m.setValue(n.getValue());
|
||||
}, 1, 0);
|
||||
}, 0, 0);
|
||||
|
||||
return m;
|
||||
},
|
||||
|
@ -290,27 +339,23 @@ gui.widgets.PropertySlider = {
|
|||
|
||||
gui.widgets.PropertyDial = {
|
||||
new: func(parent, style = nil, cfg = nil) {
|
||||
style = style or canvas.style;
|
||||
cfg = cfg or {};
|
||||
if (cfg["node"] == nil) {
|
||||
die("Missing configuration 'node' field");
|
||||
}
|
||||
if (!isa(cfg["node"], props.Node)) {
|
||||
cfg["node"] = props.globals.getNode(cfg["node"], 1);
|
||||
}
|
||||
|
||||
var m = gui.widgets.Dial.new(parent, style, cfg);
|
||||
m._node = cfg["node"];
|
||||
var m = gui.widgets.PropertyWidget.new(gui.widgets.Dial, parent, style, cfg);
|
||||
|
||||
append(m.parents, gui.widgets.PropertyDial);
|
||||
m.parents = [gui.widgets.PropertyDial] ~ m.parents;
|
||||
|
||||
m.setValue(m._node.getValue());
|
||||
m.listen("value-changed", func(e) {
|
||||
if (!m._propertySynced) {
|
||||
return;
|
||||
}
|
||||
m._node.setValue(num(e.detail.value));
|
||||
});
|
||||
m._listener = setlistener(m._node, func(n) {
|
||||
if (!m._propertySynced) {
|
||||
return;
|
||||
}
|
||||
m.setValue(n.getValue());
|
||||
}, 1, 0);
|
||||
}, 0, 0);
|
||||
|
||||
return m;
|
||||
},
|
||||
|
|
Loading…
Add table
Reference in a new issue