private void OnFeaturePropensityUpdated(object sender, UpdateFeaturePropensityEventArgs args)
        {
            Debugger.Assert(
                () =>
            {
                MaidInfo maid = SelectedMaid;
                if (maid == null)
                {
                    return;
                }

                if (args.CallerMaid != maid.Maid)
                {
                    return;
                }

                if (args.UpdateFeature)
                {
                    Debugger.WriteLine(LogLevel.Info, "Updating all features!");
                    for (Feature e = Feature.Null + 1; e < EnumHelper.MaxFeature; e++)
                    {
                        maid.UpdateMiscStatus(MaidChangeType.Feature, (int)e);
                    }
                }
                else if (args.UpdatePropensity)
                {
                    Debugger.WriteLine(LogLevel.Info, "Updating all propensities!");
                    for (Propensity e = Propensity.Null + 1; e < EnumHelper.MaxPropensity; e++)
                    {
                        maid.UpdateMiscStatus(MaidChangeType.Propensity, (int)e);
                    }
                }
            },
                "Failed to update maid features/propensities");
        }
        private void OnStatusUpdated(object sender, StatusUpdateEventArgs args)
        {
            MaidInfo maid = SelectedMaid;

            if (maid == null)
            {
                return;
            }

            if (args.CallerMaid != maid.Maid)
            {
                return;
            }

            Debugger.WriteLine(
                LogLevel.Info,
                $"Updating {EnumHelper.GetName(args.Tag)}.{(args.Tag == MaidChangeType.Feature ? Translation.GetTranslation(EnumHelper.GetName((Feature) args.EnumVal)) : Translation.GetTranslation(EnumHelper.GetName((Propensity) args.EnumVal)))} to {args.Value}...");

            maid.UpdateMiscStatus(args.Tag, args.EnumVal, args.Value);
        }
        private void OnPropensityChecked(object sender, ItemCheckEventArgs e)
        {
            if (clearingTables)
            {
                return;
            }

            MaidInfo maid = SelectedMaid;

            if (maid == null)
            {
                return;
            }

            if (!updatePropensity)
            {
                maid.Maid.Param.SetPropensity((Propensity)(e.Index + 1), e.NewValue == CheckState.Checked);
                maid.UpdateMiscStatus(MaidChangeType.Propensity, e.Index + 1);
            }
            updatePropensity = false;
        }
        private void OnFeatureChecked(object sender, ItemCheckEventArgs e)
        {
            if (clearingTables)
            {
                return;
            }

            MaidInfo maid = SelectedMaid;

            if (maid == null)
            {
                return;
            }

            if (!updateFeature)
            {
                maid.Maid.Param.SetFeature((Feature)(e.Index + 1), e.NewValue == CheckState.Checked);
                maid.UpdateMiscStatus(MaidChangeType.Feature, e.Index + 1);
            }
            updateFeature = false;
        }