private void DrawEntryHoverMenu(Rect entryRect, SettingHandle handle)
        {
            var topRight = new Vector2(
                entryRect.x + entryRect.width / 2f - HandleEntryPadding,
                entryRect.y + entryRect.height / 2f - ModSettingsWidgets.HoverMenuHeight / 2f
                );
            var includeResetEntry   = handle.CanBeReset && !handle.Unsaved;
            var menuHasExtraOptions = handle.ContextMenuEntries != null;
            var menuEnabled         = includeResetEntry || menuHasExtraOptions;
            var menuButtonClicked   = ModSettingsWidgets.DrawHandleHoverMenu(
                topRight, handle.Description, menuEnabled, menuHasExtraOptions);

            if (menuButtonClicked)
            {
                OpenHandleContextMenu();
            }

            void OpenHandleContextMenu()
            {
                var resetOptionLabel = handle.CanBeReset ? "HugsLib_settings_resetValue".Translate() : null;

                ModSettingsWidgets.OpenExtensibleContextMenu(resetOptionLabel,
                                                             () => ResetSettingHandles(handle), delegate {}, handle.ContextMenuEntries);
            }
        }
        // draws the header with the name of the mod
        private void DrawModEntryHeader(ModEntry entry, float width, ref float curY)
        {
            if (entry.ModName.NullOrEmpty())
            {
                return;
            }
            var entryTitleRect = new Rect(0f, curY, width, ModEntryLabelHeight);
            var mouseOverTitle = Mouse.IsOver(entryTitleRect);

            if (mouseOverTitle)
            {
                Widgets.DrawHighlight(entryTitleRect);
            }
            var labelRect = entryTitleRect.ContractedBy(ModEntryLabelPadding);

            Text.Font = GameFont.Medium;
            Widgets.Label(labelRect, entry.ModName);
            Text.Font = GameFont.Small;

            var entryButtonsTopRight = new Vector2(width, curY);
            var activateButtonWidth  = DrawActivateEntryButton(entryButtonsTopRight);

            DrawFloatMenuButton(new Vector2(entryButtonsTopRight.x - activateButtonWidth, entryButtonsTopRight.y));

            curY += ModEntryLabelHeight;
            var color = GUI.color;

            GUI.color = ModEntryLineColor;
            Widgets.DrawLineHorizontal(0f, curY, width);
            GUI.color = color;
            curY     += ModEntryLabelPadding;

            float DrawActivateEntryButton(Vector2 topRight)
            {
                if (entry.SettingsPack == null || !entry.SettingsPack.AlwaysExpandEntry)
                {
                    var         isExpanded = expandedModEntries.Contains(entry);
                    CachedLabel buttonLabel;
                    var         isVanillaEntry = entry.SettingsPack == null;
                    float       toggleButtonWidth;
                    if (isVanillaEntry)
                    {
                        buttonLabel       = labelShowVanillaSettings;
                        toggleButtonWidth = labelShowVanillaSettings.Size.x + ModEntryExpandButtonPadding;
                    }
                    else
                    {
                        buttonLabel       = isExpanded ? labelCollapseModEntry : labelExpandModEntry;
                        toggleButtonWidth = expandableToggleButtonWidth;
                    }
                    var buttonRect = new Rect(topRight.x - (toggleButtonWidth + ModEntryLabelPadding),
                                              topRight.y + (ModEntryLabelHeight - ModEntryShowSettingsButtonHeight) / 2f,
                                              toggleButtonWidth, ModEntryShowSettingsButtonHeight);
                    if (Widgets.ButtonText(buttonRect, buttonLabel))
                    {
                        if (isVanillaEntry)
                        {
                            Find.WindowStack.Add(new Dialog_VanillaModSettings(entry.VanillaMod));
                        }
                        else
                        {
                            if (isExpanded)
                            {
                                expandedModEntries.Remove(entry);
                            }
                            else
                            {
                                expandedModEntries.Add(entry);
                            }
                        }
                    }
                    return(topRight.x - buttonRect.x);
                }
                return(0f);
            }

            void DrawFloatMenuButton(Vector2 topRight)
            {
                if (!mouseOverTitle)
                {
                    return;
                }
                var buttonTopRight = new Vector2(topRight.x - ModEntryLabelPadding,
                                                 topRight.y + (ModEntryLabelHeight - ModSettingsWidgets.HoverMenuHeight) / 2f);
                var hasExtraMenuEntries = entry.SettingsPack?.ContextMenuEntries != null;

                if (ModSettingsWidgets.DrawHoverMenuButton(
                        buttonTopRight, entry.HasContextMenuEntries, hasExtraMenuEntries))
                {
                    OpenModEntryContextMenu();
                }

                void OpenModEntryContextMenu()
                {
                    var resetOptionLabel =
                        entry.SettingsPack.CanBeReset ? "HugsLib_settings_resetMod".Translate(entry.ModName) : null;

                    ModSettingsWidgets.OpenExtensibleContextMenu(resetOptionLabel,
                                                                 OnResetOptionSelected, delegate {}, entry.SettingsPack.ContextMenuEntries);
                }

                void OnResetOptionSelected()
                {
                    ShowResetPrompt("HugsLib_settings_resetMod_prompt".Translate(entry.ModName),
                                    entry.SettingsPack.Handles);
                }
            }
        }