├── .github └── ISSUE_TEMPLATE │ ├── general-feedback.md │ ├── grammatical-error.md │ └── request-to-become-a-translator.md ├── .gitignore ├── EXTERNAL_LINKS.md ├── FAQ.md ├── README.md ├── images ├── arrange_children.png ├── cache_desired_size.png ├── common_widget_func │ ├── accessibility_behavior.png │ ├── accessibility_overview.png │ ├── accessibility_summary_behavior.png │ ├── clipping_clip_to_bounds.png │ ├── clipping_clip_to_bounds_always.png │ ├── clipping_clip_to_bounds_intersect.png │ ├── clipping_inherit.png │ ├── clipping_on_demand.gif │ ├── clipping_overview.png │ ├── flow_direction_preference.png │ ├── is_enabled.png │ ├── is_volatile.png │ ├── navigation_custom.png │ ├── navigation_custom_boundary.png │ ├── navigation_escape.png │ ├── navigation_explicit.png │ ├── navigation_overview.png │ ├── navigation_stop.png │ ├── navigation_wrap.png │ ├── render_opacity.png │ ├── render_transform.png │ ├── tooltip_text.png │ └── visibility_overview.png ├── common_widgets │ ├── progress_bars │ │ ├── w_progressbar_bottom_top_mask.png │ │ ├── w_progressbar_bottom_top_scale.png │ │ ├── w_progressbar_center_horizontal_mask.png │ │ ├── w_progressbar_center_horizontal_scale.png │ │ ├── w_progressbar_center_mask.png │ │ ├── w_progressbar_center_scale.png │ │ ├── w_progressbar_center_vertical_mask.png │ │ ├── w_progressbar_center_vertical_scale.png │ │ ├── w_progressbar_left_right_mask.png │ │ ├── w_progressbar_left_right_scale.png │ │ ├── w_progressbar_right_left_mask.png │ │ ├── w_progressbar_right_left_scale.png │ │ ├── w_progressbar_top_bottom_mask.png │ │ └── w_progressbar_top_bottom_scale.png │ ├── w_background_blur.png │ ├── w_border.png │ ├── w_button.png │ ├── w_canvas_panel.png │ ├── w_checkbox.png │ ├── w_combobox.png │ ├── w_editable_text.png │ ├── w_editable_text_multi.png │ ├── w_gridpanel.png │ ├── w_horizontalbox.png │ ├── w_image.png │ ├── w_input_key_selector.png │ ├── w_overlay.png │ ├── w_retainerbox.png │ ├── w_retainerbox_material.png │ ├── w_retainerbox_result.png │ ├── w_richtextblock.png │ ├── w_safezone.png │ ├── w_scalebox.png │ ├── w_scrollbox.png │ ├── w_sizebox.png │ ├── w_slider.png │ ├── w_spinbox.png │ ├── w_textblock.png │ ├── w_textbox.png │ ├── w_textbox_multi.png │ ├── w_throbber.png │ ├── w_throbber_circular.png │ ├── w_uniformgrid.png │ └── w_verticalbox.png ├── compound_widgets.png ├── game_layer_general.png ├── hittest_grid_1.png ├── hittest_grid_2.png ├── input_component_order_operations.png ├── input_component_stack.png ├── input_flow_diagram.png ├── is_variable.png ├── leaf_widgets.png ├── mouse_cursor │ └── aero_arrow.png.zip ├── mouse_lock_modes │ ├── mouse_lock_mode_do_not_lock.png │ ├── mouse_lock_mode_lock_always.png │ ├── mouse_lock_mode_lock_capture.png │ ├── mouse_lock_mode_lock_fullscreen.png │ └── mouse_lock_modes.afphoto ├── nav_grid_debug.png ├── panel_widgets.png ├── slate_widget_examples_step1.png ├── slate_widget_examples_step2.png ├── starship_gallery.png ├── ue4_test_suite.png ├── umg_animation_designer.gif ├── umg_designer.png ├── umg_hierarchy_diagram.png ├── user_widget_events │ ├── added_to_focus_path.png │ ├── animation_finished.png │ ├── animation_started.png │ ├── construct.png │ ├── destruct.png │ ├── focus_lost.png │ ├── focus_received.png │ ├── focus_received_both.png │ ├── focus_received_both.psd │ ├── focus_received_handled.png │ ├── focus_received_unhandled.png │ ├── oninitialized.png │ ├── onpaint.png │ ├── preconstruct.png │ ├── removed_from_focus_path.png │ └── tick.png ├── user_widget_hierarchy.png ├── user_widget_hierarchy_result.png ├── widget_reflector_console_debugger.png └── widget_reflector_example.png ├── languages ├── ru │ ├── EXTERNAL_LINKS.md │ ├── FAQ.md │ └── README.md └── zh │ ├── .github │ └── ISSUE_TEMPLATE │ │ ├── grammatical-error.md │ │ └── request-to-become-a-translator.md │ ├── EXTERNAL_LINKS.md │ ├── FAQ.md │ └── README.md ├── pages └── text_widgets │ ├── rich_text_block.md │ ├── text_block_widget.md │ ├── text_decorators.md │ ├── text_marshallers.md │ └── text_widget_overview.md ├── video_thumbnails ├── input_modes_video_thumbnail.png ├── video_thumbnails_template.psd └── youtube-play-button-28281.png └── videos └── input_modes_examples.mp4 /.github/ISSUE_TEMPLATE/general-feedback.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: General Feedback 3 | about: General Feedback for the document 4 | title: "[GENERAL]" 5 | labels: Feedback 6 | assignees: '' 7 | 8 | --- 9 | 10 | 11 | 16 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/grammatical-error.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Grammatical Error 3 | about: For grammatical errors in the document 4 | title: "[GRAMMAR]" 5 | labels: Grammar 6 | assignees: '' 7 | 8 | --- 9 | 10 | 11 | 16 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/request-to-become-a-translator.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Request to Become a Translator 3 | about: For those requesting to become a translator 4 | title: I would like to translate for [LANGUAGE(S)] 5 | labels: Question 6 | assignees: YawLighthouse 7 | 8 | --- 9 | 10 | I would like to become a translator for the compendium! 11 | 12 | --- 13 | 14 | Language(s): 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Visual Studio 2015 user specific files 2 | .vs/ 3 | *.vsconfig 4 | 5 | # Visual Studios code user specific files 6 | .vscode/ 7 | 8 | # Rider user specific files 9 | .idea/ 10 | **.sln.DotSettings.user 11 | 12 | # Obsidian MD 13 | .obsidian/ 14 | 15 | # Compiled Object files 16 | *.slo 17 | *.lo 18 | *.o 19 | *.obj 20 | 21 | # Precompiled Headers 22 | *.gch 23 | *.pch 24 | 25 | # Compiled Dynamic libraries 26 | *.so 27 | *.dylib 28 | *.dll 29 | 30 | # Fortran module files 31 | *.mod 32 | 33 | # Compiled Static libraries 34 | *.lai 35 | *.la 36 | *.a 37 | *.lib 38 | 39 | # Executables 40 | *.exe 41 | *.out 42 | *.app 43 | *.ipa 44 | 45 | # These project files can be generated by the engine 46 | *.xcodeproj 47 | *.xcworkspace 48 | *.code-workspace 49 | *.sln 50 | *.suo 51 | *.opensdf 52 | *.opendb 53 | *.sdf 54 | *.VC.db 55 | *.VC.opendb 56 | 57 | # Precompiled Assets 58 | SourceArt/**/*.png 59 | SourceArt/**/*.tga 60 | 61 | # Binary Files 62 | Binaries/* 63 | Binaries/*/Win64/* 64 | Plugins/*/Binaries/* 65 | 66 | # Builds 67 | Build/* 68 | 69 | # Whitelist PakBlacklist-.txt files 70 | !Build/*/ 71 | Build/*/** 72 | !Build/*/PakBlacklist*.txt 73 | 74 | # Don't ignore icon files in Build 75 | !Build/**/*.ico 76 | 77 | # Built data for maps 78 | *_BuiltData.uasset 79 | 80 | # Configuration files generated by the Editor 81 | Saved/* 82 | 83 | # Compiled source files for the engine to use 84 | Intermediate/* 85 | Plugins/*/Intermediate/* 86 | Plugins/Developer/Rider* 87 | 88 | # Cache files for the editor to use 89 | DerivedDataCache/* 90 | 91 | # Plugin related .git ignore and git attributes files 92 | Plugins/*/.gitignore 93 | Plugins/*/.gitattributes 94 | -------------------------------------------------------------------------------- /EXTERNAL_LINKS.md: -------------------------------------------------------------------------------- 1 | 2 | # EXTERNAL LINKS 3 | 4 | Localized via [GitLocalize](https://gitlocalize.com/) (Please read the [FAQ](FAQ.md) page about becoming a translator!) 5 | 6 | --- 7 | 8 | 9 | ## Repository Page Links 10 | 11 | > - [Main Compendium Page](README.md) 12 | > - [FAQ Page](FAQ.md) 13 | 14 | Here is a list of important and helpful sources of information regarding Slate and UMG in Unreal Engine. 15 | Starting with Epic related links then community links that are in no particular order. 16 | 17 | Some links might have a description of what it is to help understand why this link is included, 18 | or any other information that is recommended looking at after going to that link. 19 | 20 | There is also a sample project that is used in relation to this compendium linked here: \ 21 | [Unreal Engine template project for the UMG/Slate Compendium](https://github.com/YawLighthouse/UMG-Slate-Compendium-UE-Project) 22 | 23 | 30 | 31 | --- 32 | 33 | 34 | ## Table of Contents 35 | 36 | > - [Epic Related Links](#epic-related-links) 37 | > - [Community Related Links](#community-related-links) 38 | 39 | --- 40 | 41 | 42 | ### Epic Related Links 43 | 44 | Here are Epic Games specific links, either from individual developers doing a blog, official documentation pages, official courses, etc. 45 | 46 | 47 | 48 | 51 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 99 | 100 | 101 | 102 | 106 | 107 | 108 | 109 | **[ Back to Top](#table-of-contents)** 110 | 111 | ### Community Related Links 112 | 113 | Here is a list of community related links in no particular order(other than based on timing of when they were added). 114 | 115 | 116 | 117 | 118 | 121 | 122 | 123 | 124 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 149 | 152 | 153 | 154 | 157 | 160 | 161 | 162 | 163 | 170 | 171 | 172 | 175 | 180 | 181 | 182 | 183 | 187 | 188 | 189 | 192 | 201 | 202 | 203 | 206 | 210 | 211 | 212 | 215 | 218 | 219 | 220 | 223 | 226 | 227 | 228 | 231 | 234 | 235 | 236 | 239 | 243 | 244 | 245 | 248 | 251 | 252 | 253 | 256 | 259 | 260 | 261 | 264 | 270 | 271 | 272 | 273 | **[ Back to Top](#table-of-contents)** -------------------------------------------------------------------------------- /FAQ.md: -------------------------------------------------------------------------------- 1 | 2 | # UMG-Slate Compendium FAQ(Frequently Asked Questions) 3 | 4 | All source code referenced in the compendium is from the launcher and Epic's public github repository of Unreal Engine. 5 | 6 | *Any major updates that the author of the document(also owner of the repository) have to be confirmed by the author's place of business to make sure no "trade secrets" are revealed, 7 | this can be a time consuming process BUT it helps avoid an legal issues that the document may incur. 8 | Pull Requests from the Community are not subject to this rule and can immediately be merged into the public repository if its approved.* 9 | 10 | --- 11 | 12 | 13 | ## Repository Page Links 14 | 15 | > - [Main Compendium Page](README.md) 16 | > - [External Links Page](EXTERNAL_LINKS.md) 17 | 18 | --- 19 | 20 | 21 | ## Translation/Localization FAQ 22 | 23 | For translating the compendium and its documents we use [GitLocalize](https://gitlocalize.com/). \ 24 | For requesting to become a translator please fill out this form([LINK](https://forms.gle/xyS4otdTTNHLKfYz9)), 25 | if you already submitted the form and want to localize a different language(or additional one) you can just edit the form and re-submit it. 26 | 27 | Languages the Compendium is currently localized in(including how many translators for that language): 28 | - English(Original Language) 29 | - 1 Translator 30 | - Russian 31 | - 1 Translator 32 | - Chinese 33 | - 1 Translator 34 | 35 | 36 | ## Questions 37 | 38 | --- 39 | 1. QUESTION: I found an issue I wanted to report, what's the next steps? \ 40 | ANSWER: Please go to the "Issues" tab of this GitHub repository and make a new issue for that, 41 | I have a template for certain types of issues but the general format is to include: 42 | - What the issue is. 43 | - Where its located(including the section number is extremely helpful so the author knows that you're referring to). 44 | - `-OPTIONAL & RECOMMENDED-` Suggesting a fixed version(if applicable) to help get the fix in quicker(the templates will explicitly say whether you should have a suggestion or not). 45 | --- 46 | 2. QUESTION: I want to help contribute to this document! How can I do that? \ 47 | ANSWER: You can make a fork of the repository and then make a pull request to merge your contribution(s) into this repository like if you were contributing to Unreal Engine. You are required that you have written permission from your place of business to contribute(it can be in any forms but it needs to be in written form as proof sort of thing), this avoid any legal issues regarding "trade secrets" being revealed but even then if the information is referring to the Launcher/public Github repository of Unreal Engine then it shouldn't be an issue for them to approve it. 48 | --- 49 | 3. QUESTION: What's the policy regarding Pull Requests? \ 50 | ANSWER: 51 | - Anybody can make a pull request to make changes to the compendium! 52 | - You must be polite and respectful to others(you get 3 chances but depending on severity it may be less, use your best judgement obviously). We're all using Unreal Engine, somebody may be more experienced with it but that does not give you the right to be a jerk and vise versa. 53 | - All information referring to Unreal Engine must come from the Launcher or public Github repository of Unreal Engine, NOT private repositories from either your company or from Epic's own private repository. 54 | - If you work at a business that uses Unreal Engine(or something related to it), I would prefer if you have written(NOT VERBAL) permission from that business that you can contribute to the project even if its a one-off contribution(a slack message or email from your boss saying its fine is enough for me). This is to avoid legal issues regarding revealing "trade secrets", but even then all of the information in the compendium refers to public knowledge so it shouldn't be an issue for them to approve it. 55 | --- 56 | 4. QUESTION: What is the process of Pull Requests? \ 57 | ANSWER: 58 | 1. Fork the repository. 59 | 2. Create a branch on your forked repository for your changes to be encapsulated and contained to that branch. 60 | 3. Make your changes in your branch of your forked repository. 61 | 4. When your ready to bring it into this repository, create a pull request from your branch to be merged into the branch named: `main` of this repository. 62 | 5. Fill out the pull request with a detailed description of your changes, **DO NOT add any reviewers!** the maintainers of this repository will do this. **DO NOT @ anybody that hasn't commented on the pull request already, basically be respectful of the maintainers time, we will get to it!**. 63 | 6. A maintainer will comment with any issues they see in the changes and you can make those edits(this is general pull request back and forth). A maintainer will also comment if the pull request is approved/rejected and then add a tag for `Rejected`/`Approved`/`In Progress`. 64 | 7. The maintainer will handle merging the pull request into the project and then closing the pull request. After it has been merged you can delete your branch in your forked repository. 65 | --- 66 | 5. QUESTION: This document is awesome! I want to donate money or something to show my support that it keeps getting updated! \ 67 | ANSWER: This document is meant to be 100% free with no strings attached, I WILL NOT accept any sort of donation's(unless its knowledge donations as pull requests to make the document better). I will keep updating it until I am physically no longer able to(we'll cross that bridge when we get to it). Anybody that contributes to this compendium should not be asking for donations to contribute, anybody found violating that rule will be immediately banned from contributing. 68 | --- 69 | 6. QUESTION: I have a suggestion for something to add to the document! What's the next steps? \ 70 | ANSWER: Please go to the "Issues" tab of this GitHub repository and make a new issue ticket for that. If you direct message any maintainers about it, we will just tell you the same thing or point you to this FAQ page. 71 | --- 72 | 7. QUESTION: How do I see what's planned for the document? \ 73 | ANSWER: So there's two parts to that; 74 | - There will be an issue ticket labeled `Planned xx.xx.xx Updates` and in there it will say is being worked on for the next update. You can see live progress on it where the maintainers will check off the privately filled out information(again the reason why is explained at the top of the FAQ), OR if somebody has made a Pull Request for it and it was merged into the public repository then its immediately available. The issue ticket will be closed and marked as done when all of the update's have been merged into the public repository. 75 | - For long term planned updates they are pretty much planned in my head but not being actively worked on or posted publicly, so that if somebody is working on one of that same chunk of knowledge as a public contribution then they don't have to assume its being worked on behind the scenes and can hopefully get it into the compendium earlier than if a maintainer did it themselves(updates/additions will be over time obviously). 76 | --- 77 | 8. QUESTION: What is the policy with the version numbers? \ 78 | ANSWER: The format is `Major.Minor.Patch` depending on the significance of the changes we will either update the `Major` or `Minor`. For each fix we increment the `Patch` but whenever the `Major` or `Minor` is incremented then we reset `Patch` to zero. 79 | --- 80 | 9. QUESTION: But what about section numbering within the document? \ 81 | ANSWER: Each section's number is `Major.Minor.Mini`, anything deeper in the nesting complicates the document and requires talking with a maintainer(this would be done through a Pull Request in the comments). 82 | --- 83 | 10. QUESTION: I'm working on a contribution that I want to merge in but I saw a new update issue ticket was made that conflicts with my contribution, what do I do? \ 84 | ANSWER: First off, GREAT! Thank you for contributing, I really appreciate it! Secondly, make a draft pull request for the compendium so that it's progress is tracked(and possibly contribute to it if you want), then make a comment on the update ticket letting maintainers know that you're working on that contribution and include the draft pull request link. Afterwards maintainers will then tag your pull request with the Update tag to let you know that it is tracked. 85 | --- 86 | 11. QUESTION: What is the Compendium intended to cover when its pretty much completed? \ 87 | ANSWER: It's meant to explain both the runtime, rendering, and editor parts of UMG and Slate in the default Unreal Engine. Like I said in an earlier answer, its for the community and the community is welcome to help build it up! Now this doesn't mean it's not going to cover any plugins within the engine that you can take advantage of, but those would be as separate documents within the repository to make navigation easy and to help separate the non-essential stuff from the core information. 88 | --- 89 | 12. QUESTION: What about in engine plugins like Common UI and Common Input and such? \ 90 | ANSWER: Since those aren't default Unreal Engine features and are at the end of the day, add ons(albeit very helpful addons) the compendium's main document will not cover it. BUT I do have plans to start covering it after I cover both the runtime and editor parts of UMG/Slate. They will also be separate documents within this same repository to make navigation of the knowledge bases easier. 91 | --- 92 | 13. QUESTION: Since you're not covering Common UI and Common Input immediately, can I start writing up documentation for it to add to this repository now? \ 93 | ANSWER: YES! You are 100% welcome to make a pull request and start adding Common UI and Common Input plugin documentation, I do require that you do them as separate .md files to make navigation easy for others and please try to follow the formatting structure that is in the base README file for the compendium which requires you to always point to where in the source code a system is(this helps avoid misinformation). 94 | 95 | **[ Back to Top](#page-top)** 96 | -------------------------------------------------------------------------------- /images/arrange_children.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/arrange_children.png -------------------------------------------------------------------------------- /images/cache_desired_size.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/cache_desired_size.png -------------------------------------------------------------------------------- /images/common_widget_func/accessibility_behavior.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widget_func/accessibility_behavior.png -------------------------------------------------------------------------------- /images/common_widget_func/accessibility_overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widget_func/accessibility_overview.png -------------------------------------------------------------------------------- /images/common_widget_func/accessibility_summary_behavior.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widget_func/accessibility_summary_behavior.png -------------------------------------------------------------------------------- /images/common_widget_func/clipping_clip_to_bounds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widget_func/clipping_clip_to_bounds.png -------------------------------------------------------------------------------- /images/common_widget_func/clipping_clip_to_bounds_always.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widget_func/clipping_clip_to_bounds_always.png -------------------------------------------------------------------------------- /images/common_widget_func/clipping_clip_to_bounds_intersect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widget_func/clipping_clip_to_bounds_intersect.png -------------------------------------------------------------------------------- /images/common_widget_func/clipping_inherit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widget_func/clipping_inherit.png -------------------------------------------------------------------------------- /images/common_widget_func/clipping_on_demand.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widget_func/clipping_on_demand.gif -------------------------------------------------------------------------------- /images/common_widget_func/clipping_overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widget_func/clipping_overview.png -------------------------------------------------------------------------------- /images/common_widget_func/flow_direction_preference.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widget_func/flow_direction_preference.png -------------------------------------------------------------------------------- /images/common_widget_func/is_enabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widget_func/is_enabled.png -------------------------------------------------------------------------------- /images/common_widget_func/is_volatile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widget_func/is_volatile.png -------------------------------------------------------------------------------- /images/common_widget_func/navigation_custom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widget_func/navigation_custom.png -------------------------------------------------------------------------------- /images/common_widget_func/navigation_custom_boundary.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widget_func/navigation_custom_boundary.png -------------------------------------------------------------------------------- /images/common_widget_func/navigation_escape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widget_func/navigation_escape.png -------------------------------------------------------------------------------- /images/common_widget_func/navigation_explicit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widget_func/navigation_explicit.png -------------------------------------------------------------------------------- /images/common_widget_func/navigation_overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widget_func/navigation_overview.png -------------------------------------------------------------------------------- /images/common_widget_func/navigation_stop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widget_func/navigation_stop.png -------------------------------------------------------------------------------- /images/common_widget_func/navigation_wrap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widget_func/navigation_wrap.png -------------------------------------------------------------------------------- /images/common_widget_func/render_opacity.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widget_func/render_opacity.png -------------------------------------------------------------------------------- /images/common_widget_func/render_transform.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widget_func/render_transform.png -------------------------------------------------------------------------------- /images/common_widget_func/tooltip_text.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widget_func/tooltip_text.png -------------------------------------------------------------------------------- /images/common_widget_func/visibility_overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widget_func/visibility_overview.png -------------------------------------------------------------------------------- /images/common_widgets/progress_bars/w_progressbar_bottom_top_mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/progress_bars/w_progressbar_bottom_top_mask.png -------------------------------------------------------------------------------- /images/common_widgets/progress_bars/w_progressbar_bottom_top_scale.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/progress_bars/w_progressbar_bottom_top_scale.png -------------------------------------------------------------------------------- /images/common_widgets/progress_bars/w_progressbar_center_horizontal_mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/progress_bars/w_progressbar_center_horizontal_mask.png -------------------------------------------------------------------------------- /images/common_widgets/progress_bars/w_progressbar_center_horizontal_scale.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/progress_bars/w_progressbar_center_horizontal_scale.png -------------------------------------------------------------------------------- /images/common_widgets/progress_bars/w_progressbar_center_mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/progress_bars/w_progressbar_center_mask.png -------------------------------------------------------------------------------- /images/common_widgets/progress_bars/w_progressbar_center_scale.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/progress_bars/w_progressbar_center_scale.png -------------------------------------------------------------------------------- /images/common_widgets/progress_bars/w_progressbar_center_vertical_mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/progress_bars/w_progressbar_center_vertical_mask.png -------------------------------------------------------------------------------- /images/common_widgets/progress_bars/w_progressbar_center_vertical_scale.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/progress_bars/w_progressbar_center_vertical_scale.png -------------------------------------------------------------------------------- /images/common_widgets/progress_bars/w_progressbar_left_right_mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/progress_bars/w_progressbar_left_right_mask.png -------------------------------------------------------------------------------- /images/common_widgets/progress_bars/w_progressbar_left_right_scale.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/progress_bars/w_progressbar_left_right_scale.png -------------------------------------------------------------------------------- /images/common_widgets/progress_bars/w_progressbar_right_left_mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/progress_bars/w_progressbar_right_left_mask.png -------------------------------------------------------------------------------- /images/common_widgets/progress_bars/w_progressbar_right_left_scale.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/progress_bars/w_progressbar_right_left_scale.png -------------------------------------------------------------------------------- /images/common_widgets/progress_bars/w_progressbar_top_bottom_mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/progress_bars/w_progressbar_top_bottom_mask.png -------------------------------------------------------------------------------- /images/common_widgets/progress_bars/w_progressbar_top_bottom_scale.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/progress_bars/w_progressbar_top_bottom_scale.png -------------------------------------------------------------------------------- /images/common_widgets/w_background_blur.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/w_background_blur.png -------------------------------------------------------------------------------- /images/common_widgets/w_border.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/w_border.png -------------------------------------------------------------------------------- /images/common_widgets/w_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/w_button.png -------------------------------------------------------------------------------- /images/common_widgets/w_canvas_panel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/w_canvas_panel.png -------------------------------------------------------------------------------- /images/common_widgets/w_checkbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/w_checkbox.png -------------------------------------------------------------------------------- /images/common_widgets/w_combobox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/w_combobox.png -------------------------------------------------------------------------------- /images/common_widgets/w_editable_text.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/w_editable_text.png -------------------------------------------------------------------------------- /images/common_widgets/w_editable_text_multi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/w_editable_text_multi.png -------------------------------------------------------------------------------- /images/common_widgets/w_gridpanel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/w_gridpanel.png -------------------------------------------------------------------------------- /images/common_widgets/w_horizontalbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/w_horizontalbox.png -------------------------------------------------------------------------------- /images/common_widgets/w_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/w_image.png -------------------------------------------------------------------------------- /images/common_widgets/w_input_key_selector.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/w_input_key_selector.png -------------------------------------------------------------------------------- /images/common_widgets/w_overlay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/w_overlay.png -------------------------------------------------------------------------------- /images/common_widgets/w_retainerbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/w_retainerbox.png -------------------------------------------------------------------------------- /images/common_widgets/w_retainerbox_material.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/w_retainerbox_material.png -------------------------------------------------------------------------------- /images/common_widgets/w_retainerbox_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/w_retainerbox_result.png -------------------------------------------------------------------------------- /images/common_widgets/w_richtextblock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/w_richtextblock.png -------------------------------------------------------------------------------- /images/common_widgets/w_safezone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/w_safezone.png -------------------------------------------------------------------------------- /images/common_widgets/w_scalebox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/w_scalebox.png -------------------------------------------------------------------------------- /images/common_widgets/w_scrollbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/w_scrollbox.png -------------------------------------------------------------------------------- /images/common_widgets/w_sizebox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/w_sizebox.png -------------------------------------------------------------------------------- /images/common_widgets/w_slider.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/w_slider.png -------------------------------------------------------------------------------- /images/common_widgets/w_spinbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/w_spinbox.png -------------------------------------------------------------------------------- /images/common_widgets/w_textblock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/w_textblock.png -------------------------------------------------------------------------------- /images/common_widgets/w_textbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/w_textbox.png -------------------------------------------------------------------------------- /images/common_widgets/w_textbox_multi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/w_textbox_multi.png -------------------------------------------------------------------------------- /images/common_widgets/w_throbber.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/w_throbber.png -------------------------------------------------------------------------------- /images/common_widgets/w_throbber_circular.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/w_throbber_circular.png -------------------------------------------------------------------------------- /images/common_widgets/w_uniformgrid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/w_uniformgrid.png -------------------------------------------------------------------------------- /images/common_widgets/w_verticalbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/common_widgets/w_verticalbox.png -------------------------------------------------------------------------------- /images/compound_widgets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/compound_widgets.png -------------------------------------------------------------------------------- /images/game_layer_general.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/game_layer_general.png -------------------------------------------------------------------------------- /images/hittest_grid_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/hittest_grid_1.png -------------------------------------------------------------------------------- /images/hittest_grid_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/hittest_grid_2.png -------------------------------------------------------------------------------- /images/input_component_order_operations.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/input_component_order_operations.png -------------------------------------------------------------------------------- /images/input_component_stack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/input_component_stack.png -------------------------------------------------------------------------------- /images/input_flow_diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/input_flow_diagram.png -------------------------------------------------------------------------------- /images/is_variable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/is_variable.png -------------------------------------------------------------------------------- /images/leaf_widgets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/leaf_widgets.png -------------------------------------------------------------------------------- /images/mouse_cursor/aero_arrow.png.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/mouse_cursor/aero_arrow.png.zip -------------------------------------------------------------------------------- /images/mouse_lock_modes/mouse_lock_mode_do_not_lock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/mouse_lock_modes/mouse_lock_mode_do_not_lock.png -------------------------------------------------------------------------------- /images/mouse_lock_modes/mouse_lock_mode_lock_always.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/mouse_lock_modes/mouse_lock_mode_lock_always.png -------------------------------------------------------------------------------- /images/mouse_lock_modes/mouse_lock_mode_lock_capture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/mouse_lock_modes/mouse_lock_mode_lock_capture.png -------------------------------------------------------------------------------- /images/mouse_lock_modes/mouse_lock_mode_lock_fullscreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/mouse_lock_modes/mouse_lock_mode_lock_fullscreen.png -------------------------------------------------------------------------------- /images/mouse_lock_modes/mouse_lock_modes.afphoto: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/mouse_lock_modes/mouse_lock_modes.afphoto -------------------------------------------------------------------------------- /images/nav_grid_debug.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/nav_grid_debug.png -------------------------------------------------------------------------------- /images/panel_widgets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/panel_widgets.png -------------------------------------------------------------------------------- /images/slate_widget_examples_step1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/slate_widget_examples_step1.png -------------------------------------------------------------------------------- /images/slate_widget_examples_step2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/slate_widget_examples_step2.png -------------------------------------------------------------------------------- /images/starship_gallery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/starship_gallery.png -------------------------------------------------------------------------------- /images/ue4_test_suite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/ue4_test_suite.png -------------------------------------------------------------------------------- /images/umg_animation_designer.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/umg_animation_designer.gif -------------------------------------------------------------------------------- /images/umg_designer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/umg_designer.png -------------------------------------------------------------------------------- /images/umg_hierarchy_diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/umg_hierarchy_diagram.png -------------------------------------------------------------------------------- /images/user_widget_events/added_to_focus_path.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/user_widget_events/added_to_focus_path.png -------------------------------------------------------------------------------- /images/user_widget_events/animation_finished.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/user_widget_events/animation_finished.png -------------------------------------------------------------------------------- /images/user_widget_events/animation_started.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/user_widget_events/animation_started.png -------------------------------------------------------------------------------- /images/user_widget_events/construct.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/user_widget_events/construct.png -------------------------------------------------------------------------------- /images/user_widget_events/destruct.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/user_widget_events/destruct.png -------------------------------------------------------------------------------- /images/user_widget_events/focus_lost.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/user_widget_events/focus_lost.png -------------------------------------------------------------------------------- /images/user_widget_events/focus_received.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/user_widget_events/focus_received.png -------------------------------------------------------------------------------- /images/user_widget_events/focus_received_both.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/user_widget_events/focus_received_both.png -------------------------------------------------------------------------------- /images/user_widget_events/focus_received_both.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/user_widget_events/focus_received_both.psd -------------------------------------------------------------------------------- /images/user_widget_events/focus_received_handled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/user_widget_events/focus_received_handled.png -------------------------------------------------------------------------------- /images/user_widget_events/focus_received_unhandled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/user_widget_events/focus_received_unhandled.png -------------------------------------------------------------------------------- /images/user_widget_events/oninitialized.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/user_widget_events/oninitialized.png -------------------------------------------------------------------------------- /images/user_widget_events/onpaint.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/user_widget_events/onpaint.png -------------------------------------------------------------------------------- /images/user_widget_events/preconstruct.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/user_widget_events/preconstruct.png -------------------------------------------------------------------------------- /images/user_widget_events/removed_from_focus_path.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/user_widget_events/removed_from_focus_path.png -------------------------------------------------------------------------------- /images/user_widget_events/tick.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/user_widget_events/tick.png -------------------------------------------------------------------------------- /images/user_widget_hierarchy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/user_widget_hierarchy.png -------------------------------------------------------------------------------- /images/user_widget_hierarchy_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/user_widget_hierarchy_result.png -------------------------------------------------------------------------------- /images/widget_reflector_console_debugger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/widget_reflector_console_debugger.png -------------------------------------------------------------------------------- /images/widget_reflector_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/images/widget_reflector_example.png -------------------------------------------------------------------------------- /languages/ru/EXTERNAL_LINKS.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # ВНЕШНИЕ ССЫЛКИ 4 | 5 | Локализовано с помощью [GitLocalize](https://gitlocalize.com/) (Пожалуйста, прочитайте страницу [ЧаВо](FAQ.md) о том, как стать переводчиком!) 6 | 7 | 8 | 9 | ## Ссылки на страницы репозитория 10 | 11 | > - [Главная страница компендиума](README.md) 12 | > - [Страница часто задаваемых вопросов](FAQ.md) 13 | 14 | Здесь представлен список важных и полезных источников информации о Slate и UMG в Unreal Engine. Сначала ссылки, связанные с Epic, затем ссылки на сообщества, которые расположены без особого порядка. 15 | 16 | У некоторых ссылок может быть описание того, что это такое, чтобы было понятно, почему эта ссылка приведена, или любая другая информация, которую рекомендуется просмотреть после перехода по этой ссылке. 17 | 18 | 25 | 26 | 27 | 28 | ## Оглавление 29 | 30 | > - [Ссылки, связанные с Epic](#epic-related-links) 31 | > - [Ссылки, связанные с сообществом](#community-related-links) 32 | 33 | 34 | 35 | ### Ссылки, связанные с Epic 36 | 37 | Здесь представлены конкретные ссылки от Epic Games, либо от отдельных разработчиков, ведущих блог, либо официальные страницы документации, официальные курсы и т.д. 38 | 39 | 40 | 41 | 42 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 86 | 87 | 88 | 89 | 91 | 92 | 93 | 94 | 95 | **[ Вернуться в начало](#table-of-contents)** 96 | 97 | 98 | ### Ссылки, относящиеся к сообществу 99 | 100 | Здесь представлен список ссылок, связанных с сообществом, без определенного порядка (разве что в зависимости от времени их добавления). 101 | 102 | 103 | 104 | 106 | 107 | 108 | 109 | 111 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 130 | 131 | 132 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 143 | 145 | 146 | 147 | 149 | 152 | 153 | 154 | 156 | 157 | 158 | 159 | 161 | 165 | 166 | 167 | 169 | 170 | 171 | 172 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 183 | 184 | 185 | 186 | 188 | 190 | 191 | 192 | 194 | 195 | 196 | 197 | 199 | 200 | 201 | 202 | 203 | **[ Вернуться в начало](#table-of-contents)** 204 | -------------------------------------------------------------------------------- /languages/ru/FAQ.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # ЧаВо(Часто задаваемые вопросы) компендиума по UMG-Slate 4 | 5 | Весь исходный код, указанный в компендиуме, взят из Лаунчера и public-репозитория Unreal Engine от эпиков на GitHub. 6 | 7 | *Любые крупные обновления, которые автор документа (также владелец репозитория) должен подтверждать по своему месту работы, чтобы гарантировать отсутствие «коммерческих секретов», могут занять много времени, НО это помогает избежать юридических проблем, которые может вызвать документ. Pull Requests от сообщества не подпадают под это правило и могут быть немедленно объединены в общедоступный репозиторий, если они одобрены.* 8 | 9 | 10 | 11 | ## Ссылки на страницы репозитория 12 | 13 | > - [Главная страница компендиума](README.md) 14 | > - [External Links Page](EXTERNAL_LINKS.md) 15 | 16 | 17 | 18 | ## ЧаВо по переводу/локализации 19 | 20 | Для перевода компендиума и его документов мы используем [GitLocalize](https://gitlocalize.com/).
Для подачи заявки на участие в переводе заполните эту форму ([LINK](https://forms.gle/xyS4otdTTNHLKfYz9)). Если вы уже отправили форму и хотите перевести на другой язык (или сделать ещё одну локализацию), вы можете просто отредактировать форму и отправить ее заново. 21 | 22 | Языки, на которые в настоящее время локализован компендиум (включая количество переводчиков для данного языка): 23 | 24 | - Английский (язык оригинала) 25 | - 1 Переводчик 26 | - Русский 27 | - 1 Переводчик 28 | 29 | 30 | 31 | ## Вопросы 32 | 33 | --- 34 | 35 | 1. ВОПРОС: Я обнаружил проблему и хочу о ней сообщить. Что делать дальше?
ОТВЕТ: Перейдите на вкладку "Issues" этого GitHub-репозитория и создайте для этого новую issue. У меня есть шаблон (на английском) для определенных типов задач, но общий формат должен содержать информацию: 36 | - В чем заключается проблема. 37 | - Где она находится (в том числе номер раздела будет чрезвычайно полезен, чтобы автор знал, что вы имеете в виду). 38 | - `-НЕОБЯЗАТЕЛЬНО, НО РЕКОМЕНДУЕТСЯ-` Предложение исправленной версии (если это возможно), чтобы помочь быстрее исправить текст (в шаблонах будет явно указано, должны ли вы предложить исправленный вариант или нет). 39 | 40 | --- 41 | 42 | 1. ВОПРОС: Я хочу внести свой вклад в этот документ! Как я могу это сделать?
ОТВЕТ: Вы можете сделать форк репозитория, а затем сделать Pull Request, чтобы объединить ваш вклад в этот репозиторий, как если бы вы вносили свой вклад в Unreal Engine. У вас должно быть письменное разрешение от вашего места работы на внесение вклада (оно может быть в любой форме, но оно должно быть в письменной форме в качестве доказательства), чтобы избежать раскрытия каких-либо юридических вопросов, касающихся раскрытия "коммерческой тайны", но даже тогда, когда информация относится к Лаунчеру/публичному репозиторию Unreal Engine в GitHub, для них не должно быть проблемой разрешить это. 43 | 44 | --- 45 | 46 | 1. ВОПРОС: Какова политика в отношении Pull Requests?
ОТВЕТ: 47 | - Любой может сделать запрос на внесение изменений в Compendium! 48 | - Вы должны быть вежливы и уважительны по отношению к другим (у вас есть 3 шанса, но в зависимости от серьезности их может быть меньше, так что, очевидно, руководствуйтесь своим здравым смыслом). Мы все используем Unreal Engine, кто-то может быть более опытным в этом, но это не дает вам права быть придурком, и наоборот. 49 | - Вся информация, относящаяся к Unreal Engine, должна поступать из Лаунчера или public-репозитория Unreal Engine в GitHub, НЕ из частных репозиториев вашей компании или из собственного частного репозитория Epic. 50 | - Если вы работаете в компании, которая использует Unreal Engine (или что-то связанное с ним), я бы предпочел, чтобы у вас было письменное (НЕ УСТНОЕ) разрешение от этой компании, что вы можете внести свой вклад в проект, даже если это разовый вклад (мне будет достаточно сообщения в Slack или электронного письма от вашего босса, в котором говорится, что всё в порядке). Это делается для того, чтобы избежать юридических проблем, связанных с раскрытием "коммерческой тайны", но даже в этом случае вся информация в компендиуме относится к общедоступным сведениям, поэтому для них не должно быть проблемой ее одобрение. 51 | 52 | --- 53 | 54 | 1. ВОПРОС: Как проходит процесс Pull Requests?
ОТВЕТ: 55 | 1. Сделайте форк репозитория. 56 | 2. Создайте ветку в форке репозитория, чтобы ваши изменения инкапсулировались и хранились в этой ветке. 57 | 3. Внесите изменения в свою ветку форка репозитория. 58 | 4. Когда вы будете готовы перенести их в этот репозиторий, создайте Pull Request из своей ветки, который будет объединен с веткой `main` этого репозитория. 59 | 5. Заполните Pull Request подробным описанием ваших изменений, **НЕ добавляйте никого в reviewers!** это сделают maintainers этого репозитория. **НЕ @ никого, кто еще не прокомментировал Pull Request, в общем, уважайте время maintainers, мы мы разберёмся с этим!**. 60 | 6. Maintainer прокомментирует любые проблемы, которые он увидит в изменениях, и вы сможете внести эти изменения (это обычная практика гонять Pull Request туда и обратно). Maintainer также прокомментирует, одобрен/отклонен ли Pull Request, а затем добавит тег `Rejected`/`Approved`/`In Progress`. 61 | 7. Maintainer будет заниматься вливанием Pull Request в проект, а затем закрытием Pull Request. После слияния вы можете удалить свою ветку в форке репозитория. 62 | 63 | --- 64 | 65 | 1. ВОПРОС: Этот документ потрясающий! Я хочу пожертвовать деньги или что-то еще, чтобы показать свою поддержку его обновления!
ОТВЕТ: Этот документ должен быть на 100% бесплатным без каких-либо условий, я НЕ ПРИНИМАЮ никаких пожертвований (за исключением пожертвований знаний в виде Pull Requests, чтобы сделать документ лучше). Я буду обновлять его до тех пор, пока могу физически (мы разберёмся в будущем, как быть потом). Любой, кто вносит свой вклад в этот компендиум, не должен просить пожертвования для внесения вклада, любому, кто будет уличен в нарушении этого правила, будет немедленно забанена возможность вносить свой вклад. 66 | 67 | --- 68 | 69 | 1. ВОПРОС: У меня есть предложение что-то добавить в документ! Что дальше?
ОТВЕТ: Перейдите на вкладку "Issues" в этом GitHub-репозитории и создайте для этого новый issue. Если вы напишете в личку любому maintainer об этом, мы просто скажем вам то же самое или направим вас на эту страницу ЧаВо. 70 | 71 | --- 72 | 73 | 1. ВОПРОС: Как я могу увидеть, что запланировано для документа?
ОТВЕТ: Итак, тут есть два момента; 74 | 75 | - Будет issue с надписью `Planned xx.xx.xx Updates`, и там будет сказано, что ведется работа над следующим обновлением. Вы можете увидеть прогресс в реальном времени, когда maintainers будут проверять информацию, заполненную в частном порядке (опять же, причина такого написана в начале ЧаВо), ИЛИ если кто-то сделал Pull Request, и тот был объединен с public-репозиторием, то он сразу же доступен. Issue будет закрыт и помечен как выполненный, когда все обновления будут объединены в public-репозиторий. 76 | - А вот долгосрочные обновления по большей части планируются в моей голове, но активно не прорабатываются и не публикуются публично, так что, если кто-то работает над одним и тем же фрагментом знаний в качестве публичного вклада, им не нужно предполагать, что кто-то над ним работает за кадром, и мы надеемся, что они могут включить его в компендиум раньше, чем maintainer сам сделал бы это (очевидно, что обновления/дополнения будут происходить со временем). 77 | 78 | --- 79 | 80 | 1. ВОПРОС: Какова политика с номерами версий?
ОТВЕТ: Формат `Major.Minor.Patch`, в зависимости от значимости изменений, мы будем обновлять мажорную/`Major` или минурную/`Minor` версию. Для каждого исправления мы увеличиваем `Patch`, но всякий раз, когда увеличивается `Major` или `Minor`, мы сбрасываем `Patch` до нуля. 81 | 82 | --- 83 | 84 | 1. ВОПРОС: А как насчет нумерации разделов внутри документа?
ОТВЕТ: Каждый раздел имеет номер `Major.Minor.Mini`, все, что находится глубже во вложенности, усложняет документ и требует общения с maintainers (это можно сделать с помощью Pull Request в комментариях). 85 | 86 | --- 87 | 88 | 1. ВОПРОС: Я работаю над вкладом, который я хочу объединить, но я увидел, что была создана новая issue на обновление, которая противоречит моему вкладу, что мне делать?
ОТВЕТ: Во-первых, ОТЛИЧНО! Спасибо за участие, я очень ценю это! Во-вторых, сделайте черновой Pull Request в компендиум, чтобы отслеживать его прогресс (и, возможно, внести в него свой вклад, если хотите), затем оставьте комментарий к Pull Request, сообщив maintainers, что вы работаете над этим вкладом, и включите ссылку на черновой Pull Request. После этого сопровождающие пометят ваш Pull Request тегом Update, чтобы вы знали, что тот отслеживается. 89 | 90 | --- 91 | 92 | 1. ВОПРОС: Что должен охватывать Компендиум, когда он будет в значительной степени завершен?
ОТВЕТ: Он нужен для объяснения как рантайма, рендеринга, так и частей редактора UMG и Slate в стандартном Unreal Engine. Как я уже сказал в предыдущем ответе, он сделан для сообщества, а сообщество может помочь в его создании! Пока не значит, что он не будет охватывать какие-либо плагины в движке, которыми вы можете воспользоваться, но они будут отдельными документами в репозитории, чтобы упростить навигацию и помочь отделить несущественные вещи от основной информации. 93 | 94 | --- 95 | 96 | 1. ВОПРОС: А как насчет подключаемых модулей движка, таких как Common UI, Common Input и тому подобное?
ОТВЕТ: Поскольку это не функции Unreal Engine по умолчанию, а дополнения (хотя и очень полезные дополнения), основной документ компендиума не будет охватывать их. НО у меня есть планы начать освещать их после того, как я расскажу как о рантайме, так и о редакторе UMG/Slate. Они также будут отдельными документами в том же репозитории, чтобы упростить навигацию по базам знаний. 97 | 98 | --- 99 | 100 | 1. ВОПРОС: Так как вы не будете сразу рассматривать Common UI и Common Input, могу ли я начать писать документацию по ним, чтобы добавить в этот репозиторий сейчас?
ОТВЕТ: ДА! Вы можете сделать Pull Request и начать добавлять документацию по плагинам Common UI и Common Input, но я требую, чтобы вы делали их в виде отдельных .md файлов, чтобы облегчить навигацию для других, и, пожалуйста, старайтесь следовать структуре форматирования, которая есть в базовом файле README для компендиума, который требует, чтобы вы всегда указывали, где в исходном коде находится система (это помогает избежать дезинформации). 101 | 102 | **[ Вернуться в начало](#page-top)** 103 | -------------------------------------------------------------------------------- /languages/zh/.github/ISSUE_TEMPLATE/grammatical-error.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 问题模板 - 语法错误 3 | about: 对于文档中的语法错误 4 | title: "[语法]" 5 | labels: 语法 6 | assignees: '' 7 | --- 8 | 9 | 10 | 11 | 16 | -------------------------------------------------------------------------------- /languages/zh/.github/ISSUE_TEMPLATE/request-to-become-a-translator.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 请求成为一名翻译 3 | about: 对于那些要求成为翻译的人 4 | title: 我想翻译[语言] 5 | labels: 问题 6 | assignees: YawLighthouse 7 | --- 8 | 9 | 我想成为该纲要的翻译! 10 | 11 | --- 12 | 13 | 语言: 14 | -------------------------------------------------------------------------------- /languages/zh/EXTERNAL_LINKS.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 外部链接 4 | 5 | 通过[GitLocalize](https://gitlocalize.com/)本地化(请阅读有关成为翻译者的[常见问题解答](FAQ.md)页面!) 6 | 7 | 8 | 9 | ## 存储库页面链接 10 | 11 | > - [主概要页面](README.md) 12 | > - [常见问题页面](FAQ.md) 13 | 14 | 以下是有关虚幻引擎中的 Slate 和 UMG 的重要且有用的信息来源列表。从 Epic 相关链接开始,然后是社区链接,排名不分先后。 15 | 16 | 某些链接可能包含有助于理解包含此链接的原因的说明,或者建议在访问该链接后查看的任何其他信息。 17 | 18 | 25 | 26 | 27 | 28 | ## 目录 29 | 30 | > - [史诗相关链接](#epic-related-links) 31 | > - [社区相关链接](#community-related-links) 32 | 33 | 34 | 35 | ### 史诗相关链接 36 | 37 | 以下是 Epic Games 的特定链接,来自个人开发者的博客、官方文档页面、官方课程等。 38 | 39 | 40 | 41 | 42 | 45 | 46 | 47 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 87 | 88 | 89 | 90 | 92 | 93 | 94 | 95 | 96 | **[返回顶部](#table-of-contents)** 97 | 98 | 99 | ### 社区相关链接 100 | 101 | 以下是社区相关链接的列表,无特定顺序(除了基于添加时间之外)。 102 | 103 | 104 | 105 | 107 | 108 | 109 | 110 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 142 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 152 | 153 | 154 | 155 | 156 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | **[返回顶部](#table-of-contents)** 190 | -------------------------------------------------------------------------------- /languages/zh/FAQ.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # UMG-Slate 纲要常见问题解答(常见问题) 4 | 5 | 纲要中引用的所有源代码均来自虚幻引擎的启动器和 Epic 公共 github 存储库。 6 | 7 | *文档作者(也是存储库的所有者)的任何重大更新都必须得到作者营业地点的确认,以确保没有泄露“商业秘密”,这可能是一个耗时的过程,但它有助于避免法律诉讼该文档可能出现的问题。来自社区的 Pull 请求不受此规则的约束,如果获得批准,可以立即合并到公共存储库中。* 8 | 9 | 10 | 11 | ## 存储库页面链接 12 | 13 | > - [主概要页面](README.md) 14 | > - [外部链接页面](EXTERNAL_LINKS.md) 15 | 16 | 17 | 18 | ## 翻译/本地化常见问题解答 19 | 20 | 为了翻译纲要及其文档,我们使用[GitLocalize](https://gitlocalize.com/) 。 21 | 如需申请成为翻译人员,请填写此表格([链接](https://forms.gle/xyS4otdTTNHLKfYz9)),如果您已经提交了表格并想要本地化另一种语言(或其他语言),您只需编辑表格并重新提交即可。 22 | 23 | 纲要当前本地化的语言(包括该语言的翻译者数量): 24 | 25 | - 英语(母语) 26 | - 1 名翻译 27 | - 俄语 28 | - 1 名翻译 29 | - 中文 30 | - 1 名翻译 31 | 32 | 33 | 34 | ## 问题 35 | 36 | --- 37 | 38 | 1. 问题:我发现了一个想要报告的问题,下一步是什么? 39 | 回答:请转到此 GitHub 存储库的“问题”选项卡并为此创建一个新问题,我有一个针对某些类型问题的模板,但一般格式包括: 40 | - 到底是什么问题。 41 | - 它的位置(包括部分编号非常有用,因此作者知道您所指的内容)。 42 | - `-OPTIONAL & RECOMMENDED-`建议固定版本(如果适用)以帮助更快地修复(模板将明确说明您是否应该提出建议)。 43 | 44 | --- 45 | 46 | 1. 问题:我想为这份文档做出贡献!我怎样才能做到这一点? 47 | 回答:您可以对存储库进行分叉,然后发出拉取请求,将您的贡献合并到此存储库中,就像您为虚幻引擎做出贡献一样。您需要获得营业场所的书面许可才能进行贡献(可以是任何形式,但需要以书面形式作为证明之类的),这可以避免任何有关“商业秘密”被泄露的法律问题,但即使如此,如果该信息引用了虚幻引擎的 Launcher/公共 Github 存储库,那么他们批准它也不应该成为问题。 48 | 49 | --- 50 | 51 | 1. 问题:有关 Pull 请求的政策是什么? 52 | 回答: 53 | - 任何人都可以提出拉取请求来对纲要进行更改! 54 | - 您必须对他人有礼貌和尊重(您有 3 次机会,但根据严重程度,机会可能会更少,显然请使用您的最佳判断)。我们都在使用虚幻引擎,有些人可能对此更有经验,但这并不意味着你有权利成为一个混蛋,反之亦然。 55 | - 所有涉及虚幻引擎的信息都必须来自虚幻引擎的启动器或公共 Github 存储库,而不是来自您公司或 Epic 自己的私有存储库的私有存储库。 56 | - 如果您在使用虚幻引擎(或与之相关的东西)的企业工作,我希望您拥有该企业的书面(非口头)许可,您可以为该项目做出贡献,即使它是一次性贡献(a你老板发来的松弛消息或电子邮件说这对我来说已经足够了)。这是为了避免泄露“商业秘密”的法律问题,但即便如此,纲要中的所有信息都涉及公共知识,因此他们批准它不应该成为问题。 57 | 58 | --- 59 | 60 | 1. 问题:Pull Request 的流程是怎样的? 61 | 回答: 62 | 1. 分叉存储库。 63 | 2. 在分叉存储库上创建一个分支,以便将更改封装并包含到该分支中。 64 | 3. 在分叉存储库的分支中进行更改。 65 | 4. 当您准备好将其放入此存储库时,请从您的分支创建一个拉取请求,以将其合并到此存储库的名为: `main`的分支中。 66 | 5. 填写拉取请求并详细描述您的更改,**请勿添加任何审阅者!**该存储库的维护者将执行此操作。**不要@任何尚未对拉取请求发表评论的人,基本上尊重维护者的时间,我们会解决它的!** 。 67 | 6. 维护者将对他们在更改中看到的任何问题进行评论,您可以进行这些编辑(这是来回的一般拉取请求)。如果拉取请求被批准/拒绝,维护者也会发表评论,然后添加`Rejected` / `Approved` / `In Progress`的标签。 68 | 7. 维护者将处理将拉取请求合并到项目中,然后关闭拉取请求。合并后,您可以删除分叉存储库中的分支。 69 | 70 | --- 71 | 72 | 1. 问:这份文件太棒了!我想捐钱或者其他什么东西来表达我的支持,它不断更新! 73 | 答:本文档是 100% 免费的,不附加任何条件,我不会接受任何形式的捐赠(除非其知识捐赠作为拉取请求以使文档变得更好)。我会不断更新它,直到我身体不再能够更新(当我们到达它时,我们将跨过那座桥)。任何为本纲要做出贡献的人都不应要求捐款,任何发现违反该规则的人将立即被禁止捐款。 74 | 75 | --- 76 | 77 | 1. 问题:我有一个关于添加到文档中的内容的建议!下一步是什么? 78 | 解答:请转到此 GitHub 存储库的“问题”选项卡并为此创建一个新问题票证。如果您直接向任何维护人员发送有关此问题的消息,我们只会告诉您同样的事情或引导您访问此常见问题解答页面。 79 | 80 | --- 81 | 82 | 1. 问题:如何查看文档的计划内容? 83 | 答案:所以有两个部分: 84 | 85 | - 将有一个标记为`Planned xx.xx.xx Updates`问题单,其中会显示正在处理下一次更新。您可以看到它的实时进度,维护人员将检查私下填写的信息(同样在常见问题解答顶部解释了原因),或者是否有人对其提出了 Pull 请求并将其合并到公共中存储库然后它立即可用。当所有更新都已合并到公共存储库中时,问题票证将被关闭并标记为已完成。 86 | - 对于长期计划的更新,它们几乎是在我的脑海中计划好的,但没有积极工作或公开发布,因此,如果有人正在研究与公共贡献相同的知识块之一,那么他们不必假设其正在幕后进行工作,并且希望比维护者自己更早将其纳入纲要(更新/添加显然会随着时间的推移而进行)。 87 | 88 | --- 89 | 90 | 1. 问题:版本号的政策是什么? 91 | 解答:格式为`Major.Minor.Patch`具体取决于更改的重要性,我们将更新`Major`或`Minor` 。对于每个修复,我们都会增加`Patch` ,但每当`Major`或`Minor`增加时,我们都会将`Patch`重置为零。 92 | 93 | --- 94 | 95 | 1. 问题:但是文档中的章节编号又如何呢? 96 | 回答:每个部分的编号是`Major.Minor.Mini` ,嵌套中任何更深的内容都会使文档变得复杂,并且需要与维护者交谈(这将通过评论中的 Pull Request 来完成)。 97 | 98 | --- 99 | 100 | 1. 问题:我正在处理一个想要合并的贡献,但我看到一个新的更新问题票与我的贡献冲突,我该怎么办? 101 | 回答:首先,太棒了!感谢您的贡献,我真的很感激!其次,为纲要提出草稿拉取请求,以便跟踪其进度(如果您愿意,也可以为其做出贡献),然后在更新票上发表评论,让维护人员知道您正在处理该贡献并包含草稿拉取请求链接。之后,维护人员将使用 Update 标签标记您的拉取请求,让您知道它已被跟踪。 102 | 103 | --- 104 | 105 | 1. 问:纲要即将完成时打算涵盖哪些内容? 106 | 解答:它旨在解释默认虚幻引擎中 UMG 和 Slate 的运行时、渲染和编辑器部分。正如我在之前的回答中所说,它是为了社区,欢迎社区帮助建立它!现在,这并不意味着它不会涵盖引擎中您可以利用的任何插件,但这些插件将作为存储库中的单独文档,以便于导航并帮助将非必要内容与核心信息分开。 107 | 108 | --- 109 | 110 | 1. 问题:Common UI 和 Common Input 等引擎插件怎么样? 111 | 回答:由于这些不是默认的虚幻引擎功能并且最终会出现,因此概要的主文档不会涵盖这些附加功能(尽管非常有用的附加功能)。但我确实计划在介绍 UMG/Slate 的运行时和编辑器部分后开始介绍它。它们也将是同一存储库中的单独文档,以便更轻松地导航知识库。 112 | 113 | --- 114 | 115 | 1. 问题:由于您没有立即涵盖通用 UI 和通用输入,我现在可以开始编写文档以将其添加到此存储库吗? 116 | 答:是的! 100% 欢迎您提出拉取请求并开始添加通用 UI 和通用输入插件文档,我确实要求您将它们作为单独的 .md 文件进行,以便其他人轻松导航,请尝试遵循中的格式结构纲要的基本自述文件要求您始终指出系统在源代码中的位置(这有助于避免错误信息)。 117 | 118 | **[返回顶部](#page-top)** 119 | -------------------------------------------------------------------------------- /pages/text_widgets/rich_text_block.md: -------------------------------------------------------------------------------- 1 | 2 | # Rich Text Block Widget 3 | 4 | --- 5 | 6 | 7 | ## Table of Contents 8 | 9 | > **[ Back to Main Compendium Page](../../README.md)** 10 | > 11 | > **[ Back to Overview Page](text_widget_overview.md)** 12 | > 13 | > ### Related Page Links 14 | > 15 | > - [Text Marshallers Page](text_marshallers.md) 16 | > - [Text Decorators Page](text_decorators.md) 17 | 18 | --- 19 | 20 | 21 | ## General Description 22 | 23 | Rich Text Block's handle displaying not just text but inline images and/or widgets, links, combinations of styles, colors, sizes, fonts, localization support, and other features within a single text block. 24 | Rich Text Block's do not tick logic as they compute their results during the Paint pass of the widget. 25 | 26 | --- 27 | 28 | 29 | ### Important Types 30 | 31 | *@TODO Add graph visuals for this hierarchy* 32 | 33 | - `URichTextBlock`[Parent Class: `UTextLayoutWidget`]: UMG implementation of the Rich Text Block. 34 | - `SRichTextBlock`[Parent Class: `SWidget`]: Slate Widget implementation of the Rich Text Block. 35 | - `FDefaultRichTextMarkupParser`[[Compendium Explanation](text_marshallers.md#default-rich-text-markup-parser)]: The default implementation class of rich text markup parsing that handles parsing the inputted `FString` to be separated and returned as the parse results(`TArray`) and a `FString` stripped of any markup. 36 | - `FRichTextLayoutMarshaller`[[Compendium Explanation]](text_marshallers.md#rich-text-marshaller): The marshaller that is used when creating the rich text block layout of this widget. 37 | - `ITextDecorator`[[Compendium Explanation]](text_decorators.md): Decorators that handle parsing the source text to apply custom styling and features to the resulted text of this widget. 38 | 39 | --- 40 | 41 | 42 | ### Construction 43 | 44 | When constructed(occurs when the blueprint widget is recompiled in the editor) the rich text widget will cache designer inputted data for drawing in this execution order: 45 | 46 | 1. Caches the markup parser(if applicable otherwise uses `FDefaultRichTextMarkupParser` if nothing is inputted). 47 | 2. Caches the text marshaller(if applicable otherwise uses `FRichTextLayoutMarshaller` if nothing is inputted). 48 | 3. Caches the optionally inputted decorator's within the marshaller. 49 | 4. Caches the text layout[`FSlateTextBlockLayout`] and caches the marshaller within that text layout. 50 | 51 | ### Painting 52 | 53 | Within `OnPaint` the rich text block goes through a more direct drawing phase that is more composed than split for code paths that occur on the CPU. 54 | 55 | 56 | #### Rich Text Block :: On Paint 57 | 58 | This occurs in the paint pass in this execution order in the rich text block widget: 59 | 60 | 1. Starts the draw phase by calculating the geometry of the text block and its position on the screen from the cached text layout. 61 | 2. Builds up paint data by routing to the cached text layout's `FSlateTextBlockLayout::OnPaint` to then route to [FSlateTextLayout::OnPaint](#slate-text-layout--on-paint) which handles the actual drawing. 62 | 3. Recalculate the layout now that the paint data is ready while accounting for wrapping. 63 | 4. If the paint data is causing the new layout size to require the rich text widget to wrap, then invalidate the widget to fully populate the widget's geometry size change to the hierarchy. 64 | 65 | 66 | #### Slate Text Layout :: On Paint 67 | 68 | This occurs in this execution order in slate text layout: 69 | 70 | 1. Starts by figuring out if we're suppose to apply the disabled effect or not(causing the text to be at a lower opacity). 71 | 2. Computes the scale factor of the widget so it scales within the layout. 72 | 3. Setting up a lambda to check if a line of text is visible within the viewport(recommend studying this function for your own code implementations). 73 | Taking into account horizontal & vertical culling using `FSlateRect::DoRectanglesIntersect`. This is to skip elements that don't need to be drawn as an optimization. 74 | 4. Iterates through each text line and track which layer (found via the text line) is the highest layer or not. This is to have each element layered correctly to account for other widgets. 75 | - There is also checks to account for if the text should be cut off with Ellipsis(`...`). 76 | - You can also see a debug box for each line by enabling the console command `Slate.ShowTextDebugging 1`(this is noted in [Main Compendium Page - Debug Console Commands](../../README.md#91-debug-console-commands)). 77 | - Text overlay's are also included with this highest layer computation process via `FSlateTextLayout::OnPaintHighlights`. 78 | 5. Outputs the highest layer ID to paint and draw. 79 | 80 | -------------------------------------------------------------------------------- /pages/text_widgets/text_block_widget.md: -------------------------------------------------------------------------------- 1 | 2 | # Text Block Widget 3 | 4 | --- 5 | 6 | 7 | ## Table of Contents 8 | 9 | > **[ Back to Main Compendium Page](../../README.md)** 10 | > 11 | > **[ Back to Overview Page](text_widget_overview.md)** 12 | 13 | --- 14 | 15 | 16 | ### General Description 17 | 18 | Text Block's handle displaying static text that can be changed at runtime. 19 | Text block's allow for a simple text mode which is intended for optimized rendering of text blocks but only works with text containing numbers or basic ASCII. 20 | 21 | > Simple text mode does **NOT** allow for certain languages such as Arabic or Thai, that require complex text rendering support. 22 | > It is useful for text that changes frequently and really shouldn't be used for localized user-facing text. 23 | 24 | --- 25 | 26 | 27 | ### Important Types 28 | 29 | *@TODO Add graph visuals for this hierarchy* 30 | 31 | - `UTextBlock`[Parent Class: `UTextLayoutWidget`] UMG implementation of the Text Block. 32 | - `STextBlock`[Parent Class: `SLeafWidget`]: Slate Widget implementation of the Text Block. 33 | - `FSlateTextBlockLayout`: Variable[`TextLayoutCache`] The class to handle caching the layout of the STextBlock as a proxy of the `FTextLayout`. 34 | - `FPlainTextLayoutMarshaller`[[Compendium Explanation]](text_marshallers.md#plain-text-marshaller): The marshaller that is used when creating the text block layout of this widget. 35 | 36 | --- 37 | 38 | 39 | ### Painting 40 | 41 | Within `OnPaint` the text block goes through two paint routes on the CPU. 42 | 43 | 44 | #### Painting Simple Text Mode 45 | 46 | *@TODO Add graph visuals for this section* 47 | 48 | Located in `STextBlock::OnPaint`, this occurs in the paint pass in this execution order: 49 | 50 | 1. Retrieves the local shadow color, opacity, and offset values and checks if a shadow should be drawn based on these values. 51 | 2. Checks if the text should be rendered as enabled/disabled based on if the parent is enabled/disabled. 52 | 3. Retrieves the local text and font values to be rendered. 53 | 4. Checks if shadow rendering is enabled via `ShouldDropShadow`(`local boolean`) which modifies the font settings to remove the outline from the shadow. 54 | 1. Calls `FSlateDrawElement::MakeText` to render the shadow text, with it being offset by `LocalShadowOffset`(`local FVector2D`) and styled according to the shadow font settings. 55 | 2. Restores the outline size to the font's and increments the `LayerID`(`integer`) for the main text to be drawn at that layer ID in front of the shadow text. 56 | 5. Calls `FSlateDrawElement::MakeText` to render the main text at the `LayerID`(`integer`) and positions the text according to `AllottedGeometry`(`FGeometry`) and applies the style's and effects that are configured by the designer. 57 | 6. Returns the `LayerID`. 58 | 59 | 60 | #### Painting Non-Simple Text Mode 61 | 62 | *@TODO Add graph visuals for this section* 63 | 64 | Located in `STextBlock::OnPaint`, this occurs in the paint pass in this execution order: 65 | 66 | 1. Retrieves the last desired size of the text so we can check if the text size has changed after it was rendered. 67 | 2. Tells the `TextLayoutCache` to paint the text via [FSlateTextBlockLayout::OnPaint](#slate-text-block-layout--on-paint) at the `LayerID`(`integer`). 68 | 3. Caches the new desired size of the text after its been painted(rendered) via the text layout cache. 69 | 4. Checks if the desired size has changed and if wrapping is enabled, to then invalidate the layout of the widget since it requires the layout to be re-arranged. 70 | 5. Returns the `LayerID`. 71 | 72 | 73 | ##### Slate Text Block Layout :: On Paint 74 | 75 | *@TODO Add graph visuals for this section* 76 | 77 | This occurs for painting the block layout in this execution order: 78 | 79 | 1. Caches size of the widget's geometry as `CachedSize`. 80 | 2. Computes the wrapping width to pass to the text layout for later use. 81 | 3. Locally caches the visual justification of the text layout and computes the auto scroll value based on that justification(can be zero). 82 | 4. Updates what part of the text layout is visible via `FTextLayout::SetVisibleRegion` & `FTextLayout::UpdateIfNeeded`. 83 | 5. Lets the text layout handle the final aspects of OnPaint with its own `FTextLayout::OnPaint` functionality. 84 | 85 | 86 | ##### Slate Text Layout :: On Paint 87 | 88 | This occurs for painting the text layout in this execution order: 89 | 90 | 1. Decides which drawing effects to show based on whether the parent widget is enabled/disabled. If disabled then uses the disabled effect. 91 | 2. Calculates the text's scaling factor from the pre-scaled offset to the painted scaling(including things like the widget's render transform and such). 92 | 3. Initializes the highest layer ID to keep track of front-most layer that's being used while painting. 93 | 4. Sets up a visibility check to find out if a line of text is visible within the bounds of the widget as an optimization to not compute un-rendered text. 94 | 5. Iterates over each line view, skipping lines that won't be rendered/visible. 95 | 1. Renders background highlights for that line via `FSlateTextLayout::OnPaintHighlights`. 96 | 2. Sets up layer indices for rendering text and debugging visuals(incase there is a debug draw layer to draw over). 97 | 3. Computes the overflow policy and direction of this line and how it should be handled such as adding ellipsis at the end. 98 | 4. Render foreground highlights for that line via `FSlateTextLayout::OnPaintHighlights`. 99 | 5. Updates the highest layer ID to be based on the highest layer during this line's rendering. 100 | 6. Returns the highest layer ID. 101 | 102 | 103 | 104 | ##### Text Layout :: Flow Line Layout 105 | 106 | This occurs when building the flow line layout in this execution order: 107 | 108 | 1. Locally caches the current Line Model index as `LineModel`(`FLineModel`) to prepare to lay out a single line of text. 109 | 2. Checks if `LineModel`'s amount of `RunRenderer`(`TArray`)'s is greater than or equal to zero. 110 | 3. Locally caches if this line is wrapping by checking if `WrappingWidth` is greater than zero as `IsWrapping`. 111 | 4. Checks if the line doesn't have any break candidates or if we're not wrapping the text: 112 | 1. Iterates over all of the run's and creates a line view block via `FTextLayout::CreateLineViewBlocks` for this line model only. 113 | 5. Otherwise it starts processing each word and character so see if we need to move it to the start of the next line to ensure the text fits. Each time it has to create a new line we call `FTextLayout::CreateLineViewBlocks` to run the new line. 114 | 1. Adjusts spacing between words and characters which would involve increasing/decreasing space to make sure the text looks balanced and easy to read. 115 | 2. Aligns the positioning of the words and characters in the line to what the designer wanted via alignment & justification properties. 116 | 3. Checks for special characters/elements of the text such as hyperlinks or embedded images to ensure they are correctly placed and rendered within the line. 117 | 4. Caches line dimensions of width and height. 118 | 5. Applies the line styling such as font size, color, bold/italic, etc. 119 | 6. Caches word and character positioning of exact coordinates for the text to appear at. 120 | 7. Accounts for special cases. This is a per text widget basis such as: 121 | - Truncating text(cutting it off) 122 | - Adding ellipsis("...") 123 | - Wrapping it to the next line 124 | - Applying different fonts 125 | - Applying inline images 126 | - Bidirectional text(such as Arabic or Hebrew) 127 | - Text highlighting and selection 128 | - Additional accessibility features such as high contract, larger text, etc. 129 | 8. Notifying that this line of text is ready to be rendered(which will be sent to the rendering part of the engine later in the code execution). 130 | 131 | 132 | ##### Text Layout :: Flow Highlights 133 | 134 | This occurs for applying highlights to specific parts of text in this execution order: 135 | 136 | 1. Ensure that this only occurs when updating a layout. 137 | 2. Iterate through each line(`FLineView`). 138 | 1. Clear out any highlights in this line. 139 | 2. Retrieve the text of this line as a line model(`FLineModel`). 140 | 3. Iterate through each model's highlights(`FTextLineHighlight`). 141 | 1. Check if the highlight is valid and relevant to the current line, otherwise skip it. 142 | 2. Compute the text range(`FTextRange`) of the highlight for this line. 143 | 3. If the highlight doesn't affect this line then skip this highlight. 144 | 4. Iterate through each text block in the line. 145 | 1. Intersect the block's range with the highlight range. 146 | 2. Check if the block is part of the highlight's range. 147 | 3. Checks if this block is the start of the new highlight and adjusts positioning and width accordingly to fit the block. 148 | 4. Computes the highlight width and offset depending on whether its the start of the highlight or a continuation from the previous block and the direction of the text(Left/Right). 149 | 5. If a block is only partially highlighted then adjust the highlight's width and position to fit just the portion. 150 | 6. Cache the highlight data that was computed. 151 | 5. Apply the highlight to the line either as an foreground(overlay) or background(underlay) based on the z-order. 152 | 153 | 154 | -------------------------------------------------------------------------------- /pages/text_widgets/text_decorators.md: -------------------------------------------------------------------------------- 1 |  2 | # Text Decorators 3 | 4 | --- 5 | 6 | 7 | ## Table of Contents 8 | 9 | > **[ Back to Main Compendium Page](../../README.md)** 10 | > 11 | > **[ Back to Overview Page](text_widget_overview.md)** 12 | > 13 | > ### Related Page Links 14 | > 15 | > - [Rich Text Block Widget](rich_text_block.md) 16 | > - [Text Marshallers](text_marshallers.md) 17 | 18 | --- 19 | 20 | 21 | ## General Description 22 | 23 | Text Decorators are used to add custom styling or interactive elements withing text blocks dynamically. 24 | An example would be adding a hyperlink, an image within the text without having to have two text block widget's and an image widget placed in-between them, an in-game tooltip, etc. 25 | 26 | You can configure which decorators to use by listing them in a data table with each entry in the table linking to the decorator type and how it can affect the resulted text. 27 | 28 | > An important aspect of decorators when you configure them on a per rich text block basis, 29 | > is that they are applied in the order that they are configured so if the last decorator is intended to affect all of them. 30 | > 31 | > You can see an example of this in the Lyra example project where they will configure a list of decorators with the last on being used to apply that decorator to all of the remaining text that wasn't specifically being modified by other decorators. 32 | 33 | They are injected into the rich text layout marshaller([Text Marshallers Page - Rich Text Marshaller](text_marshallers.md#rich-text-marshaller)) and then applied when text properties are changed/set. 34 | 35 | --- 36 | 37 | 38 | ### Important Types 39 | 40 | *@TODO Add graph visuals for this hierarchy* 41 | 42 | - `ITextDecorator`: Base class, used as an interface for all text decorator types. 43 | - `FRichTextDecorator`[Parent Class: `ITextDecorator`]: Base class for all rich text decorator types to execute decorator functionality, intended to be inherited from for project specific code IN COORDINATION with `URichTextBlockDecorator`. 44 | - `FRichInlineImage` [Parent Class: `FRichTextDecorator`]: A default rich text inline image decorator for utility usage. 45 | - `URichTextBlock`[Parent Class: `UTextLayoutWidget`]: UMG implementation of the Rich Text Block. 46 | - `SRichTextBlock`[Parent Class: `SWidget`]: Slate Widget implementation of the Rich Text Block. 47 | - `URichTextBlockDecorator`[Parent Class: `UObject`]: Base class for all rich text decorator types to configure decorator functionality, intended to be inherited from for project specific code IN COORDINATION with `FRichTextDecorator`. 48 | - `SRichInlineImage`[Parent Class: `SCompoundWidget`]: The default rich inline image widget to display for `FRichInlineImage`. 49 | 50 | --- 51 | 52 | 53 | ## Important Functions 54 | 55 | - `FRichTextDecorator::Supports`: Override this to check if a text run has tags that are supported by this decorator. Refer to `FRichInlineImage::Supports` as example usage. 56 | - `FRichTextDecorator::CreateDecoratorWidget`: Override this to create a custom widget(like an image, button, etc). Refer to `FRichInlineImage::CreateDecoratorWidget` as example usage. 57 | - `FRichTextDecorator::CreateDecoratorText`: Override this to generate text at runtime, change the style, etc. 58 | - `URichTextBlockDecorator::CreateDecorator`: Override this for creating your custom decorator class to execute functionality on it. Refer to `URichTextBlockImageDecorator::CreateDecorator` as example usage. 59 | 60 | 61 | ## Parsing for a Decorator 62 | 63 | Each time when a decorator is checked, it is given an already parsed and separated text run(so its ready for you to input your own functionality!). 64 | You can parse for a decorator type in your own code by comparing the `FTextRunParseResults::Name` property against a literal string wrapped with `TEXT()`. 65 | For parsing parameters you can check within `FTextRunParseResults::MetaData`[`TMap`, key is the parameter ID and value is the parameter's value] and use the `Contains` function and input the parameter wrapped with `TEXT()`. 66 | For getting its value as well, you can use the `Find` function instead of `Contains`. 67 | 68 | Example situation: `` 69 | ```c++ 70 | virtual TSharedPtr CreateDecoratorWidget(const FTextRunInfo& RunInfo, const FTextBlockStyle& TextStyle) const override 71 | { 72 | const bool bWarnIfMissing = true; 73 | // Checking for the parameter "id" 74 | const FSlateBrush* Brush = Decorator->FindImageBrush(*RunInfo.MetaData[TEXT("id")], bWarnIfMissing); 75 | if(!ensure(Brush)) 76 | { 77 | return TSharedPtr(); 78 | } 79 | 80 | // Checking for the parameter "width" 81 | TOptional Width; 82 | if (const FString* WidthString = RunInfo.MetaData.Find(TEXT("width"))) 83 | { 84 | int32 WidthTemp; 85 | // Parse if its an integer 86 | if (FDefaultValueHelper::ParseInt(*WidthString, WidthTemp)) 87 | { 88 | Width = WidthTemp; 89 | } 90 | // Otherwise try to use the image's size X if the user inputted "desired" 91 | else if (FCString::Stricmp(GetData(*WidthString), TEXT("desired")) == 0) 92 | { 93 | Width = Brush->ImageSize.X; 94 | } 95 | } 96 | 97 | // Checking for the parameters "height" 98 | TOptional Height; 99 | if (const FString* HeightString = RunInfo.MetaData.Find(TEXT("height"))) 100 | { 101 | int32 HeightTemp; 102 | // Parse if its an integer 103 | if (FDefaultValueHelper::ParseInt(*HeightString, HeightTemp)) 104 | { 105 | Height = HeightTemp; 106 | } 107 | // Otherwise try to use the image's size Y if the user inputted "desired" 108 | else if (FCString::Stricmp(GetData(*HeightString), TEXT("desired")) == 0) 109 | { 110 | Height = Brush->ImageSize.Y; 111 | } 112 | } 113 | 114 | // Grab the "stretch" enum parameter if applicable 115 | EStretch::Type Stretch = EStretch::ScaleToFit; 116 | if (const FString* SstretchString = RunInfo.MetaData.Find(TEXT("stretch"))) 117 | { 118 | const UEnum* StretchEnum = StaticEnum(); 119 | int64 StretchValue = StretchEnum->GetValueByNameString(*SstretchString); 120 | if (StretchValue != INDEX_NONE) 121 | { 122 | Stretch = static_cast(StretchValue); 123 | } 124 | } 125 | // Acutally create the widget will all of the parameters we figured out while parsing in this function 126 | return SNew(SRichInlineImage, Brush, TextStyle, Width, Height, Stretch); 127 | } 128 | ``` 129 | 130 | 131 | ## Inline Image Decorator 132 | 133 | Decorator Types: 134 | - `URichTextBlockImageDecorator`: Configuration. 135 | - `FRichInlineImage`: Functionality. 136 | - `FRichImageRow`: Data Table Row Type. 137 | - `SRichInlineImage`: Compound Widget to display inline. 138 | 139 | The default inline image decorator adds an image widget within the text with some configurations 140 | (you are welcome to make your own and use that instead if it doesn't provide all of the configuration tags that you need). 141 | 142 | For tagging that you want an inline image, enter into the text the image ID 143 | (which is retrieved via the row name that the data table that you input into the decorator, you can see where this ID is checked within `URichTextBlockImageDecorator::FindImageBrush`). 144 | This is primarily done in `FRichInlineImage::Supports`. 145 | 146 | Example: `` 147 | - `<`: Starting the decorator "tag" statement. 148 | - `img `: The name of the decorator tag type(if there is a decorator looking for that), the space afterwards is the signal for the system to know that we're done writing out the name of the tag. 149 | - `id`: A parameter of the `img` tag. It is also required for the tag to consider it usable for a decorator. This specifies that we need to lookup an image ID from the data table's row name. 150 | - `=`: Specifying the next set of text is the value for `id`. 151 | - `"MyId"`: Surrounded in quotation marks for parsing purposes, `MyId` is the value of `id`. This decorator is coded to use `id`'s value as the data table row name to lookup. 152 | - `/>`: Signals to the system that we are done with this decorator tag statement. 153 | 154 | This decorator will display a `SRichInlineImage` compound widget which is slotted in this fashion: 155 | - ChildSlot: 156 | - `SBox`: Inputs Width & Height parameters from text markdown. 157 | - `SScaleBox`: Inputs the Stretch parameter from text markdown, sets the stretch direction[EStretchDirection] to down only, with its vertical alignment being center. 158 | - `SImage`: Inputs the required ID parameter from text markdown for the image asset. 159 | 160 | ### Tag Options 161 | 162 | This is handled within `FRichInlineImage::CreateDecoratorWidget`. 163 | 164 | The available tags that this decorator offers are(case sensitive), you can combine multiple or have all of them in a single decorator tag statement: 165 | - `width` [Example: ``](`int32`): Adjusts the image widget to be the specified width value. 166 | - `desired` [Example: ``]: Optional value to use the desired width of the image widget instead of an `int32`. 167 | - `height` [Example: ``](`int32`): Adjusts the image widget to be the specified height value. 168 | - `desired` [Example: ``]: Optional value to use the desired height of the image widget instead of an `int32`. 169 | - `stretch` [Example: ` 2 | # Text Marshallers 3 | 4 | --- 5 | 6 | 7 | ## Table of Contents 8 | 9 | > **[ Back to Main Compendium Page](../../README.md)** 10 | > 11 | > **[ Back to Overview Page](text_widget_overview.md)** 12 | > 13 | > ### Internal Page Links 14 | > 15 | > - [Plain Text Marshaller](#plain-text-marshaller) 16 | > - [Rich Text Marshaller](#rich-text-marshaller) 17 | > - [Output Log Text Layout Marshaller](#output-log-text-layout-marshaller) 18 | 19 | --- 20 | 21 | 22 | ## General Description 23 | 24 | Text marshallers are classes meant to be subclassed for different raw text types to handle converting to/from text layout's(`FTextLayout`). 25 | Can be used to Get/Set raw text To/From the intended text layout of that marshaller type. 26 | 27 | > Text Marshallers are **NOT** intended to parse the raw text, that is intended to be done via decorators(or custom classes that you would insert into your custom marshaller). 28 | > The marshaller is intended to handle *managing* the conversion process from Raw Text to the Converted Text Layout. An example of this is in the [Rich Text Marshaller](#rich-text-marshaller). 29 | 30 | [[Wikipedia Description]](https://en.wikipedia.org/wiki/Marshalling_(computer_science)) A reminder about what "marshalling" as a concept is: similar or sometimes synonymous with serialization with the inverse of de-serialization is to "un-marshall" something, 31 | used to describe an overall process of combining and/or resolving data so it can then be transferred over to another object. \ 32 | An example would be in physics we run all of our physics overlaps/collisions/etc on the physics thread and then when that thread ticks, it "marshall's"(really resolve's and figures out) those physics interactions to then output the final result to the game thread. \ 33 | So essentially the process of marshalling something is to resolve/figure out a bunch of data into a single simple to understand chunk of data. 34 | 35 | --- 36 | 37 | 38 | ## Important Types 39 | 40 | *@TODO Add graph visuals for this section* 41 | 42 | - `ITextLayoutMarshaller`: The literal base class as an interface for getting/setting raw text(`FString`) to/from a text layout(`FTextLayout`). 43 | - `FBaseTextLayoutMarshaller`: The intended base class for all marshallers. 44 | - `FPlainTextLayoutMarshaller`: Handles conversion between raw text and plain text. 45 | - `FRichTextLayoutMarshaller`: Handles conversion between raw text and rich text. 46 | - `FOutputLogTextLayoutMarshaller`: Handles conversion between output log messages(`FOutputLogMessage`) into a stylized lines for text layouts to consume. 47 | - `FTextRange`: Container used to hold the beginning/end indexes within a string, usually used when splitting up a string into multiple strings without duplicating the string. It comprised of two integers for `BeginIndex` and `EndIndex`. 48 | - `FRegexMatcher`: A regular expression pattern matcher in this case, used to match rich text markup elements. IE: `Content`. 49 | 50 | 51 | ## Important functions 52 | 53 | `static void FTextRange::CalculateLineRangesFromString(const FString& Input, TArray& LineRanges)`: Handles iterating through an `FString` and splitting it into 54 | multiple `FTextRange`'s based on if there is a `\n`, `\r`, or an actual line break by the user using `FChar::IsLinebreak`. 55 | - Line breaks are considered one of these: 56 | - If the iterated character goes past the line feed(which is how long until it can automatically new line using `TCharBase::CarriageReturn` & `TCharBase::LineFeed`). 57 | - If the iterated character is the next line(`TCharBase::NextLine`). 58 | - If the iterated character is a line separator(`TCharBase::LineSeparator`). 59 | - If the iterated character is a paragraph separator(`TCharBase::ParagraphSeparator`). 60 | 61 | --- 62 | 63 | 64 | ### Plain Text Marshaller 65 | 66 | Class Name: `FPlainTextLayoutMarshaller` 67 | 68 | Intended to handle regular text conversion's of `FString` into/from `FTextLayout`. 69 | Can also be used to display the text as a password(hiding the characters with `*`). 70 | 71 | #### Conversion to Text Layout from String 72 | 73 | *@TODO Add graph visuals for this section* 74 | 75 | When converting to `FTextLayout` from `FString`, these steps occur within `FPlainTextLayoutMarshaller::SetText`; 76 | 77 | 1. Calculate line ranges to display from string using `FTextRange::CalculateLineRangesFromString`(basically outputs to `TArray`). 78 | 2. Iterate through those line ranges; 79 | 1. Create a Slate Text Run(`IRun`) of that iterated line range, this could either be `FSlatePasswordRun` or `FSlateTextRun`; if this marshaller is suppose to display the text as a password `*` or not. 80 | 2. Create the Line Highlight(`FTextLineHighlight`) for this iterated line range, this could be either/both of an underline and strikethrough highlight. 81 | 3. Cache the line highlight and the run. 82 | 3. Cache the runs that were created into the text layout(`FTextLayout`). 83 | 4. Cache the highlights that were created into the text layout(`FTextLayout`). 84 | 5. Return that text layout that has the cached information from earlier steps. 85 | 86 | #### Conversion from Text Layout to String 87 | 88 | *@TODO Add graph visuals for this section* 89 | 90 | Really this calls `FTextLayout::GetAsText` on the inputted `SourceTextLayout` which then uses `FTextLayout::GetAsTextAndOffsets`, so here are the steps that occur within `GetAsTextAndOffsets`; 91 | 92 | 1. Iterates through `LineModels`(`TArray`). 93 | 1. Appends a line terminator(`\n` or `\r`) to the end of the previous line since each line model was originally split up via those line terminator's in the conversion from string to text layout. 94 | 2. Iterates through the text runs text from the modal's to the return string value. 95 | 3. -OPTIONAL- If there is a text offset then add an offset between each line model. This is for documents to have larger string results. 96 | - When applying this offset, this is added to an `TArray` to contain one entry per line in the document. The array index is the line number and the entry contains the index in the flat string that marks the start of the line, along with the length of the line(not including any trailing `\n` character). 97 | 98 | **[ Back to Top](#table-of-contents)** 99 | 100 | ### Rich Text Marshaller 101 | 102 | Class Name: `FRichTextLayoutMarshaller` 103 | 104 | Intended to handle text conversions of `FString` into/from `FTextLayout` that formats it as rich text. 105 | 106 | 107 | #### Rich Text Markup Writer 108 | 109 | *@TODO Add graph visuals for this section* 110 | 111 | You can override the rich text markup writer within Rich Text Blocks by overriding `URichTextBlock::CreateMarkupWriter`. 112 | 113 | Class Hierarchy: 114 | - `IRichTextMarkupWriter`: The base interface class that can be inherited from for rich text markup writing. 115 | - `FDefaultRichTextMarkupWriter`: The default implementation class of rich text markup writer's that handles parsing for *ONLY* markup formatting. 116 | 117 | 118 | ##### Default Rich Text Markup Writer 119 | 120 | *@TODO Add graph visuals for this section* 121 | 122 | The rich text format that this writer looks for is: `My fancy Text` 123 | 124 | The write process(which outputs a `FString`) for the default writer for each rich text line is: 125 | 126 | 1. Append a line terminator to account for the previous line. 127 | 2. Iterate through each run inside that line to append information to the output string 128 | 1. Check if there is a tag in this run 129 | 1. If there is a tag then first append `<` to start the markup text. 130 | 2. Append the tagged run's name(`Name` in the format) as following the correct format. 131 | 3. Iterate through each meta data entry(`TPair`) to add the tag and value: 132 | 1. Append a space so now the string is `` to close this tagged run: `` 138 | 2. Append the actual text message(`My fancy Text`). 139 | - `FDefaultRichTextMarkupWriter::EscapeText` is called; intended to account for this run exiting due to an escape character being used: 140 | - `&` | `&` 141 | - `"` | `"` 142 | - `<` | `<` 143 | - `>` | `>` 144 | 3. End this tagged run(if its tagged) by appending `` to close it: `My fancy Text` 145 | 146 | 147 | #### Rich Text Parser 148 | 149 | *@TODO Add graph visuals for this section* 150 | 151 | Class Hierarchy: 152 | - `IRichTextMarkupParser`: The base interface class that can be inherited from for rich text markup parsing. 153 | - `FDefaultRichTextMarkupParser`: The default implementation class of rich text markup parsing that handles parsing the inputted `FString` to be separated and returned as the parse results(`TArray`) and a `FString` stripped of any markup. 154 | 155 | 156 | ##### Default Rich Text Markup Parser 157 | 158 | *@TODO Add REGEX visuals for this section* 159 | 160 | > This parser heavily uses regex expressions so it is recommended to learn regex expression syntax 161 | > (its like markdown for filtering and finding things within strings for code to understand) for understanding the code. 162 | > 163 | > Regex Patterns used by the default parser: 164 | > - `EscapeSequenceRegexPattern`: `(")|(<)|(>)|(&)` OR `(&\";)|(&<;)|(&>;)|(&&;)` to account for HTML conversion. 165 | > - `ElementRegexPattern`: `<([\\w\\d\\.-]+)((?: (?:[\\w\\d\\.-]+=(?>\".*?\")))+)?(?:(?:/>)|(?:>(.*?)))` 166 | > - `AttributeRegexPattern`: `([\\w\\d\\.]+)=(?>\"(.*?)\")` 167 | 168 | The parsing process is done within `FDefaultRichTextMarkupParser::Process` where it will go through these steps: 169 | 170 | > We will be using the string: `My fancy Text`, as the example for explaining the steps of this process. 171 | 172 | 1. Create an `LineRanges`(`TArray`) variable to cache, modify and use with the output string. 173 | 2. Calculate line ranges to display from string using `FTextRange::CalculateLineRangesFromString`(basically outputs to `TArray`). 174 | 3. Parses each line range via [FDefaultRichTextMarkupParser::ParseLineRanges](#default-rich-text-markup-parser--parse-line-ranges) 175 | 4. Parses each parsed line result via [FDefaultRichTextMarkupParser::HandleEscapeSequences](#default-rich-text-markup-parser--handle-escape-sequences) to account for escape sequence characters. 176 | 177 | 178 | ###### Default Rich Text Markup Parser :: Parse Line Ranges 179 | 180 | *@TODO Add REGEX visuals for this section* 181 | 182 | Here is a breakdown of what `ParseLineRanges` does. 183 | 184 | 1. First creates a `FRegexMatcher` named `ElementRegexMatcher` to handle the parsing. 185 | 2. Iterates through each line range: 186 | 1. Creates a `FTextLineParseResults` named `LineParseResults` to cache the range and line run results(which is an array). 187 | 1. The regex matcher is used to handle finding the attributes and meta data of each line that gets broken apart into runs. This regex expression is using `ElementRegexPattern`. 188 | 2. Iterate through the regex's results using `FRegexMatcher::FindNext`. 189 | 1. (Group 1) `<([\w\d\.-]+)`: Caches the captured element name that comes after an opening `<`. which is the `\".*?\")))+)?`: Finds these sections `metakey1="metavalue1"` & `metakey2="metavalue2"` by capturing `metakey1`|`metakey2` as the attribute name's and `"metavalue1"`|`"metavalue2"` as the attribute value's. 191 | 3. (Group 3) `(?:(?:/>)|(?:>(.*?)))`: Finds this section `>My fancy Text` and captures `My fancy Text` as the content text between the opening and closing tags. 192 | 4. After these groups are found, we then run the attribute regex expression on the attribute's section(group 2) to iterate through each attribute using `FRegexMatcher::FindNext`. This regex expression is using `AttributeRegexPattern`. 193 | 1. Cache the attribute(stored as a `TMap`) where it will store the middle of the attribute key and then store the begin/end of the attribute value for the text range. 194 | 5. (If there is a next line to cache) Cache the line's intervening run which is basically intended to link these parsed results together while we're iterating through the line ranges. 195 | 6. Cache the attributes and the content as `FTextRunParseResults` as this line range's run. 196 | 2. (If there is more line ranges to iterate through)Add a dangling line run to account for if we have more line ranges that the regex isn't accounting for(to make sure the string is still linked together properly). 197 | 3. (If we didn't add any run's) Add a blank run since that is more than likely what was inputted in. 198 | 4. Caches the run's that were added this line range iteration into the function's output of parsed results(`TArray`). 199 | 200 | 201 | ###### Default Rich Text Markup Parser :: Handle Escape Sequences 202 | 203 | Escape sequences are special characters that allow for you to include characters in a string that wouldn't normally be included directly inside `ParseLineRanges`. 204 | For example; if you wanted to include a `<` symbol within your rich text without it being considered the start of a tag, you could use an escape sequence to have this character be displayed as content text. 205 | 206 | This function's job is to account for that AFTER `ParseLineRanges` occurs to adjust the outputted string so any escape sequence characters are taken care of. 207 | 208 | Escape Sequence Characters: 209 | - Quotations `"` | `"` 210 | - Left Arrow `<` | `<` 211 | - Right Arrow `>` | `>` 212 | - Ampersand `&` | `&` 213 | 214 | > **Example Text** 215 | > 216 | > Raw Text: `"This is a "quote" & <sample>"` 217 | > 218 | > Result: `"This is a "quote" & "` 219 | 220 | #### Conversion to Text Layout from String 221 | 222 | *@TODO Add graph visuals for this section* 223 | 224 | When converting to `FTextLayout` from `FString`, these steps occur within `FRichTextLayoutMarshaller::SetText`; 225 | 226 | 1. Runs the cached Parser of the marshaller(which occurs when the marshaller is created) to `Process` the inputted string and output the parsed line results as `TArray` which can be override via `IRichTextMarkupParser::Process`. 227 | - The default parser in Unreal Engine is `FDefaultRichTextMarkupParser` as an example. 228 | - `FTextLineParseResults`: This is basically a container for text range and the parsed text runs(`TArray`). 229 | 2. Iterates through the parsed lines which basically calls `FRichTextLayoutMarshaller::AppendRunsForText` and then caches it as a line run and cached highlight information to later add to the text layout. 230 | 1. Tries to get the decorator of this marshaller by calling `FRichTextLayoutMarshaller::TryGetDecorator`; 231 | 1. First iterates through any inline decorators and then iterates through regular decorators, for each iteration loop it checks if that decorator supports the text run and string via an overridable `ITextDecorator::Supports`. 232 | 2. If there is a found decorator then it uses that to create the run and update the resulted string via `ITextDecorator::Create`. \ 233 | Otherwise a run is manually via the text run's metadata and created a `FRunInfo` as a safety net; 234 | 3. Iterate through the text run's metadata and add them to the run info. 235 | 4. Apply regular text block style as one of the safety net decorator style set's. 236 | 5. Basically this is converting the same way as plain text marshaller and adds it to the runs to return. 237 | 3. Adds the iterated and cached line runs to the text layout. 238 | 4. Adds the cached highlight information to the text layout. 239 | 240 | #### Conversion from Text Layout to String 241 | 242 | *@TODO Add graph visuals for this section* 243 | 244 | When converting to `FTextLayout` from `FString`, these steps occur within `FRichTextLayoutMarshaller::GetText`; 245 | 246 | 1. Creates an empty array of `FRichTextLine` named `WriterLines` to output at the end of this function. 247 | 2. Iterates through the Line Models(`TArray`) retrieved from the inputted text layout. 248 | 1. Creates a single `WriterLine`(`FRichTextLine`), which is intended to hold a single line in a rich-text document that is comprised of multiple(or one) styled runs(rich text runs). 249 | 2. Iterates through each `Runs`(`FRunModel`) to build out a rich text run and caches it for the parent loop's. 250 | 1. Caches each run within `WriterLine` as a `FRichTextRun`. 251 | 3. Caches that modified `WriterLine` into `WriterLines` array. 252 | 3. Tells the `Writer`(`TSharedPtr`) to write the cached `WriterLines` to output each line with the markup that persists that run layout. 253 | 254 | **[ Back to Top](#table-of-contents)** 255 | 256 | ### Output Log Text Layout Marshaller 257 | 258 | Since this is used for the output log, this marshaller has a `FCriticalSection` named `PendingMessagesCriticalSection` because output log runs its own "OutputDeviceRedirector" thread 259 | so this critical section is used to lock the marshaller from converting messages to prevent race conditions. 260 | 261 | #### Conversion to Text Layout from String 262 | 263 | *@TODO Add graph visuals for this section* 264 | 265 | When converting `FTextLayout` from `FString`, these steps occur within `FOutputLogTextLayoutMarshaller::SetText`; 266 | 267 | 1. Caches `TextLayout` to the `TargetTextLayout`. 268 | 2. Resets the `NextPendingMessageIndex` to 0. 269 | 3. Calls `FOutputLogTextLayoutMarshaller::SubmitPendingMessages`: 270 | 1. Checks if we can lock the marshaller to avoid submitting additional messages(since we can submit more next tick). If we didn't successfully lock then exit the function. 271 | 2. If the next pending message index is valid then we will append all pending messages to the cached text layout and then update the pending message index to our current count(for next submit request). 272 | 273 | #### Conversion from Text Layout to String 274 | 275 | *@TODO Add graph visuals for this section* 276 | 277 | Really this calls `FTextLayout::GetAsText` on the inputted `SourceTextLayout` which then uses `FTextLayout::GetAsTextAndOffsets`, so here are the steps that occur within `GetAsTextAndOffsets`; 278 | 279 | 1. Iterates through `LineModels`(`TArray`). 280 | 1. Appends a line terminator(`\n` or `\r`) to the end of the previous line since each line model was originally split up via those line terminator's in the conversion from string to text layout. 281 | 2. Iterates through the text runs text from the modal's to the return string value. 282 | 3. -OPTIONAL- If there is a text offset then add an offset between each line model. This is for documents to have larger string results. 283 | - When applying this offset, this is added to an `TArray` to contain one entry per line in the document. The array index is the line number and the entry contains the index in the flat string that marks the start of the line, along with the length of the line(not including any trailing `\n` character). 284 | 285 | **[ Back to Top](#table-of-contents)** 286 | -------------------------------------------------------------------------------- /pages/text_widgets/text_widget_overview.md: -------------------------------------------------------------------------------- 1 | 2 | # Text Widget's Overview 3 | This page is meant to be a hub for text widget related pages for easy navigation as well as include information that covers multiple pages. 4 | 5 | --- 6 | 7 | 8 | ## Table of Contents 9 | 10 | > **[ Back to Main Compendium Page](../../README.md)** 11 | > 12 | > ### Internal Page Links 13 | > 14 | > - [Text Layout Widget](#text-layout-widget) 15 | > - [Other Object Types](#other-object-types) 16 | > -       [Line Model](#line-model) 17 | > -       [Text Layout](#text-layout) 18 | > 19 | > ### Child Page Links 20 | > 21 | > - [Text Block](text_block_widget.md) 22 | > - [Rich Text Block](rich_text_block.md) 23 | > - [Text Decorators](text_decorators.md) 24 | > - [Text Marshallers](text_marshallers.md) 25 | 26 | --- 27 | 28 | 29 | ## Text Layout Widget 30 | 31 | *@TODO Add graph visuals for the hierarchy* 32 | 33 | `UTextLayoutWidget` is the base class for all core text widgets in Unreal Engine, these widgets inherit from Text Layout Widget: 34 | - `TextBlock`[Compendium Explanation](text_block_widget.md) 35 | - `RichTextBlock`[Compendium Explanation](rich_text_block.md) 36 | - `MultiLineEditableText` 37 | - `MultiLineEditableTextBox` 38 | 39 | *@TODO Add pictures for these properties* 40 | 41 | This class is intended to hold common options for text layout, that underlying Slate widget's would read from such as: 42 | - `Shaped Text Options`: Common data options for shaping the text. 43 | - [Optional Override]`Text Shaping Method`: The method for how the text should be shaped within this widget. 44 | - `Auto`: Automatically picks the fastest possible shaping method(either Kerning Only or Full Shaping) based on the reading direction of the text. Left-to-right text uses the Kerning Only method, and right-to-left text uses the Full Shaping method. 45 | - `Kerning Only`: Provides fake shaping using only the kerning data of each letter. Can be faster but won't rendering right-to-left or bi-directional glyphs (such as Arabic) correctly. Basically an optimization of fast but only for simple glyphs such as numbers. 46 | - `Full Shaping`: Provides full text shaping, allows more accurate rendering of complex right-to-left or bi-directional glyphs (such as Arabic). This mode will perform ligature(binding) replacement for all languages(such as combined "fi" glyph in English). 47 | - [Optional Override]`Text Flow Direction`: The directions that text can flow(direction that you read the text) within a paragraph of text. 48 | - `Auto`: Automatically detects the flow direction for each paragraph from its text. 49 | - `Left to Right`: Force text to be flowed left-to-right. 50 | - `Right to Left`: Force text to be flowed right-to-left. 51 | - `Justification`: The orientation to align the text with the margin. 52 | - `Left`: Justify the text logically to the left. 53 | - When flowing left-to-right: Will align text visually to the left. 54 | - When flowing right-to-right: Will align text visually to the right. 55 | - `Center`: Justify the text logically to the center, text flow direction does not affect this justification. 56 | - `Right`: Justify the text logically to the right. 57 | - When flowing left-to-right: Will align text visually to the right. 58 | - When flowing right-to-right: Will align text visually to the left. 59 | - `Wrapping Policy`: The wrapping policy to use if a word is too long to be broken by the default line-break iterator. 60 | - `Default Wrapping`: No fallback, uses the default line-break iterator. 61 | - `Allow Per Character Wrapping`: Fallback to per-character wrapping if a word is too long. 62 | - `Auto Wrapping Text`: Flag for if this text can automatically wrap based on the computed horizontal space. 63 | - `Wrapping Text At`: Optional value for wrapping a new line when text exceeds a certain width; if this value is less than or equal to zero then no wrapping occurs. 64 | - `Line Height Percentage`: The amount of scaling to apply to each text line's height. 65 | - `Margin`: The amount of blank space left around the edges of a text area(usually used for padding space around the widget). 66 | 67 | **[ Back to Top](#table-of-contents)** 68 | 69 | ## Other Object Types 70 | 71 | Brief summary explanations of important object types that don't need their own document but need to be mentioned and explained plainly. 72 | 73 | 74 | ### Line Model 75 | 76 | `FLineModel` 77 | 78 | A container representing a single string with no manual breaks. 79 | It is intended to be a representation of a line of text, its properties, line specific operations while staying efficient. 80 | Works in tandem with [Text Layouts](#text-layout) 81 | 82 | 83 | ### Text Layout 84 | 85 | `FTextLayout` 86 | 87 | A class for computing how the text layout is presented, intended to handle arranging and displaying text like a text editor would. 88 | A text layout is intended to handle arranging and styling text, while being performant and supporting localization and interactive text(hyperlinks and such). 89 | 90 | **[ Back to Top](#table-of-contents)** 91 | -------------------------------------------------------------------------------- /video_thumbnails/input_modes_video_thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/video_thumbnails/input_modes_video_thumbnail.png -------------------------------------------------------------------------------- /video_thumbnails/video_thumbnails_template.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/video_thumbnails/video_thumbnails_template.psd -------------------------------------------------------------------------------- /video_thumbnails/youtube-play-button-28281.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/video_thumbnails/youtube-play-button-28281.png -------------------------------------------------------------------------------- /videos/input_modes_examples.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YawLighthouse/UMG-Slate-Compendium/b13274164432864fe592439da72c0553efe0988e/videos/input_modes_examples.mp4 --------------------------------------------------------------------------------