Ejemplo n.º 1
0
        /// <summary>
        /// Initialize the screen
        /// </summary>
        /// <param name="mgr">KSP manager containing instances</param>
        /// <param name="cp">Plan of mods to add and remove</param>
        /// <param name="rej">Mods that the user saw and did not select, in this pass or a previous pass</param>
        /// <param name="dbg">True if debug options should be available, false otherwise</param>
        public DependencyScreen(KSPManager mgr, ChangePlan cp, HashSet <string> rej, bool dbg) : base()
        {
            debug    = dbg;
            manager  = mgr;
            plan     = cp;
            registry = RegistryManager.Instance(manager.CurrentInstance).registry;
            rejected = rej;

            AddObject(new ConsoleLabel(
                          1, 2, -1,
                          () => "Additional mods are recommended or suggested:"
                          ));

            generateList(plan.Install);
            generateList(new HashSet <CkanModule>(
                             ReplacementIdentifiers(plan.Replace)
                             .Select(id => registry.InstalledModule(id).Module)
                             ));

            dependencyList = new ConsoleListBox <Dependency>(
                1, 4, -1, -2,
                new List <Dependency>(dependencies.Values),
                new List <ConsoleListBoxColumn <Dependency> >()
            {
                new ConsoleListBoxColumn <Dependency>()
                {
                    Header   = "Install",
                    Width    = 7,
                    Renderer = (Dependency d) => StatusSymbol(d.module)
                },
                new ConsoleListBoxColumn <Dependency>()
                {
                    Header   = "Name",
                    Width    = 36,
                    Renderer = (Dependency d) => d.module.ToString()
                },
                new ConsoleListBoxColumn <Dependency>()
                {
                    Header   = "Sources",
                    Width    = 42,
                    Renderer = (Dependency d) => string.Join(", ", d.dependents)
                }
            },
                1, 0, ListSortDirection.Descending
                );
            dependencyList.AddTip("+", "Toggle");
            dependencyList.AddBinding(Keys.Plus, (object sender) => {
                ChangePlan.toggleContains(accepted, dependencyList.Selection.module);
                return(true);
            });

            dependencyList.AddTip("Ctrl+A", "Select all");
            dependencyList.AddBinding(Keys.CtrlA, (object sender) => {
                foreach (var kvp in dependencies)
                {
                    if (!accepted.Contains(kvp.Key))
                    {
                        ChangePlan.toggleContains(accepted, kvp.Key);
                    }
                }
                return(true);
            });

            dependencyList.AddTip("Ctrl+D", "Deselect all", () => accepted.Count > 0);
            dependencyList.AddBinding(Keys.CtrlD, (object sender) => {
                accepted.Clear();
                return(true);
            });

            dependencyList.AddTip("Enter", "Details");
            dependencyList.AddBinding(Keys.Enter, (object sender) => {
                if (dependencyList.Selection != null)
                {
                    LaunchSubScreen(new ModInfoScreen(
                                        manager, plan,
                                        dependencyList.Selection.module,
                                        debug
                                        ));
                }
                return(true);
            });

            AddObject(dependencyList);

            AddTip("Esc", "Cancel");
            AddBinding(Keys.Escape, (object sender) => {
                // Add everything to rejected
                foreach (var kvp in dependencies)
                {
                    rejected.Add(kvp.Key.identifier);
                }
                return(false);
            });

            AddTip("F9", "Accept");
            AddBinding(Keys.F9, (object sender) => {
                foreach (CkanModule mod in accepted)
                {
                    plan.Install.Add(mod);
                }
                // Add the rest to rejected
                foreach (var kvp in dependencies)
                {
                    if (!accepted.Contains(kvp.Key))
                    {
                        rejected.Add(kvp.Key.identifier);
                    }
                }
                return(false);
            });
        }