public AutoPriorities_Dialog() : base()
        {
            doCloseButton = true;
            draggable     = true;
            resizeable    = true;
            _scrollPos    = new Vector2();
            PrioritiesEncounteredCached = new HashSet <int>();
            _openedOnce = false;

            PawnsData          = new PawnsData();
            PrioritiesAssigner = new PrioritiesAssigner();
        }
        public override void DoWindowContents(Rect inRect)
        {
            var worktypes = PawnsData.SortedPawnFitnessForEveryWork.Count;

            var scrollRect = new Rect(inRect.xMin, inRect.yMin, inRect.width,
                                      inRect.height - _distFromBottomBorder);

            var tableSizeX  = (worktypes + 1) * _sliderMargin + _slidersDistFromLeftBorder + _slidersDistFromRightBorder;
            var scrollWidth = tableSizeX > inRect.width ? tableSizeX : inRect.width;

            var tableSizeY   = (_sliderHeight + 3 * _buttonHeight) * PawnsData.WorkTables.Count;
            var scrollHeight = tableSizeY > scrollRect.height ? tableSizeY : inRect.height;

            Widgets.BeginScrollView(scrollRect, ref _scrollPos, new Rect(0, 0, scrollWidth, scrollHeight));

            PrioritiesEncounteredCached.Clear();
            int row        = 0;
            var workTables = PawnsData.WorkTables;

            for (var table = 0; table < workTables.Count; table++)
            {
                var pr      = PawnsData.WorkTables[table];
                var colOrig = GUI.color;
                //shadow repeating priorities
                if (PrioritiesEncounteredCached.Contains(pr.priority))
                {
                    GUI.color = colOrig * _guiShadowedMult;
                }

                var slidersRect = new Rect(
                    _slidersDistFromLeftBorder,
                    (_sliderHeight + 3 * _buttonHeight) * row,
                    tableSizeX + _slidersDistFromRightBorder,
                    _sliderHeight + 3 * _buttonHeight + 5f
                    );

                //draw bottom line
                Widgets.DrawLine(new Vector2(slidersRect.xMin, slidersRect.yMax),
                                 new Vector2(slidersRect.xMax, slidersRect.yMax), new Color(0.7f, 0.7f, 0.7f), 1f);

                var priorityButtonRect = new Rect(slidersRect.xMin, slidersRect.yMin + (slidersRect.height / 2f),
                                                  _buttonHeight, _buttonHeight);

                pr.priority = DrawUtil.PriorityBox(slidersRect.xMin, slidersRect.yMin + (slidersRect.height / 2f),
                                                   pr.priority);
                PawnsData.WorkTables[table] = pr;

                int i = 0;
                foreach (var workType in PawnsData.WorkTypes)
                {
                    var workName = workType.labelShort;
                    try
                    {
                        float elementXPos = slidersRect.xMin + _sliderMargin * (i + 1);

                        var labelRect = new Rect(elementXPos - (workName.GetWidthCached() / 2),
                                                 slidersRect.yMin + (i % 2 == 0 ? 0f : 20f) + 10f, 100f, 25f);
                        Widgets.Label(labelRect, workName);

                        var sliderRect     = new Rect(elementXPos, slidersRect.yMin + 60f, _sliderWidth, _sliderHeight);
                        var newSliderValue =
                            GUI.VerticalSlider(sliderRect, (float)pr.workTypes[workType].Value, 1f, 0f);
                        var available = (float)PawnsData.PercentOfColonistsAvailable(workType, pr.priority);
                        newSliderValue = Mathf.Min(available, newSliderValue);

                        var percentsText = Mathf.RoundToInt(newSliderValue * 100f).ToString();
                        var percentsRect = new Rect(
                            sliderRect.xMax - _percentStringWidth / 2,
                            sliderRect.yMax + 3f,
                            _percentStringWidth,
                            25f);

                        Widgets.TextFieldPercent(percentsRect, ref newSliderValue, ref percentsText);
                        newSliderValue = Mathf.Min(available, newSliderValue);

                        pr.workTypes[workType] = new Percent(newSliderValue);
                    }
                    catch (Exception e)
                    {
                        Log.Error($"Error for work type {workName}:");
                        e.LogStackTrace();
                    }

                    i += 1;
                }

                row += 1;
                PrioritiesEncounteredCached.Add(pr.priority);
                //return to normal
                GUI.color = colOrig;
            }

            Widgets.EndScrollView();

            const string label      = "Run AutoPriorities";
            var          buttonRect = new Rect(
                inRect.xMin,
                scrollRect.yMax + 9f,
                label.GetWidthCached() + 10f,
                _buttonHeight);

            if (Widgets.ButtonText(buttonRect, label))
            {
                PawnsData.Rebuild();
                PrioritiesAssigner.AssignPriorities(PawnsData);
                PawnsData.SaveState();
                SoundDefOf.Click.PlayOneShotOnCamera();
            }

            var removePriorityButtonRect = new Rect(
                inRect.xMax - _sliderMargin,
                scrollRect.yMax + 9f,
                _buttonHeight,
                _buttonHeight);

            if (Widgets.ButtonImage(removePriorityButtonRect, Core.Resources._minusIcon))
            {
                RemovePriority();
                SoundDefOf.Click.PlayOneShotOnCamera();
            }

            var addPriorityButtonRect = new Rect(
                removePriorityButtonRect.xMin - StandardMargin - removePriorityButtonRect.width,
                scrollRect.yMax + 9f,
                _buttonHeight,
                _buttonHeight);

            if (Widgets.ButtonImage(addPriorityButtonRect, Core.Resources._plusIcon))
            {
                AddPriority();
                SoundDefOf.Click.PlayOneShotOnCamera();
            }
        }
 public override void PostClose()
 {
     base.PostClose();
     _rect = windowRect;
     PawnsData.SaveState();
 }