/// <summary> /// Called on key down when the mod list is focused. /// Makes the Home/End keys go to the top/bottom of the list respectively. /// </summary> private void ModList_KeyDown(object sender, KeyEventArgs e) { switch (e.KeyCode) { case Keys.Home: // First row. ModList.CurrentCell = ModList.Rows[0].Cells[SelectableColumnIndex()]; e.Handled = true; break; case Keys.End: // Last row. ModList.CurrentCell = ModList.Rows[ModList.Rows.Count - 1].Cells[SelectableColumnIndex()]; e.Handled = true; break; case Keys.Space: // If they've focused one of the checkbox columns, don't intercept if (ModList.CurrentCell.ColumnIndex > 3) { DataGridViewRow row = ModList.CurrentRow; // Toggle Update column if enabled, otherwise Install for (int colIndex = 2; colIndex >= 0; --colIndex) { if (row?.Cells[colIndex] is DataGridViewCheckBoxCell) { // Need to change the state here, because the user hasn't clicked on a checkbox row.Cells[colIndex].Value = !(bool)row.Cells[colIndex].Value; ModList.CommitEdit(DataGridViewDataErrorContexts.Commit); e.Handled = true; break; } } } break; } }
private void ConflictsUpdated() { foreach (DataGridViewRow row in ModList.Rows) { var module = (GUIMod)row.Tag; string value; if (Conflicts != null && Conflicts.TryGetValue(module, out value)) { var conflict_text = value; foreach (DataGridViewCell cell in row.Cells) { cell.ToolTipText = conflict_text; } if (row.DefaultCellStyle.BackColor != Color.LightCoral) { row.DefaultCellStyle.BackColor = Color.LightCoral; ModList.InvalidateRow(row.Index); } } else { if (row.DefaultCellStyle.BackColor != Color.Empty) { foreach (DataGridViewCell cell in row.Cells) { cell.ToolTipText = null; } row.DefaultCellStyle.BackColor = Color.Empty; ModList.InvalidateRow(row.Index); } } } }
private void Main_Load(object sender, EventArgs e) { m_UpdateRepoWorker = new BackgroundWorker(); m_UpdateRepoWorker.WorkerReportsProgress = false; m_UpdateRepoWorker.WorkerSupportsCancellation = true; m_UpdateRepoWorker.RunWorkerCompleted += PostUpdateRepo; m_UpdateRepoWorker.DoWork += UpdateRepo; m_InstallWorker = new BackgroundWorker(); m_InstallWorker.WorkerReportsProgress = true; m_InstallWorker.WorkerSupportsCancellation = true; m_InstallWorker.RunWorkerCompleted += PostInstallMods; m_InstallWorker.DoWork += InstallMods; UpdateModsList(); UpdateModFilterList(); ApplyToolButton.Enabled = false; ModList.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells); Text = String.Format("CKAN {0} - KSP {1}", Meta.Version(), KSPManager.CurrentInstance.Version()); KSPVersionLabel.Text = String.Format("Kerbal Space Program {0}", KSPManager.CurrentInstance.Version()); }
/// <summary> /// I'm pretty sure this is what gets called when the user clicks on a ticky /// in the mod list. /// </summary> private void ModList_CellContentClick(object sender, DataGridViewCellEventArgs e) { ModList.CommitEdit(DataGridViewDataErrorContexts.Commit); }
protected override void OnLoad(EventArgs e) { Location = configuration.WindowLoc; Size = configuration.WindowSize; if (!configuration.CheckForUpdatesOnLaunchNoNag) { log.Debug("Asking user if they wish for autoupdates"); if (new AskUserForAutoUpdatesDialog().ShowDialog() == DialogResult.OK) { configuration.CheckForUpdatesOnLaunch = true; } configuration.CheckForUpdatesOnLaunchNoNag = true; configuration.Save(); } bool autoUpdating = false; if (configuration.CheckForUpdatesOnLaunch) { try { log.Info("Making autoupdate call"); AutoUpdate.Instance.FetchLatestReleaseInfo(); var latest_version = AutoUpdate.Instance.LatestVersion; var current_version = new Version(Meta.GetVersion()); if (AutoUpdate.Instance.IsFetched() && latest_version.IsGreaterThan(current_version)) { log.Debug("Found higher ckan version"); var release_notes = AutoUpdate.Instance.ReleaseNotes; var dialog = new NewUpdateDialog(latest_version.ToString(), release_notes); if (dialog.ShowDialog() == DialogResult.OK) { UpdateCKAN(); autoUpdating = true; } } } catch (Exception exception) { currentUser.RaiseError("Error in autoupdate: \n\t" + exception.Message + ""); log.Error("Error in autoupdate", exception); } } m_UpdateRepoWorker = new BackgroundWorker { WorkerReportsProgress = false, WorkerSupportsCancellation = true }; m_UpdateRepoWorker.RunWorkerCompleted += PostUpdateRepo; m_UpdateRepoWorker.DoWork += UpdateRepo; installWorker = new BackgroundWorker { WorkerReportsProgress = true, WorkerSupportsCancellation = true }; installWorker.RunWorkerCompleted += PostInstallMods; installWorker.DoWork += InstallMods; var old_YesNoDialog = currentUser.displayYesNo; currentUser.displayYesNo = YesNoDialog; URLHandlers.RegisterURLHandler(configuration, currentUser); currentUser.displayYesNo = old_YesNoDialog; ApplyToolButton.Enabled = false; CurrentInstanceUpdated(); // if we're autoUpdating then we shouldn't interfere progress tab if (configuration.RefreshOnStartup && !autoUpdating) { UpdateRepo(); } Text = String.Format("CKAN {0} - KSP {1} -- {2}", Meta.GetVersion(), CurrentInstance.Version(), CurrentInstance.GameDir()); if (commandLineArgs.Length >= 2) { var identifier = commandLineArgs[1]; if (identifier.StartsWith("//")) { identifier = identifier.Substring(2); } else if (identifier.StartsWith("ckan://")) { identifier = identifier.Substring(7); } if (identifier.EndsWith("/")) { identifier = identifier.Substring(0, identifier.Length - 1); } log.Debug("Attempting to select mod from startup parameters"); FocusMod(identifier, true, true); ModList.Refresh(); log.Debug("Failed to select mod from startup parameters"); } var pluginsPath = Path.Combine(CurrentInstance.CkanDir(), "Plugins"); if (!Directory.Exists(pluginsPath)) { Directory.CreateDirectory(pluginsPath); } pluginController = new PluginController(pluginsPath, true); CurrentInstance.RebuildKSPSubDir(); NavInit(); // initialize navigation. this should be called as late // as possible, once the UI is "settled" from its initial // load. log.Info("GUI started"); base.OnLoad(e); }
protected override void OnLoad(EventArgs e) { Location = configuration.WindowLoc; Size = configuration.WindowSize; WindowState = configuration.IsWindowMaximised ? FormWindowState.Maximized : FormWindowState.Normal; splitContainer1.SplitterDistance = configuration.PanelPosition; ModInfoTabControl.ModMetaSplitPosition = configuration.ModInfoPosition; if (!configuration.CheckForUpdatesOnLaunchNoNag && AutoUpdate.CanUpdate) { log.Debug("Asking user if they wish for auto-updates"); if (new AskUserForAutoUpdatesDialog().ShowDialog() == DialogResult.OK) { configuration.CheckForUpdatesOnLaunch = true; } configuration.CheckForUpdatesOnLaunchNoNag = true; configuration.Save(); } bool autoUpdating = false; if (configuration.CheckForUpdatesOnLaunch && AutoUpdate.CanUpdate) { try { log.Info("Making auto-update call"); AutoUpdate.Instance.FetchLatestReleaseInfo(); var latest_version = AutoUpdate.Instance.LatestVersion; var current_version = new Version(Meta.GetVersion()); if (AutoUpdate.Instance.IsFetched() && latest_version.IsGreaterThan(current_version)) { log.Debug("Found higher ckan version"); var release_notes = AutoUpdate.Instance.ReleaseNotes; var dialog = new NewUpdateDialog(latest_version.ToString(), release_notes); if (dialog.ShowDialog() == DialogResult.OK) { UpdateCKAN(); autoUpdating = true; } } } catch (Exception exception) { currentUser.RaiseError($"Error in auto-update:\n\t{exception.Message}"); log.Error("Error in auto-update", exception); } } m_UpdateRepoWorker = new BackgroundWorker { WorkerReportsProgress = false, WorkerSupportsCancellation = true }; m_UpdateRepoWorker.RunWorkerCompleted += PostUpdateRepo; m_UpdateRepoWorker.DoWork += UpdateRepo; installWorker = new BackgroundWorker { WorkerReportsProgress = true, WorkerSupportsCancellation = true }; installWorker.RunWorkerCompleted += PostInstallMods; installWorker.DoWork += InstallMods; var old_YesNoDialog = currentUser.displayYesNo; currentUser.displayYesNo = YesNoDialog; URLHandlers.RegisterURLHandler(configuration, currentUser); currentUser.displayYesNo = old_YesNoDialog; ApplyToolButton.Enabled = false; CurrentInstanceUpdated(); // We would like to refresh if we're configured to refresh on startup, // or if we have no currently available modules. bool repoUpdateNeeded = configuration.RefreshOnStartup || !RegistryManager.Instance(CurrentInstance).registry.HasAnyAvailable(); // If we're auto-updating the client then we shouldn't interfere with the progress tab if (!autoUpdating && repoUpdateNeeded) { UpdateRepo(); } Text = $"CKAN {Meta.GetVersion()} - KSP {CurrentInstance.Version()} -- {CurrentInstance.GameDir()}"; if (commandLineArgs.Length >= 2) { var identifier = commandLineArgs[1]; if (identifier.StartsWith("//")) { identifier = identifier.Substring(2); } else if (identifier.StartsWith("ckan://")) { identifier = identifier.Substring(7); } if (identifier.EndsWith("/")) { identifier = identifier.Substring(0, identifier.Length - 1); } log.Debug("Attempting to select mod from startup parameters"); FocusMod(identifier, true, true); ModList.Refresh(); log.Debug("Failed to select mod from startup parameters"); } var pluginsPath = Path.Combine(CurrentInstance.CkanDir(), "Plugins"); if (!Directory.Exists(pluginsPath)) { Directory.CreateDirectory(pluginsPath); } pluginController = new PluginController(pluginsPath); CurrentInstance.RebuildKSPSubDir(); // Initialize navigation. This should be called as late as // possible, once the UI is "settled" from its initial load. NavInit(); log.Info("GUI started"); base.OnLoad(e); }
private void FocusMod(string key, bool exactMatch, bool showAsFirst = false) { DataGridViewRow current_row = ModList.CurrentRow; int currentIndex = current_row?.Index ?? 0; DataGridViewRow first_match = null; var does_name_begin_with_key = new Func <DataGridViewRow, bool>(row => { GUIMod mod = row.Tag as GUIMod; bool row_match; if (exactMatch) { row_match = mod.Name == key || mod.Identifier == key; } else { row_match = mod.Name.StartsWith(key, StringComparison.OrdinalIgnoreCase) || mod.Abbrevation.StartsWith(key, StringComparison.OrdinalIgnoreCase) || mod.Identifier.StartsWith(key, StringComparison.OrdinalIgnoreCase); } if (row_match && first_match == null) { // Remember the first match to allow cycling back to it if necessary. first_match = row; } if (key.Length == 1 && row_match && row.Index <= currentIndex) { // Keep going forward if it's a single key match and not ahead of the current row. return(false); } return(row_match); }); ModList.ClearSelection(); var rows = ModList.Rows.Cast <DataGridViewRow>().Where(row => row.Visible); DataGridViewRow match = rows.FirstOrDefault(does_name_begin_with_key); if (match == null && first_match != null) { // If there were no matches after the first match, cycle over to the beginning. match = first_match; } if (match != null) { match.Selected = true; // Setting this to the 'Name' cell prevents the checkbox from being toggled // by pressing 'Space' while the row is not indicated as active. ModList.CurrentCell = match.Cells[2]; if (showAsFirst) { ModList.FirstDisplayedScrollingRowIndex = match.Index; } } else { AddStatusMessage("Not found."); } }
protected override void OnLoad(EventArgs e) { if (configuration.WindowLoc.X == -1 && configuration.WindowLoc.Y == -1) { // Center on screen for first launch StartPosition = FormStartPosition.CenterScreen; } else if (Platform.IsMac) { // Make sure there's room at the top for the MacOSX menu bar Location = Util.ClampedLocationWithMargins( configuration.WindowLoc, configuration.WindowSize, new Size(0, 30), new Size(0, 0) ); } else { // Just make sure it's fully on screen Location = Util.ClampedLocation(configuration.WindowLoc, configuration.WindowSize); } Size = configuration.WindowSize; WindowState = configuration.IsWindowMaximised ? FormWindowState.Maximized : FormWindowState.Normal; if (!configuration.CheckForUpdatesOnLaunchNoNag && AutoUpdate.CanUpdate) { log.Debug("Asking user if they wish for auto-updates"); if (new AskUserForAutoUpdatesDialog().ShowDialog() == DialogResult.OK) { configuration.CheckForUpdatesOnLaunch = true; } configuration.CheckForUpdatesOnLaunchNoNag = true; configuration.Save(); } bool autoUpdating = false; if (configuration.CheckForUpdatesOnLaunch && AutoUpdate.CanUpdate) { try { log.Info("Making auto-update call"); AutoUpdate.Instance.FetchLatestReleaseInfo(); var latest_version = AutoUpdate.Instance.latestUpdate.Version; var current_version = new ModuleVersion(Meta.GetVersion()); if (AutoUpdate.Instance.IsFetched() && latest_version.IsGreaterThan(current_version)) { log.Debug("Found higher ckan version"); var release_notes = AutoUpdate.Instance.latestUpdate.ReleaseNotes; var dialog = new NewUpdateDialog(latest_version.ToString(), release_notes); if (dialog.ShowDialog() == DialogResult.OK) { UpdateCKAN(); autoUpdating = true; } } } catch (Exception exception) { currentUser.RaiseError($"Error in auto-update:\n\t{exception.Message}"); log.Error("Error in auto-update", exception); } } CheckTrayState(); InitRefreshTimer(); m_UpdateRepoWorker = new BackgroundWorker { WorkerReportsProgress = false, WorkerSupportsCancellation = true }; m_UpdateRepoWorker.RunWorkerCompleted += PostUpdateRepo; m_UpdateRepoWorker.DoWork += UpdateRepo; installWorker = new BackgroundWorker { WorkerReportsProgress = true, WorkerSupportsCancellation = true }; installWorker.RunWorkerCompleted += PostInstallMods; installWorker.DoWork += InstallMods; URLHandlers.RegisterURLHandler(configuration, currentUser); ApplyToolButton.Enabled = false; CurrentInstanceUpdated(!autoUpdating); if (commandLineArgs.Length >= 2) { var identifier = commandLineArgs[1]; if (identifier.StartsWith("//")) { identifier = identifier.Substring(2); } else if (identifier.StartsWith("ckan://")) { identifier = identifier.Substring(7); } if (identifier.EndsWith("/")) { identifier = identifier.Substring(0, identifier.Length - 1); } log.Debug("Attempting to select mod from startup parameters"); FocusMod(identifier, true, true); ModList.Refresh(); log.Debug("Failed to select mod from startup parameters"); } var pluginsPath = Path.Combine(CurrentInstance.CkanDir(), "Plugins"); if (!Directory.Exists(pluginsPath)) { Directory.CreateDirectory(pluginsPath); } pluginController = new PluginController(pluginsPath); CurrentInstance.RebuildKSPSubDir(); // Initialize navigation. This should be called as late as // possible, once the UI is "settled" from its initial load. NavInit(); log.Info("GUI started"); base.OnLoad(e); }
private void _UpdateModsList(bool markUpdates) { Registry registry = RegistryManager.Instance(KSPManager.CurrentInstance).registry; ModList.Rows.Clear(); List <CkanModule> modules = GetModsByFilter(m_ModFilter); // filter by left menu selection switch (m_ModFilter) { case GUIModFilter.All: break; case GUIModFilter.Installed: modules.RemoveAll(m => !registry.IsInstalled(m.identifier)); break; case GUIModFilter.InstalledUpdateAvailable: modules.RemoveAll ( m => !(registry.IsInstalled(m.identifier) && m.version.IsGreaterThan( registry.InstalledVersion(m.identifier))) ); break; case GUIModFilter.NewInRepository: break; case GUIModFilter.NotInstalled: modules.RemoveAll(m => registry.IsInstalled(m.identifier)); break; case GUIModFilter.Incompatible: break; } // filter by name modules.RemoveAll(m => !m.name.ToLowerInvariant().Contains(m_ModNameFilter.ToLowerInvariant())); foreach (CkanModule mod in modules) { var item = new DataGridViewRow(); item.Tag = mod; bool isInstalled = registry.IsInstalled(mod.identifier); // installed if (m_ModFilter != GUIModFilter.Incompatible) { var installedCell = new DataGridViewCheckBoxCell(); installedCell.Value = isInstalled; item.Cells.Add(installedCell); } else { var installedCell = new DataGridViewTextBoxCell(); installedCell.Value = "-"; item.Cells.Add(installedCell); } // want update if (!isInstalled) { var updateCell = new DataGridViewTextBoxCell(); item.Cells.Add(updateCell); updateCell.ReadOnly = true; updateCell.Value = "-"; } else { bool isUpToDate = !registry.InstalledVersion(mod.identifier).IsLessThan(mod.version); if (!isUpToDate) { var updateCell = new DataGridViewCheckBoxCell(); item.Cells.Add(updateCell); updateCell.ReadOnly = false; } else { var updateCell = new DataGridViewTextBoxCell(); item.Cells.Add(updateCell); updateCell.ReadOnly = true; updateCell.Value = "-"; } } // name var nameCell = new DataGridViewTextBoxCell(); nameCell.Value = mod.name; item.Cells.Add(nameCell); // author var authorCell = new DataGridViewTextBoxCell(); if (mod.author != null) { string authors = ""; for (int i = 0; i < mod.author.Count(); i++) { authors += mod.author[i]; if (i != mod.author.Count() - 1) { authors += ", "; } } authorCell.Value = authors; } else { authorCell.Value = "N/A"; } item.Cells.Add(authorCell); // installed version Version installedVersion = registry.InstalledVersion(mod.identifier); var installedVersionCell = new DataGridViewTextBoxCell(); if (installedVersion != null) { installedVersionCell.Value = installedVersion.ToString(); } else { installedVersionCell.Value = "-"; } item.Cells.Add(installedVersionCell); // latest version Version latestVersion = mod.version; var latestVersionCell = new DataGridViewTextBoxCell(); if (latestVersion != null) { latestVersionCell.Value = latestVersion.ToString(); } else { latestVersionCell.Value = "-"; } item.Cells.Add(latestVersionCell); // KSP version KSPVersion kspVersion = mod.ksp_version; var kspVersionCell = new DataGridViewTextBoxCell(); if (kspVersion != null) { kspVersionCell.Value = kspVersion.ToString(); } else { kspVersionCell.Value = "-"; } item.Cells.Add(kspVersionCell); // description var descriptionCell = new DataGridViewTextBoxCell(); descriptionCell.Value = mod.@abstract; item.Cells.Add(descriptionCell); // homepage var homepageCell = new DataGridViewLinkCell(); if (mod.resources != null && mod.resources.homepage != null) { homepageCell.Value = mod.resources.homepage; } else { homepageCell.Value = "N/A"; } item.Cells.Add(homepageCell); ModList.Rows.Add(item); // sort by name ModList.Sort(ModList.Columns[2], ListSortDirection.Ascending); ModList.Refresh(); } }
protected override void OnLoad(EventArgs e) { Location = m_Configuration.WindowLoc; Size = m_Configuration.WindowSize; if (!m_Configuration.CheckForUpdatesOnLaunchNoNag) { log.Debug("Asking user if they wish for autoupdates"); if (new AskUserForAutoUpdatesDialog().ShowDialog() == DialogResult.OK) { m_Configuration.CheckForUpdatesOnLaunch = true; } m_Configuration.CheckForUpdatesOnLaunchNoNag = true; m_Configuration.Save(); } if (m_Configuration.CheckForUpdatesOnLaunch) { try { log.Info("Making autoupdate call"); AutoUpdate.Instance.FetchLatestReleaseInfo(); var latest_version = AutoUpdate.Instance.LatestVersion; var current_version = new Version(Meta.Version()); if (AutoUpdate.Instance.IsFetched() && latest_version.IsGreaterThan(current_version)) { log.Debug("Found higher ckan version"); var release_notes = AutoUpdate.Instance.ReleaseNotes; var dialog = new NewUpdateDialog(latest_version.ToString(), release_notes); if (dialog.ShowDialog() == DialogResult.OK) { log.Info("Start ckan update"); AutoUpdate.Instance.StartUpdateProcess(true); } } } catch (Exception exception) { m_User.RaiseError("Error in autoupdate: \n\t" + exception.Message + ""); log.Error("Error in autoupdate", exception); } } m_UpdateRepoWorker = new BackgroundWorker { WorkerReportsProgress = false, WorkerSupportsCancellation = true }; m_UpdateRepoWorker.RunWorkerCompleted += PostUpdateRepo; m_UpdateRepoWorker.DoWork += UpdateRepo; m_InstallWorker = new BackgroundWorker { WorkerReportsProgress = true, WorkerSupportsCancellation = true }; m_InstallWorker.RunWorkerCompleted += PostInstallMods; m_InstallWorker.DoWork += InstallMods; m_CacheWorker = new BackgroundWorker { WorkerReportsProgress = true, WorkerSupportsCancellation = true }; m_CacheWorker.RunWorkerCompleted += PostModCaching; m_CacheWorker.DoWork += CacheMod; var old_YesNoDialog = m_User.displayYesNo; m_User.displayYesNo = YesNoDialog; URLHandlers.RegisterURLHandler(m_Configuration, m_User); m_User.displayYesNo = old_YesNoDialog; ApplyToolButton.Enabled = false; CurrentInstanceUpdated(); if (m_Configuration.RefreshOnStartup) { UpdateRepo(); } Text = String.Format("CKAN {0} - KSP {1} -- {2}", Meta.Version(), CurrentInstance.Version(), CurrentInstance.GameDir()); KSPVersionLabel.Text = String.Format("Kerbal Space Program {0}", CurrentInstance.Version()); if (m_CommandLineArgs.Length >= 2) { var identifier = m_CommandLineArgs[1]; if (identifier.StartsWith("//")) { identifier = identifier.Substring(2); } else if (identifier.StartsWith("ckan://")) { identifier = identifier.Substring(7); } if (identifier.EndsWith("/")) { identifier = identifier.Substring(0, identifier.Length - 1); } log.Debug("Attempting to select mod from startup parameters"); FocusMod(identifier, true, true); ModList.Refresh(); log.Debug("Failed to select mod from startup parameters"); } var pluginsPath = Path.Combine(CurrentInstance.CkanDir(), "Plugins"); if (!Directory.Exists(pluginsPath)) { Directory.CreateDirectory(pluginsPath); } m_PluginController = new PluginController(pluginsPath, true); CurrentInstance.RebuildKSPSubDir(); log.Info("GUI started"); base.OnLoad(e); }
private void Main_Load(object sender, EventArgs e) { m_UpdateRepoWorker = new BackgroundWorker { WorkerReportsProgress = false, WorkerSupportsCancellation = true }; m_UpdateRepoWorker.RunWorkerCompleted += PostUpdateRepo; m_UpdateRepoWorker.DoWork += UpdateRepo; m_InstallWorker = new BackgroundWorker { WorkerReportsProgress = true, WorkerSupportsCancellation = true }; m_InstallWorker.RunWorkerCompleted += PostInstallMods; m_InstallWorker.DoWork += InstallMods; UpdateModsList(); m_User.displayYesNo = YesNoDialog; URLHandlers.RegisterURLHandler(m_Configuration, m_User); m_User.displayYesNo = null; ApplyToolButton.Enabled = false; ModList.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells); Text = String.Format("CKAN {0} - KSP {1}", Meta.Version(), CurrentInstance.Version()); KSPVersionLabel.Text = String.Format("Kerbal Space Program {0}", CurrentInstance.Version()); if (m_CommandLineArgs.Length >= 2) { var identifier = m_CommandLineArgs[1]; if (identifier.StartsWith("//")) { identifier = identifier.Substring(2); } else if (identifier.StartsWith("ckan://")) { identifier = identifier.Substring(7); } if (identifier.EndsWith("/")) { identifier = identifier.Substring(0, identifier.Length - 1); } int i = 0; foreach (DataGridViewRow row in ModList.Rows) { var module = ((GUIMod)row.Tag).ToCkanModule(); if (identifier == module.identifier) { ModList.FirstDisplayedScrollingRowIndex = i; row.Selected = true; break; } i++; } } var pluginsPath = Path.Combine(CurrentInstance.CkanDir(), "Plugins"); if (!Directory.Exists(pluginsPath)) { Directory.CreateDirectory(pluginsPath); } m_PluginController = new PluginController(pluginsPath, true); }
protected override void OnLoad(EventArgs e) { enableTls2IfPossible(); Location = m_Configuration.WindowLoc; Size = m_Configuration.WindowSize; if (CurrentInstance.lacksFactorioAuthData()) { m_User.RaiseError( "Your config file located in {0} does not contain Factorio authorization data. Mods from official factorio.com mod portal will not be shown.\n\rYou can fix it by launching Factorio, entering in-game mod manager (mods -> install mods), quitting the game and restarting CFAN.", new object[] { CurrentInstance.getFactorioAuthDataPath() } ); } if (!m_Configuration.CheckForUpdatesOnLaunchNoNag) { log.Debug("Asking user if they wish for autoupdates"); if (new AskUserForAutoUpdatesDialog().ShowDialog() == DialogResult.OK) { m_Configuration.CheckForUpdatesOnLaunch = true; } m_Configuration.CheckForUpdatesOnLaunchNoNag = true; m_Configuration.Save(); } if (m_Configuration.CheckForUpdatesOnLaunch) { try { log.Info("Making autoupdate call"); AutoUpdate.Instance.FetchLatestReleaseInfo(); var latest_version = AutoUpdate.Instance.LatestVersion; var current_version = new CFANVersion(Meta.Version(), ""); if (AutoUpdate.Instance.IsFetched() && latest_version.IsGreaterThan(current_version)) { log.Debug("Found higher cfan version"); var release_notes = AutoUpdate.Instance.ReleaseNotes; var dialog = new NewUpdateDialog(latest_version.ToString(), release_notes); if (dialog.ShowDialog() == DialogResult.OK) { log.Info("Start cfan update"); BackgroundWorker bw = new BackgroundWorker(); bw.DoWork += (sender, args) => AutoUpdate.Instance.StartUpdateProcess(true, PleaseWait.User); bw.RunWorkerAsync(); new PleaseWait().ShowDialog(this); } } } catch (Exception exception) { m_User.RaiseError("Error in autoupdate: \n\t" + exception.Message + ""); log.Error("Error in autoupdate", exception); } } m_UpdateRepoWorker = new BackgroundWorker { WorkerReportsProgress = false, WorkerSupportsCancellation = true }; m_UpdateRepoWorker.RunWorkerCompleted += PostUpdateRepo; m_UpdateRepoWorker.DoWork += UpdateRepo; m_InstallWorker = new BackgroundWorker { WorkerReportsProgress = true, WorkerSupportsCancellation = true }; m_InstallWorker.RunWorkerCompleted += PostInstallMods; m_InstallWorker.DoWork += InstallMods; m_CacheWorker = new BackgroundWorker { WorkerReportsProgress = true, WorkerSupportsCancellation = true }; m_CacheWorker.RunWorkerCompleted += PostModCaching; m_CacheWorker.DoWork += CacheMod; var old_YesNoDialog = m_User.displayYesNo; m_User.displayYesNo = YesNoDialog; //URLHandlers.RegisterURLHandler(m_Configuration, m_User); m_User.displayYesNo = old_YesNoDialog; ApplyToolButton.Enabled = false; CurrentInstanceUpdated(); CheckForConsistency(); if (m_Configuration.RefreshOnStartup) { UpdateRepo(); } Text = String.Format("CFAN {0} - Factorio {1} -- {2}", Meta.Version(), CurrentInstance.Version(), CurrentInstance.GameDir()); KSPVersionLabel.Text = String.Format("Factorio {0}", CurrentInstance.Version()); if (m_CommandLineArgs.Length >= 2) { var identifier = m_CommandLineArgs[1]; if (identifier.StartsWith("//")) { identifier = identifier.Substring(2); } else if (identifier.StartsWith("cfan://")) { identifier = identifier.Substring(7); } if (identifier.EndsWith("/")) { identifier = identifier.Substring(0, identifier.Length - 1); } log.Debug("Attempting to select mod from startup parameters"); FocusMod(identifier, true, true); ModList.Refresh(); log.Debug("Failed to select mod from startup parameters"); } var pluginsPath = Path.Combine(CurrentInstance.CkanDir(), "Plugins"); if (!Directory.Exists(pluginsPath)) { Directory.CreateDirectory(pluginsPath); } m_PluginController = new PluginController(pluginsPath, true); CurrentInstance.RebuildKSPSubDir(); log.Info("GUI started"); base.OnLoad(e); }
private void LabelLinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { var link = sender as LinkLabel; OnChangeFilter?.Invoke(ModList.FilterToSavedSearch(GUIModFilter.CustomLabel, null, link.Tag as ModuleLabel)); }
/// <summary> /// Called on key press when the mod is focused. Scrolls to the first mod /// with name begining with the key pressed. If more than one unique keys are pressed /// in under a second, it searches for the combination of the keys pressed. /// If the same key is being pressed repeatedly, it cycles through mods names /// beginnng with that key. If space is pressed, the checkbox at the current row is toggled. /// </summary> private void ModList_KeyPress(object sender, KeyPressEventArgs e) { var current_row = ModList.CurrentRow; var key = e.KeyChar.ToString(); // Check the key. If it is space and the current row is selected, mark the current mod as selected. if (key == " ") { if (current_row != null && current_row.Selected) { // Get the checkbox. var selected_row_check_box = current_row.Cells["Installed"] as DataGridViewCheckBoxCell; // Invert the value. if (selected_row_check_box != null) { bool selected_value = (bool)selected_row_check_box.Value; selected_row_check_box.Value = !selected_value; } } e.Handled = true; return; } if (e.KeyChar == (char)Keys.Enter) { // Don't try to search for newlines return; } var rows = ModList.Rows.Cast <DataGridViewRow>().Where(row => row.Visible); // Determine time passed since last key press TimeSpan interval = DateTime.Now - this.lastSearchTime; if (interval.TotalSeconds < 1) { // Last keypress was < 1 sec ago, so combine the last and current keys key = this.lastSearchKey + key; } // Remember the current time and key this.lastSearchTime = DateTime.Now; this.lastSearchKey = key; if (key.Distinct().Count() == 1) { // Treat repeating and single keypresses the same key = key.Substring(0, 1); } var current_name = ((GUIMod)current_row.Tag).ToCkanModule().name; var current_match = current_name.StartsWith(key, StringComparison.OrdinalIgnoreCase); DataGridViewRow first_match = null; var does_name_begin_with_key = new Func <DataGridViewRow, bool>(row => { var modname = ((GUIMod)row.Tag).ToCkanModule().name; var row_match = modname.StartsWith(key, StringComparison.OrdinalIgnoreCase); if (row_match && first_match == null) { // Remember the first match to allow cycling back to it if necessary first_match = row; } if (key.Length == 1 && row_match && row.Index <= current_row.Index) { // Keep going forward if it's a single key match and not ahead of the current row return(false); } return(row_match); }); ModList.ClearSelection(); DataGridViewRow match = rows.FirstOrDefault(does_name_begin_with_key); if (match == null && first_match != null) { // If there were no matches after the first match, cycle over to the beginning match = first_match; } if (match != null) { match.Selected = true; // Setting this to the Name cell prevents the checkbox from being toggled // by pressing Space while the row is not indicated as active ModList.CurrentCell = match.Cells[2]; } else { this.AddStatusMessage("Not found"); } e.Handled = true; }
protected override void OnLoad(EventArgs e) { Location = m_Configuration.WindowLoc; Size = m_Configuration.WindowSize; if (!m_Configuration.CheckForUpdatesOnLaunchNoNag) { log.Debug("Asking user if they wish for autoupdates"); if (new AskUserForAutoUpdatesDialog().ShowDialog() == DialogResult.OK) { m_Configuration.CheckForUpdatesOnLaunch = true; } m_Configuration.CheckForUpdatesOnLaunchNoNag = true; m_Configuration.Save(); } if (m_Configuration.CheckForUpdatesOnLaunch) { try { log.Info("Making autoupdate call"); var latest_version = AutoUpdate.FetchLatestCkanVersion(); var current_version = new Version(Meta.Version()); if (latest_version.IsGreaterThan(current_version)) { log.Debug("Found higher ckan version"); var release_notes = AutoUpdate.FetchLatestCkanVersionReleaseNotes(); var dialog = new NewUpdateDialog(latest_version.ToString(), release_notes); if (dialog.ShowDialog() == DialogResult.OK) { log.Info("Start ckan update"); AutoUpdate.StartUpdateProcess(true); } } } catch (Exception exception) { m_User.RaiseError("Error in autoupdate: \n\t" + exception.Message + ""); log.Error("Error in autoupdate", exception); } } m_UpdateRepoWorker = new BackgroundWorker { WorkerReportsProgress = false, WorkerSupportsCancellation = true }; m_UpdateRepoWorker.RunWorkerCompleted += PostUpdateRepo; m_UpdateRepoWorker.DoWork += UpdateRepo; m_InstallWorker = new BackgroundWorker { WorkerReportsProgress = true, WorkerSupportsCancellation = true }; m_InstallWorker.RunWorkerCompleted += PostInstallMods; m_InstallWorker.DoWork += InstallMods; UpdateModsList(); m_User.displayYesNo = YesNoDialog; URLHandlers.RegisterURLHandler(m_Configuration, m_User); m_User.displayYesNo = null; ApplyToolButton.Enabled = false; CurrentInstanceUpdated(); ModList.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells); if (m_CommandLineArgs.Length >= 2) { var identifier = m_CommandLineArgs[1]; if (identifier.StartsWith("//")) { identifier = identifier.Substring(2); } else if (identifier.StartsWith("ckan://")) { identifier = identifier.Substring(7); } if (identifier.EndsWith("/")) { identifier = identifier.Substring(0, identifier.Length - 1); } int i = 0; log.Debug("Attempting to select mod from startup parameters"); foreach (DataGridViewRow row in ModList.Rows) { var module = ((GUIMod)row.Tag).ToCkanModule(); if (identifier == module.identifier) { ModList.FirstDisplayedScrollingRowIndex = i; row.Selected = true; break; } i++; } log.Debug("Failed to select mod from startup parameters"); } var pluginsPath = Path.Combine(CurrentInstance.CkanDir(), "Plugins"); if (!Directory.Exists(pluginsPath)) { Directory.CreateDirectory(pluginsPath); } m_PluginController = new PluginController(pluginsPath, true); log.Info("GUI started"); base.OnLoad(e); }