Search in sources :

Example 1 with DependencyInfo

use of org.terasology.gestalt.module.dependencyresolution.DependencyInfo in project Terasology by MovingBlocks.

the class ModuleDetailsScreen method setUpDependencies.

private void setUpDependencies() {
    dependencies.setList(Collections.emptyList());
    dependencies.setItemRenderer(new AbstractItemRenderer<DependencyInfo>() {

        private String getString(DependencyInfo value) {
            if (value != null) {
                return value.getId().toString();
            }
            return "";
        }

        @Override
        public void draw(DependencyInfo value, Canvas canvas) {
            Module module = moduleManager.getRegistry().getLatestModuleVersion(value.getId());
            if (module == null || !(value.versionPredicate().test(module.getVersion()))) {
                canvas.setMode("invalid");
            } else {
                canvas.setMode("available");
            }
            canvas.drawText(getString(value), canvas.getRegion());
        }

        @Override
        public Vector2i getPreferredSize(DependencyInfo value, Canvas canvas) {
            String text = getString(value);
            canvas.getCurrentStyle().setTextColor(Color.RED);
            return new Vector2i(canvas.getCurrentStyle().getFont().getWidth(text), canvas.getCurrentStyle().getFont().getLineHeight());
        }
    });
    dependencies.subscribe(((widget, item) -> {
        if (item != null) {
            modules.getList().stream().filter(m -> item.getId().equals(m.getId())).findFirst().ifPresent(m -> modules.setSelection(m));
        }
    }));
}
Also used : ModuleInstaller(org.terasology.engine.core.module.ModuleInstaller) Arrays(java.util.Arrays) In(org.terasology.engine.registry.In) Color(org.terasology.nui.Color) LoggerFactory(org.slf4j.LoggerFactory) ModuleMetadata(org.terasology.gestalt.module.ModuleMetadata) AbstractItemRenderer(org.terasology.nui.itemRendering.AbstractItemRenderer) DependencyInfo(org.terasology.gestalt.module.dependencyresolution.DependencyInfo) Canvas(org.terasology.nui.Canvas) ReadOnlyBinding(org.terasology.nui.databinding.ReadOnlyBinding) DateFormat(java.text.DateFormat) TranslationSystem(org.terasology.engine.i18n.TranslationSystem) StringTextRenderer(org.terasology.nui.itemRendering.StringTextRenderer) Binding(org.terasology.nui.databinding.Binding) StringUtils(org.codehaus.plexus.util.StringUtils) Module(org.terasology.gestalt.module.Module) Collection(java.util.Collection) WaitPopup(org.terasology.engine.rendering.nui.layers.mainMenu.WaitPopup) Set(java.util.Set) Version(org.terasology.gestalt.naming.Version) Collectors(java.util.stream.Collectors) DependencyResolver(org.terasology.gestalt.module.dependencyresolution.DependencyResolver) Objects(java.util.Objects) UIText(org.terasology.nui.widgets.UIText) List(java.util.List) Context(org.terasology.engine.context.Context) Stream(java.util.stream.Stream) Vector2i(org.joml.Vector2i) ExtraDataModuleExtension(org.terasology.engine.core.module.ExtraDataModuleExtension) UIList(org.terasology.nui.widgets.UIList) Name(org.terasology.gestalt.naming.Name) MenuAnimationSystems(org.terasology.engine.rendering.nui.animation.MenuAnimationSystems) ModuleManager(org.terasology.engine.core.module.ModuleManager) UIButtonWebBrowser(org.terasology.engine.rendering.nui.widgets.UIButtonWebBrowser) SimpleDateFormat(java.text.SimpleDateFormat) DownloadPopupProgressListener(org.terasology.engine.rendering.nui.layers.mainMenu.advancedGameSetupScreen.DownloadPopupProgressListener) DependencyResolutionFailedException(org.terasology.engine.core.module.DependencyResolutionFailedException) HashSet(java.util.HashSet) StandardModuleExtension(org.terasology.engine.core.module.StandardModuleExtension) ResourceUrn(org.terasology.gestalt.assets.ResourceUrn) ConfirmPopup(org.terasology.engine.rendering.nui.layers.mainMenu.ConfirmPopup) MessagePopup(org.terasology.engine.rendering.nui.layers.mainMenu.MessagePopup) Logger(org.slf4j.Logger) UILabel(org.terasology.nui.widgets.UILabel) CoreScreenLayer(org.terasology.engine.rendering.nui.CoreScreenLayer) UIButton(org.terasology.nui.widgets.UIButton) Comparator(java.util.Comparator) RemoteModuleExtension(org.terasology.engine.core.module.RemoteModuleExtension) Collections(java.util.Collections) Canvas(org.terasology.nui.Canvas) Vector2i(org.joml.Vector2i) Module(org.terasology.gestalt.module.Module) DependencyInfo(org.terasology.gestalt.module.dependencyresolution.DependencyInfo)

Example 2 with DependencyInfo

use of org.terasology.gestalt.module.dependencyresolution.DependencyInfo in project Terasology by MovingBlocks.

the class GameDetailsScreen method getModuleDescription.

private String getModuleDescription(final ModuleSelectionInfo moduleSelectionInfo) {
    final StringBuilder sb = new StringBuilder();
    final ModuleMetadata moduleMetadata = moduleSelectionInfo.getMetadata();
    if (moduleMetadata != null) {
        sb.append(translationSystem.translate("${engine:menu#game-details-game-title} ")).append(moduleMetadata.getDisplayName()).append('\n').append('\n');
        if (moduleSelectionInfo.isLatestVersion()) {
            sb.append(translationSystem.translate("${engine:menu#game-details-invalid-module-version-warning}")).append('\n').append('\n');
        }
        if (moduleMetadata.getVersion() != null) {
            sb.append(translationSystem.translate("${engine:menu#game-details-version}")).append(" ").append(moduleMetadata.getVersion().toString()).append('\n').append('\n');
        }
        String moduleDescription = moduleMetadata.getDescription().toString();
        if (StringUtils.isBlank(moduleDescription)) {
            moduleDescription = translationSystem.translate("${engine:menu#game-details-no-description}");
        }
        sb.append(translationSystem.translate("${engine:menu#game-details-description}")).append(moduleDescription).append('\n').append('\n');
        StringBuilder dependenciesNames;
        final List<DependencyInfo> dependencies = moduleMetadata.getDependencies();
        if (dependencies != null && !dependencies.isEmpty()) {
            dependenciesNames = new StringBuilder(translationSystem.translate("${engine:menu#module-dependencies-exist}") + ":" + '\n');
            for (DependencyInfo dependency : dependencies) {
                dependenciesNames.append("   ").append(dependency.getId().toString()).append('\n');
            }
        } else {
            dependenciesNames = new StringBuilder(translationSystem.translate("${engine:menu#module-dependencies-empty}") + ".");
        }
        return sb.append(dependenciesNames).toString();
    }
    if (moduleSelectionInfo.isUnavailableVersion()) {
        return sb.append(translationSystem.translate("${engine:menu#game-details-invalid-module-error}")).append("\n").append('\n').append(translationSystem.translate("${engine:menu#game-details-version}")).append(" ").append(moduleSelectionInfo.getUnavailableModuleVersion()).toString();
    }
    return translationSystem.translate("${engine:menu#game-details-invalid-module-error}");
}
Also used : ModuleMetadata(org.terasology.gestalt.module.ModuleMetadata) DependencyInfo(org.terasology.gestalt.module.dependencyresolution.DependencyInfo)

Example 3 with DependencyInfo

use of org.terasology.gestalt.module.dependencyresolution.DependencyInfo in project Terasology by MovingBlocks.

the class UniverseSetupScreen method recursivelyAddModuleDependencies.

private void recursivelyAddModuleDependencies(Set<Name> modules, Name moduleName) {
    Module module = moduleManager.getRegistry().getLatestModuleVersion(moduleName);
    if (module != null) {
        for (DependencyInfo dependencyInfo : module.getMetadata().getDependencies()) {
            modules.add(dependencyInfo.getId());
            recursivelyAddModuleDependencies(modules, dependencyInfo.getId());
        }
    }
}
Also used : Module(org.terasology.gestalt.module.Module) DependencyInfo(org.terasology.gestalt.module.dependencyresolution.DependencyInfo)

Example 4 with DependencyInfo

use of org.terasology.gestalt.module.dependencyresolution.DependencyInfo in project Terasology by MovingBlocks.

the class ModuleManager method ensureModulesDependOnEngine.

/**
 * Ensure all modules declare a dependency on the engine module.
 * <p>
 * This is to ensure that the set of modules is a graph with a single root.
 * We need this to ensure the engine is loaded <em>before</em> other modules
 * when things iterate over the module list in dependency order.
 * <p>
 * See <a href="https://github.com/MovingBlocks/Terasology/issues/1450">#1450</a>.
 */
private void ensureModulesDependOnEngine() {
    DependencyInfo engineDep = new DependencyInfo();
    engineDep.setId(engineModule.getId());
    engineDep.setMinVersion(engineModule.getVersion());
    Set<Name> engineModules = Sets.newHashSet(engineModule.getId());
    engineModules.addAll(engineModule.getMetadata().getDependencies().stream().map(DependencyInfo::getId).collect(Collectors.toList()));
    registry.stream().filter(mod -> !engineModules.contains(mod.getId())).forEach(mod -> mod.getMetadata().getDependencies().add(engineDep));
}
Also used : Arrays(java.util.Arrays) Enumeration(java.util.Enumeration) URL(java.net.URL) URISyntaxException(java.net.URISyntaxException) LoggerFactory(org.slf4j.LoggerFactory) SystemConfig(org.terasology.engine.config.SystemConfig) PermissionProviderFactory(org.terasology.gestalt.module.sandbox.PermissionProviderFactory) Reflections(org.reflections.Reflections) Jvm(org.terasology.engine.utilities.Jvm) StandardPermissionProviderFactory(org.terasology.gestalt.module.sandbox.StandardPermissionProviderFactory) PropertyPermission(java.util.PropertyPermission) ResolutionResult(org.terasology.gestalt.module.dependencyresolution.ResolutionResult) Map(java.util.Map) ModuleMetadataLoader(org.terasology.gestalt.module.ModuleMetadataLoader) DependencyInfo(org.terasology.gestalt.module.dependencyresolution.DependencyInfo) JarURLConnection(java.net.JarURLConnection) Path(java.nio.file.Path) Policy(java.security.Policy) ReflectPermission(java.lang.reflect.ReflectPermission) Scanner(org.reflections.scanners.Scanner) Module(org.terasology.gestalt.module.Module) ModuleEnvironment(org.terasology.gestalt.module.ModuleEnvironment) Collection(java.util.Collection) TableModuleRegistry(org.terasology.gestalt.module.TableModuleRegistry) Set(java.util.Set) Collectors(java.util.stream.Collectors) Sets(com.google.common.collect.Sets) ClasspathHelper(org.reflections.util.ClasspathHelper) DependencyResolver(org.terasology.gestalt.module.dependencyresolution.DependencyResolver) List(java.util.List) ModuleSecurityPolicy(org.terasology.gestalt.module.sandbox.ModuleSecurityPolicy) Name(org.terasology.gestalt.naming.Name) TerasologyConstants(org.terasology.engine.core.TerasologyConstants) APIScanner(org.terasology.gestalt.module.sandbox.APIScanner) WarnOnlyProviderFactory(org.terasology.gestalt.module.sandbox.WarnOnlyProviderFactory) HashSet(java.util.HashSet) ModuleRegistry(org.terasology.gestalt.module.ModuleRegistry) ModuleSecurityManager(org.terasology.gestalt.module.sandbox.ModuleSecurityManager) ConfigurationBuilder(org.reflections.util.ConfigurationBuilder) Logger(org.slf4j.Logger) PermissionProvider(org.terasology.gestalt.module.sandbox.PermissionProvider) PermissionSet(org.terasology.gestalt.module.sandbox.PermissionSet) IOException(java.io.IOException) File(java.io.File) Config(org.terasology.engine.config.Config) ModulePathScanner(org.terasology.gestalt.module.ModulePathScanner) ModuleMetadataJsonAdapter(org.terasology.gestalt.module.ModuleMetadataJsonAdapter) Collections(java.util.Collections) PathManager(org.terasology.engine.core.PathManager) ModuleFactory(org.terasology.gestalt.module.ModuleFactory) DependencyInfo(org.terasology.gestalt.module.dependencyresolution.DependencyInfo) Name(org.terasology.gestalt.naming.Name)

Example 5 with DependencyInfo

use of org.terasology.gestalt.module.dependencyresolution.DependencyInfo in project Terasology by MovingBlocks.

the class AdvancedGameSetupScreen method initialise.

@Override
public void initialise() {
    setAnimationSystem(MenuAnimationSystems.createDefaultSwipeAnimation());
    remoteModuleRegistryUpdater = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat(new TargetLengthBasedClassNameAbbreviator(36).abbreviate(getClass().getName()) + "-%d").setDaemon(true).build()).submit(moduleManager.getInstallManager().updateRemoteRegistry());
    final UIText seed = find("seed", UIText.class);
    if (seed != null) {
        seed.setText(new FastRandom().nextString(32));
    }
    // skip loading module configs, limit shown modules to locally present ones
    selectModulesConfig = new SelectModulesConfig();
    selectModulesConfig.getSelectedStandardModuleExtensions().forEach(selectModulesConfig::unselectStandardModuleExtension);
    selectModulesConfig.toggleIsLocalOnlySelected();
    dependencyResolver = new DependencyResolver(moduleManager.getRegistry());
    modulesLookup = Maps.newHashMap();
    sortedModules = Lists.newArrayList();
    for (Name moduleId : moduleManager.getRegistry().getModuleIds()) {
        Module latestVersion = moduleManager.getRegistry().getLatestModuleVersion(moduleId);
        ModuleSelectionInfo info = ModuleSelectionInfo.local(latestVersion);
        modulesLookup.put(info.getMetadata().getId(), info);
        sortedModules.add(info);
    }
    sortedModules.sort(moduleInfoComparator);
    allSortedModules = new ArrayList<>(sortedModules);
    final UIList<ModuleSelectionInfo> moduleList = find("moduleList", UIList.class);
    if (moduleList != null) {
        moduleList.setList(sortedModules);
        moduleList.setItemRenderer(new AbstractItemRenderer<ModuleSelectionInfo>() {

            String getString(ModuleSelectionInfo value) {
                return value.getMetadata().getDisplayName().toString();
            }

            @Override
            public void draw(ModuleSelectionInfo value, Canvas canvas) {
                if (isSelectedGameplayModule(value) && value.isValidToSelect()) {
                    canvas.setMode("gameplay");
                } else if (value.isSelected() && value.isExplicitSelection()) {
                    canvas.setMode("enabled");
                } else if (value.isSelected()) {
                    canvas.setMode("dependency");
                } else if (!value.isPresent()) {
                    canvas.setMode("disabled");
                } else if (!value.isValidToSelect()) {
                    canvas.setMode("invalid");
                } else {
                    canvas.setMode("available");
                }
                canvas.drawText(getString(value), canvas.getRegion());
            }

            @Override
            public Vector2i getPreferredSize(ModuleSelectionInfo value, Canvas canvas) {
                String text = getString(value);
                return new Vector2i(canvas.getCurrentStyle().getFont().getWidth(text), canvas.getCurrentStyle().getFont().getLineHeight());
            }
        });
        // ItemActivateEventListener is triggered by double clicking
        moduleList.subscribe((widget, item) -> {
            if (item.isSelected() && moduleList.getSelection().isExplicitSelection()) {
                deselect(item);
            } else if (item.isValidToSelect()) {
                select(item);
            }
        });
        moduleSearch = find("moduleSearch", ResettableUIText.class);
        if (moduleSearch != null) {
            moduleSearch.subscribe((TextChangeEventListener) (oldText, newText) -> filterModules());
        }
        final Binding<ModuleMetadata> moduleInfoBinding = new ReadOnlyBinding<ModuleMetadata>() {

            @Override
            public ModuleMetadata get() {
                if (moduleList.getSelection() != null) {
                    return moduleList.getSelection().getMetadata();
                }
                return null;
            }
        };
        UILabel name = find("name", UILabel.class);
        if (name != null) {
            name.bindText(new ReadOnlyBinding<String>() {

                @Override
                public String get() {
                    if (moduleInfoBinding.get() != null) {
                        return moduleInfoBinding.get().getDisplayName().toString();
                    }
                    return "";
                }
            });
        }
        UILabel installedVersion = find("installedVersion", UILabel.class);
        if (installedVersion != null) {
            installedVersion.bindText(new ReadOnlyBinding<String>() {

                @Override
                public String get() {
                    ModuleSelectionInfo sel = moduleList.getSelection();
                    if (sel == null) {
                        return "";
                    }
                    return sel.isPresent() ? sel.getMetadata().getVersion().toString() : translationSystem.translate("${engine:menu#module-version-installed-none}");
                }
            });
        }
        UILabel onlineVersion = find("onlineVersion", UILabel.class);
        if (onlineVersion != null) {
            onlineVersion.bindText(new ReadOnlyBinding<String>() {

                @Override
                public String get() {
                    ModuleSelectionInfo sel = moduleList.getSelection();
                    if (sel == null) {
                        return "";
                    }
                    return (sel.getOnlineVersion() != null) ? sel.getOnlineVersion().getVersion().toString() : "none";
                }
            });
        }
        UILabel description = find("description", UILabel.class);
        if (description != null) {
            description.bindText(new ReadOnlyBinding<String>() {

                @Override
                public String get() {
                    ModuleMetadata moduleMetadata = moduleInfoBinding.get();
                    if (moduleMetadata != null) {
                        StringBuilder dependenciesNames;
                        List<DependencyInfo> dependencies = moduleMetadata.getDependencies();
                        if (dependencies != null && !dependencies.isEmpty()) {
                            dependenciesNames = new StringBuilder(translationSystem.translate("${engine:menu#module-dependencies-exist}") + ":" + '\n');
                            for (DependencyInfo dependency : dependencies) {
                                dependenciesNames.append("   ").append(dependency.getId().toString()).append('\n');
                            }
                        } else {
                            dependenciesNames = new StringBuilder(translationSystem.translate("${engine:menu#module-dependencies-empty}") + ".");
                        }
                        return moduleMetadata.getDescription().toString() + '\n' + '\n' + dependenciesNames;
                    }
                    return "";
                }
            });
        }
        UILabel status = find("status", UILabel.class);
        if (status != null) {
            status.bindText(new ReadOnlyBinding<String>() {

                @Override
                public String get() {
                    ModuleSelectionInfo info = moduleList.getSelection();
                    if (info != null) {
                        if (isSelectedGameplayModule(info)) {
                            return translationSystem.translate("${engine:menu#module-status-activegameplay}");
                        } else if (info.isSelected() && info.isExplicitSelection()) {
                            return translationSystem.translate("${engine:menu#module-status-activated}");
                        } else if (info.isSelected()) {
                            return translationSystem.translate("${engine:menu#module-status-dependency}");
                        } else if (!info.isPresent()) {
                            return translationSystem.translate("${engine:menu#module-status-notpresent}");
                        } else if (info.isValidToSelect()) {
                            return translationSystem.translate("${engine:menu#module-status-available}");
                        } else {
                            return translationSystem.translate("${engine:menu#module-status-error}");
                        }
                    }
                    return "";
                }
            });
        }
        UIButton toggleActivate = find("toggleActivation", UIButton.class);
        if (toggleActivate != null) {
            toggleActivate.subscribe(button -> {
                ModuleSelectionInfo info = moduleList.getSelection();
                if (info != null) {
                    // Toggle
                    if (info.isSelected() && info.isExplicitSelection()) {
                        deselect(info);
                    } else if (info.isValidToSelect()) {
                        select(info);
                    }
                }
            });
            toggleActivate.bindEnabled(new ReadOnlyBinding<Boolean>() {

                @Override
                public Boolean get() {
                    ModuleSelectionInfo info = moduleList.getSelection();
                    return info != null && info.isPresent() && !isSelectedGameplayModule(info) && (info.isSelected() || info.isValidToSelect());
                }
            });
            toggleActivate.bindText(new ReadOnlyBinding<String>() {

                @Override
                public String get() {
                    if (moduleList.getSelection() != null) {
                        if (moduleList.getSelection().isExplicitSelection()) {
                            return translationSystem.translate("${engine:menu#deactivate-module}");
                        } else {
                            return translationSystem.translate("${engine:menu#activate-module}");
                        }
                    }
                    // button should be disabled
                    return translationSystem.translate("${engine:menu#activate-module}");
                }
            });
        }
        UIButton downloadButton = find("download", UIButton.class);
        if (downloadButton != null) {
            downloadButton.subscribe(button -> {
                if (moduleList.getSelection() != null) {
                    ModuleSelectionInfo info = moduleList.getSelection();
                    startDownloadingNewestModulesRequiredFor(info);
                }
            });
            downloadButton.bindEnabled(new ReadOnlyBinding<Boolean>() {

                @Override
                public Boolean get() {
                    ModuleSelectionInfo selection = moduleList.getSelection();
                    if (null == selection) {
                        return false;
                    }
                    return selection.getOnlineVersion() != null;
                }
            });
            downloadButton.bindText(new ReadOnlyBinding<String>() {

                @Override
                public String get() {
                    ModuleSelectionInfo info = moduleList.getSelection();
                    if (info != null && !info.isPresent()) {
                        return translationSystem.translate("${engine:menu#download-module}");
                    } else {
                        return translationSystem.translate("${engine:menu#update-module}");
                    }
                }
            });
        }
        UIButton disableAll = find("disableAll", UIButton.class);
        if (disableAll != null) {
            disableAll.subscribe(button -> sortedModules.stream().filter(info -> info.isSelected() && info.isExplicitSelection()).forEach(this::deselect));
        }
        for (CheckboxAssociationEnum checkboxAssociation : CheckboxAssociationEnum.values()) {
            String checkboxName = checkboxAssociation.getCheckboxName();
            StandardModuleExtension standardModuleExtension = checkboxAssociation.getStandardModuleExtension();
            UICheckbox checkBox = find(checkboxName, UICheckbox.class);
            if (null != checkBox) {
                checkBox.setChecked(selectModulesConfig.isStandardModuleExtensionSelected(standardModuleExtension));
                checkBox.subscribe(e -> {
                    selectModulesConfig.toggleStandardModuleExtensionSelected(standardModuleExtension);
                    checkBox.setChecked(selectModulesConfig.isStandardModuleExtensionSelected(standardModuleExtension));
                    filterModules();
                });
            } else {
                logger.error("Unable to find checkbox named " + checkboxName + " in " + ASSET_URI.toString());
                selectModulesConfig.unselectStandardModuleExtension(standardModuleExtension);
            }
        }
        UICheckbox localOnlyCheckbox = find("localOnlyCheckbox", UICheckbox.class);
        localOnlyCheckbox.setChecked(selectModulesConfig.isLocalOnlySelected());
        localOnlyCheckbox.subscribe(e -> {
            selectModulesConfig.toggleIsLocalOnlySelected();
            localOnlyCheckbox.setChecked(selectModulesConfig.isLocalOnlySelected());
            filterModules();
        });
        UICheckbox uncategorizedCheckbox = find("uncategorizedCheckbox", UICheckbox.class);
        uncategorizedCheckbox.setChecked(selectModulesConfig.isUncategorizedSelected());
        uncategorizedCheckbox.subscribe(e -> {
            selectModulesConfig.toggleUncategorizedSelected();
            boolean isUncategorizedSelected = selectModulesConfig.isUncategorizedSelected();
            uncategorizedCheckbox.setChecked(isUncategorizedSelected);
            for (CheckboxAssociationEnum checkboxAssociation : CheckboxAssociationEnum.values()) {
                final String checkboxName = checkboxAssociation.getCheckboxName();
                UICheckbox checkbox = find(checkboxName, UICheckbox.class);
                if (null != checkbox) {
                    checkbox.setEnabled(!isUncategorizedSelected);
                }
            }
            filterModules();
        });
        UIButton resetAdvancedFilters = find("resetFilters", UIButton.class);
        if (resetAdvancedFilters != null) {
            // on clicking 'reset category filters' button, uncheck all advanced filters
            localOnlyCheckbox.setChecked(selectModulesConfig.isLocalOnlySelected());
            uncategorizedCheckbox.setChecked(selectModulesConfig.isUncategorizedSelected());
            resetAdvancedFilters.subscribe(button -> {
                if (selectModulesConfig.isLocalOnlySelected()) {
                    selectModulesConfig.toggleIsLocalOnlySelected();
                    localOnlyCheckbox.setChecked(selectModulesConfig.isLocalOnlySelected());
                }
                if (selectModulesConfig.isUncategorizedSelected()) {
                    selectModulesConfig.toggleUncategorizedSelected();
                    uncategorizedCheckbox.setChecked(selectModulesConfig.isUncategorizedSelected());
                }
                filterModules();
            });
            for (CheckboxAssociationEnum checkboxAssociation : CheckboxAssociationEnum.values()) {
                StandardModuleExtension standardModuleExtension = checkboxAssociation.getStandardModuleExtension();
                String checkboxName = checkboxAssociation.getCheckboxName();
                UICheckbox checkbox = find(checkboxName, UICheckbox.class);
                if (null != checkbox) {
                    checkbox.setChecked(selectModulesConfig.isStandardModuleExtensionSelected(standardModuleExtension));
                    resetAdvancedFilters.subscribe(button -> {
                        checkbox.setEnabled(!selectModulesConfig.isUncategorizedSelected());
                        if (selectModulesConfig.isStandardModuleExtensionSelected(standardModuleExtension)) {
                            selectModulesConfig.toggleStandardModuleExtensionSelected(standardModuleExtension);
                            checkbox.setChecked(selectModulesConfig.isStandardModuleExtensionSelected(standardModuleExtension));
                        }
                        filterModules();
                    });
                }
            }
            final UIButton moduleDetails = find("moduleDetails", UIButton.class);
            if (moduleDetails != null) {
                moduleDetails.bindEnabled(new ReadOnlyBinding<Boolean>() {

                    @Override
                    public Boolean get() {
                        return moduleInfoBinding.get() != null;
                    }
                });
                moduleDetails.subscribe(b -> {
                    final ModuleDetailsScreen moduleDetailsScreen = getManager().createScreen(ModuleDetailsScreen.ASSET_URI, ModuleDetailsScreen.class);
                    final Collection<Module> modules = sortedModules.stream().map(ModuleSelectionInfo::getMetadata).filter(Objects::nonNull).map(meta -> moduleManager.getRegistry().getLatestModuleVersion(meta.getId())).filter(Objects::nonNull).collect(Collectors.toList());
                    moduleDetailsScreen.setModules(modules);
                    moduleDetailsScreen.setSelectedModule(modules.stream().filter(module -> module.getId().equals(moduleInfoBinding.get().getId())).findFirst().orElse(null));
                    getManager().pushScreen(moduleDetailsScreen);
                });
            }
        }
    }
    WidgetUtil.trySubscribe(this, "createWorld", button -> {
        final UniverseSetupScreen universeSetupScreen = getManager().createScreen(UniverseSetupScreen.ASSET_URI, UniverseSetupScreen.class);
        universeWrapper.setSeed(seed.getText());
        saveConfiguration();
        universeSetupScreen.setEnvironment(universeWrapper);
        triggerForwardAnimation(universeSetupScreen);
    });
    WidgetUtil.trySubscribe(this, "play", button -> {
        if (StringUtils.isBlank(seed.getText())) {
            getManager().createScreen(MessagePopup.ASSET_URI, MessagePopup.class).setMessage("Error", "Game seed cannot be empty!");
        } else {
            universeWrapper.setSeed(seed.getText());
            saveConfiguration();
            final GameManifest gameManifest = GameManifestProvider.createGameManifest(universeWrapper, moduleManager, config);
            if (gameManifest != null) {
                gameEngine.changeState(new StateLoading(gameManifest, (universeWrapper.getLoadingAsServer()) ? NetworkMode.DEDICATED_SERVER : NetworkMode.NONE));
            } else {
                getManager().createScreen(MessagePopup.ASSET_URI, MessagePopup.class).setMessage("Error", "Can't create new game!");
            }
        }
    });
    WidgetUtil.trySubscribe(this, "return", button -> triggerBackAnimation());
    WidgetUtil.trySubscribe(this, "mainMenu", button -> {
        getManager().pushScreen("engine:mainMenuScreen");
    });
}
Also used : ModuleInstaller(org.terasology.engine.core.module.ModuleInstaller) WorldGeneratorManager(org.terasology.engine.world.generator.internal.WorldGeneratorManager) In(org.terasology.engine.registry.In) LoggerFactory(org.slf4j.LoggerFactory) WidgetUtil(org.terasology.nui.WidgetUtil) ModuleMetadata(org.terasology.gestalt.module.ModuleMetadata) ResolutionResult(org.terasology.gestalt.module.dependencyresolution.ResolutionResult) Future(java.util.concurrent.Future) Map(java.util.Map) AbstractItemRenderer(org.terasology.nui.itemRendering.AbstractItemRenderer) DependencyInfo(org.terasology.gestalt.module.dependencyresolution.DependencyInfo) Canvas(org.terasology.nui.Canvas) ResettableUIText(org.terasology.nui.widgets.ResettableUIText) StateLoading(org.terasology.engine.core.modes.StateLoading) ReadOnlyBinding(org.terasology.nui.databinding.ReadOnlyBinding) TranslationSystem(org.terasology.engine.i18n.TranslationSystem) Binding(org.terasology.nui.databinding.Binding) ImmutableSet(com.google.common.collect.ImmutableSet) StringUtils(org.codehaus.plexus.util.StringUtils) GameEngine(org.terasology.engine.core.GameEngine) CancellationException(java.util.concurrent.CancellationException) Module(org.terasology.gestalt.module.Module) Collection(java.util.Collection) UniverseWrapper(org.terasology.engine.rendering.nui.layers.mainMenu.UniverseWrapper) WaitPopup(org.terasology.engine.rendering.nui.layers.mainMenu.WaitPopup) Set(java.util.Set) Collectors(java.util.stream.Collectors) Executors(java.util.concurrent.Executors) SimpleUri(org.terasology.engine.core.SimpleUri) DependencyResolver(org.terasology.gestalt.module.dependencyresolution.DependencyResolver) Objects(java.util.Objects) UIText(org.terasology.nui.widgets.UIText) List(java.util.List) Vector2i(org.joml.Vector2i) UIList(org.terasology.nui.widgets.UIList) Name(org.terasology.gestalt.naming.Name) ThreadFactoryBuilder(com.google.common.util.concurrent.ThreadFactoryBuilder) MenuAnimationSystems(org.terasology.engine.rendering.nui.animation.MenuAnimationSystems) TerasologyConstants(org.terasology.engine.core.TerasologyConstants) ModuleManager(org.terasology.engine.core.module.ModuleManager) ModuleDetailsScreen(org.terasology.engine.rendering.nui.layers.mainMenu.moduleDetailsScreen.ModuleDetailsScreen) NetworkMode(org.terasology.engine.network.NetworkMode) TargetLengthBasedClassNameAbbreviator(ch.qos.logback.classic.pattern.TargetLengthBasedClassNameAbbreviator) DependencyResolutionFailedException(org.terasology.engine.core.module.DependencyResolutionFailedException) FastRandom(org.terasology.engine.utilities.random.FastRandom) ArrayList(java.util.ArrayList) StandardModuleExtension(org.terasology.engine.core.module.StandardModuleExtension) ResourceUrn(org.terasology.gestalt.assets.ResourceUrn) GameManifest(org.terasology.engine.game.GameManifest) Lists(com.google.common.collect.Lists) ConfirmPopup(org.terasology.engine.rendering.nui.layers.mainMenu.ConfirmPopup) GameManifestProvider(org.terasology.engine.rendering.nui.layers.mainMenu.GameManifestProvider) MessagePopup(org.terasology.engine.rendering.nui.layers.mainMenu.MessagePopup) ModuleConfig(org.terasology.engine.config.ModuleConfig) Logger(org.slf4j.Logger) Iterator(java.util.Iterator) UILabel(org.terasology.nui.widgets.UILabel) SelectModulesConfig(org.terasology.engine.config.SelectModulesConfig) Maps(com.google.common.collect.Maps) CoreScreenLayer(org.terasology.engine.rendering.nui.CoreScreenLayer) UICheckbox(org.terasology.nui.widgets.UICheckbox) ExecutionException(java.util.concurrent.ExecutionException) Config(org.terasology.engine.config.Config) TextChangeEventListener(org.terasology.nui.widgets.TextChangeEventListener) UIButton(org.terasology.nui.widgets.UIButton) UniverseSetupScreen(org.terasology.engine.rendering.nui.layers.mainMenu.UniverseSetupScreen) Comparator(java.util.Comparator) MessagePopup(org.terasology.engine.rendering.nui.layers.mainMenu.MessagePopup) Name(org.terasology.gestalt.naming.Name) SelectModulesConfig(org.terasology.engine.config.SelectModulesConfig) ModuleDetailsScreen(org.terasology.engine.rendering.nui.layers.mainMenu.moduleDetailsScreen.ModuleDetailsScreen) UIButton(org.terasology.nui.widgets.UIButton) ThreadFactoryBuilder(com.google.common.util.concurrent.ThreadFactoryBuilder) ResettableUIText(org.terasology.nui.widgets.ResettableUIText) UIText(org.terasology.nui.widgets.UIText) List(java.util.List) UIList(org.terasology.nui.widgets.UIList) ArrayList(java.util.ArrayList) Vector2i(org.joml.Vector2i) StandardModuleExtension(org.terasology.engine.core.module.StandardModuleExtension) UILabel(org.terasology.nui.widgets.UILabel) UniverseSetupScreen(org.terasology.engine.rendering.nui.layers.mainMenu.UniverseSetupScreen) StateLoading(org.terasology.engine.core.modes.StateLoading) ReadOnlyBinding(org.terasology.nui.databinding.ReadOnlyBinding) Canvas(org.terasology.nui.Canvas) ModuleMetadata(org.terasology.gestalt.module.ModuleMetadata) FastRandom(org.terasology.engine.utilities.random.FastRandom) UICheckbox(org.terasology.nui.widgets.UICheckbox) TargetLengthBasedClassNameAbbreviator(ch.qos.logback.classic.pattern.TargetLengthBasedClassNameAbbreviator) DependencyInfo(org.terasology.gestalt.module.dependencyresolution.DependencyInfo) DependencyResolver(org.terasology.gestalt.module.dependencyresolution.DependencyResolver) ResettableUIText(org.terasology.nui.widgets.ResettableUIText) GameManifest(org.terasology.engine.game.GameManifest) Module(org.terasology.gestalt.module.Module)

Aggregations

DependencyInfo (org.terasology.gestalt.module.dependencyresolution.DependencyInfo)5 Module (org.terasology.gestalt.module.Module)4 Collection (java.util.Collection)3 List (java.util.List)3 Set (java.util.Set)3 Collectors (java.util.stream.Collectors)3 Logger (org.slf4j.Logger)3 LoggerFactory (org.slf4j.LoggerFactory)3 DependencyResolver (org.terasology.gestalt.module.dependencyresolution.DependencyResolver)3 Name (org.terasology.gestalt.naming.Name)3 Arrays (java.util.Arrays)2 Collections (java.util.Collections)2 Comparator (java.util.Comparator)2 HashSet (java.util.HashSet)2 Map (java.util.Map)2 Objects (java.util.Objects)2 Config (org.terasology.engine.config.Config)2 TerasologyConstants (org.terasology.engine.core.TerasologyConstants)2 ModuleMetadata (org.terasology.gestalt.module.ModuleMetadata)2 ResolutionResult (org.terasology.gestalt.module.dependencyresolution.ResolutionResult)2