Moved selection to be a service

This commit is contained in:
Vulpovile
2022-10-03 19:30:24 -07:00
parent b2db375ecf
commit f46e24d8f1
18 changed files with 177 additions and 140 deletions

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity <assemblyIdentity
version="0.0.105.2" version="0.0.106.0"
processorArchitecture="*" processorArchitecture="*"
name="Blocks3D.Blocks3D.Blocks3D" name="Blocks3D.Blocks3D.Blocks3D"
type="win32" type="win32"

View File

@@ -491,6 +491,10 @@
/> />
</FileConfiguration> </FileConfiguration>
</File> </File>
<File
RelativePath=".\src\source\DataModel\SelectionService.cpp"
>
</File>
<File <File
RelativePath=".\src\source\DataModelV2\WorkspaceInstance.cpp" RelativePath=".\src\source\DataModelV2\WorkspaceInstance.cpp"
> >
@@ -840,6 +844,10 @@
RelativePath=".\src\include\DataModelV2\PVInstance.h" RelativePath=".\src\include\DataModelV2\PVInstance.h"
> >
</File> </File>
<File
RelativePath=".\src\include\DataModelV2\SelectionService.h"
>
</File>
<File <File
RelativePath=".\src\include\DataModelV2\WorkspaceInstance.h" RelativePath=".\src\include\DataModelV2\WorkspaceInstance.h"
> >

View File

@@ -49,5 +49,5 @@ IDI_ICON1 ICON "FatB3dIcon.ico"
// //
#ifndef _DEBUG #ifndef _DEBUG
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
1 RT_MANIFEST ".\\Blocks3D.exe.manifest" 1 MANIFEST ".\\Blocks3D.exe.manifest"
#endif #endif

View File

@@ -32,7 +32,6 @@ class Application { // : public GApp {
PartInstance* makePart(); PartInstance* makePart();
void drawButtons(RenderDevice* rd); void drawButtons(RenderDevice* rd);
void drawOutline(Vector3 from, Vector3 to, RenderDevice* rd, LightingParameters lighting, Vector3 size, Vector3 pos, CoordinateFrame c); void drawOutline(Vector3 from, Vector3 to, RenderDevice* rd, LightingParameters lighting, Vector3 size, Vector3 pos, CoordinateFrame c);
std::vector<Instance*> getSelection();
void deleteInstance(); void deleteInstance();
void run(); void run();
void QuitApp(); void QuitApp();

View File

@@ -2,6 +2,7 @@
#include "WorkspaceInstance.h" #include "WorkspaceInstance.h"
#include "LevelInstance.h" #include "LevelInstance.h"
#include "PartInstance.h" #include "PartInstance.h"
#include "SelectionService.h"
#include "rapidxml/rapidxml.hpp" #include "rapidxml/rapidxml.hpp"
#include "GuiRootInstance.h" #include "GuiRootInstance.h"
#include "XplicitNgine/XplicitNgine.h" #include "XplicitNgine/XplicitNgine.h"
@@ -30,12 +31,7 @@ public:
bool showMessage; bool showMessage;
G3D::GFontRef font; G3D::GFontRef font;
GuiRootInstance* getGuiRoot(); GuiRootInstance* getGuiRoot();
//float mousex; SelectionService* getSelectionService();
//float mousey;
//Vector2 getMousePos();
//void setMousePos(int x,int y);
//void setMousePos(Vector2 pos);
//bool mouseButton1Down;
PartInstance* makePart(); PartInstance* makePart();
void clearLevel(); void clearLevel();
void toggleRun(); void toggleRun();
@@ -56,6 +52,7 @@ private:
WorkspaceInstance* workspace; WorkspaceInstance* workspace;
LevelInstance * level; LevelInstance * level;
GuiRootInstance* guiRoot; GuiRootInstance* guiRoot;
SelectionService* selectionService;
bool running; bool running;
XplicitNgine * xplicitNgine; XplicitNgine * xplicitNgine;
}; };

View File

@@ -0,0 +1,21 @@
#pragma once
#include "Instance.h"
#include "PropertyWindow.h"
class SelectionService : public Instance
{
public:
SelectionService(void);
~SelectionService(void);
SelectionService(const SelectionService &oinst);
std::vector<Instance *> getSelection();
void clearSelection();
bool isSelected(Instance * instance);
void addSelected(Instance * instance);
void removeSelected(Instance * instance);
void addSelected(const std::vector<Instance *> &instances);
void setPropertyWindow(PropertyWindow * propertyWindow);
private:
std::vector<Instance *> selection;
PropertyWindow * propertyWindow;
};

View File

@@ -25,7 +25,6 @@ public:
}; };
extern std::vector<Instance*> postRenderStack; extern std::vector<Instance*> postRenderStack;
extern std::vector<Instance*> g_selectedInstances;
extern bool running; extern bool running;
extern DataModelInstance* g_dataModel; extern DataModelInstance* g_dataModel;
extern XplicitNgine* g_xplicitNgine; extern XplicitNgine* g_xplicitNgine;

View File

@@ -1,14 +1,15 @@
#pragma once #pragma once
#include "DataModelV2/Instance.h" #include "DataModelV2/Instance.h"
#include <set>
class PropertyWindow { class PropertyWindow {
public: public:
PropertyWindow(int x, int y, int sx, int sy, HMODULE hThisInstance); PropertyWindow(int x, int y, int sx, int sy, HMODULE hThisInstance);
bool onCreate(int x, int y, int sx, int sy, HMODULE hThisInstance); bool onCreate(int x, int y, int sx, int sy, HMODULE hThisInstance);
void UpdateSelected(Instance *); void UpdateSelected(std::vector<Instance *> selection);
void ClearProperties(); void ClearProperties();
void onResize(); void onResize();
void refreshExplorer(Instance* selectedInstance); void refreshExplorer(std::vector<Instance *> selection);
HWND _hwndProp; HWND _hwndProp;
private: private:
HWND _propGrid; HWND _propGrid;

View File

@@ -154,19 +154,19 @@ void Application::navigateToolbox(std::string path)
void Application::deleteInstance() void Application::deleteInstance()
{ {
if(g_selectedInstances.size() > 0) if(_dataModel->getSelectionService()->getSelection().size() > 0)
{ {
size_t undeletable = 0; size_t undeletable = 0;
while(g_selectedInstances.size() > undeletable) while(_dataModel->getSelectionService()->getSelection().size() > undeletable)
{ {
if(g_selectedInstances.at(0)->canDelete) if(_dataModel->getSelectionService()->getSelection()[0]->canDelete)
{ {
AudioPlayer::playSound(GetFileInPath("/content/sounds/pageturn.wav")); AudioPlayer::playSound(GetFileInPath("/content/sounds/pageturn.wav"));
Instance* selectedInstance = g_selectedInstances.at(0); Instance* selectedInstance = g_dataModel->getSelectionService()->getSelection()[0];
_dataModel->getSelectionService()->removeChild(selectedInstance);
selectedInstance->setParent(NULL); selectedInstance->setParent(NULL);
delete selectedInstance; delete selectedInstance;
selectedInstance = NULL; selectedInstance = NULL;
g_selectedInstances.erase(g_selectedInstances.begin());
} }
else else
{ {
@@ -174,8 +174,8 @@ void Application::deleteInstance()
} }
} }
} }
if(g_selectedInstances.size() == 0) if(_dataModel->getSelectionService()->getSelection().size() == 0)
g_usableApp->_propWindow->UpdateSelected(g_dataModel); _dataModel->getSelectionService()->addSelected(_dataModel);
} }
@@ -280,6 +280,8 @@ void Application::onInit() {
_dataModel->debugGetOpen(); _dataModel->debugGetOpen();
#endif #endif
_dataModel->getSelectionService()->clearSelection();
_dataModel->getSelectionService()->addSelected(_dataModel);
@@ -311,10 +313,6 @@ void Application::onNetwork() {
// return pow(pow((double)vector1.x - (double)vector2.x, 2) + pow((double)vector1.y - (double)vector2.y, 2) + pow((double)vector1.z - (double)vector2.z, 2), 0.5); // return pow(pow((double)vector1.x - (double)vector2.x, 2) + pow((double)vector1.y - (double)vector2.y, 2) + pow((double)vector1.z - (double)vector2.z, 2), 0.5);
//} //}
std::vector<Instance*> Application::getSelection()
{
return g_selectedInstances;
}
void Application::onSimulation(RealTime rdt, SimTime sdt, SimTime idt) { void Application::onSimulation(RealTime rdt, SimTime sdt, SimTime idt) {
if(_dataModel->isRunning()) if(_dataModel->isRunning())
@@ -331,25 +329,13 @@ void Application::onSimulation(RealTime rdt, SimTime sdt, SimTime idt) {
else else
_dataModel->getEngine()->createBody(partInstance); _dataModel->getEngine()->createBody(partInstance);
} }
bool a = false;
while(toDelete.size() > 0) while(toDelete.size() > 0)
{ {
PartInstance * p = toDelete.back(); PartInstance * p = toDelete.back();
toDelete.pop_back(); toDelete.pop_back();
if(std::find(g_selectedInstances.begin(), g_selectedInstances.end(), p) != g_selectedInstances.end()) g_dataModel->getSelectionService()->removeSelected(p);
{
g_selectedInstances.erase(std::remove(g_selectedInstances.begin(), g_selectedInstances.end(), p), g_selectedInstances.end());
a = true;
}
p->setParent(NULL); p->setParent(NULL);
delete p; delete p;
}
if(a)
{
if(g_selectedInstances.size() == 0)
g_usableApp->_propWindow->UpdateSelected(g_dataModel);
else if(g_selectedInstances.size() == 1)
g_usableApp->_propWindow->UpdateSelected(g_selectedInstances[0]);
} }
for(int i = 0; i < 6; i++) for(int i = 0; i < 6; i++)
{ {
@@ -603,17 +589,15 @@ void Application::onGraphics(RenderDevice* rd) {
//Draw::box(G3D::Box(mouse.getPosition()-Vector3(2,0.5F,1),mouse.getPosition()+Vector3(2,0.5F,1)), rd, Color3::cyan(), Color4::clear()); //Draw::box(G3D::Box(mouse.getPosition()-Vector3(2,0.5F,1),mouse.getPosition()+Vector3(2,0.5F,1)), rd, Color3::cyan(), Color4::clear());
if(g_selectedInstances.size() > 0)
for(size_t i = 0; i < _dataModel->getSelectionService()->getSelection().size(); i++)
{ {
for(size_t i = 0; i < g_selectedInstances.size(); i++) if(PartInstance* part = dynamic_cast<PartInstance*>(g_dataModel->getSelectionService()->getSelection()[i]))
{ {
if(PartInstance* part = dynamic_cast<PartInstance*>(g_selectedInstances.at(i))) Vector3 size = part->getSize();
{ Vector3 pos = part->getPosition();
Vector3 size = part->getSize(); drawOutline(Vector3(0+size.x/2, 0+size.y/2, 0+size.z/2) ,Vector3(0-size.x/2,0-size.y/2,0-size.z/2), rd, lighting, Vector3(size.x/2, size.y/2, size.z/2), Vector3(pos.x, pos.y, pos.z), part->getCFrame());
Vector3 pos = part->getPosition(); }
drawOutline(Vector3(0+size.x/2, 0+size.y/2, 0+size.z/2) ,Vector3(0-size.x/2,0-size.y/2,0-size.z/2), rd, lighting, Vector3(size.x/2, size.y/2, size.z/2), Vector3(pos.x, pos.y, pos.z), part->getCFrame());
}
}
} }
@@ -702,12 +686,6 @@ void Application::onKeyUp(int key)
void Application::onMouseLeftPressed(HWND hwnd,int x,int y) void Application::onMouseLeftPressed(HWND hwnd,int x,int y)
{ {
//Removed set focus
//std::cout << "Click: " << x << "," << y << std::endl;
bool onGUI = _dataModel->getGuiRoot()->mouseInGUI(renderDevice, x, y); bool onGUI = _dataModel->getGuiRoot()->mouseInGUI(renderDevice, x, y);
@@ -717,19 +695,6 @@ void Application::onMouseLeftPressed(HWND hwnd,int x,int y)
} }
} }
void Application::selectInstance(Instance* selectedInstance, PropertyWindow* propWindow)
{
if(!GetHoldKeyState(VK_RCONTROL) && !GetHoldKeyState(VK_LCONTROL))
{
printf("No control key hold \n");
g_selectedInstances.clear();
}
else printf("Control held\n");
if(std::find(g_selectedInstances.begin(), g_selectedInstances.end(),selectedInstance)==g_selectedInstances.end())
g_selectedInstances.push_back(selectedInstance);
propWindow->UpdateSelected(selectedInstance);
}
G3D::RenderDevice* Application::getRenderDevice() G3D::RenderDevice* Application::getRenderDevice()
{ {
return renderDevice; return renderDevice;
@@ -737,13 +702,9 @@ G3D::RenderDevice* Application::getRenderDevice()
void Application::onMouseLeftUp(G3D::RenderDevice* renderDevice, int x, int y) void Application::onMouseLeftUp(G3D::RenderDevice* renderDevice, int x, int y)
{ {
//std::cout << "Release: " << x << "," << y << std::endl;
_dataModel->getGuiRoot()->onMouseLeftUp(renderDevice, x, y); _dataModel->getGuiRoot()->onMouseLeftUp(renderDevice, x, y);
_dragging = false; _dragging = false;
tool->onButton1MouseUp(mouse); tool->onButton1MouseUp(mouse);
//_message = "Dragging = false.";
//_messageTime = System::time();
} }
void Application::onMouseRightPressed(int x,int y) void Application::onMouseRightPressed(int x,int y)
@@ -763,8 +724,6 @@ void Application::onMouseMoved(int x,int y)
mouse.y = y; mouse.y = y;
//tool->onMouseMoved(mouse); //tool->onMouseMoved(mouse);
mouseMoveState = true; mouseMoveState = true;
//_dataModel->mousex = x;
//_dataModel->mousey = y;
} }
void Application::onMouseWheel(int x,int y,short delta) void Application::onMouseWheel(int x,int y,short delta)

View File

@@ -0,0 +1,53 @@
#include "DataModelV2/SelectionService.h"
SelectionService::SelectionService(void){
Instance::Instance();
propertyWindow = NULL;
}
SelectionService::~SelectionService(void){
}
SelectionService::SelectionService(const SelectionService &oinst){
Instance::Instance(oinst);
propertyWindow = NULL;
}
std::vector<Instance *> SelectionService::getSelection(){
return this->selection;
}
void SelectionService::clearSelection(){
this->selection.clear();
if(propertyWindow != NULL)
propertyWindow->ClearProperties();
}
bool SelectionService::isSelected(Instance * instance){
return std::find(selection.begin(), selection.end(), instance) != selection.end();
}
void SelectionService::addSelected(Instance * instance){
if(!isSelected(instance))
this->selection.push_back(instance);
if(propertyWindow != NULL)
propertyWindow->UpdateSelected(selection);
}
void SelectionService::removeSelected(Instance * instance){
selection.erase(std::remove(selection.begin(), selection.end(), instance), selection.end());
if(propertyWindow != NULL)
propertyWindow->UpdateSelected(selection);
}
void SelectionService::addSelected(const std::vector<Instance *> &instances){
for(size_t i = 0; i < instances.size(); i++)
{
if(!isSelected(instances[i]))
this->selection.push_back(instances[i]);
}
if(propertyWindow != NULL)
propertyWindow->UpdateSelected(selection);
}
void SelectionService::setPropertyWindow(PropertyWindow * propertyWindow)
{
this->propertyWindow = propertyWindow;
if(propertyWindow != NULL)
propertyWindow->ClearProperties();
}

View File

@@ -1,5 +1,6 @@
#include <string> #include <string>
#include "DataModelV2/GuiRootInstance.h" #include "DataModelV2/GuiRootInstance.h"
#include "DataModelV2/ToggleImageButtonInstance.h"
#include "DataModelV2/DataModelInstance.h" #include "DataModelV2/DataModelInstance.h"
#include <fstream> #include <fstream>
#include <iostream> #include <iostream>
@@ -19,6 +20,8 @@ DataModelInstance::DataModelInstance(void)
workspace = new WorkspaceInstance(); workspace = new WorkspaceInstance();
guiRoot = new GuiRootInstance(); guiRoot = new GuiRootInstance();
level = new LevelInstance(); level = new LevelInstance();
selectionService = new SelectionService();
selectionService->setPropertyWindow(g_usableApp->_propWindow);
//children.push_back(workspace); //children.push_back(workspace);
//children.push_back(level); //children.push_back(level);
className = "dataModel"; className = "dataModel";
@@ -61,6 +64,7 @@ void DataModelInstance::toggleRun()
//if(!running) //if(!running)
//resetEngine(); //resetEngine();
} }
bool DataModelInstance::isRunning() bool DataModelInstance::isRunning()
{ {
return running; return running;
@@ -83,8 +87,17 @@ void DataModelInstance::modXMLLevel(float modY)
void DataModelInstance::clearLevel() void DataModelInstance::clearLevel()
{ {
running = false;
Instance * goButton = this->getGuiRoot()->findFirstChild("go");
if(goButton != NULL){
if(ToggleImageButtonInstance* goButtonReal = dynamic_cast<ToggleImageButtonInstance*>(goButton))
{
goButtonReal->checked = false;
}
}
selectionService->clearSelection();
selectionService->addSelected(this);
workspace->clearChildren(); workspace->clearChildren();
g_usableApp->_propWindow->UpdateSelected(this);
} }
PartInstance* DataModelInstance::makePart() PartInstance* DataModelInstance::makePart()
{ {
@@ -480,6 +493,8 @@ bool DataModelInstance::load(const char* filename, bool clearObjects)
std::string tname = hname.substr(0, hname.length() - 5); std::string tname = hname.substr(0, hname.length() - 5);
name = tname; name = tname;
resetEngine(); resetEngine();
selectionService->clearSelection();
selectionService->addSelected(this);
return true; return true;
} }
else else
@@ -622,25 +637,16 @@ WorkspaceInstance* DataModelInstance::getWorkspace()
{ {
return workspace; return workspace;
} }
/*Vector2 DataModelInstance::getMousePos()
{
return Vector2(mousex,mousey);
}
void DataModelInstance::setMousePos(int x,int y)
{
mousex=x;
mousey=y;
}
void DataModelInstance::setMousePos(Vector2 pos)
{
mousex=pos.x;
mousey=pos.y;
}*/
GuiRootInstance* DataModelInstance::getGuiRoot() GuiRootInstance* DataModelInstance::getGuiRoot()
{ {
return guiRoot; return guiRoot;
} }
SelectionService* DataModelInstance::getSelectionService()
{
return selectionService;
}
LevelInstance* DataModelInstance::getLevel() LevelInstance* DataModelInstance::getLevel()
{ {

View File

@@ -507,8 +507,8 @@ void GuiRootInstance::update()
button4->disabled = true; button4->disabled = true;
button5->disabled = true; button5->disabled = true;
button6->disabled = true; button6->disabled = true;
for(size_t i = 0; i < g_selectedInstances.size(); i++) for(size_t i = 0; i < g_dataModel->getSelectionService()->getSelection().size(); i++)
if(g_selectedInstances.at(i)->canDelete) if(g_dataModel->getSelectionService()->getSelection()[i]->canDelete)
{ {
button->disabled = false; button->disabled = false;
button2->disabled = false; button2->disabled = false;

View File

@@ -43,9 +43,9 @@ HRESULT IEBrowser::doExternal(std::wstring funcName,
if(pDispParams->rgvarg->intVal < 0 || pDispParams->rgvarg->intVal > 7) if(pDispParams->rgvarg->intVal < 0 || pDispParams->rgvarg->intVal > 7)
return S_OK; return S_OK;
Enum::Controller::Value cont = (Enum::Controller::Value)pDispParams->rgvarg->intVal; Enum::Controller::Value cont = (Enum::Controller::Value)pDispParams->rgvarg->intVal;
for(size_t i = 0; i < g_selectedInstances.size(); i++) for(size_t i = 0; i < g_dataModel->getSelectionService()->getSelection().size(); i++)
{ {
if(PVInstance* part = dynamic_cast<PVInstance*>(g_selectedInstances.at(i))) if(PVInstance* part = dynamic_cast<PVInstance*>(g_dataModel->getSelectionService()->getSelection()[i]))
{ {
ding = true; ding = true;
part->controller = cont; part->controller = cont;

View File

@@ -7,8 +7,8 @@ void CameraButtonListener::onButton1MouseClick(BaseButtonInstance* button)
{ {
AudioPlayer::playSound(cameraSound); AudioPlayer::playSound(cameraSound);
CoordinateFrame frame = g_usableApp->cameraController.getCamera()->getCoordinateFrame(); CoordinateFrame frame = g_usableApp->cameraController.getCamera()->getCoordinateFrame();
if(button->name == "CenterCam" && g_selectedInstances.size() > 0) if(button->name == "CenterCam" && g_dataModel->getSelectionService()->getSelection().size() > 0)
g_usableApp->cameraController.centerCamera(g_selectedInstances.at(0)); g_usableApp->cameraController.centerCamera(g_dataModel->getSelectionService()->getSelection()[0]);
else if(button->name == "ZoomIn") else if(button->name == "ZoomIn")
g_usableApp->cameraController.Zoom(1); g_usableApp->cameraController.Zoom(1);
else if(button->name == "ZoomOut") else if(button->name == "ZoomOut")

View File

@@ -2,13 +2,14 @@
#include "Application.h" #include "Application.h"
#include "Globals.h" #include "Globals.h"
#include "AudioPlayer.h" #include "AudioPlayer.h"
#include "DataModelV2/SelectionService.h"
#include "Listener/GUDButtonListener.h" #include "Listener/GUDButtonListener.h"
void GUDButtonListener::onButton1MouseClick(BaseButtonInstance* button) void GUDButtonListener::onButton1MouseClick(BaseButtonInstance* button)
{ {
bool cont = false; bool cont = false;
for(size_t i = 0; i < g_selectedInstances.size(); i++) for(size_t i = 0; i < g_dataModel->getSelectionService()->getSelection().size(); i++)
if(g_selectedInstances.at(i)->canDelete) if(g_dataModel->getSelectionService()->getSelection()[i]->canDelete)
{ {
cont = true; cont = true;
break; break;
@@ -19,53 +20,46 @@ void GUDButtonListener::onButton1MouseClick(BaseButtonInstance* button)
if(button->name == "Duplicate") if(button->name == "Duplicate")
{ {
std::vector<Instance*> newinst; std::vector<Instance*> newinst;
for(size_t i = 0; i < g_selectedInstances.size(); i++) for(size_t i = 0; i < g_dataModel->getSelectionService()->getSelection().size(); i++)
{ {
if(g_selectedInstances.at(i)->canDelete) if(g_dataModel->getSelectionService()->getSelection()[i]->canDelete)
{ {
Instance* tempinst = g_selectedInstances.at(i); Instance* tempinst = g_dataModel->getSelectionService()->getSelection()[i];
Instance* clonedInstance = g_selectedInstances.at(i)->clone(); Instance* clonedInstance = g_dataModel->getSelectionService()->getSelection()[i]->clone();
newinst.push_back(tempinst); newinst.push_back(tempinst);
} }
/*tempinst->setPosition(Vector3(tempPos.x, tempPos.y + tempSize.y, tempPos.z));
g_usableApp->cameraController.centerCamera(g_selectedInstances.at(0));*/
} }
g_selectedInstances = newinst; g_dataModel->getSelectionService()->clearSelection();
if(g_selectedInstances.size() > 0) g_dataModel->getSelectionService()->addSelected(newinst);
g_usableApp->_propWindow->UpdateSelected(newinst.at(0));
} }
else if(button->name == "Group") else if(button->name == "Group")
{ {
GroupInstance * inst = new GroupInstance(); GroupInstance * inst = new GroupInstance();
inst->setParent(g_dataModel->getWorkspace()); inst->setParent(g_dataModel->getWorkspace());
for(size_t i = 0; i < g_selectedInstances.size(); i++) for(size_t i = 0; i < g_dataModel->getSelectionService()->getSelection().size(); i++)
{ {
if(g_selectedInstances.at(i)->canDelete) if(g_dataModel->getSelectionService()->getSelection()[i]->canDelete)
{ {
g_selectedInstances.at(i)->setParent(inst); g_dataModel->getSelectionService()->getSelection()[i]->setParent(inst);
if(PartInstance* part = dynamic_cast<PartInstance*>(g_selectedInstances.at(i))) if(PartInstance* part = dynamic_cast<PartInstance*>(g_dataModel->getSelectionService()->getSelection()[i]))
{ {
inst->primaryPart = part; inst->primaryPart = part;
} }
} }
/*tempinst->setPosition(Vector3(tempPos.x, tempPos.y + tempSize.y, tempPos.z));
g_usableApp->cameraController.centerCamera(g_selectedInstances.at(0));*/
} }
g_selectedInstances.clear(); g_dataModel->getSelectionService()->clearSelection();
g_selectedInstances.push_back(inst); g_dataModel->getSelectionService()->addSelected(inst);
if(g_selectedInstances.size() > 0)
g_usableApp->_propWindow->UpdateSelected(g_selectedInstances.at(0));
} }
else if(button->name == "UnGroup") else if(button->name == "UnGroup")
{ {
std::vector<Instance*> newinst; std::vector<Instance*> newinst;
for(size_t i = 0; i < g_selectedInstances.size(); i++) for(size_t i = 0; i < g_dataModel->getSelectionService()->getSelection().size(); i++)
{ {
if(g_selectedInstances.at(i)->canDelete) if(g_dataModel->getSelectionService()->getSelection()[i]->canDelete)
{ {
if(GroupInstance* model = dynamic_cast<GroupInstance*>(g_selectedInstances.at(i))) if(GroupInstance* model = dynamic_cast<GroupInstance*>(g_dataModel->getSelectionService()->getSelection()[i]))
{ {
newinst = model->unGroup(); newinst = model->unGroup();
model->setParent(NULL); model->setParent(NULL);
@@ -73,13 +67,9 @@ void GUDButtonListener::onButton1MouseClick(BaseButtonInstance* button)
model = NULL; model = NULL;
} }
} }
/*tempinst->setPosition(Vector3(tempPos.x, tempPos.y + tempSize.y, tempPos.z));
g_usableApp->cameraController.centerCamera(g_selectedInstances.at(0));*/
} }
g_selectedInstances.clear(); g_dataModel->getSelectionService()->clearSelection();
g_selectedInstances = newinst; g_dataModel->getSelectionService()->addSelected(newinst);
if(g_selectedInstances.size() > 0)
g_usableApp->_propWindow->UpdateSelected(newinst.at(0));
} }
} }
} }

View File

@@ -5,9 +5,9 @@
void RotateButtonListener::onButton1MouseClick(BaseButtonInstance* button) void RotateButtonListener::onButton1MouseClick(BaseButtonInstance* button)
{ {
if(g_selectedInstances.size() > 0) if(g_dataModel->getSelectionService()->getSelection().size() > 0)
{ {
Instance* selectedInstance = g_selectedInstances.at(0); Instance* selectedInstance = g_dataModel->getSelectionService()->getSelection()[0];
AudioPlayer::playSound(clickSound); AudioPlayer::playSound(clickSound);
if(PartInstance* part = dynamic_cast<PartInstance*>(selectedInstance)) if(PartInstance* part = dynamic_cast<PartInstance*>(selectedInstance))
{ {

View File

@@ -172,8 +172,8 @@ LRESULT CALLBACK PropProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
int ItemIndex = SendMessage((HWND) lParam, (UINT) CB_GETCURSEL, (WPARAM) 0, (LPARAM) 0); int ItemIndex = SendMessage((HWND) lParam, (UINT) CB_GETCURSEL, (WPARAM) 0, (LPARAM) 0);
CHAR ListItem[256]; CHAR ListItem[256];
SendMessage((HWND) lParam, (UINT) CB_GETLBTEXT, (WPARAM) ItemIndex, (LPARAM) ListItem); SendMessage((HWND) lParam, (UINT) CB_GETLBTEXT, (WPARAM) ItemIndex, (LPARAM) ListItem);
propWind->ClearProperties(); g_dataModel->getSelectionService()->clearSelection();
g_usableApp->selectInstance(children.at(ItemIndex),propWind); g_dataModel->getSelectionService()->addSelected(children.at(ItemIndex));
} }
} }
break; break;
@@ -203,13 +203,12 @@ LRESULT CALLBACK PropProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
return 0; return 0;
} }
void PropertyWindow::refreshExplorer(Instance* selectedInstance) void PropertyWindow::refreshExplorer(std::vector<Instance*> selectedInstances)
{ {
Instance * instance = selectedInstances[0];
SendMessage(_explorerComboBox,CB_RESETCONTENT,0,0); SendMessage(_explorerComboBox,CB_RESETCONTENT,0,0);
parent = NULL; parent = NULL;
children.clear(); children.clear();
//g_selectedInstances.clear();
//for (unsigned int i=0;i<g_selectedInstances.size();i++) {
children.push_back(selectedInstance); children.push_back(selectedInstance);
SendMessage(_explorerComboBox, CB_ADDSTRING, 0, (LPARAM)selectedInstance->name.c_str()); SendMessage(_explorerComboBox, CB_ADDSTRING, 0, (LPARAM)selectedInstance->name.c_str());
if(selectedInstance->getParent() != NULL) if(selectedInstance->getParent() != NULL)
@@ -221,7 +220,6 @@ void PropertyWindow::refreshExplorer(Instance* selectedInstance)
parent = selectedInstance->getParent(); parent = selectedInstance->getParent();
children.push_back(selectedInstance->getParent()); children.push_back(selectedInstance->getParent());
} }
//children = g_selectedInstances[i]->getChildren();
std::vector<Instance*> selectedChildren = selectedInstance->getChildren(); std::vector<Instance*> selectedChildren = selectedInstance->getChildren();
for(size_t z = 0; z < selectedChildren.size(); z++) for(size_t z = 0; z < selectedChildren.size(); z++)
@@ -338,8 +336,14 @@ void PropertyWindow::_resize()
SetWindowPos(_explorerComboBox, NULL, 0, 0, rect.right, 400, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); SetWindowPos(_explorerComboBox, NULL, 0, 0, rect.right, 400, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
} }
void PropertyWindow::UpdateSelected(Instance * instance) void PropertyWindow::UpdateSelected(std::vector<Instance *> instances)
{ {
if(instances.size() < 0)
{
ClearProperties();
return;
}
Instance * instance = instances[0];
PropGrid_ResetContent(_propGrid); PropGrid_ResetContent(_propGrid);
prop = instance->getProperties(); prop = instance->getProperties();
//if (selectedInstance != instance) //if (selectedInstance != instance)
@@ -356,7 +360,7 @@ void PropertyWindow::UpdateSelected(Instance * instance)
PropGrid_ExpandAllCatalogs(_propGrid); PropGrid_ExpandAllCatalogs(_propGrid);
//SetWindowLongPtr(_propGrid,GWL_USERDATA,(LONG)this); //SetWindowLongPtr(_propGrid,GWL_USERDATA,(LONG)this);
refreshExplorer(instance); refreshExplorer(instances);
_resize(); _resize();
} }
} }

View File

@@ -1,5 +1,6 @@
#include "Tool/ArrowTool.h" #include "Tool/ArrowTool.h"
#include "Application.h" #include "Application.h"
#include "DataModelV2/SelectionService.h"
ArrowTool::ArrowTool(void) ArrowTool::ArrowTool(void)
{ {
@@ -21,13 +22,12 @@ void ArrowTool::onButton1MouseDown(Mouse mouse)
mouseDownStarty = mouse.y; mouseDownStarty = mouse.y;
mouseDown = true; mouseDown = true;
if(!lctrlDown && !rctrlDown) if(!lctrlDown && !rctrlDown)
g_selectedInstances.clear(); g_dataModel->getSelectionService()->clearSelection();
PartInstance * target = mouse.getTarget(); PartInstance * target = mouse.getTarget();
if(target != NULL && std::find(g_selectedInstances.begin(), g_selectedInstances.end(), target) == g_selectedInstances.end()) if(target != NULL)
g_selectedInstances.push_back(target); g_dataModel->getSelectionService()->addSelected(target);
if(g_selectedInstances.size() == 0) if(g_dataModel->getSelectionService()->getSelection().size() == 0)
g_selectedInstances.push_back(g_dataModel); g_dataModel->getSelectionService()->addSelected(g_dataModel);
g_usableApp->_propWindow->UpdateSelected(g_selectedInstances[0]);
} }
void ArrowTool::onButton1MouseUp(Mouse mouse) void ArrowTool::onButton1MouseUp(Mouse mouse)
{ {
@@ -47,11 +47,11 @@ void ArrowTool::onMouseMoved(Mouse mouse)
} }
else return; else return;
} }
for(size_t i = 0; i < g_selectedInstances.size(); i++) //This will later decide primary and move all parts according to primary for(size_t i = 0; i < g_dataModel->getSelectionService()->getSelection().size(); i++) //This will later decide primary and move all parts according to primary
{ {
if(PartInstance * part = dynamic_cast<PartInstance *>(g_selectedInstances[i])) if(PartInstance * part = dynamic_cast<PartInstance *>(g_dataModel->getSelectionService()->getSelection()[i]))
{ {
part->setPosition(mouse.getPosition(g_selectedInstances)); part->setPosition(mouse.getPosition(g_dataModel->getSelectionService()->getSelection()));
} }
} }
return; return;