void GD_CORE_API ProjectStripper::StripProjectForExternalLayoutEdition( gd::Project& project, const gd::String& externalLayoutName) { while (project.GetExternalEventsCount() > 0) project.RemoveExternalEvents(project.GetExternalEvents(0).GetName()); gd::String associatedLayoutName; if (project.HasExternalLayoutNamed(externalLayoutName)) { associatedLayoutName = project.GetExternalLayout(externalLayoutName).GetAssociatedLayout(); } for (unsigned int i = 0; i < project.GetLayoutsCount(); ++i) { auto& layout = project.GetLayout(i); if (!associatedLayoutName.empty() && associatedLayoutName == layout.GetName()) continue; project.GetLayout(i).GetEvents().Clear(); project.GetLayout(i).GetInitialInstances().Clear(); } for (unsigned int i = 0; i < project.GetExternalEventsCount(); ++i) { project.GetExternalEvents(i).GetEvents().Clear(); } for (unsigned int i = 0; i < project.GetExternalLayoutsCount(); ++i) { auto& externalLayout = project.GetExternalLayout(i); if (externalLayoutName == externalLayout.GetName()) continue; externalLayout.GetInitialInstances().Clear(); } }
bool AndroidExporter::ExportEventsCode(gd::Project& project, gd::String outputDir) { for (std::size_t i = 0; i < project.GetLayoutsCount(); ++i) { gd::Layout& exportedLayout = project.GetLayout(i); gd::String eventsOutput = EventsCodeGenerator::GenerateSceneEventsCompleteCode( project, exportedLayout, exportedLayout.GetEvents(), true); gd::String filename = "scene" + gd::String::From(i) + ".cpp"; if (!fs.WriteToFile(outputDir + "/jni/" + filename, eventsOutput)) return false; } for (std::size_t i = 0; i < project.GetExternalEventsCount(); ++i) { gd::ExternalEvents& externalEvents = project.GetExternalEvents(i); DependenciesAnalyzer analyzer(project, externalEvents); if (!analyzer.ExternalEventsCanBeCompiledForAScene().empty()) { gd::String eventsOutput = EventsCodeGenerator::GenerateExternalEventsCompleteCode( project, externalEvents, true); gd::String filename = "externalEvents" + gd::String::From(i) + ".cpp"; if (!fs.WriteToFile(outputDir + "/jni/" + filename, eventsOutput)) return false; } } return true; }
void GD_CORE_API ProjectStripper::StripProjectForExport(gd::Project& project) { project.GetObjectGroups().Clear(); while (project.GetExternalEventsCount() > 0) project.RemoveExternalEvents(project.GetExternalEvents(0).GetName()); for (unsigned int i = 0; i < project.GetLayoutsCount(); ++i) { project.GetLayout(i).GetObjectGroups().Clear(); project.GetLayout(i).GetEvents().Clear(); } }
void GD_CORE_API ProjectStripper::StripProjectForLayoutEdition( gd::Project& project, const gd::String& layoutName) { while (project.GetExternalEventsCount() > 0) project.RemoveExternalEvents(project.GetExternalEvents(0).GetName()); for (unsigned int i = 0; i < project.GetLayoutsCount(); ++i) { auto& layout = project.GetLayout(i); if (layoutName == layout.GetName()) continue; project.GetLayout(i).GetEvents().Clear(); project.GetLayout(i).GetInitialInstances().Clear(); } for (unsigned int i = 0; i < project.GetExternalEventsCount(); ++i) { project.GetExternalEvents(i).GetEvents().Clear(); } for (unsigned int i = 0; i < project.GetExternalLayoutsCount(); ++i) { project.GetExternalLayout(i).GetInitialInstances().Clear(); } }
void EventsChangesNotifier::NotifyChangesInEventsOfExternalEvents( gd::Project& project, gd::ExternalEvents& externalEvents) { for (std::size_t j = 0; j < project.GetUsedPlatforms().size(); ++j) project.GetUsedPlatforms()[j]->GetChangesNotifier().OnEventsModified( project, externalEvents); // Notify scenes, which include the external events ( even indirectly ), that // their events has changed for (std::size_t i = 0; i < project.GetLayoutsCount(); ++i) { std::vector<gd::Layout*> notUsed; std::vector<gd::ExternalEvents*> linkedExternalEvents; GetScenesAndExternalEventsLinkedTo(project.GetLayout(i).GetEvents(), project, notUsed, linkedExternalEvents); for (std::size_t j = 0; j < linkedExternalEvents.size(); ++j) { if (linkedExternalEvents[j]->GetName() == externalEvents.GetName()) { for (std::size_t k = 0; k < project.GetUsedPlatforms().size(); ++k) project.GetUsedPlatforms()[k]->GetChangesNotifier().OnEventsModified( project, project.GetLayout(i), /*indirectChange=*/true, externalEvents.GetName()); } } } // Also notify external events for (std::size_t i = 0; i < project.GetExternalEventsCount(); ++i) { std::vector<gd::Layout*> notUsed; std::vector<gd::ExternalEvents*> linkedExternalEvents; GetScenesAndExternalEventsLinkedTo(project.GetExternalEvents(i).GetEvents(), project, notUsed, linkedExternalEvents); for (std::size_t j = 0; j < linkedExternalEvents.size(); ++j) { if (linkedExternalEvents[j]->GetName() == externalEvents.GetName()) { for (std::size_t k = 0; k < project.GetUsedPlatforms().size(); ++k) project.GetUsedPlatforms()[k]->GetChangesNotifier().OnEventsModified( project, project.GetExternalEvents(i), /*indirectChange=*/true, externalEvents.GetName()); } } } }
void EventsChangesNotifier::NotifyChangesInEventsOfScene(gd::Project& project, gd::Layout& layout) { for (std::size_t j = 0; j < project.GetUsedPlatforms().size(); ++j) project.GetUsedPlatforms()[j]->GetChangesNotifier().OnEventsModified( project, layout); // Notify others scenes, which include the changed scene ( even indirectly ), // that their events has changed for (std::size_t i = 0; i < project.GetLayoutsCount(); ++i) { if (&project.GetLayout(i) == &layout) continue; std::vector<gd::Layout*> linkedScenes; std::vector<gd::ExternalEvents*> notUsed; GetScenesAndExternalEventsLinkedTo( project.GetLayout(i).GetEvents(), project, linkedScenes, notUsed); for (std::size_t j = 0; j < linkedScenes.size(); ++j) { if (linkedScenes[j]->GetName() == layout.GetName()) { for (std::size_t k = 0; k < project.GetUsedPlatforms().size(); ++k) project.GetUsedPlatforms()[k]->GetChangesNotifier().OnEventsModified( project, project.GetLayout(i), /*indirectChange=*/true, layout.GetName()); } } } // Also notify external events for (std::size_t i = 0; i < project.GetExternalEventsCount(); ++i) { std::vector<gd::Layout*> linkedScenes; std::vector<gd::ExternalEvents*> notUsed; GetScenesAndExternalEventsLinkedTo(project.GetExternalEvents(i).GetEvents(), project, linkedScenes, notUsed); for (std::size_t j = 0; j < linkedScenes.size(); ++j) { if (linkedScenes[j]->GetName() == layout.GetName()) { for (std::size_t k = 0; k < project.GetUsedPlatforms().size(); ++k) project.GetUsedPlatforms()[k]->GetChangesNotifier().OnEventsModified( project, project.GetExternalEvents(i), /*indirectChange=*/true, layout.GetName()); } } } }
void ChangesNotifier::RequestFullRecompilation(gd::Project& game, gd::Layout* scene) const { #if !defined(GD_NO_WX_GUI) // Compilation is not supported when wxWidgets // support is disabled. if (scene) { // Notify the scene it has been changed... scene->SetRefreshNeeded(); //...as well as the dependencies DependenciesAnalyzer analyzer(game, *scene); if (!analyzer.Analyze()) { std::cout << "WARNING: Circular dependency for scene " << scene->GetName() << std::endl; return; } std::set<gd::String> externalEventsDependencies = analyzer.GetExternalEventsDependencies(); for (std::set<gd::String>::const_iterator i = externalEventsDependencies.begin(); i != externalEventsDependencies.end(); ++i) { if (game.HasExternalEventsNamed(*i)) game.GetExternalEvents(*i).SetLastChangeTimeStamp( wxDateTime::Now().GetTicks()); } // And ask for a recompilation of everything. CodeCompilationHelpers::CreateSceneEventsCompilationTask(game, *scene); } else // Scene pointer is NULL: Mark all scenes as modified { for (std::size_t i = 0; i < game.GetLayoutsCount(); ++i) { game.GetLayout(i).SetRefreshNeeded(); game.GetLayout(i).SetCompilationNeeded(); } for (std::size_t i = 0; i < game.GetExternalEventsCount(); ++i) { game.GetExternalEvents(i).SetLastChangeTimeStamp( wxDateTime::Now() .GetTicks()); // Do no forget external events as they can have // been compiled separately from scenes. } } #endif }
void ChangesNotifier::OnObjectVariablesChanged(gd::Project & game, gd::Layout * scene, gd::Object & object) const { #if !defined(GD_NO_WX_GUI) //Compilation is not supported when wxWidgets support is disabled. if ( scene ) scene->SetRefreshNeeded(); else //Scene pointer is NULL: Update shared data of all scenes { for (std::size_t i = 0;i<game.GetLayoutsCount();++i) { game.GetLayout(i).SetRefreshNeeded(); game.GetLayout(i).SetCompilationNeeded(); } for (std::size_t i = 0;i<game.GetExternalEventsCount();++i) { game.GetExternalEvents(i).SetLastChangeTimeStamp(wxDateTime::Now().GetTicks()); //Do no forget external events as they can have been compiled separately from scenes. } } #endif }
LinkEventEditor::LinkEventEditor(wxWindow* parent, LinkEvent& event, const gd::Project& project) : LinkEventEditorBase(parent), editedEvent(event), project(project) { // Add all the scenes and external events into the combobox. for (std::size_t i = 0; i < project.GetExternalEventsCount(); ++i) m_eventsComboBox->Append(project.GetExternalEvents(i).GetName()); for (std::size_t i = 0; i < project.GetLayoutsCount(); ++i) m_eventsComboBox->Append(project.GetLayout(i).GetName()); m_includeAllEventsRadio->SetValue(editedEvent.GetIncludeConfig() == LinkEvent::INCLUDE_ALL); m_includeEventsGroupRadio->SetValue(editedEvent.GetIncludeConfig() == LinkEvent::INCLUDE_EVENTS_GROUP); m_includeEventsByIndexRadio->SetValue(editedEvent.GetIncludeConfig() == LinkEvent::INCLUDE_BY_INDEX); m_eventsComboBox->SetValue(editedEvent.GetTarget()); if (editedEvent.GetIncludeConfig() == LinkEvent::INCLUDE_EVENTS_GROUP) { m_eventsGroupComboBox->SetValue(editedEvent.GetEventsGroupName()); } else if (editedEvent.GetIncludeConfig() == LinkEvent::INCLUDE_BY_INDEX) { m_startTextCtrl->SetValue( gd::String::From<std::size_t>(editedEvent.GetIncludeStart() + 1)); m_endTextCtrl->SetValue( gd::String::From<std::size_t>(editedEvent.GetIncludeEnd() + 1)); } // Display the deprecated features if the event was using them m_includeEventsByIndexRadio->Show(editedEvent.GetIncludeConfig() == LinkEvent::INCLUDE_BY_INDEX); m_deprecatedPanel->Show(editedEvent.GetIncludeConfig() == LinkEvent::INCLUDE_BY_INDEX); GetSizer()->Fit(this); EnableControls(); UpdateEventsGroupsList(); }