help messages

This commit is contained in:
iisaev committed 2026-10-24 22:20:39 +03:00
1 parent dd465cc093
commit b6c61ea3df
20 files changed
+659 -5

No files matched your search

+21 -3
View File
@@ -199,6 +199,13 @@ namespace Mods.ModManager
_newGame.Text = TranslationServer.Translate("mod_manager/collection_new_game");
_pillProblems.Text = TranslationServer.Translate("mod_manager/collection_problems");
_pillPlan.Text = TranslationServer.Translate("mod_manager/collection_plan");
_close.TooltipText = _close.Text;
_refresh.TooltipText = _refresh.Text;
_addMechanic.TooltipText = _addMechanic.Text;
_newGame.TooltipText = _newGame.Text;
_gameSelect.TooltipText = TranslationServer.Translate("mod_manager/collection_game_tooltip");
_pillProblems.TooltipText = TranslationServer.Translate("mod_manager/collection_problems_tooltip");
_pillPlan.TooltipText = TranslationServer.Translate("mod_manager/collection_plan_tooltip");
_dirty.Text = TranslationServer.Translate("mod_manager/collection_unsaved");
_json.Text = TranslationServer.Translate("mod_manager/collection_json");
_reset.Text = TranslationServer.Translate("mod_manager/collection_reset");
@@ -206,15 +213,23 @@ namespace Mods.ModManager
_tabInspector.Text = TranslationServer.Translate("mod_manager/collection_tab_inspector");
_tabProblems.Text = TranslationServer.Translate("mod_manager/collection_tab_problems");
_tabPlan.Text = TranslationServer.Translate("mod_manager/collection_tab_plan");
_json.TooltipText = TranslationServer.Translate("mod_manager/collection_json_tooltip");
_reset.TooltipText = TranslationServer.Translate("mod_manager/collection_reset_tooltip");
_save.TooltipText = _save.Text;
_tabInspector.TooltipText = _tabInspector.Text;
_tabProblems.TooltipText = _tabProblems.Text;
_tabPlan.TooltipText = _tabPlan.Text;
_apply.Text = TranslationServer.Translate("mod_manager/collection_apply");
_edgesToggle.Text = TranslationServer.Translate("mod_manager/collection_links");
_apply.TooltipText = _apply.Text;
_edgesToggle.TooltipText = _edgesToggle.Text;
var header = _json.GetParent();
_savesInfo = new Label { VerticalAlignment = VerticalAlignment.Center };
_savesInfo.AddThemeColorOverride("font_color", UiTokens.Muted);
_duplicate = new Button { Text = TranslationServer.Translate("mod_manager/collection_duplicate") };
_revert = new Button { Text = TranslationServer.Translate("mod_manager/collection_revert") };
_delete = new Button { Text = TranslationServer.Translate("mod_manager/collection_delete") };
_duplicate = new Button { Text = TranslationServer.Translate("mod_manager/collection_duplicate"), TooltipText = TranslationServer.Translate("mod_manager/collection_duplicate") };
_revert = new Button { Text = TranslationServer.Translate("mod_manager/collection_revert"), TooltipText = TranslationServer.Translate("mod_manager/collection_revert") };
_delete = new Button { Text = TranslationServer.Translate("mod_manager/collection_delete"), TooltipText = TranslationServer.Translate("mod_manager/collection_delete") };
foreach (var control in new Control[] { _savesInfo, _duplicate, _revert, _delete })
{
header.AddChild(control);
@@ -303,10 +318,12 @@ namespace Mods.ModManager
row.AddChild(UiKit.Spacer());
_buildManager = UiKit.Button(TranslationServer.Translate("mod_manager/build_open_manager"));
_buildManager.TooltipText = _buildManager.Text;
_buildManager.Pressed += () => OpenManagerRequested?.Invoke(null);
row.AddChild(_buildManager);
_buildApply = UiKit.Button(TranslationServer.Translate("mod_manager/collection_apply"), ButtonKind.Primary);
_buildApply.TooltipText = _buildApply.Text;
_buildApply.Pressed += OnApplyPressed;
row.AddChild(_buildApply);
}
@@ -1078,6 +1095,7 @@ namespace Mods.ModManager
private Button MakeInspectorButton(string text, Action action, bool danger = false)
{
var button = UiKit.Button(text, danger ? ButtonKind.Danger : ButtonKind.Secondary);
button.TooltipText = text;
button.AddThemeFontSizeOverride("font_size", UiTokens.FontSmall);
button.Pressed += action;
return button;
+56
View File
@@ -35,6 +35,7 @@ namespace Mods.ModManager
private const string TabCollections = "collections";
private const string ModsScene = "scenes/mod_manager_screen.tscn";
private const string EditorScene = "scenes/mod_collections_screen.tscn";
private const string HelpScene = "scenes/components/mod_help_panel.tscn";
/// <summary>Active tab, remembered for the whole game session (mockup: "state is remembered").</summary>
private static string _activeTab = TabMods;
@@ -53,6 +54,8 @@ namespace Mods.ModManager
private ModManagerScreen _mods;
private CollectionsGallery _gallery;
private ModCollectionsScreen _editor;
private ModHelpPanel _help;
private Button _helpButton;
private bool _editorOpen;
/// <summary>Mods installed this session, shared by the gallery and the editor so both stay honest before a restart.</summary>
@@ -66,6 +69,7 @@ namespace Mods.ModManager
BuildHeader();
BuildBanner();
BuildBody();
BuildHelp();
ShowTab(_activeTab);
}
@@ -99,12 +103,14 @@ namespace Mods.ModManager
_tabMods.ToggleMode = true;
_tabMods.ButtonGroup = group;
_tabMods.Pressed += () => ShowTab(TabMods);
_tabMods.TooltipText = _tabMods.Text;
_segment.AddChild(_tabMods);
_tabCollections = UiKit.Button(TranslationServer.Translate("mod_manager/hub_tab_collections"), ButtonKind.Tab);
_tabCollections.ToggleMode = true;
_tabCollections.ButtonGroup = group;
_tabCollections.Pressed += () => ShowTab(TabCollections);
_tabCollections.TooltipText = _tabCollections.Text;
_segment.AddChild(_tabCollections);
header.AddChild(UiKit.Spacer());
@@ -116,11 +122,54 @@ namespace Mods.ModManager
SizeFlagsVertical = Control.SizeFlags.ShrinkCenter,
};
_gallerySearch.TextChanged += OnGallerySearchChanged;
_gallerySearch.TooltipText = _gallerySearch.PlaceholderText;
header.AddChild(_gallerySearch);
_galleryRefresh = UiKit.Button(TranslationServer.Translate("mod_manager/refresh"));
_galleryRefresh.Pressed += OnGalleryRefreshPressed;
_galleryRefresh.TooltipText = _galleryRefresh.Text;
header.AddChild(_galleryRefresh);
_helpButton = UiKit.IconButton("?", TranslationServer.Translate("mod_manager/help_open"));
_helpButton.Name = "HelpButton";
_helpButton.Pressed += OnHelpPressed;
header.AddChild(_helpButton);
}
/// <summary>
/// Builds the full-screen help overlay once; it stays hidden until the
/// header's "?" button opens the page of the level the player is on.
/// </summary>
private void BuildHelp()
{
_help = TscnScenes.LoadAndBuild(HelpScene) as ModHelpPanel;
if (_help == null)
{
GameLogger.Log("MOD_HUB", $"Failed to build '{HelpScene}'", LogLevel.Error);
return;
}
AddChild(_help);
_help.SetAnchorsAndOffsetsPreset(LayoutPreset.FullRect);
_help.EnsureConstructed();
_help.Visible = false;
}
private void OnHelpPressed()
{
_help?.Open(CurrentHelpLevel());
}
/// <summary>The help page follows the hub level: the mods grid, an open mod page, the collections gallery or the scheme editor.</summary>
private string CurrentHelpLevel()
{
if (_editorOpen)
return "scheme";
if (_activeTab == TabCollections)
return "collections";
if (ModOpen)
return "mod_page";
return "mods";
}
private void BuildBanner()
@@ -363,6 +412,13 @@ namespace Mods.ModManager
if (!@event.IsActionPressed("ui_cancel"))
return;
if (_help != null && _help.Visible)
{
_help.Close();
GetViewport().SetInputAsHandled();
return;
}
if (_editorOpen)
{
ShowGallery();
+4
View File
@@ -117,6 +117,7 @@ namespace Mods.ModManager
_bannerLabel = GetNode<Label>("Margin/Root/Banner/BannerLabel");
close.Text = TranslationServer.Translate("mod_manager/back");
close.TooltipText = close.Text;
title.Text = TranslationServer.Translate("mod_manager/title");
if (Embedded)
{
@@ -126,13 +127,16 @@ namespace Mods.ModManager
title.Visible = false;
}
_search.PlaceholderText = TranslationServer.Translate("mod_manager/search_placeholder");
_search.TooltipText = _search.PlaceholderText;
_refreshButton.Text = TranslationServer.Translate("mod_manager/refresh");
_refreshButton.TooltipText = _refreshButton.Text;
_resultLabel.AddThemeColorOverride("font_color", UiTokens.Muted);
_sort.AddItem(TranslationServer.Translate("mod_manager/sort_name"));
_sort.AddItem(TranslationServer.Translate("mod_manager/sort_author"));
_sort.AddItem(TranslationServer.Translate("mod_manager/sort_status"));
_sort.Selected = (int)_filter.Sort;
_sort.TooltipText = TranslationServer.Translate("mod_manager/sort_tooltip");
_bannerPanel.AddThemeStyleboxOverride("panel", ModManagerTheme.MakeBox(
UiTokens.Alpha(UiTokens.Warning, 0.15f),
+4
View File
@@ -151,6 +151,7 @@ namespace Mods.ModManager
row.AddChild(UiKit.Spacer());
var newGame = UiKit.Button(TranslationServer.Translate("mod_manager/gallery_new_game"), ButtonKind.Primary);
newGame.TooltipText = newGame.Text;
newGame.Pressed += () => NewGameRequested?.Invoke();
row.AddChild(newGame);
_host.AddChild(row);
@@ -401,6 +402,7 @@ namespace Mods.ModManager
button.Disabled = true;
}
button.TooltipText = button.Text;
if (action != null)
button.Pressed += action;
return button;
@@ -409,6 +411,7 @@ namespace Mods.ModManager
private Button BuildEditButton(ModCollectionGameSummary summary)
{
var button = UiKit.Button(TranslationServer.Translate("mod_manager/gallery_edit_scheme"));
button.TooltipText = button.Text;
button.Disabled = _installingId != null;
button.Pressed += () => EditSchemeRequested?.Invoke(summary.Collection.Id);
return button;
@@ -417,6 +420,7 @@ namespace Mods.ModManager
private Button BuildDeleteButton(ModCollectionGameSummary summary)
{
var button = UiKit.Button(TranslationServer.Translate("mod_manager/collection_delete"), ButtonKind.Danger);
button.TooltipText = button.Text;
button.Disabled = _installingId != null;
button.Pressed += () => CollectionDeletion.Confirm(this, summary.Collection, () =>
{
+4
View File
@@ -72,6 +72,8 @@ namespace Mods.ModManager
_author.AddThemeColorOverride("font_color", UiTokens.Muted);
_source.AddThemeColorOverride("font_color", UiTokens.Muted);
// The source tooltip needs hover, while clicks on it must still open the card.
_source.MouseFilter = Control.MouseFilterEnum.Pass;
AddThemeStyleboxOverride("panel", ModManagerTheme.CreateCardStyle(data.IsConflict));
_versions.ItemSelected += OnVersionSelected;
@@ -136,6 +138,7 @@ namespace Mods.ModManager
{
_versions.AddItem("v" + (_data.LocalVersion ?? "—"));
_versions.Disabled = true;
_versions.TooltipText = _versions.GetItemText(0);
return;
}
@@ -211,6 +214,7 @@ namespace Mods.ModManager
_action.Visible = true;
_action.Text = ModActionNames.Translate(kind.Value);
_action.TooltipText = _action.Text;
if (ModActionNames.IsDanger(kind.Value))
CthangoverTheme.ApplyDanger(_action);
+6 -2
View File
@@ -177,6 +177,7 @@ namespace Mods.ModManager
}
_versions.Selected = selectedIndex;
_versions.TooltipText = _versions.GetItemText(selectedIndex);
}
private void BuildActions()
@@ -190,7 +191,7 @@ namespace Mods.ModManager
var primary = ModActions.GetPrimary(_data);
if (primary != null)
{
var button = new Button { Text = ModActionNames.Translate(primary.Value) };
var button = new Button { Text = ModActionNames.Translate(primary.Value), TooltipText = ModActionNames.Translate(primary.Value) };
if (ModActionNames.IsDanger(primary.Value))
CthangoverTheme.ApplyDanger(button);
else
@@ -201,7 +202,7 @@ namespace Mods.ModManager
if (primary != ModActionKind.Delete && _data.IsDeletable)
{
var delete = new Button { Text = ModActionNames.Translate(ModActionKind.Delete) };
var delete = new Button { Text = ModActionNames.Translate(ModActionKind.Delete), TooltipText = ModActionNames.Translate(ModActionKind.Delete) };
CthangoverTheme.ApplyDanger(delete);
delete.Pressed += OnDeletePressed;
_actionsRow.AddChild(delete);
@@ -214,6 +215,9 @@ namespace Mods.ModManager
Text = ModActionNames.Translate(_data.IsDisabled
? ModActionKind.Enable
: ModActionKind.Disable),
TooltipText = ModActionNames.Translate(_data.IsDisabled
? ModActionKind.Enable
: ModActionKind.Disable),
};
if (_data.IsDisabled)
CthangoverTheme.ApplyPrimary(toggle);
+4
View File
@@ -52,9 +52,11 @@ namespace Mods.ModManager
_title.Text = TranslationServer.Translate("mod_manager/filters");
_reset.Text = TranslationServer.Translate("mod_manager/reset_filters");
_reset.TooltipText = TranslationServer.Translate("mod_manager/filters_reset_tooltip");
_statusCaption.Text = TranslationServer.Translate("mod_manager/filter_status");
_categoryCaption.Text = TranslationServer.Translate("mod_manager/filter_categories");
_groupToggle.Text = TranslationServer.Translate("mod_manager/group_by_category");
_groupToggle.TooltipText = _groupToggle.Text;
_groupToggle.ButtonPressed = _state.GroupByCategory;
_statusCaption.AddThemeColorOverride("font_color", UiTokens.Muted);
@@ -78,12 +80,14 @@ namespace Mods.ModManager
{
var count = statusCounts.GetValueOrDefault(pair.Key);
pair.Value.Text = $"{ModStatusNames.Translate(pair.Key)} ({count})";
pair.Value.TooltipText = pair.Value.Text;
}
foreach (var pair in _categoryBoxes)
{
var count = categoryCounts.GetValueOrDefault(pair.Key);
pair.Value.Text = $"{ModCategoryNames.Translate(pair.Key)} ({count})";
pair.Value.TooltipText = pair.Value.Text;
}
}
+54
View File
@@ -0,0 +1,54 @@
namespace Mods.ModManager
{
using Godot;
/// <summary>
/// Full-screen help overlay of the mods hub: one page per hub level — the mods
/// grid, a mod's page, the games gallery and the scheme editor. The layout is the
/// <c>mod_help_panel.tscn</c> prefab (dim backdrop, centred frame, title, body,
/// close button); this class only binds the nodes and fills the texts, so a new
/// page is a locale pair <c>mod_manager/help_&lt;level&gt;_title/_body</c> — no code.
/// Opened by the hub header's help button, closed by the button, a click on the
/// dim or Escape (the hub closes the panel first in its own Escape chain).
/// </summary>
public partial class ModHelpPanel : Cthangover.Mods.Interface.Base.Lists.ModWidget
{
private Label _title;
private RichTextLabel _body;
protected override void Construct()
{
MouseFilter = MouseFilterEnum.Stop;
_title = GetNode<Label>("Center/Frame/Margin/Column/Header/Title");
_body = GetNode<RichTextLabel>("Center/Frame/Margin/Column/Body");
var close = GetNode<Button>("Center/Frame/Margin/Column/Header/Close");
close.Text = TranslationServer.Translate("mod_manager/help_close");
close.TooltipText = TranslationServer.Translate("mod_manager/help_close");
close.Pressed += Close;
var dim = GetNode<ColorRect>("Dim");
dim.GuiInput += OnDimGuiInput;
}
/// <summary>Shows the page of one hub level; the level names match the test driver's: mods, mod_page, collections, scheme.</summary>
public void Open(string level)
{
_title.Text = TranslationServer.Translate($"mod_manager/help_{level}_title");
_body.Text = TranslationServer.Translate($"mod_manager/help_{level}_body");
Visible = true;
}
/// <summary>Hides the overlay; the hub calls this from its Escape chain and the driver checks it.</summary>
public void Close()
{
Visible = false;
}
private void OnDimGuiInput(InputEvent @event)
{
if (@event is InputEventMouseButton mouse && mouse.Pressed)
Close();
}
}
}