📄 simbase.cc
字号:
if(pSet && bWithChildren && size())
{
SimObject* pChildNew;
GuiCellButtonCtrl* pCellBtn;
for(U32 i = 0; i < size(); i++)
{
pCellBtn = dynamic_cast<GuiCellButtonCtrl*>((*this)[i]);
if(pCellBtn)
continue;
pChildNew = (*this)[i]->duplicate(bWithChildren, bRegister);
pSet->addObject(pChildNew);
}
}
return pNew;
}
void GuiCellArrayControl::write(Stream &stream, U32 tabStop, U32 flags)
{
//代码来自Simset::write
MutexHandle handle;
handle.lock(mMutex);
// export selected only?
if((flags & SelectedOnly) && !isSelected())
{
for(U32 i = 0; i < size(); i++)
(*this)[i]->write(stream, tabStop, flags);
return;
}
char buffer[1024];
writeTabs(stream, tabStop);
dSprintf(buffer, sizeof(buffer), "new %s(%s)\r\n", getClassName(), getName() ? getName() : "");
stream.write(dStrlen(buffer), buffer);
writeTabs(stream, tabStop);
stream.write(3, "{\r\n");
writeFields(stream, tabStop + 1);
/// end TGE_Theme
//有子控件,但cell数据却不能保存
if( size())
{
stream.write(2, "\r\n");
static const char* sTitle = "//对象列表...\r\n";
writeTabs(stream, tabStop+1);
stream.write(dStrlen(sTitle), sTitle);
GuiCellButtonCtrl* pCellBtn;
for(U32 i = 0; i < size(); i++)
{
pCellBtn = dynamic_cast<GuiCellButtonCtrl*>((*this)[i]);
if(pCellBtn)
continue;
(*this)[i]->write(stream, tabStop + 1, flags);
stream.write(2, "\r\n"); /// TGE_Theme
}
}
writeTabs(stream, tabStop);
dSprintf(buffer, sizeof(buffer), "};//new %s(%s)\r\n", getClassName(), getName() ? getName() : "");
stream.write(dStrlen(buffer), buffer);
}
#endif
ConsoleMethod(SimSet, listObjects, void, 2, 2, "set.listObjects();")
{
argc; argv;
object->lock();
SimSet::iterator itr;
for(itr = object->begin(); itr != object->end(); itr++)
{
SimObject *obj = *itr;
bool isSet = dynamic_cast<SimSet *>(obj) != 0;
const char *name = obj->getName();
if(name)
Con::printf(" %d,\"%s\": %s %s", obj->getId(), name,
obj->getClassName(), isSet ? "(g)":"");
else
Con::printf(" %d: %s %s", obj->getId(), obj->getClassName(),
isSet ? "(g)" : "");
}
object->unlock();
}
ConsoleMethod(SimSet, add, void, 3, 0, "set.add(obj1,...)")
{
for(S32 i = 2; i < argc; i++)
{
SimObject *obj = Sim::findObject(argv[i]);
if(obj)
object->addObject(obj);
else
Con::printf("Set::add: Object \"%s\" doesn't exist", argv[i]);
}
}
ConsoleMethod(SimSet, remove, void, 3, 0, "set.remove(obj1,...)")
{
for(S32 i = 2; i < argc; i++)
{
SimObject *obj = Sim::findObject(argv[i]);
object->lock();
if(obj && object->find(object->begin(),object->end(),obj) != object->end())
object->removeObject(obj);
else
Con::printf("Set::remove: Object \"%s\" does not exist in set", argv[i]);
object->unlock();
}
}
ConsoleMethod(SimSet, clear, void, 2, 2, "set.clear()")
{
argc; argv;
object->lock();
while (object->size() > 0)
object->removeObject(*(object->begin()));
object->unlock();
}
ConsoleMethod(SimSet, getCount, S32, 2, 2, "set.getCount()")
{
argc; argv;
return object->size();
}
ConsoleMethod(SimSet, getObject, S32, 3, 3, "set.getObject(objIndex)")
{
argc;
#ifdef TGE_RPG
if(object->size() == 0)
return -1;
#endif
S32 objectIndex = dAtoi(argv[2]);
if(objectIndex < 0 || objectIndex >= S32(object->size()))
{
Con::printf("Set::getObject index out of range.");
return -1;
}
return ((*object)[objectIndex])->getId();
}
ConsoleMethod(SimSet, isMember, bool, 3, 3, "set.isMember(object)")
{
argc;
SimObject *testObject = Sim::findObject(argv[2]);
if(!testObject)
{
Con::printf("SimSet::isMember: %s is not an object.", argv[2]);
return false;
}
object->lock();
for(SimSet::iterator i = object->begin(); i != object->end(); i++)
{
if(*i == testObject)
{
object->unlock();
return true;
}
}
object->unlock();
return false;
}
ConsoleMethod(SimSet, bringToFront, void, 3, 3, "set.bringToFront(object)")
{
argc;
SimObject *obj = Sim::findObject(argv[2]);
if(!obj)
return;
object->bringObjectToFront(obj);
}
ConsoleMethod(SimSet, pushToBack, void, 3, 3, "set.pushToBack(object)")
{
argc;
SimObject *obj = Sim::findObject(argv[2]);
if(!obj)
return;
object->pushObjectToBack(obj);
}
//----------------------------------------------------------------------------
IMPLEMENT_CONOBJECT(SimSet);
//---------------------------------------------------------------------------
SimGroup::~SimGroup()
{
lock();
for (iterator itr = begin(); itr != end(); itr++)
nameDictionary.remove(*itr);
// XXX Move this later into Group Class
// If we have any objects at this point, they should
// already have been removed from the manager, so we
// can just delete them directly.
objectList.sortId();
while (!objectList.empty())
{
delete objectList.last();
objectList.decrement();
}
unlock();
}
//---------------------------------------------------------------------------
void SimGroup::addObject(SimObject* obj)
{
lock();
// Make sure we aren't adding ourself. This isn't the most robust check
// but it should be good enough to prevent some self-foot-shooting.
if(obj == this)
{
Con::errorf("SimGroup::addObject - (%d) can't add self!", getIdString());
unlock();
return;
}
if (obj->mGroup != this)
{
if (obj->mGroup)
obj->mGroup->removeObject(obj);
nameDictionary.insert(obj);
obj->mGroup = this;
objectList.push_back(obj); // force it into the object list
// doesn't get a delete notify
obj->onGroupAdd();
}
unlock();
}
void SimGroup::removeObject(SimObject* obj)
{
lock();
if (obj->mGroup == this)
{
obj->onGroupRemove();
nameDictionary.remove(obj);
objectList.remove(obj);
obj->mGroup = 0;
}
unlock();
}
//---------------------------------------------------------------------------
void SimGroup::onRemove()
{
lock();
objectList.sortId();
if (objectList.size())
{
// This backwards iterator loop doesn't work if the
// list is empty, check the size first.
for (SimObjectList::iterator ptr = objectList.end() - 1;
ptr >= objectList.begin(); ptr--)
{
(*ptr)->onGroupRemove();
(*ptr)->mGroup = NULL;
(*ptr)->unregisterObject();
(*ptr)->mGroup = this;
}
}
SimObject::onRemove();
unlock();
}
//---------------------------------------------------------------------------
SimObject *SimGroup::findObject(const char *namePath)
{
// find the end of the object name
S32 len;
for(len = 0; namePath[len] != 0 && namePath[len] != '/'; len++)
;
StringTableEntry stName = StringTable->lookupn(namePath, len);
if(!stName)
return NULL;
SimObject *root = nameDictionary.find(stName);
if(!root)
return NULL;
if(namePath[len] == 0)
return root;
return root->findObject(namePath + len + 1);
}
SimObject *SimSet::findObject(const char *namePath)
{
// find the end of the object name
S32 len;
for(len = 0; namePath[len] != 0 && namePath[len] != '/'; len++)
;
StringTableEntry stName = StringTable->lookupn(namePath, len);
if(!stName)
return NULL;
lock();
for(SimSet::iterator i = begin(); i != end(); i++)
{
if((*i)->getName() == stName)
{
unlock();
if(namePath[len] == 0)
return *i;
return (*i)->findObject(namePath + len + 1);
}
}
unlock();
return NULL;
}
SimObject* SimObject::findObject(const char* )
{
return NULL;
}
//---------------------------------------------------------------------------
bool SimGroup::processArguments(S32, const char **)
{
return true;
}
//----------------------------------------------------------------------------
IMPLEMENT_CONOBJECT(SimGroup);
//------------------------------------------------------------------------------
SimConsoleEvent::SimConsoleEvent(S32 argc, const char **argv, bool onObject)
{
mOnObject = onObject;
mArgc = argc;
U32 totalSize = 0;
S32 i;
for(i = 0; i < argc; i++)
totalSize += dStrlen(argv[i]) + 1;
totalSize += sizeof(char *) * argc;
mArgv = (char **) dMalloc(totalSize);
char *argBase = (char *) &mArgv[argc];
for(i = 0; i < argc; i++)
{
mArgv[i] = argBase;
dStrcpy(mArgv[i], argv[i]);
argBase += dStrlen(argv[i]) + 1;
}
}
SimConsoleEvent::~SimConsoleEvent()
{
dFree(mArgv);
}
void SimConsoleEvent::process(SimObject* object)
{
// #ifdef DEBUG
// Con::printf("Executing schedule: %d", sequenceCount);
// #endif
if(mOnObject)
Con::execute(object, mArgc, const_cast<const char**>( mArgv ));
else
Con::execute(mArgc, const_cast<const char**>( mArgv ));
}
//-----------------------------------------------------------------------------
SimConsoleThreadExecCallback::SimConsoleThreadExecCallback() : retVal(NULL)
{
sem = Semaphore::createSemaphore(0);
}
SimConsoleThreadExecCallback::~SimConsoleThreadExecCallback()
{
Semaphore::destroySemaphore(sem);
}
void SimConsoleThreadExecCallback::handleCallback(const char *ret)
{
retVal = ret;
Semaphore::releaseSemaphore(sem);
}
const char *SimConsoleThreadExecCallback::waitForResult()
{
if(Semaphore::acquireSemaphore(sem, true))
{
return retVal;
}
return NULL;
}
//-----------------------------------------------------------------------------
SimConsoleThreadExecEvent::SimConsoleThreadExecEvent(S32 argc, const char **argv, bool onObject, SimConsoleThreadExecCallback *callback) :
SimConsoleEvent(argc, argv, onObject),
cb(callback)
{
}
void SimConsoleThreadExecEvent::process(SimObject* object)
{
const char *retVal;
if(mOnObject)
retVal = Con::execute(object, mArgc, const_cast<const char**>( mArgv ));
else
retVal = Con::execute(mArgc, const_cast<const char**>( mArgv ));
if(cb)
cb->handleCallback(retVal);
}
//-----------------------------------------------------------------------------
inline void SimSetIterator::Stack::push_back(SimSet* set)
{
increment();
last().set = set;
last().itr = set->begin();
}
//-----------------------------------------------------------------------------
SimSetIterator::SimSetIterator(SimSet* set)
{
VECTOR_SET_ASSOCIATION(stack);
if (!set->empty())
stack.push_back(set);
}
//-----------------------------------------------------------------------------
SimObject* SimSetIterator::operator++()
{
SimSet* set;
if ((set = dynamic_cast<SimSet*>(*stack.last().itr)) != 0)
{
if (!set->empty())
{
stack.push_back(set);
return *stack.last().itr;
}
}
while (++stack.last().itr == stack.last().set->end())
{
stack.pop_back();
if (stack.empty())
return 0;
}
return *stack.last().itr;
}
SimObject* SimGroupIterator::operator++()
{
SimGroup* set;
if ((set = dynamic_cast<SimGroup*>(*stack.last().itr)) != 0)
{
if (!set->empty())
{
stack.push_back(set);
return *stack.last().itr;
}
}
while (++stack.last().itr == stack.last().set->end())
{
stack.pop_back();
if (stack.empty())
return 0;
}
return *stack.last().itr;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -