Skip to content

Commit

Permalink
#5532: CheckBoxBinding supports an optional save function
Browse files Browse the repository at this point in the history
  • Loading branch information
codereader committed Mar 12, 2021
1 parent fe7a696 commit 6a4e9d9
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 23 deletions.
34 changes: 31 additions & 3 deletions radiant/ui/materials/Binding.h
Expand Up @@ -43,13 +43,35 @@ class CheckBoxBinding :
private:
wxCheckBox* _checkbox;
std::function<bool(const Source&)> _loadFunc;
std::function<void(const Source&, bool)> _saveFunc;

public:
CheckBoxBinding(wxCheckBox* checkbox, const std::function<bool(const Source&)> loadFunc) :
_checkbox(checkbox),
_loadFunc(loadFunc)
CheckBoxBinding(wxCheckBox* checkbox,
const std::function<bool(const Source&)> loadFunc) :
CheckBoxBinding(checkbox, loadFunc, std::function<void(const Source&, bool)>())
{}

CheckBoxBinding(wxCheckBox* checkbox,
const std::function<bool(const Source&)> loadFunc,
const std::function<void(const Source&, bool)> saveFunc) :
_checkbox(checkbox),
_loadFunc(loadFunc),
_saveFunc(saveFunc)
{
if (_saveFunc)
{
_checkbox->Bind(wxEVT_CHECKBOX, &CheckBoxBinding::onCheckedChanged, this);
}
}

virtual ~CheckBoxBinding()
{
if (_saveFunc)
{
_checkbox->Unbind(wxEVT_CHECKBOX, &CheckBoxBinding::onCheckedChanged, this);
}
}

virtual void updateFromSource(const Source& source) override
{
if (!source)
Expand All @@ -60,6 +82,12 @@ class CheckBoxBinding :

_checkbox->SetValue(_loadFunc(source));
}

private:
void onCheckedChanged(wxCommandEvent& ev)
{
_saveFunc(Binding<Source>::getSource(), _checkbox->IsChecked());
}
};

}
40 changes: 20 additions & 20 deletions radiant/ui/materials/MaterialEditor.cpp
Expand Up @@ -351,7 +351,7 @@ void MaterialEditor::setupMaterialStageProperties()
setupStageFlag("MaterialStageIgnoreAlphaTest", ShaderLayer::FLAG_IGNORE_ALPHATEST);

_stageBindings.emplace(std::make_shared<CheckBoxBinding<ShaderLayerPtr>>(getControl<wxCheckBox>("MaterialStageHasAlphaTest"),
[=](const ShaderLayerPtr& layer)
[](const ShaderLayerPtr& layer)
{
return layer->hasAlphaTest();
}));
Expand Down Expand Up @@ -386,16 +386,16 @@ void MaterialEditor::setupMaterialStageProperties()

// Texture
_stageBindings.emplace(std::make_shared<CheckBoxBinding<ShaderLayerPtr>>(getControl<wxCheckBox>("MaterialStageClamp"),
[=](const ShaderLayerPtr& layer) { return layer->getClampType() == CLAMP_NOREPEAT; }));
[](const ShaderLayerPtr& layer) { return layer->getClampType() == CLAMP_NOREPEAT; }));
_stageBindings.emplace(std::make_shared<CheckBoxBinding<ShaderLayerPtr>>(getControl<wxCheckBox>("MaterialStageNoclamp"),
[=](const ShaderLayerPtr& layer)
[](const ShaderLayerPtr& layer)
{
return layer->getClampType() == CLAMP_REPEAT && (layer->getParseFlags() & ShaderLayer::PF_HasNoclampKeyword) != 0;
}));
_stageBindings.emplace(std::make_shared<CheckBoxBinding<ShaderLayerPtr>>(getControl<wxCheckBox>("MaterialStageZeroClamp"),
[=](const ShaderLayerPtr& layer) { return layer->getClampType() == CLAMP_ZEROCLAMP; }));
[](const ShaderLayerPtr& layer) { return layer->getClampType() == CLAMP_ZEROCLAMP; }));
_stageBindings.emplace(std::make_shared<CheckBoxBinding<ShaderLayerPtr>>(getControl<wxCheckBox>("MaterialStageAlphaZeroClamp"),
[=](const ShaderLayerPtr& layer) { return layer->getClampType() == CLAMP_ALPHAZEROCLAMP; }));
[](const ShaderLayerPtr& layer) { return layer->getClampType() == CLAMP_ALPHAZEROCLAMP; }));

setupStageFlag("MaterialStageFilterNearest", ShaderLayer::FLAG_FILTER_NEAREST);
setupStageFlag("MaterialStageFilterLinear", ShaderLayer::FLAG_FILTER_LINEAR);
Expand All @@ -413,42 +413,42 @@ void MaterialEditor::setupMaterialStageProperties()
}

_stageBindings.emplace(std::make_shared<ExpressionBinding<ShaderLayerPtr>>(getControl<wxTextCtrl>("MaterialStageTranslateX"),
[=](const ShaderLayerPtr& layer) { return layer->getTranslationExpression(0); }));
[](const ShaderLayerPtr& layer) { return layer->getTranslationExpression(0); }));
_stageBindings.emplace(std::make_shared<ExpressionBinding<ShaderLayerPtr>>(getControl<wxTextCtrl>("MaterialStageTranslateY"),
[=](const ShaderLayerPtr& layer) { return layer->getTranslationExpression(1); }));
[](const ShaderLayerPtr& layer) { return layer->getTranslationExpression(1); }));

_stageBindings.emplace(std::make_shared<ExpressionBinding<ShaderLayerPtr>>(getControl<wxTextCtrl>("MaterialStageScaleX"),
[=](const ShaderLayerPtr& layer) { return layer->getScaleExpression(0); }));
[](const ShaderLayerPtr& layer) { return layer->getScaleExpression(0); }));
_stageBindings.emplace(std::make_shared<ExpressionBinding<ShaderLayerPtr>>(getControl<wxTextCtrl>("MaterialStageScaleY"),
[=](const ShaderLayerPtr& layer) { return layer->getScaleExpression(1); }));
[](const ShaderLayerPtr& layer) { return layer->getScaleExpression(1); }));

_stageBindings.emplace(std::make_shared<ExpressionBinding<ShaderLayerPtr>>(getControl<wxTextCtrl>("MaterialStageCenterScaleX"),
[=](const ShaderLayerPtr& layer) { return layer->getCenterScaleExpression(0); }));
[](const ShaderLayerPtr& layer) { return layer->getCenterScaleExpression(0); }));
_stageBindings.emplace(std::make_shared<ExpressionBinding<ShaderLayerPtr>>(getControl<wxTextCtrl>("MaterialStageCenterScaleY"),
[=](const ShaderLayerPtr& layer) { return layer->getCenterScaleExpression(1); }));
[](const ShaderLayerPtr& layer) { return layer->getCenterScaleExpression(1); }));

_stageBindings.emplace(std::make_shared<ExpressionBinding<ShaderLayerPtr>>(getControl<wxTextCtrl>("MaterialStageShearX"),
[=](const ShaderLayerPtr& layer) { return layer->getShearExpression(0); }));
[](const ShaderLayerPtr& layer) { return layer->getShearExpression(0); }));
_stageBindings.emplace(std::make_shared<ExpressionBinding<ShaderLayerPtr>>(getControl<wxTextCtrl>("MaterialStageShearY"),
[=](const ShaderLayerPtr& layer) { return layer->getShearExpression(1); }));
[](const ShaderLayerPtr& layer) { return layer->getShearExpression(1); }));

_stageBindings.emplace(std::make_shared<ExpressionBinding<ShaderLayerPtr>>(getControl<wxTextCtrl>("MaterialStageRotate"),
[=](const ShaderLayerPtr& layer) { return layer->getRotationExpression(); }));
[](const ShaderLayerPtr& layer) { return layer->getRotationExpression(); }));

_stageBindings.emplace(std::make_shared<ExpressionBinding<ShaderLayerPtr>>(getControl<wxTextCtrl>("MaterialStageCondition"),
[=](const ShaderLayerPtr& layer) { return layer->getConditionExpression(); }));
[](const ShaderLayerPtr& layer) { return layer->getConditionExpression(); }));

_stageBindings.emplace(std::make_shared<CheckBoxBinding<ShaderLayerPtr>>(getControl<wxCheckBox>("MaterialStageColored"),
[=](const ShaderLayerPtr& layer) { return (layer->getParseFlags() & ShaderLayer::PF_HasColoredKeyword) != 0; }));
[](const ShaderLayerPtr& layer) { return (layer->getParseFlags() & ShaderLayer::PF_HasColoredKeyword) != 0; }));

_stageBindings.emplace(std::make_shared<ExpressionBinding<ShaderLayerPtr>>(getControl<wxTextCtrl>("MaterialStageRed"),
[=](const ShaderLayerPtr& layer) { return layer->getColourExpression(ShaderLayer::COMP_RED); }));
[](const ShaderLayerPtr& layer) { return layer->getColourExpression(ShaderLayer::COMP_RED); }));
_stageBindings.emplace(std::make_shared<ExpressionBinding<ShaderLayerPtr>>(getControl<wxTextCtrl>("MaterialStageGreen"),
[=](const ShaderLayerPtr& layer) { return layer->getColourExpression(ShaderLayer::COMP_GREEN); }));
[](const ShaderLayerPtr& layer) { return layer->getColourExpression(ShaderLayer::COMP_GREEN); }));
_stageBindings.emplace(std::make_shared<ExpressionBinding<ShaderLayerPtr>>(getControl<wxTextCtrl>("MaterialStageBlue"),
[=](const ShaderLayerPtr& layer) { return layer->getColourExpression(ShaderLayer::COMP_BLUE); }));
[](const ShaderLayerPtr& layer) { return layer->getColourExpression(ShaderLayer::COMP_BLUE); }));
_stageBindings.emplace(std::make_shared<ExpressionBinding<ShaderLayerPtr>>(getControl<wxTextCtrl>("MaterialStageAlpha"),
[=](const ShaderLayerPtr& layer) { return layer->getColourExpression(ShaderLayer::COMP_ALPHA); }));
[](const ShaderLayerPtr& layer) { return layer->getColourExpression(ShaderLayer::COMP_ALPHA); }));

auto parameterPanel = getControl<wxPanel>("MaterialStageProgramParameters");
_stageProgramParameters = wxutil::TreeModel::Ptr(new wxutil::TreeModel(_stageProgramColumns, true));
Expand Down

0 comments on commit 6a4e9d9

Please sign in to comment.