From b821096780c0ff51d16cb689823b5f8853cb1066 Mon Sep 17 00:00:00 2001 From: codereader Date: Sat, 30 Jul 2022 10:14:27 +0200 Subject: [PATCH] #5743: Add "Show Definition..." context menu option to ModelTreeView that is active when a valid modelDef is selected --- radiant/ui/modelselector/ModelTreeView.cpp | 34 ++++++++++++++++++++++ radiant/ui/modelselector/ModelTreeView.h | 2 ++ 2 files changed, 36 insertions(+) diff --git a/radiant/ui/modelselector/ModelTreeView.cpp b/radiant/ui/modelselector/ModelTreeView.cpp index a9ca87b38f..66152680e2 100644 --- a/radiant/ui/modelselector/ModelTreeView.cpp +++ b/radiant/ui/modelselector/ModelTreeView.cpp @@ -1,6 +1,9 @@ #include "ModelTreeView.h" +#include "ideclmanager.h" #include "ModelPopulator.h" +#include "wxutil/menu/IconTextMenuItem.h" +#include "wxutil/sourceview/DeclarationSourceView.h" namespace ui { @@ -19,6 +22,11 @@ ModelTreeView::ModelTreeView(wxWindow* parent) : // Use the TreeModel's full string search function AddSearchColumn(Columns().iconAndName); EnableFavouriteManagement("model"); + + AddCustomMenuItem(std::make_shared( + new wxutil::IconTextMenuItem(_("Show Definition"), "decl.png"), + std::bind(&ModelTreeView::showModelDefinition, this), + std::bind(&ModelTreeView::testShowModelDefinition, this))); } const ModelTreeView::TreeColumns& ModelTreeView::Columns() const @@ -110,4 +118,30 @@ std::string ModelTreeView::GetColumnValue(const wxutil::TreeModel::Column& colum return row[column]; } +void ModelTreeView::showModelDefinition() +{ + auto selectedModelPath = GetColumnValue(Columns().modelPath); + auto modelDef = GlobalDeclarationManager().findDeclaration(decl::Type::ModelDef, selectedModelPath); + + if (modelDef) + { + auto view = new wxutil::DeclarationSourceView(this); + view->setDeclaration(modelDef); + + view->ShowModal(); + view->Destroy(); + } +} + +bool ModelTreeView::testShowModelDefinition() +{ + if (IsDirectorySelected()) return false; + + auto selectedModelPath = GetColumnValue(Columns().modelPath); + + auto modelDef = GlobalDeclarationManager().findDeclaration(decl::Type::ModelDef, selectedModelPath); + + return modelDef != nullptr; +} + } diff --git a/radiant/ui/modelselector/ModelTreeView.h b/radiant/ui/modelselector/ModelTreeView.h index 4430a5d758..f68474e890 100644 --- a/radiant/ui/modelselector/ModelTreeView.h +++ b/radiant/ui/modelselector/ModelTreeView.h @@ -58,6 +58,8 @@ class ModelTreeView final : private: std::string GetColumnValue(const wxutil::TreeModel::Column& column); + void showModelDefinition(); + bool testShowModelDefinition(); }; }