From 6743a34959236833e0bbeeafe95e2b077a4714dd Mon Sep 17 00:00:00 2001 From: codereader Date: Sat, 31 Jul 2021 20:15:46 +0200 Subject: [PATCH] Fix (potential) crashes due to wrong lambda captures. Disconnect from materials when closing the editor. --- radiant/ui/materials/editor/MaterialEditor.cpp | 13 +++++++------ radiant/ui/materials/editor/MaterialEditor.h | 4 +++- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/radiant/ui/materials/editor/MaterialEditor.cpp b/radiant/ui/materials/editor/MaterialEditor.cpp index cfb65a8ac5..f426535bb9 100644 --- a/radiant/ui/materials/editor/MaterialEditor.cpp +++ b/radiant/ui/materials/editor/MaterialEditor.cpp @@ -181,6 +181,7 @@ MaterialEditor::MaterialEditor() : MaterialEditor::~MaterialEditor() { + _materialChanged.disconnect(); _materialBindings.clear(); _stageBindings.clear(); @@ -819,7 +820,7 @@ void MaterialEditor::setupMaterialShaderFlags() cullTypes->AppendString(pair.first); } - cullTypes->Bind(wxEVT_CHOICE, [=](wxCommandEvent& ev) + cullTypes->Bind(wxEVT_CHOICE, [this, cullTypes](wxCommandEvent& ev) { if (!_material || _materialUpdateInProgress) return; _material->setCullType(shaders::getCullTypeForString(cullTypes->GetStringSelection().ToStdString())); @@ -847,22 +848,22 @@ void MaterialEditor::setupMaterialShaderFlags() // DECAL_MACRO _materialBindings.emplace(std::make_shared>(getControl("MaterialHasDecalMacro"), [](const MaterialPtr& material) { return material->getParseFlags() & Material::PF_HasDecalMacro; }, - [=](const MaterialPtr& material, const bool& newValue) {})); + [](const MaterialPtr& material, const bool& newValue) {})); // TWOSIDED_DECAL_MACRO _materialBindings.emplace(std::make_shared>(getControl("MaterialHasTwoSidedDecalMacro"), [](const MaterialPtr& material) { return material->getParseFlags() & Material::PF_HasTwoSidedDecalMacro; }, - [=](const MaterialPtr& material, const bool& newValue) {})); + [](const MaterialPtr& material, const bool& newValue) {})); // GLASS_MACRO _materialBindings.emplace(std::make_shared>(getControl("MaterialHasGlassMacro"), [](const MaterialPtr& material) { return material->getParseFlags() & Material::PF_HasGlassMacro; }, - [=](const MaterialPtr& material, const bool& newValue) {})); + [](const MaterialPtr& material, const bool& newValue) {})); // PARTICLE_MACRO _materialBindings.emplace(std::make_shared>(getControl("MaterialHasParticleMacro"), [](const MaterialPtr& material) { return material->getParseFlags() & Material::PF_HasParticleMacro; }, - [=](const MaterialPtr& material, const bool& newValue) {})); + [](const MaterialPtr& material, const bool& newValue) {})); } void MaterialEditor::setupMaterialSurfaceFlags() @@ -1269,7 +1270,7 @@ void MaterialEditor::setupMaterialStageProperties() _stageBindings.emplace(std::make_shared>(getControl("MaterialStageColored"), [](const IShaderLayer::Ptr& layer) { return stageQualifiesAsColoured(layer); }, - [=](const IEditableShaderLayer::Ptr& layer, const bool& value) { _onStageColoredChecked(layer, value); }, + [this](const IEditableShaderLayer::Ptr& layer, const bool& value) { _onStageColoredChecked(layer, value); }, std::bind(&MaterialEditor::onMaterialChanged, this), std::bind(&MaterialEditor::getEditableStageForSelection, this))); diff --git a/radiant/ui/materials/editor/MaterialEditor.h b/radiant/ui/materials/editor/MaterialEditor.h index 9e8458f77d..bd0a60aba7 100644 --- a/radiant/ui/materials/editor/MaterialEditor.h +++ b/radiant/ui/materials/editor/MaterialEditor.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include "icommandsystem.h" #include "ishaders.h" @@ -19,7 +20,8 @@ namespace ui class MaterialEditor : public wxutil::DialogBase, - private wxutil::XmlResourceBasedWidget + private wxutil::XmlResourceBasedWidget, + public sigc::trackable { private: MaterialTreeView* _treeView;