Skip to content
Snippets Groups Projects
CommandPaste.cpp 2.17 KiB
Newer Older
  • Learn to ignore specific revisions
  • D-AIRY's avatar
    D-AIRY committed
    #include "CommandPaste.h"
    #include <common/aastring.h>
    
    extern AssotiativeArray<AAString, IXEditable*> g_mEditableSystems;
    
    bool CCommandPaste::exec()
    {
    	if(!m_pCommandSelect)
    	{
    		m_pCommandSelect = new CCommandSelect();
    		
    		for(UINT i = 0, l = g_pLevelObjects.size(); i < l; ++i)
    		{
    			if(g_pLevelObjects[i]->isSelected())
    			{
    				m_pCommandSelect->addDeselected(i);
    			}
    		}
    	}
    
    	m_pCommandSelect->exec();
    
    	_paste_obj *pObj;
    	for(UINT i = 0, l = m_aObjects.size(); i < l; ++i)
    	{
    		pObj = &m_aObjects[i];
    
    		pObj->pObject->setSelected(true);
    		pObj->pObject->create();
    
    		pObj->pObject->setPos(pObj->vPos);
    		pObj->pObject->setScale(pObj->vScale);
    		pObj->pObject->setOrient(pObj->qRotate);
    		pObj->pObject->preSetup();
    		for(auto i = pObj->mKeyValues.begin(); i; ++i)
    		{
    			pObj->pObject->setKV(i.first->c_str(), i.second->c_str());
    		}
    		pObj->pObject->postSetup();
    
    D-AIRY's avatar
    D-AIRY committed
    		pObj->pObject->AddRef();
    
    D-AIRY's avatar
    D-AIRY committed
    		g_pLevelObjects.push_back(pObj->pObject);
    	}
    	XUpdatePropWindow();
    	return(m_aObjects.size());
    }
    bool CCommandPaste::undo()
    {
    	_paste_obj *pObj;
    	for(int i = m_aObjects.size() - 1; i >= 0; --i)
    	{
    		pObj = &m_aObjects[i];
    
    		pObj->pObject->remove();
    
    D-AIRY's avatar
    D-AIRY committed
    		pObj->pObject->Release();
    
    D-AIRY's avatar
    D-AIRY committed
    		g_pLevelObjects.erase(g_pLevelObjects.size() - 1);
    	}
    
    	m_pCommandSelect->undo();
    
    	XUpdatePropWindow();
    	return(true);
    }
    
    CCommandPaste::~CCommandPaste()
    {
    	for(UINT i = 0, l = m_aObjects.size(); i < l; ++i)
    	{
    		mem_release(m_aObjects[i].pObject);
    	}
    	mem_delete(m_pCommandSelect);
    }
    
    UINT CCommandPaste::addObject(const char *szTypeName, const char *szClassName, const float3 &vPos, const float3 &vScale, const SMQuaternion &qRotate)
    {
    	const AssotiativeArray<AAString, IXEditable*>::Node *pNode;
    	if(!g_mEditableSystems.KeyExists(AAString(szTypeName), &pNode))
    	{
    		LibReport(REPORT_MSG_LEVEL_ERROR, "Unknown object type %s, skipping!", szTypeName);
    		return(~0u);
    	}
    
    	_paste_obj obj;
    	obj.pObject = (*(pNode->Val))->newObject(szClassName);
    	obj.vPos = vPos;
    	obj.vScale = vScale;
    	obj.qRotate = qRotate;
    
    	m_aObjects.push_back(obj);
    
    	return(m_aObjects.size() - 1);
    }
    void CCommandPaste::setKV(UINT uId, const char *szKey, const char *szValue)
    {
    	assert(uId < m_aObjects.size());
    
    	m_aObjects[uId].mKeyValues[szKey] = szValue;
    }