diff --git a/src/lang/extra/czech.txt b/src/lang/extra/czech.txt index 5e20e6e602..0951d6004c 100644 --- a/src/lang/extra/czech.txt +++ b/src/lang/extra/czech.txt @@ -1192,7 +1192,9 @@ STR_NEWGRF_INSPECT_SPRITE_DUMP_TOOLTIP :{BLACK}Zobrazí STR_NEWGRF_INSPECT_SPRITE_DUMP_UNOPT :{BLACK}U STR_NEWGRF_INSPECT_SPRITE_DUMP_UNOPT_TOOLTIP :{BLACK}Zobrazí skupiny spritů bez užití jakékoli optimalizace.{}{}Vyžaduje znovunačítání NewGRF, nebylo-li dříve zapnuto (misc_debug 10). STR_NEWGRF_INSPECT_SPRITE_DUMP_GOTO :Přejít na číslo spritu... -STR_NEWGRF_INSPECT_SPRITE_DUMP_PANEL_TOOLTIP :{BLACK}Kliknutí zvýrazní skupinu spritů{}Shift+kliknutí sbalí skupinu spritů{}Ctrl+kliknutí zvýrazní dočasný registr úložiště +STR_NEWGRF_INSPECT_SPRITE_DUMP_PANEL_TOOLTIP_HIGHLIGHT :{BLACK}Kliknutí zvýrazní skupinu spritů +STR_NEWGRF_INSPECT_SPRITE_DUMP_PANEL_TOOLTIP_COLLAPSE :{BLACK}Shift+kliknutí sbalí skupinu spritů +STR_NEWGRF_INSPECT_SPRITE_DUMP_PANEL_TOOLTIP_HIGHLIGHT_TEMP :{BLACK}Ctrl+kliknutí zvýrazní dočasný registr úložiště STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_SIGNALS :Návěstidla STR_NEWGRF_ERROR_UNIMPLEMETED_MAPPED_FEATURE_ID :Neimplementované přemapované feature ID: název: {2:STRING}, mapováno na: {5:HEX} (sprite {3:NUM}) STR_NEWGRF_ERROR_UNIMPLEMETED_MAPPED_PROPERTY :Neimplementované přemapované Action 0 property feature: {4:HEX}, název: {2:STRING}, mapováno na: {5:HEX} (sprite {3:NUM}) diff --git a/src/lang/extra/english.txt b/src/lang/extra/english.txt index 6baf399c6a..84f4c3810c 100644 --- a/src/lang/extra/english.txt +++ b/src/lang/extra/english.txt @@ -1275,9 +1275,15 @@ STR_NEWGRF_INSPECT_SPRITE_DUMP_TOOLTIP :{BLACK}Display STR_NEWGRF_INSPECT_SPRITE_DUMP_UNOPT :{BLACK}U STR_NEWGRF_INSPECT_SPRITE_DUMP_UNOPT_TOOLTIP :{BLACK}Display sprite groups without any optimisations applied.{}{}Requires reloading NewGRFs if not previously enabled (misc_debug 10). STR_NEWGRF_INSPECT_SPRITE_DUMP_GOTO :Scroll to sprite number +STR_NEWGRF_INSPECT_SPRITE_DUMP_CLEAR :Clear highlighting/marking STR_NEWGRF_INSPECT_SPRITE_DUMP_MORE_DETAILS :Show more details +STR_NEWGRF_INSPECT_SPRITE_DUMP_CLICK_TO_HIGHLIGHT :Click to highlight +STR_NEWGRF_INSPECT_SPRITE_DUMP_CLICK_TO_MARK :Click to mark STR_NEWGRF_INSPECT_SPRITE_DUMP_OPTIONS :{BLACK}Options and extra commands -STR_NEWGRF_INSPECT_SPRITE_DUMP_PANEL_TOOLTIP :{BLACK}Click to highlight sprite group{}Shift+Click to collapse sprite group{}Ctrl+Click to highlight temporary storage register +STR_NEWGRF_INSPECT_SPRITE_DUMP_PANEL_TOOLTIP_HIGHLIGHT :{BLACK}Click to highlight sprite group +STR_NEWGRF_INSPECT_SPRITE_DUMP_PANEL_TOOLTIP_MARK :{BLACK}Click to mark sprite group +STR_NEWGRF_INSPECT_SPRITE_DUMP_PANEL_TOOLTIP_COLLAPSE :{BLACK}Shift+Click to collapse sprite group +STR_NEWGRF_INSPECT_SPRITE_DUMP_PANEL_TOOLTIP_HIGHLIGHT_TEMP :{BLACK}Ctrl+Click to highlight temporary storage register STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_SIGNALS :Signals STR_NEWGRF_ERROR_UNIMPLEMETED_MAPPED_FEATURE_ID :Unimplemented remapped feature ID: name: {2:RAW_STRING}, mapped to: {5:HEX} (sprite {3:NUM}) STR_NEWGRF_ERROR_UNIMPLEMETED_MAPPED_PROPERTY :Unimplemented remapped Action 0 property feature: {4:HEX}, name: {2:RAW_STRING}, mapped to: {5:HEX} (sprite {3:NUM}) diff --git a/src/lang/extra/galician.txt b/src/lang/extra/galician.txt index f73e40b9ba..74291be4a0 100644 --- a/src/lang/extra/galician.txt +++ b/src/lang/extra/galician.txt @@ -1218,7 +1218,9 @@ STR_NEWGRF_INSPECT_SPRITE_DUMP_TOOLTIP :{BLACK}Amosa a STR_NEWGRF_INSPECT_SPRITE_DUMP_UNOPT :{BLACK}U STR_NEWGRF_INSPECT_SPRITE_DUMP_UNOPT_TOOLTIP :{BLACK}Amosar grupos de sprites sen ter ningunha aplicación optimizada.{}{}Require recargar NewGRFs se non estaba previamente habilitado (misc_debug 10). STR_NEWGRF_INSPECT_SPRITE_DUMP_GOTO :Desprazarse o sprite número -STR_NEWGRF_INSPECT_SPRITE_DUMP_PANEL_TOOLTIP :{BLACK}Click para destacar o grupo de sprites{}Shift+Click para compactar o grupo de sprites{}Ctrl+Click para destacar o rexistro de almacenamento temporal +STR_NEWGRF_INSPECT_SPRITE_DUMP_PANEL_TOOLTIP_HIGHLIGHT :{BLACK}Click para destacar o grupo de sprites +STR_NEWGRF_INSPECT_SPRITE_DUMP_PANEL_TOOLTIP_COLLAPSE :{BLACK}Shift+Click para compactar o grupo de sprites +STR_NEWGRF_INSPECT_SPRITE_DUMP_PANEL_TOOLTIP_HIGHLIGHT_TEMP :{BLACK}Ctrl+Click para destacar o rexistro de almacenamento temporal STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_SIGNALS :Sinais STR_NEWGRF_ERROR_UNIMPLEMETED_MAPPED_FEATURE_ID :Característica non implementada remapeada ID: nome: {2:STRING}, mapeada a: {5:HEX} (sprite {3:NUM}) STR_NEWGRF_ERROR_UNIMPLEMETED_MAPPED_PROPERTY :Remapeado non implementado dunha característica da propiedade 'Action 0': {4:HEX}, nome: {2:STRING}, mapeado a: {5:HEX} (sprite {3:NUM}) diff --git a/src/lang/extra/german.txt b/src/lang/extra/german.txt index d8bcc57801..567e2bb7ee 100644 --- a/src/lang/extra/german.txt +++ b/src/lang/extra/german.txt @@ -1092,7 +1092,9 @@ STR_NEWGRF_INSPECT_SPRITE_DUMP_TOOLTIP :{BLACK}Aktuelle STR_NEWGRF_INSPECT_SPRITE_DUMP_UNOPT :{BLACK}U STR_NEWGRF_INSPECT_SPRITE_DUMP_UNOPT_TOOLTIP :{BLACK}Zeige Sprite-Gruppe ohne jede Optimierung an.{}{}Wenn nicht vorher aktiviert, müssen NewGRFs erneut geladen werden (misc_debug 10). STR_NEWGRF_INSPECT_SPRITE_DUMP_GOTO :Scrolle zum Sprite Nummer -STR_NEWGRF_INSPECT_SPRITE_DUMP_PANEL_TOOLTIP :{BLACK}Klicke, um Sprite-Gruppe hervorzuheben{}Umschalt+Klick, um die Sprite-Gruppe zu schließen{}Strg+Klick, um temporäres Speicherregister hervorzuheben +STR_NEWGRF_INSPECT_SPRITE_DUMP_PANEL_TOOLTIP_HIGHLIGHT :{BLACK}Klicke, um Sprite-Gruppe hervorzuheben +STR_NEWGRF_INSPECT_SPRITE_DUMP_PANEL_TOOLTIP_COLLAPSE :{BLACK}Umschalt+Klick, um die Sprite-Gruppe zu schließen +STR_NEWGRF_INSPECT_SPRITE_DUMP_PANEL_TOOLTIP_HIGHLIGHT_TEMP :{BLACK}Strg+Klick, um temporäres Speicherregister hervorzuheben STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_SIGNALS :Signale STR_NEWGRF_TOO_MANY_STRINGS :{WHITE}Nicht genügend String-IDs für alle NewGRFs vorhanden. diff --git a/src/lang/extra/korean.txt b/src/lang/extra/korean.txt index f4db2b36c6..b7ced83cbc 100644 --- a/src/lang/extra/korean.txt +++ b/src/lang/extra/korean.txt @@ -1218,7 +1218,9 @@ STR_NEWGRF_INSPECT_SPRITE_DUMP_TOOLTIP :{BLACK}현재 STR_NEWGRF_INSPECT_SPRITE_DUMP_UNOPT :{BLACK}U STR_NEWGRF_INSPECT_SPRITE_DUMP_UNOPT_TOOLTIP :{BLACK}모든 최적화가 적용되지 않은 스프라이트 그룹을 보여줍니다.{}이전에 활성화한 적이 없다면 NewGRF을 다시 불러와야 합니다. (misc_debug 10). STR_NEWGRF_INSPECT_SPRITE_DUMP_GOTO :특정 스프라이트 번호로 이동합니다 -STR_NEWGRF_INSPECT_SPRITE_DUMP_PANEL_TOOLTIP :{BLACK}스프라이트 그룹을 강조 표시하려면 클릭하세요{}SHIFT+클릭하면 스프라이트 그룹을 접거나 펼 수 있습니다.{}Ctrl+클릭하면 임시 저장 레지스터를 강조 표시합니다. +STR_NEWGRF_INSPECT_SPRITE_DUMP_PANEL_TOOLTIP_HIGHLIGHT :{BLACK}스프라이트 그룹을 강조 표시하려면 클릭하세요 +STR_NEWGRF_INSPECT_SPRITE_DUMP_PANEL_TOOLTIP_COLLAPSE :{BLACK}SHIFT+클릭하면 스프라이트 그룹을 접거나 펼 수 있습니다. +STR_NEWGRF_INSPECT_SPRITE_DUMP_PANEL_TOOLTIP_HIGHLIGHT_TEMP :{BLACK}Ctrl+클릭하면 임시 저장 레지스터를 강조 표시합니다. STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_SIGNALS :신호기 STR_NEWGRF_ERROR_UNIMPLEMETED_MAPPED_FEATURE_ID :구현되지 않은 재배치된 기능 ID: 이름: {2:STRING}, 재배치: {5:HEX} (스프라이트 {3:NUM}) STR_NEWGRF_ERROR_UNIMPLEMETED_MAPPED_PROPERTY :구현되지 않은 재배치된 액션 0 속성 특성: {4:HEX}, 이름: {2:STRING}, 재배치: {5:HEX} (스프라이트 {3:NUM}) diff --git a/src/lang/extra/simplified_chinese.txt b/src/lang/extra/simplified_chinese.txt index d6f9d0cae2..c43e3dcd37 100644 --- a/src/lang/extra/simplified_chinese.txt +++ b/src/lang/extra/simplified_chinese.txt @@ -1211,7 +1211,9 @@ STR_NEWGRF_INSPECT_SPRITE_DUMP_TOOLTIP :{BLACK}显示 STR_NEWGRF_INSPECT_SPRITE_DUMP_UNOPT :{BLACK}U STR_NEWGRF_INSPECT_SPRITE_DUMP_UNOPT_TOOLTIP :{BLACK}在没有应用任何优化的情况下显示Sprite组{}{}如果之前没有启用,则需要重新加载NewGRF (misc_debug 10) STR_NEWGRF_INSPECT_SPRITE_DUMP_GOTO :滚动Sprite编号 -STR_NEWGRF_INSPECT_SPRITE_DUMP_PANEL_TOOLTIP :{BLACK}点击高亮Sprite组{}Shift+点击折叠Sprite组{}Ctrl+点击高亮临时存储寄存器 +STR_NEWGRF_INSPECT_SPRITE_DUMP_PANEL_TOOLTIP_HIGHLIGHT :{BLACK}点击高亮Sprite组 +STR_NEWGRF_INSPECT_SPRITE_DUMP_PANEL_TOOLTIP_COLLAPSE :{BLACK}Shift+点击折叠Sprite组 +STR_NEWGRF_INSPECT_SPRITE_DUMP_PANEL_TOOLTIP_HIGHLIGHT_TEMP :{BLACK}Ctrl+点击高亮临时存储寄存器 STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_SIGNALS :信号 STR_NEWGRF_ERROR_UNIMPLEMETED_MAPPED_FEATURE_ID :未生效的重映射特性 ID: name: {2:STRING},mapped to: {5:HEX} (sprite {3:NUM}) STR_NEWGRF_ERROR_UNIMPLEMETED_MAPPED_PROPERTY :未生效的重映射 Action 0 属性特性: {4:HEX},name: {2:STRING},mapped to: {5:HEX} (sprite {3:NUM}) diff --git a/src/newgrf_debug_gui.cpp b/src/newgrf_debug_gui.cpp index e720b58860..2b5f98784b 100644 --- a/src/newgrf_debug_gui.cpp +++ b/src/newgrf_debug_gui.cpp @@ -50,6 +50,8 @@ #include "table/strings.h" +#include + #include "safeguards.h" /** The sprite picker. */ @@ -323,6 +325,7 @@ struct NewGRFInspectWindow : Window { bool auto_refresh = false; bool log_console = false; + bool click_to_mark_mode = false; bool sprite_dump = false; bool sprite_dump_unopt = false; bool sprite_dump_more_details = false; @@ -333,12 +336,17 @@ struct NewGRFInspectWindow : Window { btree::btree_map nfo_line_lines; const SpriteGroup *selected_sprite_group = nullptr; btree::btree_map highlight_tag_lines; - uint32 selected_highlight_tags[6] = {}; btree::btree_set collapsed_groups; + std::array selected_highlight_tags = {}; + std::array marked_groups = {}; + enum DropDownOptions { NGIWDDO_GOTO_SPRITE, + NGIWDDO_CLEAR, NGIWDDO_MORE_DETAILS, + NGIWDDO_CLICK_TO_HIGHLIGHT, + NGIWDDO_CLICK_TO_MARK, }; /** @@ -573,6 +581,9 @@ struct NewGRFInspectWindow : Window { const_cast(this)->highlight_tag_lines.clear(); const_cast(this)->nfo_line_lines.clear(); if (this->sprite_dump) { + const bool rtl = _current_text_dir == TD_RTL; + Rect sprite_ir = ir.Indent(WidgetDimensions::scaled.hsep_normal * 3, rtl); + bool collapsed = false; const SpriteGroup *collapse_group = nullptr; uint collapse_lines = 0; @@ -627,7 +638,18 @@ struct NewGRFInspectWindow : Window { } } } - ::DrawString(ir.left, ir.right, ir.top + (scroll_offset * this->resize.step_height), buf, colour); + if (group != nullptr) { + for (uint i = 0; i < lengthof(this->marked_groups); i++) { + if (this->marked_groups[i] == group) { + static const uint8 mark_colours[] = { PC_YELLOW, PC_GREEN, PC_ORANGE, PC_DARK_BLUE, PC_RED, PC_LIGHT_BLUE, 0xAE /* purple */, 0x6C /* brown */ }; + static_assert(lengthof(this->marked_groups) == lengthof(mark_colours)); + Rect mark_ir = ir.Indent(WidgetDimensions::scaled.hsep_normal, rtl).WithWidth(WidgetDimensions::scaled.hsep_normal, rtl).Translate(0, (scroll_offset * this->resize.step_height)); + GfxFillRect(mark_ir.left, mark_ir.top, mark_ir.right, mark_ir.top + this->resize.step_height - 1, mark_colours[i]); + break; + } + } + } + ::DrawString(sprite_ir.left, sprite_ir.right, sprite_ir.top + (scroll_offset * this->resize.step_height), buf, colour); }); dumper.use_shadows = this->sprite_dump_unopt; dumper.more_details = this->sprite_dump_more_details; @@ -820,24 +842,35 @@ struct NewGRFInspectWindow : Window { return true; } - void SelectHighlightTag(uint32 tag) + template + void SelectTagArrayItem(T &items, V value) { - for (uint i = 0; i < lengthof(this->selected_highlight_tags); i++) { - if (this->selected_highlight_tags[i] == tag) { - this->selected_highlight_tags[i] = 0; + for (size_t i = 0; i < items.size(); i++) { + if (items[i] == value) { + items[i] = V{}; return; } } - for (uint i = 0; i < lengthof(this->selected_highlight_tags); i++) { - if (this->selected_highlight_tags[i] == 0) { - this->selected_highlight_tags[i] = tag; + for (size_t i = 0; i < items.size(); i++) { + if (!items[i]) { + items[i] = value; return; } } - this->selected_highlight_tags[lengthof(this->selected_highlight_tags) - 1] = tag; + items[items.size() - 1] = value; } - void OnClick([[maybe_unused]] Point pt, int widget, [[maybe_unused]] int click_count) override + void SelectHighlightTag(uint32 tag) + { + this->SelectTagArrayItem(this->selected_highlight_tags, tag); + } + + void SelectMarkedGroup(const SpriteGroup *group) + { + this->SelectTagArrayItem(this->marked_groups, group); + } + + void OnClick(Point pt, int widget, int click_count) override { switch (widget) { case WID_NGRFI_PARENT: { @@ -892,14 +925,20 @@ struct NewGRFInspectWindow : Window { } this->SetWidgetDirty(WID_NGRFI_MAINPANEL); } - } else { const SpriteGroup *group = nullptr; auto iter = this->sprite_group_lines.find(line); if (iter != this->sprite_group_lines.end()) group = iter->second; - if (group != nullptr || this->selected_sprite_group != nullptr) { - this->selected_sprite_group = (group == this->selected_sprite_group) ? nullptr : group; - this->SetWidgetDirty(WID_NGRFI_MAINPANEL); + if (this->click_to_mark_mode) { + if (group != nullptr) { + this->SelectMarkedGroup(group); + this->SetWidgetDirty(WID_NGRFI_MAINPANEL); + } + } else { + if (group != nullptr || this->selected_sprite_group != nullptr) { + this->selected_sprite_group = (group == this->selected_sprite_group) ? nullptr : group; + this->SetWidgetDirty(WID_NGRFI_MAINPANEL); + } } } return; @@ -955,7 +994,6 @@ struct NewGRFInspectWindow : Window { this->SetWidgetLoweredState(WID_NGRFI_SPRITE_DUMP, this->sprite_dump); this->SetWidgetDisabledState(WID_NGRFI_SPRITE_DUMP_UNOPT, !this->sprite_dump || !UnOptimisedSpriteDumpOK()); this->SetWidgetDisabledState(WID_NGRFI_SPRITE_DUMP_OPTIONS, !this->sprite_dump); - this->GetWidget(WID_NGRFI_MAINPANEL)->SetToolTip(this->sprite_dump ? STR_NEWGRF_INSPECT_SPRITE_DUMP_PANEL_TOOLTIP : STR_NULL); this->SetWidgetDirty(WID_NGRFI_SPRITE_DUMP); this->SetWidgetDirty(WID_NGRFI_SPRITE_DUMP_UNOPT); this->SetWidgetDirty(WID_NGRFI_SPRITE_DUMP_OPTIONS); @@ -991,6 +1029,10 @@ struct NewGRFInspectWindow : Window { case WID_NGRFI_SPRITE_DUMP_OPTIONS: { DropDownList list; list.push_back(std::make_unique(STR_NEWGRF_INSPECT_SPRITE_DUMP_GOTO, NGIWDDO_GOTO_SPRITE, false)); + list.push_back(std::make_unique(STR_NEWGRF_INSPECT_SPRITE_DUMP_CLEAR, NGIWDDO_CLEAR, false)); + list.push_back(std::make_unique(-1, false)); + list.push_back(std::make_unique(!this->click_to_mark_mode, STR_NEWGRF_INSPECT_SPRITE_DUMP_CLICK_TO_HIGHLIGHT, NGIWDDO_CLICK_TO_HIGHLIGHT, false)); + list.push_back(std::make_unique(this->click_to_mark_mode, STR_NEWGRF_INSPECT_SPRITE_DUMP_CLICK_TO_MARK, NGIWDDO_CLICK_TO_MARK, false)); list.push_back(std::make_unique(-1, false)); list.push_back(std::make_unique(this->sprite_dump_more_details, STR_NEWGRF_INSPECT_SPRITE_DUMP_MORE_DETAILS, NGIWDDO_MORE_DETAILS, false)); @@ -1009,10 +1051,24 @@ struct NewGRFInspectWindow : Window { this->current_edit_param = 0; ShowQueryString(STR_EMPTY, STR_SPRITE_ALIGNER_GOTO_CAPTION, 10, this, CS_NUMERAL, QSF_NONE); break; + case NGIWDDO_CLEAR: + this->selected_highlight_tags.fill(0); + this->marked_groups.fill(nullptr); + this->selected_sprite_group = nullptr; + this->SetDirty(); + break; case NGIWDDO_MORE_DETAILS: this->sprite_dump_more_details = !this->sprite_dump_more_details; this->SetDirty(); break; + case NGIWDDO_CLICK_TO_HIGHLIGHT: + this->click_to_mark_mode = false; + break; + case NGIWDDO_CLICK_TO_MARK: + this->click_to_mark_mode = true; + this->selected_sprite_group = nullptr; + this->SetDirty(); + break; default: break; } @@ -1067,6 +1123,21 @@ struct NewGRFInspectWindow : Window { this->redraw_panel = false; this->redraw_scrollbar = false; } + + virtual bool OnTooltip(Point pt, int widget, TooltipCloseCondition close_cond) override + { + if (widget == WID_NGRFI_MAINPANEL && this->sprite_dump) { + _temp_special_strings[0] = GetString(this->click_to_mark_mode ? STR_NEWGRF_INSPECT_SPRITE_DUMP_PANEL_TOOLTIP_MARK : STR_NEWGRF_INSPECT_SPRITE_DUMP_PANEL_TOOLTIP_HIGHLIGHT); + _temp_special_strings[0] += "\n"; + _temp_special_strings[0] += GetString(STR_NEWGRF_INSPECT_SPRITE_DUMP_PANEL_TOOLTIP_COLLAPSE); + _temp_special_strings[0] += "\n"; + _temp_special_strings[0] += GetString(STR_NEWGRF_INSPECT_SPRITE_DUMP_PANEL_TOOLTIP_HIGHLIGHT_TEMP); + GuiShowTooltips(this, SPECSTR_TEMP_START, close_cond); + return true; + } + + return false; + } }; static const NWidgetPart _nested_newgrf_inspect_chain_widgets[] = {