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 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 bool getLightRadii() = 0;

View File

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

View File

@ -258,7 +258,8 @@ void Entity_connectSelected()
{
GlobalEntityCreator().connectEntities(
GlobalSelectionSystem().penultimateSelected().path(),
GlobalSelectionSystem().ultimateSelected().path()
GlobalSelectionSystem().ultimateSelected().path(),
0
);
}
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 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, "_Ungroup", "UngroupSelection");
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, "_Normalize Color...", "NormalizeColor");
}
@ -632,6 +650,7 @@ void Entity_Construct()
GlobalCommands_insert("EntityColor", FreeCaller<Entity_setColour>(), Accelerator('K'));
GlobalCommands_insert("NormalizeColor", FreeCaller<Entity_normalizeColor>());
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("UngroupSelection", FreeCaller<Entity_ungroupSelected>());