/* Moonfall Copyright (C) 2008 Alex Yatskov This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "Pch.h" #include "FrameMapEditor.h" #include "Surface.h" #include "Actor.h" #include "ActorPropertyScript.h" BEGIN_EVENT_TABLE(FrameMapEditor, wxFrame) EVT_CLOSE( FrameMapEditor::OnClose) EVT_SHOW( FrameMapEditor::OnShow) EVT_MENU(ID_MENU_FILE_NEW, FrameMapEditor::OnMenuSelectedFileNew) EVT_MENU(ID_MENU_FILE_OPEN, FrameMapEditor::OnMenuSelectedFileOpen) EVT_MENU(ID_MENU_FILE_SAVE, FrameMapEditor::OnMenuSelectedFileSave) EVT_MENU(ID_MENU_FILE_SAVE_AS, FrameMapEditor::OnMenuSelectedFileSaveAs) EVT_MENU(ID_MENU_FILE_EXIT, FrameMapEditor::OnMenuSelectedFileExit) EVT_MENU(ID_MENU_VIEW_GRID_DOUBLE, FrameMapEditor::OnMenuSelectedViewGridDouble) EVT_MENU(ID_MENU_VIEW_GRID_HALVE, FrameMapEditor::OnMenuSelectedViewGridHalve) EVT_MENU(ID_MENU_VIEW_GRID_CUSTOM, FrameMapEditor::OnMenuSelectedViewGridCustom) EVT_TEXT_ENTER(ID_WORLD_SCRIPT, FrameMapEditor::OnModifiedUiWorld) EVT_BUTTON(ID_WORLD_SCRIPT_BROWSE, FrameMapEditor::OnButtonClickedWorldScriptBrowse) EVT_TEXT_ENTER(ID_WORLD_BACKDROP, FrameMapEditor::OnModifiedUiWorld) EVT_BUTTON(ID_WORLD_BACKDROP_BROWSE, FrameMapEditor::OnButtonClickedWorldBackdropBrowse) EVT_TEXT_ENTER(ID_SELECTION_NAME, FrameMapEditor::OnModifiedUiSelection) EVT_TEXT_ENTER(ID_SELECTION_POSITION_X, FrameMapEditor::OnModifiedUiSelection) EVT_TEXT_ENTER(ID_SELECTION_POSITION_Y, FrameMapEditor::OnModifiedUiSelection) EVT_BUTTON(ID_SELECTION_PREVIEW, FrameMapEditor::OnButtonClickedSelectionPreview) EVT_TEXT_ENTER(ID_SELECTION_PARAMS, FrameMapEditor::OnTextChangeScriptParams) EVT_TEXT_ENTER(ID_PALETTE_FILTER, FrameMapEditor::OnModifiedUiPalette) END_EVENT_TABLE() FrameMapEditor::FrameMapEditor(wxWindow* parent) : wxFrame(parent, wxID_ANY, wxT("Map Editor"), wxDefaultPosition, wxSize(500, 800), wxDEFAULT_FRAME_STYLE), m_worldGridSize(32), m_textWorldScript(NULL), m_textWorldBackdrop(NULL), m_listPalette(NULL), m_textPaletteFilter(NULL), m_notebookSelection(NULL), m_panelSelectionGeneral(NULL), m_scrollWinSelectionScript(NULL), m_textSelectionName(NULL), m_textSelectionPositionX(NULL), m_textSelectionPositionY(NULL), m_buttonSelectionPreview(NULL) { wxBoxSizer* sizerMain = new wxBoxSizer(wxVERTICAL); sizerMain->Add(InitializeUiWorld(), 0, wxALL | wxEXPAND, 5); sizerMain->Add(InitializeUiPalette(), 1, wxALL | wxEXPAND, 5); sizerMain->Add(InitializeUiSelection(), 0, wxALL | wxEXPAND, 5); SetSizer(sizerMain); InitializeUiMenuBar(); } void FrameMapEditor::InitializeUiMenuBar() { wxMenu* menuFile = new wxMenu(); menuFile->Append(ID_MENU_FILE_NEW, wxT("&New\tCtrl+N")); menuFile->Append(ID_MENU_FILE_OPEN, wxT("&Open\tCtrl+O")); menuFile->Append(ID_MENU_FILE_SAVE, wxT("&Save\tCtrl+S")); menuFile->Append(ID_MENU_FILE_SAVE_AS, wxT("Save &As...\tCtrl+Shift+S")); menuFile->AppendSeparator(); menuFile->Append(ID_MENU_FILE_EXIT, wxT("E&xit\tCtrl+Q")); wxMenu* menuViewGrid = new wxMenu(); menuViewGrid->Append(ID_MENU_VIEW_GRID_HALVE, wxT("&Halve\tCtrl+H")); menuViewGrid->Append(ID_MENU_VIEW_GRID_DOUBLE, wxT("&Double\tCtrl+D")); menuViewGrid->AppendSeparator(); menuViewGrid->Append(ID_MENU_VIEW_GRID_CUSTOM, wxT("&Custom...\tCtrl+G")); wxMenu* menuView = new wxMenu(); menuView->Append(-1, wxT("&Grid"), menuViewGrid); wxMenuBar* menuBar = new wxMenuBar(); menuBar->Append(menuFile, wxT("&File")); menuBar->Append(menuView, wxT("&View")); SetMenuBar(menuBar); } wxSizer* FrameMapEditor::InitializeUiWorld() { wxBoxSizer* sizerWorldScript = new wxBoxSizer(wxHORIZONTAL); sizerWorldScript->Add(new wxStaticText(this, wxID_ANY, wxT("Script")), 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); sizerWorldScript->Add(m_textWorldScript = new wxTextCtrl(this, ID_WORLD_SCRIPT, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER), 1, wxALIGN_CENTER_VERTICAL | wxALL, 5); sizerWorldScript->Add(new wxButton(this, ID_WORLD_SCRIPT_BROWSE, wxT("&Browse...")), 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); wxBoxSizer* sizerWorldBackdrop = new wxBoxSizer(wxHORIZONTAL); sizerWorldBackdrop->Add(new wxStaticText(this, wxID_ANY, wxT("Backdrop")), 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); sizerWorldBackdrop->Add(m_textWorldBackdrop = new wxTextCtrl(this, ID_WORLD_BACKDROP, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER), 1, wxALIGN_CENTER_VERTICAL | wxALL, 5); sizerWorldBackdrop->Add(new wxButton(this, ID_WORLD_BACKDROP_BROWSE, wxT("&Browse...")), 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); wxStaticBoxSizer* sizerWorld = new wxStaticBoxSizer(new wxStaticBox(this, wxID_ANY, wxT("World")), wxVERTICAL); sizerWorld->Add(sizerWorldScript, 0, wxEXPAND, 5); sizerWorld->Add(sizerWorldBackdrop, 0, wxEXPAND, 5); return sizerWorld; } wxSizer* FrameMapEditor::InitializeUiPalette() { wxBoxSizer* sizerPaletteSettings = new wxBoxSizer(wxHORIZONTAL); sizerPaletteSettings->Add(new wxStaticText(this, wxID_ANY, wxT("Alias filter")), 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); sizerPaletteSettings->Add(m_textPaletteFilter = new wxTextCtrl(this, ID_PALETTE_FILTER, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER), 1, wxALIGN_CENTER_VERTICAL | wxALL, 5); wxStaticBoxSizer* sizerPalette = new wxStaticBoxSizer(new wxStaticBox(this, wxID_ANY, wxT("Palette")), wxVERTICAL); m_listPalette = new wxListCtrl(this, ID_PALETTE_LIST, wxDefaultPosition, wxDefaultSize, wxLC_ICON | wxLC_SINGLE_SEL); m_listPalette->SetForegroundColour(wxColour(0xff, 0xff, 0xff)); m_listPalette->SetBackgroundColour(wxColour(0x00, 0x00, 0x00)); sizerPalette->Add(m_listPalette, 1, wxALL | wxEXPAND, 5); sizerPalette->Add(sizerPaletteSettings, 0, wxEXPAND, 5); return sizerPalette; } wxSizer* FrameMapEditor::InitializeUiSelection() { m_notebookSelection = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_BOTTOM); m_panelSelectionGeneral = new wxPanel(m_notebookSelection, wxID_ANY); wxBoxSizer* sizerSelectionSettingsName = new wxBoxSizer(wxHORIZONTAL); sizerSelectionSettingsName->Add(new wxStaticText(m_panelSelectionGeneral, wxID_ANY, wxT("Name")), 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); sizerSelectionSettingsName->Add(m_textSelectionName = new wxTextCtrl(m_panelSelectionGeneral, ID_SELECTION_NAME, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER), 1, wxALIGN_CENTER_VERTICAL | wxALL, 5); wxStaticBoxSizer* sizerSelectionSettingsPosition = new wxStaticBoxSizer(new wxStaticBox( m_panelSelectionGeneral, wxID_ANY, wxT("Position")), wxHORIZONTAL); sizerSelectionSettingsPosition->Add(new wxStaticText(m_panelSelectionGeneral, wxID_ANY, wxT("x")), 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); sizerSelectionSettingsPosition->Add(m_textSelectionPositionX = new wxTextCtrl(m_panelSelectionGeneral, ID_SELECTION_POSITION_X, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER), 1, wxALIGN_CENTER_VERTICAL | wxALL, 5); sizerSelectionSettingsPosition->Add(new wxStaticText(m_panelSelectionGeneral, wxID_ANY, wxT("y")), 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); sizerSelectionSettingsPosition->Add(m_textSelectionPositionY = new wxTextCtrl(m_panelSelectionGeneral, ID_SELECTION_POSITION_Y, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER), 1, wxALIGN_CENTER_VERTICAL | wxALL, 5); wxBoxSizer* sizerSelectionSettings = new wxBoxSizer(wxVERTICAL); sizerSelectionSettings->Add(sizerSelectionSettingsName, 0, wxEXPAND, 5); sizerSelectionSettings->Add(sizerSelectionSettingsPosition, 0, wxALL | wxEXPAND, 5); wxBoxSizer* sizerSelectionSettingsPreview = new wxBoxSizer(wxHORIZONTAL); sizerSelectionSettingsPreview->Add(sizerSelectionSettings, 1, wxEXPAND, 5); sizerSelectionSettingsPreview->Add(m_buttonSelectionPreview = new wxBitmapButton(m_panelSelectionGeneral, ID_SELECTION_PREVIEW, wxNullBitmap, wxDefaultPosition, wxSize(96, 96)), 0, wxALL, 5); m_scrollWinSelectionScript = new wxScrolledWindow(m_notebookSelection); m_scrollWinSelectionScript->SetScrollRate(5, 5); m_panelSelectionGeneral->SetSizer(sizerSelectionSettingsPreview); m_notebookSelection->AddPage(m_panelSelectionGeneral, wxT("General"), true); m_notebookSelection->AddPage(m_scrollWinSelectionScript, wxT("Script"), false); wxStaticBoxSizer* sizerSelection = new wxStaticBoxSizer(new wxStaticBox(this, wxID_ANY, wxT("Selection")), wxVERTICAL); sizerSelection->Add(m_notebookSelection, 1, wxEXPAND | wxALL, 5); return sizerSelection; } void FrameMapEditor::UpdateUiWorld() { m_textWorldBackdrop->SetValue(wxString::FromAscii(System::QueryWorldContext()->GetBackdropSpriteAlias())); m_textWorldScript->SetValue(wxString::FromAscii(System::QueryWorldContext()->GetScriptAlias())); } void FrameMapEditor::UpdateUiPalette() { wxImage bitmapMissing = wxArtProvider::GetBitmap(wxART_MISSING_IMAGE).ConvertToImage(); Vector2i targetSize(bitmapMissing.GetWidth(), bitmapMissing.GetHeight()); for (std::vector::iterator iter = m_actorSummary.begin(); iter != m_actorSummary.end(); ++iter) { if (iter->thumbnail) { targetSize.x = MAX(targetSize.x, iter->thumbnail->GetSize().x); targetSize.y = MAX(targetSize.y, iter->thumbnail->GetSize().y); } } std::vector actorSummaryFiltered; wxImageList* actorThumbnails = new wxImageList(targetSize.x, targetSize.y, true, m_actorSummary.size()); const wxString actorAliasFilter = m_textPaletteFilter->GetValue(); for (std::vector::iterator iter = m_actorSummary.begin(); iter != m_actorSummary.end(); ++iter) { const wxString actorAlias(wxString::FromAscii(iter->alias.c_str())); if (actorAliasFilter.IsEmpty() || actorAlias.Lower().Contains(actorAliasFilter.Lower())) { wxBitmap actorThumbnail = wxNullBitmap; if (iter->thumbnail) { iter->thumbnail->Lock(); byte* const data = static_cast(iter->thumbnail->GetData()); wxImage image(iter->thumbnail->GetSize().x, iter->thumbnail->GetSize().y, data, true); image.Resize(wxSize(targetSize.x, targetSize.y), wxPoint()); actorThumbnail = wxBitmap(image); iter->thumbnail->Unlock(); } actorThumbnails->Add(actorThumbnail.IsOk() ? actorThumbnail : bitmapMissing); actorSummaryFiltered.push_back(*iter); } } m_listPalette->ClearAll(); m_listPalette->AssignImageList(actorThumbnails, wxIMAGE_LIST_NORMAL); for (size_t i = 0; i < actorSummaryFiltered.size(); ++i) { m_listPalette->InsertItem(actorSummaryFiltered.size(), wxString::FromAscii(actorSummaryFiltered[i].alias.c_str()), i); } } void FrameMapEditor::UpdateUiSelection() { boost::shared_ptr actorSelection = m_actorSelection.lock(); m_notebookSelection->Enable(actorSelection); m_scrollWinSelectionScript->DestroyChildren(); if (!actorSelection) { return; } m_textSelectionName->SetValue(wxString::FromAscii(actorSelection->GetName())); m_textSelectionPositionX->SetValue(wxString::Format(wxT("%d"), actorSelection->GetPosition().x)); m_textSelectionPositionY->SetValue(wxString::Format(wxT("%d"), actorSelection->GetPosition().y)); boost::shared_ptr propertyScript = actorSelection->GetProperty().lock(); if (propertyScript) { std::vector scriptParameters; propertyScript->EnumerateParameters(&scriptParameters); wxBoxSizer* sizerScript = new wxBoxSizer(wxVERTICAL); for (size_t i = 0; i < scriptParameters.size(); ++i) { wxBoxSizer* sizerParameter = new wxBoxSizer(wxHORIZONTAL); const char* name = scriptParameters[i].c_str(); wxStaticText* textLabel = new wxStaticText(m_scrollWinSelectionScript, wxID_ANY, wxString::FromAscii(name), wxDefaultPosition, wxSize(75,-1)); sizerParameter->Add(textLabel, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5); ScriptParameter parameter; if (propertyScript->GetParameter(name, ¶meter)) { wxTextCtrl* textCtrlValue = new wxTextCtrl( m_scrollWinSelectionScript, ID_SELECTION_PARAMS, wxString::FromAscii(parameter.value.c_str()), wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER, wxDefaultValidator, wxString::FromAscii(name) ); sizerParameter->Add(textCtrlValue, 1, wxALIGN_CENTER_VERTICAL, 5); } sizerScript->Add(sizerParameter, 0, wxEXPAND, 5); } m_scrollWinSelectionScript->SetSizer(sizerScript); m_scrollWinSelectionScript->Layout(); } wxBitmap actorThumbnail = wxNullBitmap; for (std::vector::iterator iter = m_actorSummary.begin(); iter != m_actorSummary.end(); ++iter) { if (iter->thumbnail && strcmp(actorSelection->GetAlias(), iter->alias.c_str()) == 0) { iter->thumbnail->Lock(); actorThumbnail = wxBitmap(wxImage(iter->thumbnail->GetSize().x, iter->thumbnail->GetSize().y, static_cast(iter->thumbnail->GetData()), true)); iter->thumbnail->Unlock(); } } m_buttonSelectionPreview->SetBitmapLabel(actorThumbnail); } void FrameMapEditor::OnModifiedUiWorld(wxCommandEvent& event) { System::QueryWorldContext()->SetBackdropSpriteAlias(m_textWorldBackdrop->GetValue().ToAscii()); System::QueryWorldContext()->SetScriptAlias(m_textWorldScript->GetValue().ToAscii()); } void FrameMapEditor::OnModifiedUiPalette(wxCommandEvent& event) { UpdateUiPalette(); } void FrameMapEditor::OnModifiedUiSelection(wxCommandEvent& event) { boost::shared_ptr actorSelection = m_actorSelection.lock(); if (!actorSelection) { return; } long actorPositionX = actorSelection->GetPosition().x; m_textSelectionPositionX->GetValue().ToLong(&actorPositionX); long actorPositionY = actorSelection->GetPosition().y; m_textSelectionPositionY->GetValue().ToLong(&actorPositionY); actorSelection->SetName(m_textSelectionName->GetValue().ToAscii()); actorSelection->SetPosition(Vector2i(actorPositionX, actorPositionY)); UpdateUiSelection(); } void FrameMapEditor::OnWorldMouseMove(const InputMouse& args) { boost::shared_ptr actorSelection = m_actorSelection.lock(); if (actorSelection && args.buttonState == SDL_BUTTON_LMASK) { actorSelection->SetPosition(SnapPointToGrid(args.position)); UpdateUiSelection(); } if (args.buttonState == SDL_BUTTON_RMASK) { const Vector2i cameraPosition = System::QueryWorldContext()->GetCameraTarget(); System::QueryWorldContext()->SetCameraTarget(Vector2i(cameraPosition.x - args.delta.x, cameraPosition.y - args.delta.y)); } } void FrameMapEditor::OnWorldMouseButtonDown(const InputMouse& args) { boost::shared_ptr actorSelection = System::QueryWorldContext()->PickActor(args.position).lock(); if (args.button == SDL_BUTTON_LEFT) { const int index = m_listPalette->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); if (args.modifier == KMOD_SHIFT && index != -1) { const std::string actorAlias(m_listPalette->GetItemText(index).ToAscii()); ActorSummary summary; if (!actorSelection || (System::SummarizeActor(actorAlias.c_str(), &summary) && actorSelection->GetLayer() < summary.layer)) { actorSelection = System::QueryWorldContext()->AddActor(actorAlias.c_str(), SnapPointToGrid(args.position)).lock(); } } if (args.modifier == KMOD_CTRL && actorSelection) { System::QueryWorldContext()->RemoveActor(actorSelection->GetId()); actorSelection.reset(); } m_actorSelection = actorSelection; UpdateUiSelection(); } else if (args.button == SDL_BUTTON_RIGHT && actorSelection) { SelectPaletteAlias(actorSelection->GetAlias()); } } void FrameMapEditor::OnClose(wxCloseEvent&) { Hide(); } void FrameMapEditor::OnShow(wxShowEvent& event) { if (event.GetShow()) { if (m_actorSummary.size() == 0) { System::SummarizeActors(&m_actorSummary); } if (m_worldSummary.size() == 0) { System::SummarizeWorlds(&m_worldSummary); } System::QueryWorldContext()->AddListener(this); UpdateUiWorld(); UpdateUiPalette(); UpdateUiSelection(); } else if (System::QueryWorldContext() != NULL) { System::QueryWorldContext()->RemoveListener(this); } } void FrameMapEditor::SelectPaletteAlias(const char* alias) { const int index = m_listPalette->FindItem(-1, wxString::FromAscii(alias)); if (index != -1) { const int listFlags = wxLIST_STATE_SELECTED; m_listPalette->SetItemState(index, listFlags, listFlags); m_listPalette->EnsureVisible(index); } else if (m_listPalette->GetItemCount() != static_cast(m_actorSummary.size())) { m_textPaletteFilter->Clear(); UpdateUiPalette(); SelectPaletteAlias(alias); } } Vector2i FrameMapEditor::SnapPointToGrid(const Vector2i& position) const { Vector2i gridPosition(position.x / m_worldGridSize, position.y / m_worldGridSize); if (position.x < 0) { --gridPosition.x; } if (position.y < 0) { --gridPosition.y; } return Vector2i(gridPosition.x * m_worldGridSize, gridPosition.y * m_worldGridSize); } void FrameMapEditor::BuildWorldAliasList(wxArrayString* aliasList) const { for (std::vector::const_iterator iter = m_worldSummary.begin(); iter != m_worldSummary.end(); ++iter) { aliasList->Add(wxString::FromAscii(iter->alias.c_str())); } } void FrameMapEditor::OnMenuSelectedFileNew(wxCommandEvent& event) { System::QueryWorldContext()->ClearActors(); } void FrameMapEditor::OnMenuSelectedFileOpen(wxCommandEvent& event) { wxArrayString worldNames; BuildWorldAliasList(&worldNames); wxSingleChoiceDialog dialog(this, wxT("Select a world to load"), wxT("Load world"), worldNames); if (dialog.ShowModal() == wxID_OK) { System::QueryWorldContext()->LoadWorld(dialog.GetStringSelection().ToAscii()); UpdateUiWorld(); UpdateUiSelection(); } } void FrameMapEditor::OnMenuSelectedFileSave(wxCommandEvent& event) { const char* worldAlias = System::QueryWorldContext()->GetWorldAlias(); if (worldAlias == NULL) { OnMenuSelectedFileSaveAs(event); } else { System::QueryWorldContext()->SaveWorld(worldAlias); } } void FrameMapEditor::OnMenuSelectedFileSaveAs(wxCommandEvent& event) { wxArrayString worldNames; BuildWorldAliasList(&worldNames); wxSingleChoiceDialog dialog(this, wxT("Select a world to save"), wxT("Save world"), worldNames); if (dialog.ShowModal() == wxID_OK) { System::QueryWorldContext()->SaveWorld(dialog.GetStringSelection().ToAscii()); } } void FrameMapEditor::OnMenuSelectedFileExit(wxCommandEvent& event) { Hide(); } void FrameMapEditor::OnMenuSelectedViewGridHalve(wxCommandEvent& event) { if (m_worldGridSize >= 2) { m_worldGridSize >>= 1; } } void FrameMapEditor::OnMenuSelectedViewGridDouble(wxCommandEvent& event) { if (m_worldGridSize <= 1024) { m_worldGridSize <<= 1; } } void FrameMapEditor::OnMenuSelectedViewGridCustom(wxCommandEvent& event) { wxTextEntryDialog dialog(this, wxT("Specify a world grid size"), wxT("World grid size"), wxString::Format(wxT("%d"), m_worldGridSize)); if (dialog.ShowModal() != wxID_OK) { return; } long worldGridSize = m_worldGridSize; if (dialog.GetValue().ToLong(&worldGridSize) && worldGridSize >= 1 && worldGridSize <= 1024) { m_worldGridSize = worldGridSize; } } void FrameMapEditor::OnButtonClickedSelectionPreview(wxCommandEvent& event) { const boost::shared_ptr actorSelection = m_actorSelection.lock(); if (actorSelection) { SelectPaletteAlias(actorSelection->GetAlias()); } } void FrameMapEditor::OnTextChangeScriptParams(wxCommandEvent& event) { boost::shared_ptr actorSelection = m_actorSelection.lock(); if (!actorSelection) { return; } boost::shared_ptr propertyScript = actorSelection->GetProperty().lock(); if (!propertyScript) { return; } wxTextCtrl* selectedTextCtrl = static_cast(m_scrollWinSelectionScript->FindFocus()); const std::string name(selectedTextCtrl->GetName().ToAscii()); const std::string value(selectedTextCtrl->GetValue().ToAscii()); ScriptParameter parameter; if (!propertyScript->GetParameter(name.c_str(), ¶meter)) { return; } propertyScript->SetParameter(name.c_str(), ScriptParameter(value.c_str(), parameter.type)); propertyScript->ResetScriptState(); } void FrameMapEditor::OnButtonClickedWorldScriptBrowse(wxCommandEvent& event) { std::vector summary; System::SummarizeScripts(&summary); wxArrayString scriptNames; for (std::vector::iterator iter = summary.begin(); iter != summary.end(); ++iter) { scriptNames.Add(wxString::FromAscii(iter->alias.c_str())); } wxSingleChoiceDialog dialog(this, wxT("Select a script"), wxT("Load script"), scriptNames); if (dialog.ShowModal() == wxID_OK) { System::QueryWorldContext()->SetScriptAlias(dialog.GetStringSelection().ToAscii()); UpdateUiWorld(); } } void FrameMapEditor::OnButtonClickedWorldBackdropBrowse(wxCommandEvent& event) { std::vector summary; System::SummarizeSprites(&summary); wxArrayString spriteNames; for (std::vector::iterator iter = summary.begin(); iter != summary.end(); ++iter) { spriteNames.Add(wxString::FromAscii(iter->alias.c_str())); } wxSingleChoiceDialog dialog(this, wxT("Select a sprite"), wxT("Load sprite"), spriteNames); if (dialog.ShowModal() == wxID_OK) { System::QueryWorldContext()->SetBackdropSpriteAlias(dialog.GetStringSelection().ToAscii()); UpdateUiWorld(); } }