Changeset View
Changeset View
Standalone View
Standalone View
source/tools/atlas/AtlasUI/ScenarioEditor/ScenarioEditor.cpp
Show First 20 Lines • Show All 126 Lines • ▼ Show 20 Lines | if (m_ScenarioEditor.GetToolManager().GetCurrentTool()->OnKey(evt, ITool::KEY_DOWN)) | ||||
// Key event has been handled by the tool, so don't try | // Key event has been handled by the tool, so don't try | ||||
// to use it for camera motion too | // to use it for camera motion too | ||||
return; | return; | ||||
} | } | ||||
if (KeyScroll(evt, true)) | if (KeyScroll(evt, true)) | ||||
return; | return; | ||||
// Slight hack: Only pass 'special' keys; normal keys will generate a translated Char event instead | |||||
if (evt.GetKeyCode() >= 256) | |||||
POST_MESSAGE(GuiKeyEvent, (GetSDLKeyFromWxKeyCode(evt.GetKeyCode()), evt.GetUnicodeKey(), true)); | POST_MESSAGE(GuiKeyEvent, (GetSDLKeyFromWxKeyCode(evt.GetKeyCode()), evt.GetUnicodeKey(), true)); | ||||
evt.Skip(); | evt.Skip(); | ||||
} | } | ||||
void OnKeyUp(wxKeyEvent& evt) | void OnKeyUp(wxKeyEvent& evt) | ||||
{ | { | ||||
if (m_ScenarioEditor.GetToolManager().GetCurrentTool()->OnKey(evt, ITool::KEY_UP)) | if (m_ScenarioEditor.GetToolManager().GetCurrentTool()->OnKey(evt, ITool::KEY_UP)) | ||||
return; | return; | ||||
if (KeyScroll(evt, false)) | if (KeyScroll(evt, false)) | ||||
return; | return; | ||||
// Slight hack: Only pass 'special' keys; normal keys will generate a translated Char event instead | |||||
if (evt.GetKeyCode() >= 256) | |||||
POST_MESSAGE(GuiKeyEvent, (GetSDLKeyFromWxKeyCode(evt.GetKeyCode()), evt.GetUnicodeKey(), false)); | POST_MESSAGE(GuiKeyEvent, (GetSDLKeyFromWxKeyCode(evt.GetKeyCode()), evt.GetUnicodeKey(), false)); | ||||
evt.Skip(); | evt.Skip(); | ||||
} | } | ||||
void OnChar(wxKeyEvent& evt) | void OnChar(wxKeyEvent& evt) | ||||
{ | { | ||||
if (m_ScenarioEditor.GetToolManager().GetCurrentTool()->OnKey(evt, ITool::KEY_CHAR)) | if (m_ScenarioEditor.GetToolManager().GetCurrentTool()->OnKey(evt, ITool::KEY_CHAR)) | ||||
return; | return; | ||||
Show All 23 Lines | void OnChar(wxKeyEvent& evt) | ||||
if (dir) | if (dir) | ||||
{ | { | ||||
float speed = 16.f * ScenarioEditor::GetSpeedModifier(); | float speed = 16.f * ScenarioEditor::GetSpeedModifier(); | ||||
POST_MESSAGE(SmoothZoom, (eRenderView::GAME, speed*dir)); | POST_MESSAGE(SmoothZoom, (eRenderView::GAME, speed*dir)); | ||||
} | } | ||||
else | else | ||||
{ | { | ||||
// Slight hack: Only pass 'normal' keys; special keys will generate a KeyDown/KeyUp event instead | // Slight hack: Only pass 'alphanumeric' keys; special keys will generate a KeyDown/KeyUp event instead | ||||
if (evt.GetKeyCode() < 256) | if (evt.GetKeyCode() >= 33 && evt.GetKeyCode() <= 126) | ||||
POST_MESSAGE(GuiCharEvent, (GetSDLKeyFromWxKeyCode(evt.GetKeyCode()), evt.GetUnicodeKey())); | POST_MESSAGE(GuiCharEvent, (GetSDLKeyFromWxKeyCode(evt.GetKeyCode()), evt.GetUnicodeKey())); | ||||
evt.Skip(); | evt.Skip(); | ||||
} | } | ||||
} | } | ||||
void OnKillFocus(wxFocusEvent& evt) | void OnKillFocus(wxFocusEvent& evt) | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 108 Lines • ▼ Show 20 Lines | |||||
{ | { | ||||
g_FrameHasEnded = true; | g_FrameHasEnded = true; | ||||
} | } | ||||
enum | enum | ||||
{ | { | ||||
ID_Quit = 1, | ID_Quit = 1, | ||||
ID_New, | ID_New, | ||||
ID_Open, | ID_Open, | ||||
ID_Save, | ID_Save, | ||||
ID_SaveAs, | ID_SaveAs, | ||||
ID_ImportHeightmap, | ID_ImportHeightmap, | ||||
ID_Copy, | ID_Copy, | ||||
ID_Paste, | ID_Paste, | ||||
ID_Wireframe, | ID_Wireframe, | ||||
ID_MessageTrace, | ID_MessageTrace, | ||||
ID_Screenshot, | ID_Screenshot, | ||||
ID_BigScreenshot, | ID_BigScreenshot, | ||||
ID_JavaScript, | ID_JavaScript, | ||||
ID_CameraReset, | ID_CameraReset, | ||||
ID_RenderPathFixed, | ID_RenderPathFixed, | ||||
ID_RenderPathShader, | ID_RenderPathShader, | ||||
ID_DumpState, | ID_DumpState, | ||||
ID_DumpBinaryState, | ID_DumpBinaryState, | ||||
ID_Manual, | ID_Manual, | ||||
ID_ReportBug, | ID_ReportBug, | ||||
ID_Toolbar // must be last in the list | ID_Toolbar // must be last in the list | ||||
}; | }; | ||||
BEGIN_EVENT_TABLE(ScenarioEditor, wxFrame) | BEGIN_EVENT_TABLE(ScenarioEditor, wxFrame) | ||||
EVT_CLOSE(ScenarioEditor::OnClose) | EVT_CLOSE(ScenarioEditor::OnClose) | ||||
EVT_TIMER(wxID_ANY, ScenarioEditor::OnTimer) | EVT_TIMER(wxID_ANY, ScenarioEditor::OnTimer) | ||||
EVT_MENU(ID_New, ScenarioEditor::OnNew) | EVT_MENU(ID_New, ScenarioEditor::OnNew) | ||||
EVT_MENU(ID_Open, ScenarioEditor::OnOpen) | EVT_MENU(ID_Open, ScenarioEditor::OnOpen) | ||||
EVT_MENU(ID_Save, ScenarioEditor::OnSave) | EVT_MENU(ID_Save, ScenarioEditor::OnSave) | ||||
EVT_MENU(ID_SaveAs, ScenarioEditor::OnSaveAs) | EVT_MENU(ID_SaveAs, ScenarioEditor::OnSaveAs) | ||||
EVT_MENU(ID_ImportHeightmap, ScenarioEditor::OnImportHeightmap) | EVT_MENU(ID_ImportHeightmap, ScenarioEditor::OnImportHeightmap) | ||||
EVT_MENU_RANGE(wxID_FILE1, wxID_FILE9, ScenarioEditor::OnMRUFile) | EVT_MENU_RANGE(wxID_FILE1, wxID_FILE9, ScenarioEditor::OnMRUFile) | ||||
EVT_MENU(ID_Quit, ScenarioEditor::OnQuit) | EVT_MENU(ID_Quit, ScenarioEditor::OnQuit) | ||||
EVT_MENU(wxID_UNDO, ScenarioEditor::OnUndo) | EVT_MENU(wxID_UNDO, ScenarioEditor::OnUndo) | ||||
EVT_MENU(wxID_REDO, ScenarioEditor::OnRedo) | EVT_MENU(wxID_REDO, ScenarioEditor::OnRedo) | ||||
EVT_MENU(ID_Copy, ScenarioEditor::OnCopy) | EVT_MENU(ID_Copy, ScenarioEditor::OnCopy) | ||||
EVT_MENU(ID_Paste, ScenarioEditor::OnPaste) | EVT_MENU(ID_Paste, ScenarioEditor::OnPaste) | ||||
EVT_MENU(ID_Wireframe, ScenarioEditor::OnWireframe) | EVT_MENU(ID_Wireframe, ScenarioEditor::OnWireframe) | ||||
EVT_MENU(ID_MessageTrace, ScenarioEditor::OnMessageTrace) | EVT_MENU(ID_MessageTrace, ScenarioEditor::OnMessageTrace) | ||||
EVT_MENU(ID_Screenshot, ScenarioEditor::OnScreenshot) | EVT_MENU(ID_Screenshot, ScenarioEditor::OnScreenshot) | ||||
EVT_MENU(ID_BigScreenshot, ScenarioEditor::OnScreenshot) | EVT_MENU(ID_BigScreenshot, ScenarioEditor::OnScreenshot) | ||||
EVT_MENU(ID_JavaScript, ScenarioEditor::OnJavaScript) | EVT_MENU(ID_JavaScript, ScenarioEditor::OnJavaScript) | ||||
EVT_MENU(ID_CameraReset, ScenarioEditor::OnCameraReset) | EVT_MENU(ID_CameraReset, ScenarioEditor::OnCameraReset) | ||||
EVT_MENU(ID_DumpState, ScenarioEditor::OnDumpState) | EVT_MENU(ID_DumpState, ScenarioEditor::OnDumpState) | ||||
▲ Show 20 Lines • Show All 66 Lines • ▼ Show 20 Lines | #endif | ||||
// Menu | // Menu | ||||
wxMenuBar* menuBar = new wxMenuBar; | wxMenuBar* menuBar = new wxMenuBar; | ||||
SetMenuBar(menuBar); | SetMenuBar(menuBar); | ||||
wxMenu *menuFile = new wxMenu; | wxMenu *menuFile = new wxMenu; | ||||
menuBar->Append(menuFile, _("&File")); | menuBar->Append(menuFile, _("&File")); | ||||
{ | { | ||||
menuFile->Append(ID_New, _("&New...")); | menuFile->Append(ID_New, _("&New...")); | ||||
menuFile->Append(ID_Open, _("&Open...")); | menuFile->Append(ID_Open, _("&Open...")); | ||||
menuFile->Append(ID_Save, _("&Save")); | menuFile->Append(ID_Save, _("&Save")); | ||||
menuFile->Append(ID_SaveAs, _("Save &As...")); | menuFile->Append(ID_SaveAs, _("Save &As...")); | ||||
menuFile->AppendSeparator();//----------- | menuFile->AppendSeparator();//----------- | ||||
menuFile->Append(ID_ImportHeightmap, _("&Import Heightmap...")); | menuFile->Append(ID_ImportHeightmap, _("&Import Heightmap...")); | ||||
menuFile->AppendSeparator();//----------- | menuFile->AppendSeparator();//----------- | ||||
menuFile->Append(ID_Quit, _("E&xit")); | menuFile->Append(ID_Quit, _("E&xit")); | ||||
m_FileHistory.UseMenu(menuFile);//------- | m_FileHistory.UseMenu(menuFile);//------- | ||||
m_FileHistory.AddFilesToMenu(); | m_FileHistory.AddFilesToMenu(); | ||||
} | } | ||||
// m_menuItem_Save = menuFile->FindItem(ID_Save); // remember this item, to let it be greyed out | // m_menuItem_Save = menuFile->FindItem(ID_Save); // remember this item, to let it be greyed out | ||||
// wxASSERT(m_menuItem_Save); | // wxASSERT(m_menuItem_Save); | ||||
wxMenu *menuEdit = new wxMenu; | wxMenu *menuEdit = new wxMenu; | ||||
menuBar->Append(menuEdit, _("&Edit")); | menuBar->Append(menuEdit, _("&Edit")); | ||||
{ | { | ||||
menuEdit->Append(wxID_UNDO, _("&Undo")); | menuEdit->Append(wxID_UNDO, _("&Undo")); | ||||
menuEdit->Append(wxID_REDO, _("&Redo")); | menuEdit->Append(wxID_REDO, _("&Redo")); | ||||
menuEdit->AppendSeparator(); | menuEdit->AppendSeparator(); | ||||
menuEdit->Append(ID_Copy, _("&Copy")); | menuEdit->Append(ID_Copy, _("&Copy")); | ||||
menuEdit->Enable(ID_Copy, false); | menuEdit->Enable(ID_Copy, false); | ||||
menuEdit->Append(ID_Paste, _("&Paste")); | menuEdit->Append(ID_Paste, _("&Paste")); | ||||
menuEdit->Enable(ID_Paste, false); | menuEdit->Enable(ID_Paste, false); | ||||
} | } | ||||
g_SelectedObjects.RegisterObserver(0, &ScenarioEditor::OnSelectedObjectsChange, this); | g_SelectedObjects.RegisterObserver(0, &ScenarioEditor::OnSelectedObjectsChange, this); | ||||
GetCommandProc().SetEditMenu(menuEdit); | GetCommandProc().SetEditMenu(menuEdit); | ||||
GetCommandProc().Initialize(); | GetCommandProc().Initialize(); | ||||
wxMenu *menuMisc = new wxMenu; | wxMenu *menuMisc = new wxMenu; | ||||
menuBar->Append(menuMisc, _("&Misc hacks")); | menuBar->Append(menuMisc, _("&Misc hacks")); | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 153 Lines • ▼ Show 20 Lines | float ScenarioEditor::GetSpeedModifier() | ||||
else if (wxGetKeyState(WXK_SHIFT)) | else if (wxGetKeyState(WXK_SHIFT)) | ||||
return 4.f; | return 4.f; | ||||
else | else | ||||
return 1.f; | return 1.f; | ||||
} | } | ||||
void ScenarioEditor::OnClose(wxCloseEvent& event) | void ScenarioEditor::OnClose(wxCloseEvent& event) | ||||
{ | { | ||||
if (event.CanVeto() && GetCommandProc().IsDirty()) | if (event.CanVeto() && GetCommandProc().IsDirty()) | ||||
{ | { | ||||
if (wxMessageBox(_T("You have unsaved changes. Are you sure you want to quit?"), _T("Discard unsaved changes?"), wxICON_QUESTION | wxYES_NO) != wxYES) | if (wxMessageBox(_T("You have unsaved changes. Are you sure you want to quit?"), _T("Discard unsaved changes?"), wxICON_QUESTION | wxYES_NO) != wxYES) | ||||
Stan: I guess if could be merged | |||||
{ | { | ||||
event.Veto(); | event.Veto(); | ||||
return; | return; | ||||
} | } | ||||
} | } | ||||
m_ToolManager.SetCurrentTool(_T("")); | m_ToolManager.SetCurrentTool(_T("")); | ||||
m_FileHistory.SaveToSubDir(*wxConfigBase::Get()); | m_FileHistory.SaveToSubDir(*wxConfigBase::Get()); | ||||
POST_MESSAGE(Shutdown, ()); | POST_MESSAGE(Shutdown, ()); | ||||
Show All 39 Lines | |||||
void ScenarioEditor::OnRedo(wxCommandEvent&) | void ScenarioEditor::OnRedo(wxCommandEvent&) | ||||
{ | { | ||||
GetCommandProc().Redo(); | GetCommandProc().Redo(); | ||||
} | } | ||||
void ScenarioEditor::OnCopy(wxCommandEvent& WXUNUSED(event)) | void ScenarioEditor::OnCopy(wxCommandEvent& WXUNUSED(event)) | ||||
{ | { | ||||
if (GetToolManager().GetCurrentToolName() == _T("TransformObject")) | if (GetToolManager().GetCurrentToolName() == _T("TransformObject")) | ||||
GetToolManager().GetCurrentTool()->OnCommand(_T("copy"), NULL); | GetToolManager().GetCurrentTool()->OnCommand(_T("copy"), NULL); | ||||
} | } | ||||
void ScenarioEditor::OnPaste(wxCommandEvent& WXUNUSED(event)) | void ScenarioEditor::OnPaste(wxCommandEvent& WXUNUSED(event)) | ||||
{ | { | ||||
if (GetToolManager().GetCurrentToolName() != _T("TransformObject")) | if (GetToolManager().GetCurrentToolName() != _T("TransformObject")) | ||||
GetToolManager().SetCurrentTool(_T("TransformObject"), NULL); | GetToolManager().SetCurrentTool(_T("TransformObject"), NULL); | ||||
GetToolManager().GetCurrentTool()->OnCommand(_T("paste"), NULL); | GetToolManager().GetCurrentTool()->OnCommand(_T("paste"), NULL); | ||||
} | } | ||||
////////////////////////////////////////////////////////////////////////// | ////////////////////////////////////////////////////////////////////////// | ||||
void ScenarioEditor::OnNew(wxCommandEvent& WXUNUSED(event)) | void ScenarioEditor::OnNew(wxCommandEvent& WXUNUSED(event)) | ||||
{ | { | ||||
if (wxMessageBox(_("Discard current map and start blank new map?"), _("New map"), wxOK|wxCANCEL|wxICON_QUESTION, this) == wxOK) | if (wxMessageBox(_("Discard current map and start blank new map?"), _("New map"), wxOK|wxCANCEL|wxICON_QUESTION, this) == wxOK) | ||||
OpenFile(_T(""), _T("maps/scenarios/_default.xml")); | OpenFile(_T(""), _T("maps/scenarios/_default.xml")); | ||||
▲ Show 20 Lines • Show All 113 Lines • ▼ Show 20 Lines | else | ||||
std::wstring map(m_OpenFilename.wc_str()); | std::wstring map(m_OpenFilename.wc_str()); | ||||
POST_MESSAGE(SaveMap, (map)); | POST_MESSAGE(SaveMap, (map)); | ||||
// Wait for it to finish saving | // Wait for it to finish saving | ||||
qPing qry; | qPing qry; | ||||
qry.Post(); | qry.Post(); | ||||
GetCommandProc().MarkAsSaved(); | GetCommandProc().MarkAsSaved(); | ||||
} | } | ||||
} | } | ||||
void ScenarioEditor::OnSaveAs(wxCommandEvent& WXUNUSED(event)) | void ScenarioEditor::OnSaveAs(wxCommandEvent& WXUNUSED(event)) | ||||
{ | { | ||||
MapDialog dlg(NULL, MAPDIALOG_SAVE, m_Icon); | MapDialog dlg(NULL, MAPDIALOG_SAVE, m_Icon); | ||||
if (dlg.ShowModal() == wxID_OK) | if (dlg.ShowModal() == wxID_OK) | ||||
{ | { | ||||
wxString filePath(dlg.GetSelectedFilePath()); | wxString filePath(dlg.GetSelectedFilePath()); | ||||
wxBusyInfo busy(_("Saving ") + filePath); | wxBusyInfo busy(_("Saving ") + filePath); | ||||
wxBusyCursor busyc; | wxBusyCursor busyc; | ||||
m_ToolManager.SetCurrentTool(_T("")); | m_ToolManager.SetCurrentTool(_T("")); | ||||
std::wstring map(filePath.wc_str()); | std::wstring map(filePath.wc_str()); | ||||
POST_MESSAGE(SaveMap, (map)); | POST_MESSAGE(SaveMap, (map)); | ||||
SetOpenFilename(filePath); | SetOpenFilename(filePath); | ||||
// Wait for it to finish saving | // Wait for it to finish saving | ||||
qPing qry; | qPing qry; | ||||
qry.Post(); | qry.Post(); | ||||
GetCommandProc().MarkAsSaved(); | GetCommandProc().MarkAsSaved(); | ||||
} | } | ||||
} | } | ||||
void ScenarioEditor::SetOpenFilename(const wxString& filename) | void ScenarioEditor::SetOpenFilename(const wxString& filename) | ||||
{ | { | ||||
SetTitle(wxString::Format(_("Atlas - Scenario Editor - %s"), | SetTitle(wxString::Format(_("Atlas - Scenario Editor - %s"), | ||||
(filename.IsEmpty() ? wxString(_("(untitled)")) : filename).c_str())); | (filename.IsEmpty() ? wxString(_("(untitled)")) : filename).c_str())); | ||||
▲ Show 20 Lines • Show All 100 Lines • ▼ Show 20 Lines | void ScenarioEditor::OnDumpState(wxCommandEvent& event) | ||||
else | else | ||||
{ | { | ||||
wxLogError(_("Error writing to file '%ls'"), filename.c_str()); | wxLogError(_("Error writing to file '%ls'"), filename.c_str()); | ||||
} | } | ||||
} | } | ||||
void ScenarioEditor::OnSelectedObjectsChange(const std::vector<ObjectID>& selectedObjects) | void ScenarioEditor::OnSelectedObjectsChange(const std::vector<ObjectID>& selectedObjects) | ||||
{ | { | ||||
GetMenuBar()->Enable(ID_Copy, !selectedObjects.empty()); | GetMenuBar()->Enable(ID_Copy, !selectedObjects.empty()); | ||||
} | } | ||||
void ScenarioEditor::OnHelp(wxCommandEvent& event) | void ScenarioEditor::OnHelp(wxCommandEvent& event) | ||||
{ | { | ||||
std::map<int, HelpItem>::const_iterator it = m_HelpData.find(event.GetId()); | std::map<int, HelpItem>::const_iterator it = m_HelpData.find(event.GetId()); | ||||
if (it == m_HelpData.end()) | if (it == m_HelpData.end()) | ||||
return; | return; | ||||
wxMessageDialog* dialog = new wxMessageDialog( | wxMessageDialog* dialog = new wxMessageDialog( | ||||
nullptr, _("Do you want to open '" + it->second.m_URL + "'?"), | nullptr, _("Do you want to open '" + it->second.m_URL + "'?"), | ||||
_("Atlas"), wxYES_NO | wxNO_DEFAULT | wxICON_QUESTION | _("Atlas"), wxYES_NO | wxNO_DEFAULT | wxICON_QUESTION | ||||
); | ); | ||||
if (dialog->ShowModal() == wxID_YES) | if (dialog->ShowModal() == wxID_YES) | ||||
wxLaunchDefaultBrowser(it->second.m_URL); | wxLaunchDefaultBrowser(it->second.m_URL); | ||||
} | } | ||||
void ScenarioEditor::OnMenuOpen(wxMenuEvent& event) | void ScenarioEditor::OnMenuOpen(wxMenuEvent& event) | ||||
{ | { | ||||
// Ignore wxMSW system menu events, see https://trac.wildfiregames.com/ticket/5501 | // Ignore wxMSW system menu events, see https://trac.wildfiregames.com/ticket/5501 | ||||
const wxMenu* menu = event.GetMenu(); | const wxMenu* menu = event.GetMenu(); | ||||
if (!menu) | if (!menu) | ||||
return; | return; | ||||
// This could be done far more elegantly if wxMenuItem had changeable id. | // This could be done far more elegantly if wxMenuItem had changeable id. | ||||
wxMenu* pasteMenuItem = NULL; | wxMenu* pasteMenuItem = NULL; | ||||
menu->FindItem(ID_Paste, &pasteMenuItem); | menu->FindItem(ID_Paste, &pasteMenuItem); | ||||
GetMenuBar()->Enable(ID_Paste, false); | GetMenuBar()->Enable(ID_Paste, false); | ||||
if (!pasteMenuItem) | if (!pasteMenuItem) | ||||
return; | return; | ||||
wxString content; | wxString content; | ||||
if (wxTheClipboard->Open()) | if (wxTheClipboard->Open()) | ||||
{ | { | ||||
if (wxTheClipboard->IsSupported(wxDF_TEXT)) | if (wxTheClipboard->IsSupported(wxDF_TEXT)) | ||||
Not Done Inline Actionssame here Stan: same here | |||||
{ | { | ||||
wxTextDataObject data; | wxTextDataObject data; | ||||
wxTheClipboard->GetData(data); | wxTheClipboard->GetData(data); | ||||
content = data.GetText(); | content = data.GetText(); | ||||
} | } | ||||
wxTheClipboard->Close(); | wxTheClipboard->Close(); | ||||
} | } | ||||
if (content.empty()) | if (content.empty()) | ||||
return; | return; | ||||
wxInputStream* is = new wxStringInputStream(content); | wxInputStream* is = new wxStringInputStream(content); | ||||
wxXmlDocument doc; | wxXmlDocument doc; | ||||
{ | { | ||||
wxLogNull stopComplaining; | wxLogNull stopComplaining; | ||||
static_cast<void>(stopComplaining); | static_cast<void>(stopComplaining); | ||||
if (!doc.Load(*is)) | if (!doc.Load(*is)) | ||||
return; | return; | ||||
} | } | ||||
wxXmlNode* root = doc.GetRoot(); | wxXmlNode* root = doc.GetRoot(); | ||||
if (!root || root->GetName() != wxT("Entities")) | if (!root || root->GetName() != wxT("Entities")) | ||||
return; | return; | ||||
GetMenuBar()->Enable(ID_Paste, true); | GetMenuBar()->Enable(ID_Paste, true); | ||||
} | } | ||||
////////////////////////////////////////////////////////////////////////// | ////////////////////////////////////////////////////////////////////////// | ||||
Position::Position(const wxPoint& pt) | Position::Position(const wxPoint& pt) | ||||
: type(1) | : type(1) | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 96 Lines • Show Last 20 Lines |
Wildfire Games · Phabricator
I guess if could be merged