From 91d1810baf5006a6b06b3bb11db002a881cbb47e Mon Sep 17 00:00:00 2001 From: Rudolf Polzer Date: Wed, 22 Dec 2010 17:38:33 +0100 Subject: [PATCH] make shift-a not always check classname, but check the current entity key if entity inspector is open --- radiant/entityinspector.cpp | 9 +++++++ radiant/entityinspector.h | 1 + radiant/groupdialog.h | 2 ++ radiant/mainframe.h | 2 ++ radiant/select.cpp | 51 +++++++++++++++++++++---------------- 5 files changed, 43 insertions(+), 22 deletions(-) diff --git a/radiant/entityinspector.cpp b/radiant/entityinspector.cpp index b5636780..95f03f73 100644 --- a/radiant/entityinspector.cpp +++ b/radiant/entityinspector.cpp @@ -76,6 +76,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "entity.h" #include "mainframe.h" #include "textureentry.h" +#include "groupdialog.h" GtkEntry* numeric_entry_new() { @@ -1760,3 +1761,11 @@ void EntityInspector_destroy() GlobalEntityClassManager().detach(g_EntityInspector); } +const char *EntityInspector_getCurrentKey() +{ + if(!GroupDialog_isShown()) + return 0; + if(GroupDialog_getPage() != g_page_entity) + return 0; + return gtk_entry_get_text(g_entityKeyEntry); +} diff --git a/radiant/entityinspector.h b/radiant/entityinspector.h index 62a69ab6..130c9657 100644 --- a/radiant/entityinspector.h +++ b/radiant/entityinspector.h @@ -27,5 +27,6 @@ typedef struct _GtkWindow GtkWindow; GtkWidget* EntityInspector_constructWindow(GtkWindow* parent); void EntityInspector_construct(); void EntityInspector_destroy(); +const char *EntityInspector_getCurrentKey(); #endif diff --git a/radiant/groupdialog.h b/radiant/groupdialog.h index 92caffab..38f399be 100644 --- a/radiant/groupdialog.h +++ b/radiant/groupdialog.h @@ -44,5 +44,7 @@ GtkWidget* GroupDialog_addPage(const char* tabLabel, GtkWidget* widget, const St void GroupDialog_showPage(GtkWidget* page); void GroupDialog_updatePageTitle(GtkWidget* page); +bool GroupDialog_isShown(); +GtkWidget* GroupDialog_getPage(); #endif diff --git a/radiant/mainframe.h b/radiant/mainframe.h index 5997abd3..d011f319 100644 --- a/radiant/mainframe.h +++ b/radiant/mainframe.h @@ -283,4 +283,6 @@ void XYWindowDestroyed_disconnect(SignalHandlerId id); MouseEventHandlerId XYWindowMouseDown_connect(const MouseEventHandler& handler); void XYWindowMouseDown_disconnect(MouseEventHandlerId id); +extern GtkWidget* g_page_entity; + #endif diff --git a/radiant/select.cpp b/radiant/select.cpp index 5889fd5a..c232da20 100644 --- a/radiant/select.cpp +++ b/radiant/select.cpp @@ -47,6 +47,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "mainframe.h" #include "grid.h" #include "map.h" +#include "entityinspector.h" @@ -658,13 +659,13 @@ void FindReplaceTextures(const char* pFind, const char* pReplace, bool bSelected } } -typedef std::vector Classnames; +typedef std::vector PropertyValues; -bool classnames_match_entity(const Classnames& classnames, Entity* entity) +bool propertyvalues_contain(const PropertyValues& propertyvalues, const char *str) { - for(Classnames::const_iterator i = classnames.begin(); i != classnames.end(); ++i) + for(PropertyValues::const_iterator i = propertyvalues.begin(); i != propertyvalues.end(); ++i) { - if(string_equal(entity->getKeyValue("classname"), *i)) + if(string_equal(str, *i)) { return true; } @@ -672,19 +673,20 @@ bool classnames_match_entity(const Classnames& classnames, Entity* entity) return false; } -class EntityFindByClassnameWalker : public scene::Graph::Walker +class EntityFindByPropertyValueWalker : public scene::Graph::Walker { - const Classnames& m_classnames; + const PropertyValues& m_propertyvalues; + const char *m_prop; public: - EntityFindByClassnameWalker(const Classnames& classnames) - : m_classnames(classnames) + EntityFindByPropertyValueWalker(const char *prop, const PropertyValues& propertyvalues) + : m_propertyvalues(propertyvalues), m_prop(prop) { } bool pre(const scene::Path& path, scene::Instance& instance) const { Entity* entity = Node_getEntity(path.top()); if(entity != 0 - && classnames_match_entity(m_classnames, entity)) + && propertyvalues_contain(m_propertyvalues, entity->getKeyValue(m_prop))) { Instance_getSelectable(instance)->setSelected(true); } @@ -692,17 +694,18 @@ public: } }; -void Scene_EntitySelectByClassnames(scene::Graph& graph, const Classnames& classnames) +void Scene_EntitySelectByPropertyValues(scene::Graph& graph, const char *prop, const PropertyValues& propertyvalues) { - graph.traverse(EntityFindByClassnameWalker(classnames)); + graph.traverse(EntityFindByPropertyValueWalker(prop, propertyvalues)); } -class EntityGetSelectedClassnamesWalker : public scene::Graph::Walker +class EntityGetSelectedPropertyValuesWalker : public scene::Graph::Walker { - Classnames& m_classnames; + PropertyValues& m_propertyvalues; + const char *m_prop; public: - EntityGetSelectedClassnamesWalker(Classnames& classnames) - : m_classnames(classnames) + EntityGetSelectedPropertyValuesWalker(const char *prop, PropertyValues& propertyvalues) + : m_propertyvalues(propertyvalues), m_prop(prop) { } bool pre(const scene::Path& path, scene::Instance& instance) const @@ -714,16 +717,17 @@ public: Entity* entity = Node_getEntity(path.top()); if(entity != 0) { - m_classnames.push_back(entity->getKeyValue("classname")); + if(!propertyvalues_contain(m_propertyvalues, entity->getKeyValue(m_prop))) + m_propertyvalues.push_back(entity->getKeyValue(m_prop)); } } return true; } }; -void Scene_EntityGetClassnames(scene::Graph& graph, Classnames& classnames) +void Scene_EntityGetPropertyValues(scene::Graph& graph, const char *prop, PropertyValues& propertyvalues) { - graph.traverse(EntityGetSelectedClassnamesWalker(classnames)); + graph.traverse(EntityGetSelectedPropertyValuesWalker(prop, propertyvalues)); } void Select_AllOfType() @@ -738,12 +742,15 @@ void Select_AllOfType() } else { - Classnames classnames; - Scene_EntityGetClassnames(GlobalSceneGraph(), classnames); + PropertyValues propertyvalues; + const char *prop = EntityInspector_getCurrentKey(); + if(!prop || !*prop) + prop = "classname"; + Scene_EntityGetPropertyValues(GlobalSceneGraph(), prop, propertyvalues); GlobalSelectionSystem().setSelectedAll(false); - if(!classnames.empty()) + if(!propertyvalues.empty()) { - Scene_EntitySelectByClassnames(GlobalSceneGraph(), classnames); + Scene_EntitySelectByPropertyValues(GlobalSceneGraph(), prop, propertyvalues); } else { -- 2.39.2