add a feature shift-k to assign killtarget, not target like ctrl-k

This commit is contained in:
Rudolf Polzer 2010-02-08 16:40:20 +01:00
parent 5c3de4809e
commit c6252fe3fc
3 changed files with 63 additions and 20 deletions

View File

@ -124,7 +124,7 @@ public:
virtual void setCounter(Counter* counter) = 0; virtual void setCounter(Counter* counter) = 0;
virtual void connectEntities(const scene::Path& e1, const scene::Path& e2) = 0; virtual void connectEntities(const scene::Path& e1, const scene::Path& e2, int index) = 0;
virtual void setLightRadii(bool lightRadii) = 0; virtual void setLightRadii(bool lightRadii) = 0;
virtual bool getLightRadii() = 0; virtual bool getLightRadii() = 0;

View File

@ -132,12 +132,23 @@ class ConnectEntities
public: public:
Entity* m_e1; Entity* m_e1;
Entity* m_e2; Entity* m_e2;
ConnectEntities(Entity* e1, Entity* e2) : m_e1(e1), m_e2(e2) int m_index;
ConnectEntities(Entity* e1, Entity* e2, int index) : m_e1(e1), m_e2(e2), m_index(index)
{ {
} }
const char *keyname()
{
StringOutputStream key(16);
if(m_index <= 0)
return "target";
if(m_index == 1)
return "killtarget";
key << "target" << m_index;
return key.c_str();
}
void connect(const char* name) void connect(const char* name)
{ {
m_e1->setKeyValue("target", name); m_e1->setKeyValue(keyname(), name);
m_e2->setKeyValue("targetname", name); m_e2->setKeyValue("targetname", name);
} }
typedef MemberCaller1<ConnectEntities, const char*, &ConnectEntities::connect> ConnectCaller; typedef MemberCaller1<ConnectEntities, const char*, &ConnectEntities::connect> ConnectCaller;
@ -168,7 +179,7 @@ public:
{ {
EntityKeyValues::setCounter(counter); EntityKeyValues::setCounter(counter);
} }
void connectEntities(const scene::Path& path, const scene::Path& targetPath) void connectEntities(const scene::Path& path, const scene::Path& targetPath, int index)
{ {
Entity* e1 = ScenePath_getEntity(path); Entity* e1 = ScenePath_getEntity(path);
Entity* e2 = ScenePath_getEntity(targetPath); Entity* e2 = ScenePath_getEntity(targetPath);
@ -191,29 +202,42 @@ public:
if(g_gameType == eGameTypeDoom3) if(g_gameType == eGameTypeDoom3)
{ {
StringOutputStream key(16); StringOutputStream key(16);
for(unsigned int i = 0; ; ++i) if(index >= 0)
{ {
key << "target"; key << "target";
if(i != 0) if(index != 0)
{ {
key << i; key << index;
} }
const char* value = e1->getKeyValue(key.c_str()); e1->setKeyValue(key.c_str(), e2->getKeyValue("name"));
if(string_empty(value)) key.clear();
{ }
e1->setKeyValue(key.c_str(), e2->getKeyValue("name")); else
break; {
} for(unsigned int i = 0; ; ++i)
key.clear(); {
key << "target";
if(i != 0)
{
key << i;
}
const char* value = e1->getKeyValue(key.c_str());
if(string_empty(value))
{
e1->setKeyValue(key.c_str(), e2->getKeyValue("name"));
break;
}
key.clear();
}
} }
} }
else else
{ {
ConnectEntities connector(e1, e2); ConnectEntities connector(e1, e2, index);
const char* value = e2->getKeyValue("targetname"); const char* value = e2->getKeyValue("targetname");
if(string_empty(value)) if(string_empty(value))
{ {
value = e1->getKeyValue("target"); value = e1->getKeyValue(connector.keyname());
} }
if(!string_empty(value)) if(!string_empty(value))
{ {

View File

@ -258,7 +258,8 @@ void Entity_connectSelected()
{ {
GlobalEntityCreator().connectEntities( GlobalEntityCreator().connectEntities(
GlobalSelectionSystem().penultimateSelected().path(), GlobalSelectionSystem().penultimateSelected().path(),
GlobalSelectionSystem().ultimateSelected().path() GlobalSelectionSystem().ultimateSelected().path(),
0
); );
} }
else else
@ -267,6 +268,22 @@ void Entity_connectSelected()
} }
} }
void Entity_killconnectSelected()
{
if(GlobalSelectionSystem().countSelected() == 2)
{
GlobalEntityCreator().connectEntities(
GlobalSelectionSystem().penultimateSelected().path(),
GlobalSelectionSystem().ultimateSelected().path(),
1
);
}
else
{
globalErrorStream() << "entityKillConnectSelected: exactly two instances must be selected\n";
}
}
AABB Doom3Light_getBounds(const AABB& workzone) AABB Doom3Light_getBounds(const AABB& workzone)
{ {
AABB aabb(workzone); AABB aabb(workzone);
@ -618,6 +635,7 @@ void Entity_constructMenu(GtkMenu* menu)
create_menu_item_with_mnemonic(menu, "_Regroup", "GroupSelection"); create_menu_item_with_mnemonic(menu, "_Regroup", "GroupSelection");
create_menu_item_with_mnemonic(menu, "_Ungroup", "UngroupSelection"); create_menu_item_with_mnemonic(menu, "_Ungroup", "UngroupSelection");
create_menu_item_with_mnemonic(menu, "_Connect", "ConnectSelection"); create_menu_item_with_mnemonic(menu, "_Connect", "ConnectSelection");
create_menu_item_with_mnemonic(menu, "_KillConnect", "KillConnectSelection");
create_menu_item_with_mnemonic(menu, "_Select Color...", "EntityColor"); create_menu_item_with_mnemonic(menu, "_Select Color...", "EntityColor");
create_menu_item_with_mnemonic(menu, "_Normalize Color...", "NormalizeColor"); create_menu_item_with_mnemonic(menu, "_Normalize Color...", "NormalizeColor");
} }
@ -632,6 +650,7 @@ void Entity_Construct()
GlobalCommands_insert("EntityColor", FreeCaller<Entity_setColour>(), Accelerator('K')); GlobalCommands_insert("EntityColor", FreeCaller<Entity_setColour>(), Accelerator('K'));
GlobalCommands_insert("NormalizeColor", FreeCaller<Entity_normalizeColor>()); GlobalCommands_insert("NormalizeColor", FreeCaller<Entity_normalizeColor>());
GlobalCommands_insert("ConnectSelection", FreeCaller<Entity_connectSelected>(), Accelerator('K', (GdkModifierType)GDK_CONTROL_MASK)); GlobalCommands_insert("ConnectSelection", FreeCaller<Entity_connectSelected>(), Accelerator('K', (GdkModifierType)GDK_CONTROL_MASK));
GlobalCommands_insert("KillConnectSelection", FreeCaller<Entity_killconnectSelected>(), Accelerator('K', (GdkModifierType)(GDK_SHIFT_MASK)));
GlobalCommands_insert("GroupSelection", FreeCaller<Entity_groupSelected>()); GlobalCommands_insert("GroupSelection", FreeCaller<Entity_groupSelected>());
GlobalCommands_insert("UngroupSelection", FreeCaller<Entity_ungroupSelected>()); GlobalCommands_insert("UngroupSelection", FreeCaller<Entity_ungroupSelected>());