mirror of
https://github.com/goatcorp/Dalamud.git
synced 2026-02-16 12:57:44 +01:00
Add italic/bold to font settings and make AXIS as a checkbox in settings window
This commit is contained in:
parent
f3588dfe23
commit
17c77e6bfd
10 changed files with 598 additions and 262 deletions
|
|
@ -57,8 +57,7 @@ namespace Dalamud.Interface.Internal
|
|||
private readonly SwapChainVtableResolver address;
|
||||
private RawDX11Scene? scene;
|
||||
|
||||
private GameFont overwriteDefaultFontFromGameFont = GameFont.Undefined;
|
||||
private GameFontHandle? overwriteDefaultFontFromGameFontHandle;
|
||||
private GameFontHandle? axisFontHandle;
|
||||
|
||||
// can't access imgui IO before first present call
|
||||
private bool lastWantCapture = false;
|
||||
|
|
@ -313,16 +312,7 @@ namespace Dalamud.Interface.Internal
|
|||
if (!this.isRebuildingFonts)
|
||||
{
|
||||
Log.Verbose("[FONT] RebuildFonts() trigger");
|
||||
var configuration = Service<DalamudConfiguration>.Get();
|
||||
if (this.overwriteDefaultFontFromGameFont != configuration.DefaultFontFromGame)
|
||||
{
|
||||
this.overwriteDefaultFontFromGameFont = configuration.DefaultFontFromGame;
|
||||
this.overwriteDefaultFontFromGameFontHandle?.Dispose();
|
||||
if (configuration.DefaultFontFromGame == GameFont.Undefined)
|
||||
this.overwriteDefaultFontFromGameFontHandle = null;
|
||||
else
|
||||
this.overwriteDefaultFontFromGameFontHandle = Service<GameFontManager>.Get().NewFontRef(configuration.DefaultFontFromGame);
|
||||
}
|
||||
this.SetAxisFonts();
|
||||
|
||||
this.isRebuildingFonts = true;
|
||||
this.scene.OnNewRenderFrame += this.RebuildFontsInternal;
|
||||
|
|
@ -342,6 +332,26 @@ namespace Dalamud.Interface.Internal
|
|||
Util.Fatal($"One or more files required by XIVLauncher were not found.\nPlease restart and report this error if it occurs again.\n\n{path}", "Error");
|
||||
}
|
||||
|
||||
private void SetAxisFonts()
|
||||
{
|
||||
var configuration = Service<DalamudConfiguration>.Get();
|
||||
if (configuration.UseAxisFontsFromGame)
|
||||
{
|
||||
var currentFamilyAndSize = GameFontStyle.GetRecommendedFamilyAndSize(GameFontFamily.Axis, this.axisFontHandle?.Style.Size ?? 0f);
|
||||
var expectedFamilyAndSize = GameFontStyle.GetRecommendedFamilyAndSize(GameFontFamily.Axis, 12 * ImGui.GetIO().FontGlobalScale);
|
||||
if (currentFamilyAndSize == expectedFamilyAndSize)
|
||||
return;
|
||||
|
||||
this.axisFontHandle?.Dispose();
|
||||
this.axisFontHandle = Service<GameFontManager>.Get().NewFontRef(new(expectedFamilyAndSize));
|
||||
}
|
||||
else
|
||||
{
|
||||
this.axisFontHandle?.Dispose();
|
||||
this.axisFontHandle = null;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* NOTE(goat): When hooking ReShade DXGISwapChain::runtime_present, this is missing the syncInterval arg.
|
||||
* Seems to work fine regardless, I guess, so whatever.
|
||||
|
|
@ -403,15 +413,7 @@ namespace Dalamud.Interface.Internal
|
|||
this.scene.OnBuildUI += this.Display;
|
||||
this.scene.OnNewInputFrame += this.OnNewInputFrame;
|
||||
|
||||
if (this.overwriteDefaultFontFromGameFont != configuration.DefaultFontFromGame)
|
||||
{
|
||||
this.overwriteDefaultFontFromGameFont = configuration.DefaultFontFromGame;
|
||||
this.overwriteDefaultFontFromGameFontHandle?.Dispose();
|
||||
if (configuration.DefaultFontFromGame == GameFont.Undefined)
|
||||
this.overwriteDefaultFontFromGameFontHandle = null;
|
||||
else
|
||||
this.overwriteDefaultFontFromGameFontHandle = Service<GameFontManager>.Get().NewFontRef(configuration.DefaultFontFromGame);
|
||||
}
|
||||
this.SetAxisFonts();
|
||||
|
||||
this.SetupFonts();
|
||||
|
||||
|
|
@ -591,7 +593,7 @@ namespace Dalamud.Interface.Internal
|
|||
ImGui.GetIO().Fonts.Build();
|
||||
|
||||
gameFontManager.AfterBuildFonts();
|
||||
GameFontManager.CopyGlyphsAcrossFonts(this.overwriteDefaultFontFromGameFontHandle?.Get(), DefaultFont, false, true);
|
||||
GameFontManager.CopyGlyphsAcrossFonts(this.axisFontHandle?.ImFont, DefaultFont, false, true);
|
||||
|
||||
Log.Verbose("[FONT] Invoke OnAfterBuildFonts");
|
||||
this.AfterBuildFonts?.Invoke();
|
||||
|
|
|
|||
|
|
@ -28,8 +28,6 @@ namespace Dalamud.Interface.Internal.Windows
|
|||
private const float MinScale = 0.3f;
|
||||
private const float MaxScale = 2.0f;
|
||||
|
||||
private readonly List<GameFont> validFontChoices;
|
||||
private readonly string[] validFontNames;
|
||||
private readonly string[] languages;
|
||||
private readonly string[] locLanguages;
|
||||
private int langIndex;
|
||||
|
|
@ -40,6 +38,7 @@ namespace Dalamud.Interface.Internal.Windows
|
|||
private bool doCfChatMessage;
|
||||
|
||||
private float globalUiScale;
|
||||
private bool doUseAxisFontsFromGame;
|
||||
private bool doToggleUiHide;
|
||||
private bool doToggleUiHideDuringCutscenes;
|
||||
private bool doToggleUiHideDuringGpose;
|
||||
|
|
@ -69,8 +68,6 @@ namespace Dalamud.Interface.Internal.Windows
|
|||
private bool doButtonsSystemMenu;
|
||||
private bool disableRmtFiltering;
|
||||
|
||||
private int validFontIndex;
|
||||
|
||||
#region Experimental
|
||||
|
||||
private bool doPluginTest;
|
||||
|
|
@ -94,6 +91,7 @@ namespace Dalamud.Interface.Internal.Windows
|
|||
this.doCfChatMessage = configuration.DutyFinderChatMessage;
|
||||
|
||||
this.globalUiScale = configuration.GlobalUiScale;
|
||||
this.doUseAxisFontsFromGame = configuration.UseAxisFontsFromGame;
|
||||
this.doToggleUiHide = configuration.ToggleUiHide;
|
||||
this.doToggleUiHideDuringCutscenes = configuration.ToggleUiHideDuringCutscenes;
|
||||
this.doToggleUiHideDuringGpose = configuration.ToggleUiHideDuringGpose;
|
||||
|
|
@ -116,10 +114,6 @@ namespace Dalamud.Interface.Internal.Windows
|
|||
this.doButtonsSystemMenu = configuration.DoButtonsSystemMenu;
|
||||
this.disableRmtFiltering = configuration.DisableRmtFiltering;
|
||||
|
||||
this.validFontChoices = Enum.GetValues<GameFont>().Where(x => x == GameFont.Undefined || GameFontManager.IsGenericPurposeFont(x)).ToList();
|
||||
this.validFontNames = this.validFontChoices.Select(x => GameFontManager.DescribeFont(x)).ToArray();
|
||||
this.validFontIndex = Math.Max(0, this.validFontChoices.IndexOf(configuration.DefaultFontFromGame));
|
||||
|
||||
this.languages = Localization.ApplicableLangCodes.Prepend("en").ToArray();
|
||||
try
|
||||
{
|
||||
|
|
@ -286,20 +280,19 @@ namespace Dalamud.Interface.Internal.Windows
|
|||
{
|
||||
this.globalUiScale = 1.0f;
|
||||
ImGui.GetIO().FontGlobalScale = this.globalUiScale;
|
||||
Service<InterfaceManager>.Get().RebuildFonts();
|
||||
}
|
||||
|
||||
if (ImGui.DragFloat("##DalamudSettingsGlobalUiScaleDrag", ref this.globalUiScale, 0.005f, MinScale, MaxScale, "%.2f"))
|
||||
{
|
||||
ImGui.GetIO().FontGlobalScale = this.globalUiScale;
|
||||
Service<InterfaceManager>.Get().RebuildFonts();
|
||||
}
|
||||
|
||||
ImGui.TextColored(ImGuiColors.DalamudGrey, Loc.Localize("DalamudSettingsGlobalUiScaleHint", "Scale all XIVLauncher UI elements - useful for 4K displays."));
|
||||
|
||||
ImGuiHelpers.ScaledDummy(10, 16);
|
||||
|
||||
ImGui.Text(Loc.Localize("DalamudSettingsGlobalFont", "Global Font"));
|
||||
ImGui.Combo("##DalamudSettingsGlobalFontDrag", ref this.validFontIndex, this.validFontNames, this.validFontNames.Length);
|
||||
|
||||
ImGuiHelpers.ScaledDummy(10, 16);
|
||||
|
||||
if (ImGui.Button(Loc.Localize("DalamudSettingsOpenStyleEditor", "Open Style Editor")))
|
||||
{
|
||||
Service<DalamudInterface>.Get().OpenStyleEditor();
|
||||
|
|
@ -311,6 +304,9 @@ namespace Dalamud.Interface.Internal.Windows
|
|||
|
||||
ImGui.TextColored(ImGuiColors.DalamudGrey, Loc.Localize("DalamudSettingToggleUiHideOptOutNote", "Plugins may independently opt out of the settings below."));
|
||||
|
||||
ImGui.Checkbox(Loc.Localize("DalamudSettingToggleAxisFonts", "Use AXIS fonts as default Dalamud font"), ref this.doUseAxisFontsFromGame);
|
||||
ImGui.TextColored(ImGuiColors.DalamudGrey, Loc.Localize("DalamudSettingToggleUiAxisFontsHint", "Use AXIS fonts (the game's main UI fonts) as default Dalamud font."));
|
||||
|
||||
ImGui.Checkbox(Loc.Localize("DalamudSettingToggleUiHide", "Hide plugin UI when the game UI is toggled off"), ref this.doToggleUiHide);
|
||||
ImGui.TextColored(ImGuiColors.DalamudGrey, Loc.Localize("DalamudSettingToggleUiHideHint", "Hide any open windows by plugins when toggling the game overlay."));
|
||||
|
||||
|
|
@ -814,7 +810,7 @@ namespace Dalamud.Interface.Internal.Windows
|
|||
configuration.IsFocusManagementEnabled = this.doFocus;
|
||||
configuration.ShowTsm = this.doTsm;
|
||||
|
||||
configuration.DefaultFontFromGame = this.validFontChoices[this.validFontIndex];
|
||||
configuration.UseAxisFontsFromGame = this.doUseAxisFontsFromGame;
|
||||
|
||||
// This is applied every frame in InterfaceManager::CheckViewportState()
|
||||
configuration.IsDisableViewport = !this.doViewport;
|
||||
|
|
@ -858,9 +854,8 @@ namespace Dalamud.Interface.Internal.Windows
|
|||
|
||||
configuration.Save();
|
||||
|
||||
Service<InterfaceManager>.Get().RebuildFonts();
|
||||
|
||||
_ = Service<PluginManager>.Get().ReloadPluginMastersAsync();
|
||||
Service<InterfaceManager>.Get().RebuildFonts();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Numerics;
|
||||
|
|
@ -8,6 +8,7 @@ using Dalamud.Game;
|
|||
using Dalamud.Game.ClientState;
|
||||
using Dalamud.Game.Gui;
|
||||
using Dalamud.Interface.Animation.EasingFunctions;
|
||||
using Dalamud.Interface.GameFonts;
|
||||
using Dalamud.Interface.Windowing;
|
||||
using ImGuiNET;
|
||||
using ImGuiScene;
|
||||
|
|
@ -19,6 +20,7 @@ namespace Dalamud.Interface.Internal.Windows
|
|||
/// </summary>
|
||||
internal class TitleScreenMenuWindow : Window, IDisposable
|
||||
{
|
||||
private const float TargetFontSize = 16.2f;
|
||||
private readonly TextureWrap shadeTexture;
|
||||
|
||||
private readonly Dictionary<Guid, InOutCubic> shadeEasings = new();
|
||||
|
|
@ -27,6 +29,8 @@ namespace Dalamud.Interface.Internal.Windows
|
|||
|
||||
private InOutCubic? fadeOutEasing;
|
||||
|
||||
private GameFontHandle? axisFontHandle;
|
||||
|
||||
private State state = State.Hide;
|
||||
|
||||
/// <summary>
|
||||
|
|
@ -67,14 +71,19 @@ namespace Dalamud.Interface.Internal.Windows
|
|||
/// <inheritdoc/>
|
||||
public override void PreDraw()
|
||||
{
|
||||
this.SetAxisFonts();
|
||||
ImGui.PushStyleVar(ImGuiStyleVar.ItemSpacing, new Vector2(0, 0));
|
||||
ImGui.PushStyleVar(ImGuiStyleVar.WindowPadding, new Vector2(0, 0));
|
||||
if (this.axisFontHandle?.Available ?? false)
|
||||
ImGui.PushFont(this.axisFontHandle.ImFont);
|
||||
base.PreDraw();
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override void PostDraw()
|
||||
{
|
||||
if (this.axisFontHandle?.Available ?? false)
|
||||
ImGui.PopFont();
|
||||
ImGui.PopStyleVar(2);
|
||||
base.PostDraw();
|
||||
}
|
||||
|
|
@ -90,128 +99,143 @@ namespace Dalamud.Interface.Internal.Windows
|
|||
/// <inheritdoc/>
|
||||
public override void Draw()
|
||||
{
|
||||
ImGui.SetWindowFontScale(1.3f);
|
||||
ImGui.SetWindowFontScale(TargetFontSize / ImGui.GetFont().FontSize * 4 / 3);
|
||||
|
||||
var tsm = Service<TitleScreenMenu>.Get();
|
||||
|
||||
switch (this.state)
|
||||
{
|
||||
case State.Show:
|
||||
{
|
||||
for (var i = 0; i < tsm.Entries.Count; i++)
|
||||
{
|
||||
var entry = tsm.Entries[i];
|
||||
|
||||
if (!this.moveEasings.TryGetValue(entry.Id, out var moveEasing))
|
||||
for (var i = 0; i < tsm.Entries.Count; i++)
|
||||
{
|
||||
moveEasing = new InOutQuint(TimeSpan.FromMilliseconds(400));
|
||||
this.moveEasings.Add(entry.Id, moveEasing);
|
||||
var entry = tsm.Entries[i];
|
||||
|
||||
if (!this.moveEasings.TryGetValue(entry.Id, out var moveEasing))
|
||||
{
|
||||
moveEasing = new InOutQuint(TimeSpan.FromMilliseconds(400));
|
||||
this.moveEasings.Add(entry.Id, moveEasing);
|
||||
}
|
||||
|
||||
if (!moveEasing.IsRunning && !moveEasing.IsDone)
|
||||
{
|
||||
moveEasing.Restart();
|
||||
}
|
||||
|
||||
if (moveEasing.IsDone)
|
||||
{
|
||||
moveEasing.Stop();
|
||||
}
|
||||
|
||||
moveEasing.Update();
|
||||
|
||||
var finalPos = (i + 1) * this.shadeTexture.Height;
|
||||
var pos = moveEasing.Value * finalPos;
|
||||
|
||||
// FIXME(goat): Sometimes, easings can overshoot and bring things out of alignment.
|
||||
if (moveEasing.IsDone)
|
||||
{
|
||||
pos = finalPos;
|
||||
}
|
||||
|
||||
this.DrawEntry(entry, moveEasing.IsRunning && i != 0, true, i == 0, true);
|
||||
|
||||
var cursor = ImGui.GetCursorPos();
|
||||
cursor.Y = (float)pos;
|
||||
ImGui.SetCursorPos(cursor);
|
||||
}
|
||||
|
||||
if (!moveEasing.IsRunning && !moveEasing.IsDone)
|
||||
if (!ImGui.IsWindowHovered(ImGuiHoveredFlags.RootAndChildWindows |
|
||||
ImGuiHoveredFlags.AllowWhenOverlapped |
|
||||
ImGuiHoveredFlags.AllowWhenBlockedByActiveItem))
|
||||
{
|
||||
moveEasing.Restart();
|
||||
this.state = State.FadeOut;
|
||||
}
|
||||
|
||||
if (moveEasing.IsDone)
|
||||
{
|
||||
moveEasing.Stop();
|
||||
}
|
||||
|
||||
moveEasing.Update();
|
||||
|
||||
var finalPos = (i + 1) * this.shadeTexture.Height;
|
||||
var pos = moveEasing.Value * finalPos;
|
||||
|
||||
// FIXME(goat): Sometimes, easings can overshoot and bring things out of alignment.
|
||||
if (moveEasing.IsDone)
|
||||
{
|
||||
pos = finalPos;
|
||||
}
|
||||
|
||||
this.DrawEntry(entry, moveEasing.IsRunning && i != 0, true, i == 0, true);
|
||||
|
||||
var cursor = ImGui.GetCursorPos();
|
||||
cursor.Y = (float)pos;
|
||||
ImGui.SetCursorPos(cursor);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!ImGui.IsWindowHovered(ImGuiHoveredFlags.RootAndChildWindows |
|
||||
ImGuiHoveredFlags.AllowWhenOverlapped |
|
||||
ImGuiHoveredFlags.AllowWhenBlockedByActiveItem))
|
||||
{
|
||||
this.state = State.FadeOut;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case State.FadeOut:
|
||||
{
|
||||
this.fadeOutEasing ??= new InOutCubic(TimeSpan.FromMilliseconds(400))
|
||||
{
|
||||
IsInverse = true,
|
||||
};
|
||||
this.fadeOutEasing ??= new InOutCubic(TimeSpan.FromMilliseconds(400))
|
||||
{
|
||||
IsInverse = true,
|
||||
};
|
||||
|
||||
if (!this.fadeOutEasing.IsRunning && !this.fadeOutEasing.IsDone)
|
||||
{
|
||||
this.fadeOutEasing.Restart();
|
||||
if (!this.fadeOutEasing.IsRunning && !this.fadeOutEasing.IsDone)
|
||||
{
|
||||
this.fadeOutEasing.Restart();
|
||||
}
|
||||
|
||||
if (this.fadeOutEasing.IsDone)
|
||||
{
|
||||
this.fadeOutEasing.Stop();
|
||||
}
|
||||
|
||||
this.fadeOutEasing.Update();
|
||||
|
||||
ImGui.PushStyleVar(ImGuiStyleVar.Alpha, (float)this.fadeOutEasing.Value);
|
||||
|
||||
for (var i = 0; i < tsm.Entries.Count; i++)
|
||||
{
|
||||
var entry = tsm.Entries[i];
|
||||
|
||||
var finalPos = (i + 1) * this.shadeTexture.Height;
|
||||
|
||||
this.DrawEntry(entry, i != 0, true, i == 0, false);
|
||||
|
||||
var cursor = ImGui.GetCursorPos();
|
||||
cursor.Y = finalPos;
|
||||
ImGui.SetCursorPos(cursor);
|
||||
}
|
||||
|
||||
ImGui.PopStyleVar();
|
||||
|
||||
var isHover = ImGui.IsWindowHovered(ImGuiHoveredFlags.RootAndChildWindows |
|
||||
ImGuiHoveredFlags.AllowWhenOverlapped |
|
||||
ImGuiHoveredFlags.AllowWhenBlockedByActiveItem);
|
||||
|
||||
if (!isHover && this.fadeOutEasing!.IsDone)
|
||||
{
|
||||
this.state = State.Hide;
|
||||
this.fadeOutEasing = null;
|
||||
}
|
||||
else if (isHover)
|
||||
{
|
||||
this.state = State.Show;
|
||||
this.fadeOutEasing = null;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if (this.fadeOutEasing.IsDone)
|
||||
{
|
||||
this.fadeOutEasing.Stop();
|
||||
}
|
||||
|
||||
this.fadeOutEasing.Update();
|
||||
|
||||
ImGui.PushStyleVar(ImGuiStyleVar.Alpha, (float)this.fadeOutEasing.Value);
|
||||
|
||||
for (var i = 0; i < tsm.Entries.Count; i++)
|
||||
{
|
||||
var entry = tsm.Entries[i];
|
||||
|
||||
var finalPos = (i + 1) * this.shadeTexture.Height;
|
||||
|
||||
this.DrawEntry(entry, i != 0, true, i == 0, false);
|
||||
|
||||
var cursor = ImGui.GetCursorPos();
|
||||
cursor.Y = finalPos;
|
||||
ImGui.SetCursorPos(cursor);
|
||||
}
|
||||
|
||||
ImGui.PopStyleVar();
|
||||
|
||||
var isHover = ImGui.IsWindowHovered(ImGuiHoveredFlags.RootAndChildWindows |
|
||||
ImGuiHoveredFlags.AllowWhenOverlapped |
|
||||
ImGuiHoveredFlags.AllowWhenBlockedByActiveItem);
|
||||
|
||||
if (!isHover && this.fadeOutEasing!.IsDone)
|
||||
{
|
||||
this.state = State.Hide;
|
||||
this.fadeOutEasing = null;
|
||||
}
|
||||
else if (isHover)
|
||||
{
|
||||
this.state = State.Show;
|
||||
this.fadeOutEasing = null;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case State.Hide:
|
||||
{
|
||||
if (this.DrawEntry(tsm.Entries[0], true, false, true, true))
|
||||
{
|
||||
this.state = State.Show;
|
||||
}
|
||||
if (this.DrawEntry(tsm.Entries[0], true, false, true, true))
|
||||
{
|
||||
this.state = State.Show;
|
||||
}
|
||||
|
||||
this.moveEasings.Clear();
|
||||
this.logoEasings.Clear();
|
||||
this.shadeEasings.Clear();
|
||||
break;
|
||||
}
|
||||
this.moveEasings.Clear();
|
||||
this.logoEasings.Clear();
|
||||
this.shadeEasings.Clear();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void SetAxisFonts()
|
||||
{
|
||||
var configuration = Service<DalamudConfiguration>.Get();
|
||||
if (configuration.UseAxisFontsFromGame)
|
||||
{
|
||||
if (this.axisFontHandle == null)
|
||||
this.axisFontHandle = Service<GameFontManager>.Get().NewFontRef(new(GameFontFamily.Axis, TargetFontSize));
|
||||
}
|
||||
else
|
||||
{
|
||||
this.axisFontHandle?.Dispose();
|
||||
this.axisFontHandle = null;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue