Skip to content

Commit

Permalink
#5532: Add Binding class used to connect the Material to a UI control…
Browse files Browse the repository at this point in the history
…. Introduce CheckboxBinding as first implementation to reflect all the surface flags.
  • Loading branch information
codereader committed Feb 19, 2021
1 parent 195e303 commit 81b9bcb
Show file tree
Hide file tree
Showing 7 changed files with 173 additions and 52 deletions.
52 changes: 26 additions & 26 deletions install/ui/materialeditor.fbp

Large diffs are not rendered by default.

52 changes: 26 additions & 26 deletions install/ui/materialeditor.xrc
Expand Up @@ -167,7 +167,7 @@
<object class="wxNotebook" name="m_notebook2">
<object class="notebookpage">
<label>Interaction</label>
<selected>1</selected>
<selected>0</selected>
<object class="wxPanel" name="InteractionPage">
<style>wxTAB_TRAVERSAL</style>
<object class="wxBoxSizer">
Expand Down Expand Up @@ -315,7 +315,7 @@
</object>
<object class="notebookpage">
<label>Surface Flags</label>
<selected>0</selected>
<selected>1</selected>
<object class="wxPanel" name="SurfaceFlagsPage">
<style>wxTAB_TRAVERSAL</style>
<object class="wxBoxSizer">
Expand All @@ -335,16 +335,16 @@
<option>0</option>
<flag>wxALL</flag>
<border>5</border>
<object class="wxCheckBox" name="m_checkBox873">
<object class="wxCheckBox" name="MaterialSurfaceFlagSolid">
<label>solid</label>
<checked>0</checked>
<checked>1</checked>
</object>
</object>
<object class="sizeritem">
<option>0</option>
<flag>wxALL</flag>
<border>5</border>
<object class="wxCheckBox" name="m_checkBox88">
<object class="wxCheckBox" name="MaterialSurfaceFlagIkclip">
<label>ikclip</label>
<checked>0</checked>
</object>
Expand All @@ -353,7 +353,7 @@
<option>0</option>
<flag>wxALL</flag>
<border>5</border>
<object class="wxCheckBox" name="m_checkBox89">
<object class="wxCheckBox" name="MaterialSurfaceFlagFlashlighttrigger">
<label>flashlight__trigger</label>
<checked>0</checked>
</object>
Expand All @@ -362,7 +362,7 @@
<option>0</option>
<flag>wxALL</flag>
<border>5</border>
<object class="wxCheckBox" name="m_checkBox90">
<object class="wxCheckBox" name="MaterialSurfaceFlagDiscrete">
<label>discrete</label>
<checked>0</checked>
</object>
Expand All @@ -371,7 +371,7 @@
<option>0</option>
<flag>wxALL</flag>
<border>5</border>
<object class="wxCheckBox" name="m_checkBox91">
<object class="wxCheckBox" name="MaterialSurfaceFlagNoimpact">
<label>noimpact</label>
<checked>0</checked>
</object>
Expand All @@ -380,7 +380,7 @@
<option>0</option>
<flag>wxALL</flag>
<border>5</border>
<object class="wxCheckBox" name="m_checkBox92">
<object class="wxCheckBox" name="MaterialSurfaceFlagWater">
<label>water</label>
<checked>0</checked>
</object>
Expand All @@ -389,7 +389,7 @@
<option>0</option>
<flag>wxALL</flag>
<border>5</border>
<object class="wxCheckBox" name="m_checkBox93">
<object class="wxCheckBox" name="MaterialSurfaceFlagBlood">
<label>blood</label>
<checked>0</checked>
</object>
Expand All @@ -398,7 +398,7 @@
<option>0</option>
<flag>wxALL</flag>
<border>5</border>
<object class="wxCheckBox" name="m_checkBox94">
<object class="wxCheckBox" name="MaterialSurfaceFlagNonsolid">
<label>nonsolid</label>
<checked>0</checked>
</object>
Expand All @@ -407,7 +407,7 @@
<option>0</option>
<flag>wxALL</flag>
<border>5</border>
<object class="wxCheckBox" name="m_checkBox95">
<object class="wxCheckBox" name="MaterialSurfaceFlagNofragment">
<label>noFragment</label>
<checked>0</checked>
</object>
Expand All @@ -416,7 +416,7 @@
<option>0</option>
<flag>wxALL</flag>
<border>5</border>
<object class="wxCheckBox" name="m_checkBox96">
<object class="wxCheckBox" name="MaterialSurfaceFlagNodamage">
<label>nodamage</label>
<checked>0</checked>
</object>
Expand All @@ -425,7 +425,7 @@
<option>0</option>
<flag>wxALL</flag>
<border>5</border>
<object class="wxCheckBox" name="m_checkBox97">
<object class="wxCheckBox" name="MaterialSurfaceFlagPlayerclip">
<label>playerclip</label>
<checked>0</checked>
</object>
Expand All @@ -434,7 +434,7 @@
<option>0</option>
<flag>wxALL</flag>
<border>5</border>
<object class="wxCheckBox" name="m_checkBox98">
<object class="wxCheckBox" name="MaterialSurfaceFlagTrigger">
<label>trigger</label>
<checked>0</checked>
</object>
Expand All @@ -443,7 +443,7 @@
<option>0</option>
<flag>wxALL</flag>
<border>5</border>
<object class="wxCheckBox" name="m_checkBox99">
<object class="wxCheckBox" name="MaterialSurfaceFlagNullnormal">
<label>nullNormal</label>
<checked>0</checked>
</object>
Expand All @@ -452,7 +452,7 @@
<option>0</option>
<flag>wxALL</flag>
<border>5</border>
<object class="wxCheckBox" name="m_checkBox100">
<object class="wxCheckBox" name="MaterialSurfaceFlagSlick">
<label>slick</label>
<checked>0</checked>
</object>
Expand All @@ -461,7 +461,7 @@
<option>0</option>
<flag>wxALL</flag>
<border>5</border>
<object class="wxCheckBox" name="m_checkBox101">
<object class="wxCheckBox" name="MaterialSurfaceFlagLadder">
<label>ladder</label>
<checked>0</checked>
</object>
Expand All @@ -470,7 +470,7 @@
<option>0</option>
<flag>wxALL</flag>
<border>5</border>
<object class="wxCheckBox" name="m_checkBox102">
<object class="wxCheckBox" name="MaterialSurfaceFlagMonsterclip">
<label>monsterclip</label>
<checked>0</checked>
</object>
Expand All @@ -479,7 +479,7 @@
<option>0</option>
<flag>wxALL</flag>
<border>5</border>
<object class="wxCheckBox" name="m_checkBox103">
<object class="wxCheckBox" name="MaterialSurfaceFlagAassolid">
<label>aassolid</label>
<checked>0</checked>
</object>
Expand All @@ -488,7 +488,7 @@
<option>0</option>
<flag>wxALL</flag>
<border>5</border>
<object class="wxCheckBox" name="m_checkBox104">
<object class="wxCheckBox" name="MaterialSurfaceFlagAreaportal">
<label>areaPortal</label>
<checked>0</checked>
</object>
Expand All @@ -497,7 +497,7 @@
<option>0</option>
<flag>wxALL</flag>
<border>5</border>
<object class="wxCheckBox" name="m_checkBox105">
<object class="wxCheckBox" name="MaterialSurfaceFlagCollision">
<label>collision</label>
<checked>0</checked>
</object>
Expand All @@ -506,7 +506,7 @@
<option>0</option>
<flag>wxALL</flag>
<border>5</border>
<object class="wxCheckBox" name="m_checkBox106">
<object class="wxCheckBox" name="MaterialSurfaceFlagNosteps">
<label>nosteps</label>
<checked>0</checked>
</object>
Expand All @@ -515,7 +515,7 @@
<option>0</option>
<flag>wxALL</flag>
<border>5</border>
<object class="wxCheckBox" name="m_checkBox107">
<object class="wxCheckBox" name="MaterialSurfaceFlagMoveableClip">
<label>moveableclip</label>
<checked>0</checked>
</object>
Expand All @@ -524,7 +524,7 @@
<option>0</option>
<flag>wxALL</flag>
<border>5</border>
<object class="wxCheckBox" name="m_checkBox108">
<object class="wxCheckBox" name="MaterialSurfaceFlagAasobstacle">
<label>aasobstacle</label>
<checked>0</checked>
</object>
Expand All @@ -533,7 +533,7 @@
<option>0</option>
<flag>wxALL</flag>
<border>5</border>
<object class="wxCheckBox" name="m_checkBox109">
<object class="wxCheckBox" name="MaterialSurfaceFlagQernocarve">
<label>qer__nocarve</label>
<checked>0</checked>
</object>
Expand Down
66 changes: 66 additions & 0 deletions radiant/ui/materials/MaterialBinding.h
@@ -0,0 +1,66 @@
#pragma once

#include "ishaders.h"
#include <wx/checkbox.h>

namespace ui
{

template<typename Source>
class Binding
{
private:
Source _source;

public:
virtual ~Binding()
{}

const Source& getSource() const
{
return _source;
}

void setSource(const Source& source)
{
_source = source;
onSourceChanged();
}

virtual void updateFromSource(const Source& source) = 0;

protected:
virtual void onSourceChanged()
{
updateFromSource(getSource());
}
};

using MaterialBinding = Binding<MaterialPtr>;

class CheckBoxBinding :
public MaterialBinding
{
private:
wxCheckBox* _checkbox;
std::function<bool(const MaterialPtr&)> _loadFunc;

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

virtual void updateFromSource(const MaterialPtr& material) override
{
if (!getSource())
{
_checkbox->SetValue(false);
return;
}

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

}
46 changes: 46 additions & 0 deletions radiant/ui/materials/MaterialEditor.cpp
Expand Up @@ -80,6 +80,7 @@ MaterialEditor::MaterialEditor() :

setupMaterialProperties();
setupMaterialStageView();
setupMaterialSurfaceFlags();

// Set the default size of the window
FitToScreen(0.8f, 0.6f);
Expand All @@ -98,6 +99,8 @@ MaterialEditor::MaterialEditor() :
CenterOnParent();

_treeView->Populate();

updateControlsFromMaterial();
}

int MaterialEditor::ShowModal()
Expand Down Expand Up @@ -138,6 +141,43 @@ void MaterialEditor::setupMaterialProperties()
}
}

void MaterialEditor::setupSurfaceFlag(const std::string& controlName, Material::SurfaceFlags flag)
{
_bindings.emplace(controlName,
std::make_shared<CheckBoxBinding>(getControl<wxCheckBox>(controlName),
[=](const MaterialPtr& material)
{
return (material->getSurfaceFlags() & flag) != 0;
}));
}

void MaterialEditor::setupMaterialSurfaceFlags()
{
setupSurfaceFlag("MaterialSurfaceFlagSolid", Material::SurfaceFlags::SURF_SOLID);
setupSurfaceFlag("MaterialSurfaceFlagWater", Material::SurfaceFlags::SURF_WATER);
setupSurfaceFlag("MaterialSurfaceFlagPlayerclip", Material::SurfaceFlags::SURF_PLAYERCLIP);
setupSurfaceFlag("MaterialSurfaceFlagMonsterclip", Material::SurfaceFlags::SURF_MONSTERCLIP);
setupSurfaceFlag("MaterialSurfaceFlagMoveableClip", Material::SurfaceFlags::SURF_MOVEABLECLIP);
setupSurfaceFlag("MaterialSurfaceFlagIkclip", Material::SurfaceFlags::SURF_IKCLIP);
setupSurfaceFlag("MaterialSurfaceFlagBlood", Material::SurfaceFlags::SURF_BLOOD);
setupSurfaceFlag("MaterialSurfaceFlagTrigger", Material::SurfaceFlags::SURF_TRIGGER);
setupSurfaceFlag("MaterialSurfaceFlagAassolid", Material::SurfaceFlags::SURF_AASSOLID);
setupSurfaceFlag("MaterialSurfaceFlagAasobstacle", Material::SurfaceFlags::SURF_AASOBSTACLE);
setupSurfaceFlag("MaterialSurfaceFlagFlashlighttrigger", Material::SurfaceFlags::SURF_FLASHLIGHT_TRIGGER);
setupSurfaceFlag("MaterialSurfaceFlagNonsolid", Material::SurfaceFlags::SURF_NONSOLID);
setupSurfaceFlag("MaterialSurfaceFlagNullnormal", Material::SurfaceFlags::SURF_NULLNORMAL);
setupSurfaceFlag("MaterialSurfaceFlagAreaportal", Material::SurfaceFlags::SURF_AREAPORTAL);
setupSurfaceFlag("MaterialSurfaceFlagQernocarve", Material::SurfaceFlags::SURF_NOCARVE);
setupSurfaceFlag("MaterialSurfaceFlagDiscrete", Material::SurfaceFlags::SURF_DISCRETE);
setupSurfaceFlag("MaterialSurfaceFlagNofragment", Material::SurfaceFlags::SURF_NOFRAGMENT);
setupSurfaceFlag("MaterialSurfaceFlagSlick", Material::SurfaceFlags::SURF_SLICK);
setupSurfaceFlag("MaterialSurfaceFlagCollision", Material::SurfaceFlags::SURF_COLLISION);
setupSurfaceFlag("MaterialSurfaceFlagNoimpact", Material::SurfaceFlags::SURF_NOIMPACT);
setupSurfaceFlag("MaterialSurfaceFlagNodamage", Material::SurfaceFlags::SURF_NODAMAGE);
setupSurfaceFlag("MaterialSurfaceFlagLadder", Material::SurfaceFlags::SURF_LADDER);
setupSurfaceFlag("MaterialSurfaceFlagNosteps", Material::SurfaceFlags::SURF_NOSTEPS);
}

void MaterialEditor::setupMaterialStageView()
{
// Stage view
Expand Down Expand Up @@ -175,6 +215,12 @@ void MaterialEditor::updateMaterialPropertiesFromMaterial()
{
getControl<wxPanel>("MaterialEditorMaterialPropertiesPanel")->Enable(_material != nullptr);

// Update all registered bindings
for (const auto& pair : _bindings)
{
pair.second->setSource(_material);
}

if (_material)
{
getControl<wxTextCtrl>("MaterialDescription")->SetValue(_material->getDescription());
Expand Down
5 changes: 5 additions & 0 deletions radiant/ui/materials/MaterialEditor.h
Expand Up @@ -11,6 +11,7 @@
#include "wxutil/SourceView.h"

#include "ui/common/MaterialTreeView.h"
#include "MaterialBinding.h"

namespace ui
{
Expand All @@ -33,6 +34,8 @@ class MaterialEditor :

MaterialPtr _material;

std::map<std::string, std::shared_ptr<MaterialBinding>> _bindings;

private:
MaterialEditor();

Expand All @@ -46,6 +49,8 @@ class MaterialEditor :
private:
void setupMaterialStageView();
void setupMaterialProperties();
void setupMaterialSurfaceFlags();
void setupSurfaceFlag(const std::string& controlName, Material::SurfaceFlags flag);
void updateControlsFromMaterial();
void updateMaterialPropertiesFromMaterial();

Expand Down

0 comments on commit 81b9bcb

Please sign in to comment.