#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 toolbarButtons_t; typedef std::vector 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; }