From 1c0f9a76a57e230a7e40797248f75219e736a5fd Mon Sep 17 00:00:00 2001 From: codereader Date: Fri, 19 Feb 2021 06:00:07 +0100 Subject: [PATCH] #5532: Start working on control population --- install/ui/materialeditor.fbp | 4 +- radiant/ui/materials/MaterialEditor.cpp | 57 ++++++++++++++++++++++--- radiant/ui/materials/MaterialEditor.h | 16 +++++++ 3 files changed, 70 insertions(+), 7 deletions(-) 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 - bSizer137 + bSizer77 wxVERTICAL none 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); + } }; }