mirror of
https://gitea.wildfiregames.com/0ad/0ad
synced 2026-06-17 13:53:57 -07:00
154 lines
3.3 KiB
C++
154 lines
3.3 KiB
C++
#include "stdafx.h"
|
|
|
|
#include "Tools.h"
|
|
#include "GameInterface/Messages.h"
|
|
#include "CustomControls/Buttons/ToolButton.h"
|
|
|
|
class DummyTool : public ITool
|
|
{
|
|
void Init(void*) {}
|
|
void Shutdown() {}
|
|
bool OnMouse(wxMouseEvent& WXUNUSED(evt)) { return false; }
|
|
bool OnKey(wxKeyEvent& WXUNUSED(evt), KeyEventType) { return false; }
|
|
void OnTick(float) {}
|
|
} dummy;
|
|
|
|
static ITool* g_CurrentTool = &dummy;
|
|
static wxString g_CurrentToolName;
|
|
|
|
void SetActive(bool active, const wxString& name);
|
|
|
|
ITool& GetCurrentTool()
|
|
{
|
|
return *g_CurrentTool;
|
|
}
|
|
|
|
void SetCurrentTool(const wxString& name, void* initData)
|
|
{
|
|
if (g_CurrentTool != &dummy)
|
|
{
|
|
g_CurrentTool->Shutdown();
|
|
delete g_CurrentTool;
|
|
g_CurrentTool = &dummy;
|
|
}
|
|
|
|
SetActive(false, g_CurrentToolName);
|
|
|
|
ITool* tool = NULL;
|
|
if (name.Len())
|
|
{
|
|
tool = wxDynamicCast(wxCreateDynamicObject(name), ITool);
|
|
wxASSERT(tool);
|
|
}
|
|
|
|
if (tool)
|
|
{
|
|
g_CurrentTool = tool;
|
|
tool->Init(initData);
|
|
}
|
|
|
|
g_CurrentToolName = name;
|
|
SetActive(true, g_CurrentToolName);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
struct toolbarButton
|
|
{
|
|
wxString name;
|
|
wxToolBar* toolbar;
|
|
int id;
|
|
};
|
|
struct toolButton
|
|
{
|
|
wxString name;
|
|
ToolButton* button;
|
|
};
|
|
|
|
typedef std::vector<toolbarButton> toolbarButtons_t;
|
|
typedef std::vector<toolButton> toolButtons_t;
|
|
|
|
static toolbarButtons_t toolbarButtons;
|
|
static toolButtons_t toolButtons;
|
|
|
|
void SetActive(bool active, const wxString& name)
|
|
{
|
|
for (toolbarButtons_t::iterator it = toolbarButtons.begin(); it != toolbarButtons.end(); ++it)
|
|
if (it->name == name)
|
|
it->toolbar->ToggleTool(it->id, active);
|
|
|
|
for (toolButtons_t::iterator it = toolButtons.begin(); it != toolButtons.end(); ++it)
|
|
if (it->name == name)
|
|
it->button->SetSelectedAppearance(active);
|
|
}
|
|
|
|
void RegisterToolButton(ToolButton* button, const wxString& toolName)
|
|
{
|
|
toolButton b;
|
|
b.name = toolName;
|
|
b.button = button;
|
|
toolButtons.push_back(b);
|
|
}
|
|
|
|
void RegisterToolBarButton(wxToolBar* toolbar, int buttonId, const wxString& toolName)
|
|
{
|
|
toolbarButton b;
|
|
b.name = toolName;
|
|
b.toolbar = toolbar;
|
|
b.id = buttonId;
|
|
toolbarButtons.push_back(b);
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
IMPLEMENT_CLASS(WorldCommand, AtlasWindowCommand);
|
|
|
|
WorldCommand::WorldCommand(AtlasMessage::mWorldCommand* command)
|
|
: AtlasWindowCommand(true, wxString::FromAscii(command->GetType())), m_Command(command), m_AlreadyDone(false)
|
|
{
|
|
}
|
|
|
|
WorldCommand::~WorldCommand()
|
|
{
|
|
// m_Command was allocated by POST_COMMAND
|
|
delete m_Command;
|
|
}
|
|
|
|
bool WorldCommand::Do()
|
|
{
|
|
if (m_AlreadyDone)
|
|
POST_MESSAGE(RedoCommand, ());
|
|
else
|
|
{
|
|
// The DoCommand message clones the data from m_Command, and posts that
|
|
// (passing ownership to the game), so we're free to delete m_Command
|
|
// at any time
|
|
POST_MESSAGE(DoCommand, (m_Command));
|
|
m_AlreadyDone = true;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool WorldCommand::Undo()
|
|
{
|
|
POST_MESSAGE(UndoCommand, ());
|
|
return true;
|
|
}
|
|
|
|
bool WorldCommand::Merge(AtlasWindowCommand* p)
|
|
{
|
|
WorldCommand* prev = wxDynamicCast(p, WorldCommand);
|
|
|
|
if (! prev)
|
|
return false;
|
|
|
|
if (m_Command->GetName() != prev->m_Command->GetName()) // comparing char* pointers, because they're unique-per-class constants
|
|
return false;
|
|
|
|
if (! m_Command->IsMergeable())
|
|
return false;
|
|
|
|
POST_MESSAGE(MergeCommand, ());
|
|
return true;
|
|
}
|