diff --git a/install/ui/materialeditor.fbp b/install/ui/materialeditor.fbp
index fc05222de7..b03c07e980 100644
--- a/install/ui/materialeditor.fbp
+++ b/install/ui/materialeditor.fbp
@@ -17977,7 +17977,7 @@
Resizable
1
-
+ ; ; forward_declare
0
@@ -17985,7 +17985,7 @@
wxTAB_TRAVERSAL
diff --git a/radiant/ui/materials/MaterialEditor.cpp b/radiant/ui/materials/MaterialEditor.cpp
index f79cc741b9..3f9bed4483 100644
--- a/radiant/ui/materials/MaterialEditor.cpp
+++ b/radiant/ui/materials/MaterialEditor.cpp
@@ -4,6 +4,10 @@
#include
#include
+#include
+#include
+#include "wxutil/SourceView.h"
+#include "fmt/format.h"
namespace ui
{
@@ -51,23 +55,27 @@ MaterialEditor::MaterialEditor() :
makeLabelBold(this, "MaterialEditorStageSettingsLabel");
// Wire up the close button
- findNamedObject(this, "MaterialEditorCloseButton")->Bind(wxEVT_BUTTON, &MaterialEditor::_onClose, this);
+ getControl("MaterialEditorCloseButton")->Bind(wxEVT_BUTTON, &MaterialEditor::_onClose, this);
// Add the treeview
- auto* panel = findNamedObject(this, "MaterialEditorTreeView");
+ auto* panel = getControl("MaterialEditorTreeView");
_treeView = new MaterialTreeView(panel);
+ _treeView->Bind(wxEVT_DATAVIEW_SELECTION_CHANGED, &MaterialEditor::_onTreeViewSelectionChanged, this);
panel->GetSizer()->Add(_treeView, 1, wxEXPAND);
// Setup the splitter and preview
- auto* splitter = findNamedObject(this, "MaterialEditorSplitter");
+ auto* splitter = getControl("MaterialEditorSplitter");
splitter->SetSashPosition(GetSize().GetWidth() * 0.6f);
splitter->SetMinimumPaneSize(10); // disallow unsplitting
// Set up the preview
- auto* previewPanel = findNamedObject(this, "MaterialEditorPreviewPanel");
+ auto* previewPanel = getControl("MaterialEditorPreviewPanel");
_preview.reset(new wxutil::ModelPreview(previewPanel));
+ _sourceView = new wxutil::D3MaterialSourceViewCtrl(previewPanel);
+
previewPanel->GetSizer()->Add(_preview->getWidget(), 1, wxEXPAND);
+ previewPanel->GetSizer()->Add(_sourceView, 1, wxEXPAND);
setupMaterialStageView();
@@ -119,7 +127,7 @@ void MaterialEditor::ShowDialog(const cmd::ArgumentList& args)
void MaterialEditor::setupMaterialStageView()
{
// Stage view
- auto* panel = findNamedObject(this, "MaterialEditorStageView");
+ auto* panel = getControl("MaterialEditorStageView");
_stageView = wxutil::TreeView::CreateWithModel(panel, _stageList.get(), wxDV_NO_HEADER);
panel->GetSizer()->Add(_stageView, 1, wxEXPAND);
@@ -129,4 +137,43 @@ void MaterialEditor::setupMaterialStageView()
wxDATAVIEW_CELL_INERT, wxCOL_WIDTH_AUTOSIZE, wxALIGN_NOT, wxDATAVIEW_COL_SORTABLE);
}
+void MaterialEditor::_onTreeViewSelectionChanged(wxDataViewEvent& ev)
+{
+ // Update the preview if a texture is selected
+ if (!_treeView->IsDirectorySelected())
+ {
+ _material = GlobalMaterialManager().getMaterialForName(_treeView->GetSelectedFullname());
+ }
+ else
+ {
+ _material.reset();
+ }
+
+ updateControlsFromMaterial();
+}
+
+void MaterialEditor::updateControlsFromMaterial()
+{
+ updateMaterialPropertiesFromMaterial();
+}
+
+void MaterialEditor::updateMaterialPropertiesFromMaterial()
+{
+ getControl("MaterialEditorMaterialPropertiesPanel")->Enable(_material != nullptr);
+
+ if (_material)
+ {
+ getControl("MaterialDescription")->SetValue(_material->getDescription());
+
+ // Surround the definition with curly braces, these are not included
+ auto definition = fmt::format("{0}\n{{{1}}}", _material->getName(), _material->getDefinition());
+ _sourceView->SetValue(definition);
+ }
+ else
+ {
+ getControl("MaterialDescription")->SetValue("");
+ _sourceView->SetValue("");
+ }
+}
+
}
diff --git a/radiant/ui/materials/MaterialEditor.h b/radiant/ui/materials/MaterialEditor.h
index 81796a8b3b..874ce44d26 100644
--- a/radiant/ui/materials/MaterialEditor.h
+++ b/radiant/ui/materials/MaterialEditor.h
@@ -1,12 +1,14 @@
#pragma once
#include "icommandsystem.h"
+#include "ishaders.h"
#include "wxutil/dialog/DialogBase.h"
#include "wxutil/WindowPosition.h"
#include "wxutil/PanedPosition.h"
#include "wxutil/XmlResourceBasedWidget.h"
#include "wxutil/preview/ModelPreview.h"
+#include "wxutil/SourceView.h"
#include "ui/common/MaterialTreeView.h"
@@ -27,6 +29,9 @@ class MaterialEditor :
wxutil::PanedPosition _panedPosition;
std::shared_ptr _preview;
+ wxutil::D3MaterialSourceViewCtrl* _sourceView;
+
+ MaterialPtr _material;
private:
MaterialEditor();
@@ -40,6 +45,17 @@ class MaterialEditor :
private:
void setupMaterialStageView();
+ void updateControlsFromMaterial();
+ void updateMaterialPropertiesFromMaterial();
+
+ void _onTreeViewSelectionChanged(wxDataViewEvent& ev);
+
+ // Shortcut
+ template
+ ObjectClass* getControl(const std::string& name)
+ {
+ return findNamedObject(this, name);
+ }
};
}