2006-04-24 01:14:18 +02:00
|
|
|
#include "stdafx.h"
|
|
|
|
|
|
|
|
#include "Common/Tools.h"
|
|
|
|
#include "Common/Brushes.h"
|
|
|
|
#include "Common/MiscState.h"
|
2006-05-31 07:27:02 +02:00
|
|
|
#include "Common/ObjectSettings.h"
|
2006-04-24 01:14:18 +02:00
|
|
|
#include "GameInterface/Messages.h"
|
|
|
|
|
|
|
|
using AtlasMessage::Position;
|
|
|
|
|
|
|
|
class TransformObject : public StateDrivenTool<TransformObject>
|
|
|
|
{
|
|
|
|
DECLARE_DYNAMIC_CLASS(TransformObject);
|
|
|
|
|
|
|
|
int m_dx, m_dy;
|
|
|
|
|
|
|
|
public:
|
|
|
|
TransformObject()
|
|
|
|
{
|
|
|
|
SetState(&Waiting);
|
|
|
|
}
|
|
|
|
|
|
|
|
void OnDisable()
|
|
|
|
{
|
2006-05-04 04:44:03 +02:00
|
|
|
g_SelectedObjects.clear();
|
|
|
|
g_SelectedObjects.NotifyObservers();
|
|
|
|
POST_MESSAGE(SetSelectionPreview, (g_SelectedObjects));
|
2006-04-24 01:14:18 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// TODO: keys to rotate/move object?
|
|
|
|
|
|
|
|
struct sWaiting : public State
|
|
|
|
{
|
|
|
|
bool OnMouse(TransformObject* obj, wxMouseEvent& evt)
|
|
|
|
{
|
|
|
|
if (evt.LeftDown())
|
|
|
|
{
|
2006-05-31 07:27:02 +02:00
|
|
|
// New selection - never merge with movements of other objects
|
|
|
|
ScenarioEditor::GetCommandProc().FinaliseLastCommand();
|
|
|
|
|
|
|
|
// Select the object clicked on:
|
|
|
|
|
2006-05-04 04:44:03 +02:00
|
|
|
AtlasMessage::qPickObject qry(Position(evt.GetPosition()));
|
2006-04-24 01:14:18 +02:00
|
|
|
qry.Post();
|
2006-05-31 07:27:02 +02:00
|
|
|
|
|
|
|
// TODO: handle multiple selections
|
2006-05-04 04:44:03 +02:00
|
|
|
g_SelectedObjects.clear();
|
2006-05-31 07:27:02 +02:00
|
|
|
|
|
|
|
// Check they actually clicked on a valid object
|
2006-04-24 01:14:18 +02:00
|
|
|
if (AtlasMessage::ObjectIDIsValid(qry.id))
|
|
|
|
{
|
2006-05-04 04:44:03 +02:00
|
|
|
g_SelectedObjects.push_back(qry.id);
|
2006-05-31 07:27:02 +02:00
|
|
|
// Remember the screen-space offset of the mouse from the
|
|
|
|
// object's centre, so we can add that back when moving it
|
|
|
|
// (instead of just moving the object's centre to directly
|
|
|
|
// beneath the mouse)
|
2006-04-24 01:14:18 +02:00
|
|
|
obj->m_dx = qry.offsetx;
|
|
|
|
obj->m_dy = qry.offsety;
|
|
|
|
SET_STATE(Dragging);
|
|
|
|
}
|
2006-05-04 04:44:03 +02:00
|
|
|
g_SelectedObjects.NotifyObservers();
|
|
|
|
POST_MESSAGE(SetSelectionPreview, (g_SelectedObjects));
|
2006-04-24 01:14:18 +02:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
else if (evt.Dragging() && evt.RightIsDown() || evt.RightDown())
|
|
|
|
{
|
2006-05-31 07:27:02 +02:00
|
|
|
// Dragging with right mouse button -> rotate objects to look
|
|
|
|
// at mouse
|
2006-04-24 01:14:18 +02:00
|
|
|
Position pos (evt.GetPosition());
|
2006-05-04 04:44:03 +02:00
|
|
|
for (size_t i = 0; i < g_SelectedObjects.size(); ++i)
|
|
|
|
POST_COMMAND(RotateObject, (g_SelectedObjects[i], true, pos, 0.f));
|
2006-05-31 07:27:02 +02:00
|
|
|
|
2006-04-24 01:14:18 +02:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2006-06-11 09:03:59 +02:00
|
|
|
bool OnKey(TransformObject* WXUNUSED(obj), wxKeyEvent& evt, KeyEventType type)
|
2006-04-24 01:14:18 +02:00
|
|
|
{
|
|
|
|
if (type == KEY_CHAR && evt.GetKeyCode() == WXK_DELETE)
|
|
|
|
{
|
2006-05-04 04:44:03 +02:00
|
|
|
for (size_t i = 0; i < g_SelectedObjects.size(); ++i)
|
|
|
|
POST_COMMAND(DeleteObject, (g_SelectedObjects[i]));
|
2006-05-31 07:27:02 +02:00
|
|
|
|
2006-05-04 04:44:03 +02:00
|
|
|
g_SelectedObjects.clear();
|
|
|
|
g_SelectedObjects.NotifyObservers();
|
2006-05-31 07:27:02 +02:00
|
|
|
|
2006-05-04 04:44:03 +02:00
|
|
|
POST_MESSAGE(SetSelectionPreview, (g_SelectedObjects));
|
2006-04-24 01:14:18 +02:00
|
|
|
return true;
|
|
|
|
}
|
2006-05-31 07:27:02 +02:00
|
|
|
else if (type == KEY_CHAR && (evt.GetKeyCode() >= '0' && evt.GetKeyCode() <= '9'))
|
|
|
|
{
|
|
|
|
int playerID = evt.GetKeyCode() - '0';
|
|
|
|
g_ObjectSettings.SetPlayerID(playerID);
|
|
|
|
g_ObjectSettings.NotifyObservers();
|
|
|
|
return true;
|
|
|
|
}
|
2006-04-24 01:14:18 +02:00
|
|
|
else
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Waiting;
|
|
|
|
|
|
|
|
struct sDragging : public State
|
|
|
|
{
|
|
|
|
bool OnMouse(TransformObject* obj, wxMouseEvent& evt)
|
|
|
|
{
|
|
|
|
if (evt.LeftUp())
|
|
|
|
{
|
|
|
|
SET_STATE(Waiting);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
else if (evt.Dragging())
|
|
|
|
{
|
|
|
|
Position pos (evt.GetPosition() + wxPoint(obj->m_dx, obj->m_dy));
|
2006-05-04 04:44:03 +02:00
|
|
|
for (size_t i = 0; i < g_SelectedObjects.size(); ++i)
|
|
|
|
POST_COMMAND(MoveObject, (g_SelectedObjects[i], pos));
|
2006-04-24 01:14:18 +02:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Dragging;
|
|
|
|
};
|
|
|
|
|
|
|
|
IMPLEMENT_DYNAMIC_CLASS(TransformObject, StateDrivenTool<TransformObject>);
|