From 6a4e9d9d947c718ff076bfd0e9157300352dcfd0 Mon Sep 17 00:00:00 2001 From: codereader Date: Fri, 12 Mar 2021 13:53:30 +0100 Subject: [PATCH] #5532: CheckBoxBinding supports an optional save function --- radiant/ui/materials/Binding.h | 34 +++++++++++++++++++-- radiant/ui/materials/MaterialEditor.cpp | 40 ++++++++++++------------- 2 files changed, 51 insertions(+), 23 deletions(-) diff --git a/radiant/ui/materials/Binding.h b/radiant/ui/materials/Binding.h index a3153f0658..943ee57273 100644 --- a/radiant/ui/materials/Binding.h +++ b/radiant/ui/materials/Binding.h @@ -43,13 +43,35 @@ class CheckBoxBinding : private: wxCheckBox* _checkbox; std::function _loadFunc; + std::function _saveFunc; public: - CheckBoxBinding(wxCheckBox* checkbox, const std::function loadFunc) : - _checkbox(checkbox), - _loadFunc(loadFunc) + CheckBoxBinding(wxCheckBox* checkbox, + const std::function loadFunc) : + CheckBoxBinding(checkbox, loadFunc, std::function()) {} + CheckBoxBinding(wxCheckBox* checkbox, + const std::function loadFunc, + const std::function 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) @@ -60,6 +82,12 @@ class CheckBoxBinding : _checkbox->SetValue(_loadFunc(source)); } + +private: + void onCheckedChanged(wxCommandEvent& ev) + { + _saveFunc(Binding::getSource(), _checkbox->IsChecked()); + } }; } diff --git a/radiant/ui/materials/MaterialEditor.cpp b/radiant/ui/materials/MaterialEditor.cpp index accd4d260c..ac7059cede 100644 --- a/radiant/ui/materials/MaterialEditor.cpp +++ b/radiant/ui/materials/MaterialEditor.cpp @@ -351,7 +351,7 @@ void MaterialEditor::setupMaterialStageProperties() setupStageFlag("MaterialStageIgnoreAlphaTest", ShaderLayer::FLAG_IGNORE_ALPHATEST); _stageBindings.emplace(std::make_shared>(getControl("MaterialStageHasAlphaTest"), - [=](const ShaderLayerPtr& layer) + [](const ShaderLayerPtr& layer) { return layer->hasAlphaTest(); })); @@ -386,16 +386,16 @@ void MaterialEditor::setupMaterialStageProperties() // Texture _stageBindings.emplace(std::make_shared>(getControl("MaterialStageClamp"), - [=](const ShaderLayerPtr& layer) { return layer->getClampType() == CLAMP_NOREPEAT; })); + [](const ShaderLayerPtr& layer) { return layer->getClampType() == CLAMP_NOREPEAT; })); _stageBindings.emplace(std::make_shared>(getControl("MaterialStageNoclamp"), - [=](const ShaderLayerPtr& layer) + [](const ShaderLayerPtr& layer) { return layer->getClampType() == CLAMP_REPEAT && (layer->getParseFlags() & ShaderLayer::PF_HasNoclampKeyword) != 0; })); _stageBindings.emplace(std::make_shared>(getControl("MaterialStageZeroClamp"), - [=](const ShaderLayerPtr& layer) { return layer->getClampType() == CLAMP_ZEROCLAMP; })); + [](const ShaderLayerPtr& layer) { return layer->getClampType() == CLAMP_ZEROCLAMP; })); _stageBindings.emplace(std::make_shared>(getControl("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); @@ -413,42 +413,42 @@ void MaterialEditor::setupMaterialStageProperties() } _stageBindings.emplace(std::make_shared>(getControl("MaterialStageTranslateX"), - [=](const ShaderLayerPtr& layer) { return layer->getTranslationExpression(0); })); + [](const ShaderLayerPtr& layer) { return layer->getTranslationExpression(0); })); _stageBindings.emplace(std::make_shared>(getControl("MaterialStageTranslateY"), - [=](const ShaderLayerPtr& layer) { return layer->getTranslationExpression(1); })); + [](const ShaderLayerPtr& layer) { return layer->getTranslationExpression(1); })); _stageBindings.emplace(std::make_shared>(getControl("MaterialStageScaleX"), - [=](const ShaderLayerPtr& layer) { return layer->getScaleExpression(0); })); + [](const ShaderLayerPtr& layer) { return layer->getScaleExpression(0); })); _stageBindings.emplace(std::make_shared>(getControl("MaterialStageScaleY"), - [=](const ShaderLayerPtr& layer) { return layer->getScaleExpression(1); })); + [](const ShaderLayerPtr& layer) { return layer->getScaleExpression(1); })); _stageBindings.emplace(std::make_shared>(getControl("MaterialStageCenterScaleX"), - [=](const ShaderLayerPtr& layer) { return layer->getCenterScaleExpression(0); })); + [](const ShaderLayerPtr& layer) { return layer->getCenterScaleExpression(0); })); _stageBindings.emplace(std::make_shared>(getControl("MaterialStageCenterScaleY"), - [=](const ShaderLayerPtr& layer) { return layer->getCenterScaleExpression(1); })); + [](const ShaderLayerPtr& layer) { return layer->getCenterScaleExpression(1); })); _stageBindings.emplace(std::make_shared>(getControl("MaterialStageShearX"), - [=](const ShaderLayerPtr& layer) { return layer->getShearExpression(0); })); + [](const ShaderLayerPtr& layer) { return layer->getShearExpression(0); })); _stageBindings.emplace(std::make_shared>(getControl("MaterialStageShearY"), - [=](const ShaderLayerPtr& layer) { return layer->getShearExpression(1); })); + [](const ShaderLayerPtr& layer) { return layer->getShearExpression(1); })); _stageBindings.emplace(std::make_shared>(getControl("MaterialStageRotate"), - [=](const ShaderLayerPtr& layer) { return layer->getRotationExpression(); })); + [](const ShaderLayerPtr& layer) { return layer->getRotationExpression(); })); _stageBindings.emplace(std::make_shared>(getControl("MaterialStageCondition"), - [=](const ShaderLayerPtr& layer) { return layer->getConditionExpression(); })); + [](const ShaderLayerPtr& layer) { return layer->getConditionExpression(); })); _stageBindings.emplace(std::make_shared>(getControl("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>(getControl("MaterialStageRed"), - [=](const ShaderLayerPtr& layer) { return layer->getColourExpression(ShaderLayer::COMP_RED); })); + [](const ShaderLayerPtr& layer) { return layer->getColourExpression(ShaderLayer::COMP_RED); })); _stageBindings.emplace(std::make_shared>(getControl("MaterialStageGreen"), - [=](const ShaderLayerPtr& layer) { return layer->getColourExpression(ShaderLayer::COMP_GREEN); })); + [](const ShaderLayerPtr& layer) { return layer->getColourExpression(ShaderLayer::COMP_GREEN); })); _stageBindings.emplace(std::make_shared>(getControl("MaterialStageBlue"), - [=](const ShaderLayerPtr& layer) { return layer->getColourExpression(ShaderLayer::COMP_BLUE); })); + [](const ShaderLayerPtr& layer) { return layer->getColourExpression(ShaderLayer::COMP_BLUE); })); _stageBindings.emplace(std::make_shared>(getControl("MaterialStageAlpha"), - [=](const ShaderLayerPtr& layer) { return layer->getColourExpression(ShaderLayer::COMP_ALPHA); })); + [](const ShaderLayerPtr& layer) { return layer->getColourExpression(ShaderLayer::COMP_ALPHA); })); auto parameterPanel = getControl("MaterialStageProgramParameters"); _stageProgramParameters = wxutil::TreeModel::Ptr(new wxutil::TreeModel(_stageProgramColumns, true));