/// <summary> /// Get a list of options that have been changed since the objects were set. /// Indeterminate checkboxes are never a change. /// </summary> private Dictionary <int, bool> GetChangedValues() { var d = new Dictionary <int, bool>(); for (var i = 0; i < FlagsTable.Items.Count; i++) { var fh = (FlagHolder)FlagsTable.Items[i]; var cs = FlagsTable.GetItemCheckState(i); if (cs == CheckState.Indeterminate || cs == fh.OriginalValue) { continue; } d.Add(fh.BitValue, cs == CheckState.Checked); } return(d); }
private EditEntityData GetEditEntityDataAction() { var ents = Objects.Where(x => x is Entity || x is World).ToList(); if (!ents.Any()) { return(null); } var action = new EditEntityData(); foreach (var entity in ents) { var entityData = entity.GetEntityData().Clone(); var changed = false; // Updated class if (Class.BackColor == Color.LightGreen) { entityData.Name = Class.Text; changed = true; } // Remove nonexistant properties var nonExistant = entityData.Properties.Where(x => _values.All(y => y.OriginalKey != x.Key)); if (nonExistant.Any()) { changed = true; entityData.Properties.RemoveAll(x => _values.All(y => y.OriginalKey != x.Key)); } // Set updated/new properties foreach (var ent in _values.Where(x => x.IsModified || (x.IsAdded && !x.IsRemoved))) { entityData.SetPropertyValue(ent.OriginalKey, ent.Value); if (!String.IsNullOrWhiteSpace(ent.NewKey) && ent.NewKey != ent.OriginalKey) { var prop = entityData.Properties.FirstOrDefault(x => String.Equals(x.Key, ent.OriginalKey, StringComparison.InvariantCultureIgnoreCase)); if (prop != null && !entityData.Properties.Any(x => String.Equals(x.Key, ent.NewKey, StringComparison.InvariantCultureIgnoreCase))) { prop.Key = ent.NewKey; } } changed = true; } foreach (var ent in _values.Where(x => x.IsRemoved && !x.IsAdded)) { entityData.Properties.RemoveAll(x => x.Key == ent.OriginalKey); changed = true; } // Set flags var flags = Enumerable.Range(0, FlagsTable.Items.Count).Select(x => FlagsTable.GetItemCheckState(x)).ToList(); var entClass = Document.GameData.Classes.FirstOrDefault(x => x.Name == entityData.Name); var spawnFlags = entClass == null ? null : entClass.Properties.FirstOrDefault(x => x.Name == "spawnflags"); var opts = spawnFlags == null ? null : spawnFlags.Options.OrderBy(x => int.Parse(x.Key)).ToList(); if (opts != null && flags.Count == opts.Count) { var beforeFlags = entityData.Flags; for (var i = 0; i < flags.Count; i++) { var val = int.Parse(opts[i].Key); if (flags[i] == CheckState.Unchecked) { entityData.Flags &= ~val; // Switch the flag off if unchecked } else if (flags[i] == CheckState.Checked) { entityData.Flags |= val; // Switch it on if checked } // No change if indeterminate } if (entityData.Flags != beforeFlags) { changed = true; } } if (changed) { action.AddEntity(entity, entityData); } } return(action.IsEmpty() ? null : action); }