gui_skinning.rst 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. .. _doc_gui_skinning:
  2. GUI skinning
  3. ============
  4. Oh, beautiful GUI!
  5. ------------------
  6. This tutorial is about advanced skinning of an user interface. Most
  7. games generally don't need this, as they end up just relying on
  8. :ref:`Label <class_Label>`, :ref:`TextureRect <class_TextureRect>`,
  9. :ref:`TextureButton <class_TextureButton>` and
  10. :ref:`TextureProgress <class_TextureProgress>`.
  11. However, many types of games often need complex user interfaces, like
  12. MMOs, traditional RPGs, Simulators, Strategy, etc. These kinds of
  13. interface are also common in some games that include editors to create
  14. content, or interfaces for network connectivity.
  15. Godot's user interface uses these kinds of control with the default theme,
  16. but they can be skinned to resemble pretty much any kind of user
  17. interface.
  18. Theme
  19. -----
  20. The GUI is skinned through the :ref:`Theme <class_Theme>`
  21. resource. Theme contains all the information required to change the
  22. entire visual styling of all controls. Theme options are named, so it's
  23. not obvious which name changes what (especially from code), but several
  24. tools are provided. The ultimate place to look at what each theme option
  25. is for each control, which will always be more up to date than any
  26. documentation, is the file `scene/resources/default_theme/default_theme.cpp
  27. <https://github.com/godotengine/godot/blob/master/scene/resources/default_theme/default_theme.cpp>`__.
  28. The rest of this document will explain the different tools used to
  29. customize the theme.
  30. A Theme can be applied to any control in the scene. As a result, all
  31. children and grand-children controls will use that same theme, too
  32. (unless another theme is specified further down the tree). If a value is
  33. not found in a theme, it will be searched in themes higher up in the
  34. hierarchy, towards the root. If nothing was found, the default theme is
  35. used. This system allows for flexible overriding of themes in complex
  36. user interfaces.
  37. Theme options
  38. -------------
  39. Each kind of option in a theme can be:
  40. - **An integer constant**: A single numerical constant. Generally used
  41. to define spacing between components or alignment.
  42. - **A Color**: A single color, with or without transparency. Colors are
  43. usually applied to fonts and icons.
  44. - **A Texture**: A single image. Textures are not often used, but when
  45. they are, they represent handles to pick or icons in a complex control
  46. (such as a file dialog).
  47. - **A Font**: Every control that uses text can be assigned the fonts
  48. used to draw strings.
  49. - **A StyleBox**: Stylebox is a resource that defines how to draw a
  50. panel in varying sizes (more information on them later).
  51. Every option is associated with:
  52. - A name (the name of the option)
  53. - A Control (the name of the control)
  54. An example usage:
  55. .. tabs::
  56. .. code-tab:: gdscript GDScript
  57. var t = Theme.new()
  58. t.set_color("font_color", "Label", Color(1.0, 1.0, 1.0))
  59. var l = Label.new()
  60. l.set_theme(t)
  61. .. code-tab:: csharp
  62. var t = new Theme();
  63. t.SetColor("fontColor", "Label", new Color(1.0f, 1.0f, 1.0f));
  64. var l = new Label();
  65. l.SetTheme(t);
  66. In the example above, a new theme is created. The "font_color" option
  67. is changed and then applied to a label. As a result, the label (and all
  68. children and grandchildren labels) will use that color.
  69. It is possible to override those options without using the theme
  70. directly, and only for a specific control, by using the override API in
  71. :ref:`Control.add_color_override() <class_Control_method_add_color_override>`:
  72. .. tabs::
  73. .. code-tab:: gdscript GDScript
  74. var l = Label.new()
  75. l.add_color_override("font_color", Color(1.0, 1.0, 1.0))
  76. .. code-tab:: csharp
  77. var l = new Label();
  78. l.AddColorOverride("fontColor", new Color(1.0f, 1.0f, 1.0f));
  79. In the inline help of Godot (in the script tab) you can check which theme options
  80. are overrideable, or check the :ref:`Control <class_Control>` class reference.
  81. Customizing a control
  82. ---------------------
  83. If only a few controls need to be skinned, it is often not necessary to
  84. create a new theme. Controls offer their theme options as special kinds
  85. of properties. If checked, overriding will take place:
  86. .. image:: img/themecheck.png
  87. As can be seen in the image above, theme options have little check boxes.
  88. If checked, they can be used to override the value of the theme just for
  89. that control.
  90. Creating a theme
  91. ----------------
  92. The simplest way to create a theme is to edit a theme resource. Create a
  93. Theme from the resource menu; the editor will appear immediately.
  94. After that, save it (for example, with the name mytheme.theme):
  95. .. image:: img/sb2.png
  96. This will create an empty theme that can later be loaded and assigned to
  97. controls.
  98. Example: theming a button
  99. --------------------------
  100. Take some assets (:download:`skin_assets.zip <files/skin_assets.zip>`),
  101. go to the "theme" menu and select "Add Class Item":
  102. .. image:: img/themeci.png
  103. A menu will appear prompting the type of control to create. Select
  104. "Button":
  105. .. image:: img/themeci2.png
  106. Immediately, all button theme options will appear in the property
  107. editor, where they can be edited:
  108. .. image:: img/themeci3.png
  109. From ``Styles``, open the "Normal" drop-down menu next to where it probably
  110. says "null" and create a "New StyleBoxTexture", then
  111. edit it. A texture stylebox basically contains a texture and the size of
  112. the margins that will not stretch when the texture is stretched. This is
  113. called "3x3" stretching:
  114. .. image:: img/sb1.png
  115. Repeat the steps and add the other assets. There is no hover or disabled
  116. image in the example files, so use the same stylebox as in normal. Set
  117. the supplied font as the button font and change the font color to black.
  118. Soon, your button will look different and retro:
  119. .. image:: img/sb2.png
  120. Save this theme to the .theme file. Go to the 2D editor and create a few
  121. buttons:
  122. .. image:: img/skinbuttons1.png
  123. Now, go to the root node of the scene and locate the "theme" property,
  124. replace it with the theme that was just created. It should look like this:
  125. .. image:: img/skinbuttons2.png
  126. Congratulations! You have created a reusable GUI Theme!