private void addFlagOverride(FVariable flag, bool init = false) { string key = flag.Key; if (!overrideRowLookup.ContainsKey(key)) { RegistryKey editor = flagRegistry.GetSubKey(key); flag.SetEditor(editor); if (!init && flag.Type.EndsWith("Flag", Program.StringFormat) && !flag.Custom) { if (bool.TryParse(flag.Value, out bool value)) { string str = (!value) .ToString(Program.Format) .ToLower(Program.Format); flag.SetValue(str); } } DataRow row = overrideTable.Rows.Add ( flag.Name, flag.Type, flag.Value.ToLower(Program.Format) ); overrideRowLookup.Add(key, row); } overrideStatus.Text = OVERRIDE_STATUS_ON; overrideStatus.ForeColor = Color.Red; if (!init) { // Find the row that corresponds to the flag we added. var query = overrideDataGridView.Rows .Cast <DataGridViewRow>() .Where(rowMatchesSelectedRow); if (query.Any()) { // Select it. var overrideRow = query.First(); overrideDataGridView.CurrentCell = overrideRow.Cells[0]; } // Clear last custom flag. lastCustomFlag = null; // Switch to the overrides tab. tabs.SelectedTab = overridesTab; } }
private void addFlagOverride(FVariable flag, bool init = false) { string key = flag.Key; if (!overrideRowLookup.ContainsKey(key)) { RegistryKey editor = flagRegistry.GetSubKey(key); flag.SetEditor(editor); DataRow row = overrideTable.Rows.Add ( flag.Name, flag.Type, flag.Value ); overrideRowLookup.Add(key, row); } overrideStatus.Text = OVERRIDE_STATUS_ON; overrideStatus.ForeColor = Color.Red; if (!init) { // Find the row that corresponds to the flag we added. var query = overrideDataGridView.Rows .Cast <DataGridViewRow>() .Where(rowMatchesSelectedRow); if (query.Count() > 0) { // Select it. var overrideRow = query.First(); overrideDataGridView.CurrentCell = overrideRow.Cells[0]; } // Switch to the overrides tab. tabs.SelectedTab = overridesTab; } }
private async void initializeEditor() { string localAppData = Environment.GetEnvironmentVariable("LocalAppData"); string settingsDir = Path.Combine(localAppData, "Roblox", "ClientSettings"); string settingsPath = Path.Combine(settingsDir, "StudioAppSettings.json"); string lastExecVersion = versionRegistry.GetString("LastExecutedVersion"); string versionGuid = versionRegistry.GetString("VersionGuid"); if (lastExecVersion != versionGuid) { // Reset the settings file. Directory.CreateDirectory(settingsDir); File.WriteAllText(settingsPath, ""); // Create some system events for studio so we can hide the splash screen. SystemEvent start = new SystemEvent("FFlagExtract"); SystemEvent show = new SystemEvent("NoSplashScreen"); // Run Roblox Studio briefly so we can update the settings file. ProcessStartInfo studioStartInfo = new ProcessStartInfo() { FileName = StudioBootstrapper.GetStudioPath(), Arguments = $"-startEvent {start.Name} -showEvent {show.Name}" }; Process studio = Process.Start(studioStartInfo); await start.WaitForEvent(); FileInfo info = new FileInfo(settingsPath); // Wait for the settings path to be written. while (info.Length == 0) { await Task.Delay(30); info.Refresh(); } // Nuke studio and flag the version we updated with. versionRegistry.SetValue("LastExecutedVersion", versionGuid); studio.Kill(); } // Initialize flag browser string[] flagNames = flagRegistry.GetSubKeyNames(); string settings = File.ReadAllText(settingsPath); var json = Program.ReadJsonDictionary(settings); int numFlags = json.Count; var flagSetup = new List <FVariable>(numFlags); var autoComplete = new AutoCompleteStringCollection(); foreach (var pair in json) { string key = pair.Key, value = pair.Value; FVariable flag = new FVariable(key, value); autoComplete.Add(flag.Name); flagSetup.Add(flag); if (flagNames.Contains(flag.Name)) { // Update what the flag should be reset to if removed? RegistryKey flagKey = flagRegistry.GetSubKey(flag.Name); flagKey.SetValue("Reset", value); // Set the flag's editor. flag.SetEditor(flagKey); } } flagSearchFilter.AutoCompleteCustomSource = autoComplete; allFlags = flagSetup .OrderBy(flag => flag.Name) .ToList(); refreshFlags(); // Initialize override table. overrideTable = new DataTable(); foreach (DataGridViewColumn column in overrideDataGridView.Columns) { overrideTable.Columns.Add(column.DataPropertyName); } DataView overrideView = new DataView(overrideTable); overrideView.Sort = "Name"; foreach (string flagName in flagNames) { if (flagLookup.ContainsKey(flagName)) { int index = flagLookup[flagName]; FVariable flag = flags[index]; addFlagOverride(flag, true); } } overrideStatus.Visible = true; overrideDataGridView.DataSource = overrideView; }