kdk 3.1.0__tar.gz → 3.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. {kdk-3.1.0/src/kdk.egg-info → kdk-3.2.0}/PKG-INFO +12 -4
  2. {kdk-3.1.0 → kdk-3.2.0}/README.md +11 -3
  3. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/__init__.py +1 -1
  4. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/data/kodi/piers/strings.po +13 -1
  5. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/data/kodi_builtin_controls.xml +3 -0
  6. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/data/omega/controls.xml +18 -22
  7. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/data/piers/controls.xml +18 -22
  8. kdk-3.2.0/src/kdk/libs/addon/translations.py +129 -0
  9. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/infoprovider/checker.py +29 -7
  10. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/reporting/text.py +29 -12
  11. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/skin/index.py +6 -7
  12. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/skin/resources.py +2 -2
  13. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/skin/skin.py +12 -6
  14. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/utils/expressions.py +34 -0
  15. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/utils/images.py +85 -0
  16. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/utils/infobool.py +30 -5
  17. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/utils/validation.py +5 -3
  18. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/validation/constants.py +7 -5
  19. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/validation/filecheck.py +24 -2
  20. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/validation/ids.py +11 -0
  21. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/validation/image.py +11 -5
  22. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/validation/interpreter.py +136 -14
  23. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/validation/label.py +24 -3
  24. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/validation/repo.py +54 -12
  25. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/validation/rules.py +51 -1
  26. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/validation/suppress.py +7 -3
  27. kdk-3.2.0/src/kdk/libs/validation/urls.py +211 -0
  28. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/validation/variable.py +3 -20
  29. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/output/payload.py +4 -3
  30. {kdk-3.1.0 → kdk-3.2.0/src/kdk.egg-info}/PKG-INFO +12 -4
  31. {kdk-3.1.0 → kdk-3.2.0}/src/kdk.egg-info/SOURCES.txt +3 -0
  32. {kdk-3.1.0 → kdk-3.2.0}/tests/test_color_values.py +31 -2
  33. {kdk-3.1.0 → kdk-3.2.0}/tests/test_control_template_semantics.py +49 -4
  34. {kdk-3.1.0 → kdk-3.2.0}/tests/test_expressions.py +16 -2
  35. {kdk-3.1.0 → kdk-3.2.0}/tests/test_font_validation.py +50 -0
  36. {kdk-3.1.0 → kdk-3.2.0}/tests/test_ids.py +31 -0
  37. kdk-3.2.0/tests/test_image_info.py +204 -0
  38. {kdk-3.1.0 → kdk-3.2.0}/tests/test_image_validation.py +2 -2
  39. {kdk-3.1.0 → kdk-3.2.0}/tests/test_include_faults.py +23 -5
  40. {kdk-3.1.0 → kdk-3.2.0}/tests/test_infobool.py +10 -0
  41. {kdk-3.1.0 → kdk-3.2.0}/tests/test_interpreter.py +94 -3
  42. {kdk-3.1.0 → kdk-3.2.0}/tests/test_json_output.py +6 -1
  43. {kdk-3.1.0 → kdk-3.2.0}/tests/test_muted_output.py +4 -2
  44. kdk-3.2.0/tests/test_po_strings.py +109 -0
  45. {kdk-3.1.0 → kdk-3.2.0}/tests/test_repo.py +69 -3
  46. {kdk-3.1.0 → kdk-3.2.0}/tests/test_rules.py +13 -1
  47. {kdk-3.1.0 → kdk-3.2.0}/tests/test_save_report.py +2 -2
  48. {kdk-3.1.0 → kdk-3.2.0}/tests/test_suppress.py +10 -0
  49. kdk-3.2.0/tests/test_urls.py +224 -0
  50. kdk-3.1.0/src/kdk/libs/addon/translations.py +0 -39
  51. kdk-3.1.0/tests/test_image_info.py +0 -110
  52. {kdk-3.1.0 → kdk-3.2.0}/LICENSE +0 -0
  53. {kdk-3.1.0 → kdk-3.2.0}/pyproject.toml +0 -0
  54. {kdk-3.1.0 → kdk-3.2.0}/setup.cfg +0 -0
  55. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/__main__.py +0 -0
  56. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/config.py +0 -0
  57. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/core.py +0 -0
  58. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/data/addon_schema/addon.xsd +0 -0
  59. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/data/addon_schema/gotham_skin.xsd +0 -0
  60. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/data/addon_schema/matrix_metadata.xsd +0 -0
  61. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/data/icon.ico +0 -0
  62. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/data/kodi/omega/colors.xml +0 -0
  63. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/data/kodi/omega/strings.po +0 -0
  64. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/data/kodi/piers/colors.xml +0 -0
  65. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/data/omega/data.xml +0 -0
  66. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/data/omega/infonames.json +0 -0
  67. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/data/omega/obsolete_windows.json +0 -0
  68. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/data/omega/windows.json +0 -0
  69. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/data/piers/data.xml +0 -0
  70. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/data/piers/infonames.json +0 -0
  71. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/data/piers/obsolete_windows.json +0 -0
  72. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/data/piers/windows.json +0 -0
  73. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/gui/__init__.py +0 -0
  74. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/gui/__main__.py +0 -0
  75. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/gui/app.py +0 -0
  76. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/__init__.py +0 -0
  77. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/addon/__init__.py +0 -0
  78. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/addon/addon.py +0 -0
  79. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/coredata.py +0 -0
  80. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/infonames.py +0 -0
  81. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/infoprovider/__init__.py +0 -0
  82. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/infoprovider/loader.py +0 -0
  83. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/infoprovider/provider.py +0 -0
  84. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/polib/LICENSE +0 -0
  85. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/polib/__init__.py +0 -0
  86. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/polib/polib.py +0 -0
  87. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/reporting/__init__.py +0 -0
  88. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/skin/__init__.py +0 -0
  89. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/skin/include.py +0 -0
  90. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/skin/maps.py +0 -0
  91. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/skin/resolution.py +0 -0
  92. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/skin/textures.py +0 -0
  93. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/utils/__init__.py +0 -0
  94. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/utils/colors.py +0 -0
  95. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/utils/files.py +0 -0
  96. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/utils/xml.py +0 -0
  97. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/validation/__init__.py +0 -0
  98. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/validation/font.py +0 -0
  99. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/validation/hierarchy.py +0 -0
  100. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/validation/include.py +0 -0
  101. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/libs/validation/skinmap.py +0 -0
  102. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/output/__init__.py +0 -0
  103. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/output/browse.py +0 -0
  104. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/output/cache.py +0 -0
  105. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/output/compare.py +0 -0
  106. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/output/logs.py +0 -0
  107. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/output/progress.py +0 -0
  108. {kdk-3.1.0 → kdk-3.2.0}/src/kdk/output/render.py +0 -0
  109. {kdk-3.1.0 → kdk-3.2.0}/src/kdk.egg-info/dependency_links.txt +0 -0
  110. {kdk-3.1.0 → kdk-3.2.0}/src/kdk.egg-info/entry_points.txt +0 -0
  111. {kdk-3.1.0 → kdk-3.2.0}/src/kdk.egg-info/requires.txt +0 -0
  112. {kdk-3.1.0 → kdk-3.2.0}/src/kdk.egg-info/top_level.txt +0 -0
  113. {kdk-3.1.0 → kdk-3.2.0}/tests/test_addon_type.py +0 -0
  114. {kdk-3.1.0 → kdk-3.2.0}/tests/test_archive.py +0 -0
  115. {kdk-3.1.0 → kdk-3.2.0}/tests/test_bracket_validation.py +0 -0
  116. {kdk-3.1.0 → kdk-3.2.0}/tests/test_brackets.py +0 -0
  117. {kdk-3.1.0 → kdk-3.2.0}/tests/test_circular_references.py +0 -0
  118. {kdk-3.1.0 → kdk-3.2.0}/tests/test_cli.py +0 -0
  119. {kdk-3.1.0 → kdk-3.2.0}/tests/test_compare.py +0 -0
  120. {kdk-3.1.0 → kdk-3.2.0}/tests/test_conditional_defaults.py +0 -0
  121. {kdk-3.1.0 → kdk-3.2.0}/tests/test_constant_resolution_accuracy.py +0 -0
  122. {kdk-3.1.0 → kdk-3.2.0}/tests/test_coredata.py +0 -0
  123. {kdk-3.1.0 → kdk-3.2.0}/tests/test_expression_resolution.py +0 -0
  124. {kdk-3.1.0 → kdk-3.2.0}/tests/test_extract_expression_at_offset.py +0 -0
  125. {kdk-3.1.0 → kdk-3.2.0}/tests/test_file_integrity.py +0 -0
  126. {kdk-3.1.0 → kdk-3.2.0}/tests/test_file_name_case.py +0 -0
  127. {kdk-3.1.0 → kdk-3.2.0}/tests/test_github_output.py +0 -0
  128. {kdk-3.1.0 → kdk-3.2.0}/tests/test_hierarchy.py +0 -0
  129. {kdk-3.1.0 → kdk-3.2.0}/tests/test_id_refs.py +0 -0
  130. {kdk-3.1.0 → kdk-3.2.0}/tests/test_include_file_refs.py +0 -0
  131. {kdk-3.1.0 → kdk-3.2.0}/tests/test_include_validation.py +0 -0
  132. {kdk-3.1.0 → kdk-3.2.0}/tests/test_includes.py +0 -0
  133. {kdk-3.1.0 → kdk-3.2.0}/tests/test_index_order.py +0 -0
  134. {kdk-3.1.0 → kdk-3.2.0}/tests/test_infonames.py +0 -0
  135. {kdk-3.1.0 → kdk-3.2.0}/tests/test_kodi_resolution.py +0 -0
  136. {kdk-3.1.0 → kdk-3.2.0}/tests/test_label_attrs.py +0 -0
  137. {kdk-3.1.0 → kdk-3.2.0}/tests/test_label_validation.py +0 -0
  138. {kdk-3.1.0 → kdk-3.2.0}/tests/test_load_order.py +0 -0
  139. {kdk-3.1.0 → kdk-3.2.0}/tests/test_maps.py +0 -0
  140. {kdk-3.1.0 → kdk-3.2.0}/tests/test_obsolete_windows.py +0 -0
  141. {kdk-3.1.0 → kdk-3.2.0}/tests/test_param_in_include_names.py +0 -0
  142. {kdk-3.1.0 → kdk-3.2.0}/tests/test_param_resolution.py +0 -0
  143. {kdk-3.1.0 → kdk-3.2.0}/tests/test_param_value.py +0 -0
  144. {kdk-3.1.0 → kdk-3.2.0}/tests/test_param_values.py +0 -0
  145. {kdk-3.1.0 → kdk-3.2.0}/tests/test_parse_errors.py +0 -0
  146. {kdk-3.1.0 → kdk-3.2.0}/tests/test_release_gated_tags.py +0 -0
  147. {kdk-3.1.0 → kdk-3.2.0}/tests/test_singleton_tags.py +0 -0
  148. {kdk-3.1.0 → kdk-3.2.0}/tests/test_skin_string_range.py +0 -0
  149. {kdk-3.1.0 → kdk-3.2.0}/tests/test_split_top_level_commas.py +0 -0
  150. {kdk-3.1.0 → kdk-3.2.0}/tests/test_textures.py +0 -0
  151. {kdk-3.1.0 → kdk-3.2.0}/tests/test_utils.py +0 -0
  152. {kdk-3.1.0 → kdk-3.2.0}/tests/test_valueless_tags.py +0 -0
  153. {kdk-3.1.0 → kdk-3.2.0}/tests/test_variables.py +0 -0
  154. {kdk-3.1.0 → kdk-3.2.0}/tests/test_xbt.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kdk
3
- Version: 3.1.0
3
+ Version: 3.2.0
4
4
  Summary: Kodi skin validation tool - CLI and GUI
5
5
  Author-email: MikeSiLVO <mikesilvo164@gmail.com>
6
6
  License-Expression: GPL-3.0-or-later
@@ -54,7 +54,7 @@ contain the same code; the GUI build runs without a console window, so
54
54
  double-clicking it doesn't open a terminal. No Python install needed.
55
55
 
56
56
  Download them from the [Releases page](https://github.com/MikeSiLVO/kdk/releases).
57
- `<version>` is the release tag, such as `v3.1.0`:
57
+ `<version>` is the release tag, such as `v3.2.0`:
58
58
 
59
59
  - **Windows (x86_64)**: `kdk-gui-<version>-windows-x86_64.exe` and
60
60
  `kdk-cli-<version>-windows-x86_64.exe`.
@@ -128,7 +128,12 @@ kdk issues --summary # Append the per-category summary
128
128
 
129
129
  Every finding carries a `rule` id, such as `fonts.undefined`, and a `subject`, the name it is
130
130
  about, such as the font name or the image path as written. `kdk rules` lists every id with what it
131
- reports, and `kdk rules --json` adds the check each belongs to. An id never changes once released.
131
+ reports, and `kdk rules --json` adds the check each belongs to and `addon_checker`: `problem` when
132
+ Kodi's add-on checker fails a repo PR on it, `warning` when it only warns, `null` when it does not
133
+ check it. `blocking_warning` is `true` for a rule kdk reports as a warning that still blocks a
134
+ Kodi repo submission: the add-on checker's problems and the rules reviewers refuse a skin on. Errors
135
+ are not marked; every error blocks a submission. Kodi Repo findings stay warnings in kdk. An id
136
+ never changes once released.
132
137
 
133
138
  Both commands take these:
134
139
 
@@ -193,7 +198,7 @@ endings, which File Integrity reports as errors.
193
198
 
194
199
  ## Silencing a finding
195
200
 
196
- An XML comment mutes findings the skin has already judged, the way a
201
+ An XML comment mutes warnings the skin has already judged, the way a
197
202
  `# type: ignore` does in Python. `kdk-ignore-file` covers the whole file it sits
198
203
  in and `kdk-ignore` a single line. Text after a `;` is the reason, shown to
199
204
  anyone reading the results:
@@ -222,6 +227,9 @@ Comments are read in the XML files of the skin's resolution folders, such as
222
227
  `xml` or `1080i`. A finding in any other file, `addon.xml` and the language
223
228
  files included, cannot be muted.
224
229
 
230
+ A comment mutes warnings only. An error, or a warning that blocks a Kodi repo
231
+ submission, stays listed and counted on a line the comment covers.
232
+
225
233
  Category names are the ones in the summary (`Labels`, `Fonts`, `Images`, `IDs`,
226
234
  `Variables`, `Maps`, `Includes`, `XML Validation`, `File Integrity`, `Kodi Repo`),
227
235
  matched without regard to case, spaces, or hyphens. A name that matches no check
@@ -15,7 +15,7 @@ contain the same code; the GUI build runs without a console window, so
15
15
  double-clicking it doesn't open a terminal. No Python install needed.
16
16
 
17
17
  Download them from the [Releases page](https://github.com/MikeSiLVO/kdk/releases).
18
- `<version>` is the release tag, such as `v3.1.0`:
18
+ `<version>` is the release tag, such as `v3.2.0`:
19
19
 
20
20
  - **Windows (x86_64)**: `kdk-gui-<version>-windows-x86_64.exe` and
21
21
  `kdk-cli-<version>-windows-x86_64.exe`.
@@ -89,7 +89,12 @@ kdk issues --summary # Append the per-category summary
89
89
 
90
90
  Every finding carries a `rule` id, such as `fonts.undefined`, and a `subject`, the name it is
91
91
  about, such as the font name or the image path as written. `kdk rules` lists every id with what it
92
- reports, and `kdk rules --json` adds the check each belongs to. An id never changes once released.
92
+ reports, and `kdk rules --json` adds the check each belongs to and `addon_checker`: `problem` when
93
+ Kodi's add-on checker fails a repo PR on it, `warning` when it only warns, `null` when it does not
94
+ check it. `blocking_warning` is `true` for a rule kdk reports as a warning that still blocks a
95
+ Kodi repo submission: the add-on checker's problems and the rules reviewers refuse a skin on. Errors
96
+ are not marked; every error blocks a submission. Kodi Repo findings stay warnings in kdk. An id
97
+ never changes once released.
93
98
 
94
99
  Both commands take these:
95
100
 
@@ -154,7 +159,7 @@ endings, which File Integrity reports as errors.
154
159
 
155
160
  ## Silencing a finding
156
161
 
157
- An XML comment mutes findings the skin has already judged, the way a
162
+ An XML comment mutes warnings the skin has already judged, the way a
158
163
  `# type: ignore` does in Python. `kdk-ignore-file` covers the whole file it sits
159
164
  in and `kdk-ignore` a single line. Text after a `;` is the reason, shown to
160
165
  anyone reading the results:
@@ -183,6 +188,9 @@ Comments are read in the XML files of the skin's resolution folders, such as
183
188
  `xml` or `1080i`. A finding in any other file, `addon.xml` and the language
184
189
  files included, cannot be muted.
185
190
 
191
+ A comment mutes warnings only. An error, or a warning that blocks a Kodi repo
192
+ submission, stays listed and counted on a line the comment covers.
193
+
186
194
  Category names are the ones in the summary (`Labels`, `Fonts`, `Images`, `IDs`,
187
195
  `Variables`, `Maps`, `Includes`, `XML Validation`, `File Integrity`, `Kodi Repo`),
188
196
  matched without regard to case, spaces, or hyphens. A name that matches no check
@@ -1,3 +1,3 @@
1
1
  """KDK - Kodi skin validation tool."""
2
2
 
3
- __version__ = "3.1.0"
3
+ __version__ = "3.2.0"
@@ -25167,7 +25167,19 @@ msgctxt "#39217"
25167
25167
  msgid "Best"
25168
25168
  msgstr ""
25169
25169
 
25170
- #empty strings from id 39218 to 39899
25170
+ #. Title of the setting that chooses if the Dolby Vision extensions is used
25171
+ #: system/settings/settings.xml
25172
+ msgctxt "#39218"
25173
+ msgid "Use Dolby Vision extensions"
25174
+ msgstr ""
25175
+
25176
+ #. Help text for setting "Dolby Vision extensions" of label #39218
25177
+ #: system/settings/settings.xml
25178
+ msgctxt "#39219"
25179
+ msgid "Use the system Dolby Vision extensions to correctly display Dolby Vision profile 5, 7 (excludes FEL reconstruction), 8 and 10 video."
25180
+ msgstr ""
25181
+
25182
+ #empty strings from id 39220 to 39899
25171
25183
 
25172
25184
  #. List formatting: pattern used to join a list of exactly two items, e.g. "A and B"
25173
25185
  #. STR_LIST_AND_TWO
@@ -13,6 +13,7 @@
13
13
  - Window names match Kodi's lowercase window identifiers
14
14
  - Control IDs are those programmatically created by Kodi's C++ code
15
15
  - Skins can reference these IDs without defining them
16
+ - <range> covers ids Kodi assigns at runtime; without "to" it has no upper bound
16
17
  -->
17
18
  <builtin_controls>
18
19
 
@@ -210,6 +211,7 @@
210
211
  <control id="996" description="Grouplist template" />
211
212
  <control id="999" description="Background image of the context menu" />
212
213
  <control id="1000" description="Button template" />
214
+ <range from="1001" description="Buttons cloned from the template, one per menu entry" />
213
215
  </window>
214
216
 
215
217
  <window name="extendedprogressdialog" id="10151" xml="DialogExtendedProgressBar.xml">
@@ -433,6 +435,7 @@
433
435
  <control id="5" description="List of feature types" />
434
436
  <control id="7" description="Button template" />
435
437
  <control id="8" description="Settings category label template" />
438
+ <range from="100" to="799" description="Controller, feature, group and separator controls" />
436
439
  </window>
437
440
 
438
441
  </builtin_controls>
@@ -105,6 +105,7 @@
105
105
  <scrollsuffix>label</scrollsuffix>
106
106
  <randomize>bool</randomize>
107
107
  <resetonlabelchange>bool</resetonlabelchange>
108
+ <number></number>
108
109
  </control>
109
110
  <control type="scrollbar" id="int">
110
111
  <width max="int">int</width>
@@ -119,9 +120,10 @@
119
120
  <texturesliderbarfocus colordiffuse="color" border="coords" diffuse="path" flipx="bool" flipy="bool" infill="bool" background="bool">path</texturesliderbarfocus>
120
121
  <textureslidernib colordiffuse="color" border="coords" diffuse="path" flipx="bool" flipy="bool" infill="bool" background="bool">path</textureslidernib>
121
122
  <textureslidernibfocus colordiffuse="color" border="coords" diffuse="path" flipx="bool" flipy="bool" infill="bool" background="bool">path</textureslidernibfocus>
122
- <textureslidernibdisabled colordiffuse="color" border="coords" diffuse="path" flipx="bool" flipy="bool" infill="bool" background="bool">path</textureslidernibdisabled>
123
123
  <orientation>orientation</orientation>
124
124
  <showonepage>bool</showonepage>
125
+ <texturebg colordiffuse="color" border="coords" diffuse="path" flipx="bool" flipy="bool" infill="bool" background="bool">path</texturebg>
126
+ <colordiffuse>color</colordiffuse>
125
127
  </control>
126
128
  <control type="button" id="int">
127
129
  <width min="int" max="int">int</width>
@@ -151,8 +153,6 @@
151
153
  <include>common</include>
152
154
  <include>button_common</include>
153
155
  <include>nav_common</include>
154
- <label2>label</label2>
155
- <wrapmultiline>bool</wrapmultiline>
156
156
  <selectedcolor>color</selectedcolor>
157
157
  <onclick condition="condition">builtin</onclick>
158
158
  <onback condition="condition">builtin</onback>
@@ -166,8 +166,6 @@
166
166
  <include>common</include>
167
167
  <colordiffuse>color</colordiffuse>
168
168
  <fadetime>int</fadetime>
169
- <align>align</align>
170
- <aligny>aligny</aligny>
171
169
  <texture border="coords" flipy="bool" flipx="bool" background="bool" colordiffuse="color" diffuse="path" fallback="path" infill="bool">path</texture>
172
170
  <bordertexture border="coords" colordiffuse="color" infill="bool" diffuse="path" flipx="bool" flipy="bool" background="bool">path</bordertexture>
173
171
  <bordersize>int</bordersize>
@@ -259,8 +257,9 @@
259
257
  <textoffsetx>int</textoffsetx>
260
258
  <textoffsety>int</textoffsety>
261
259
  <reverse>bool</reverse>
262
- <pulseonselect>bool</pulseonselect>
263
260
  <showonepage>bool</showonepage>
261
+ <shadowcolor>color</shadowcolor>
262
+ <angle>int</angle>
264
263
  </control>
265
264
  <control type="spincontrolex" id="int">
266
265
  <width max="int">int</width>
@@ -269,7 +268,6 @@
269
268
  <include>nav_common</include>
270
269
  <include>button_common</include>
271
270
  <spinposx>int</spinposx>
272
- <spinposy>int</spinposy>
273
271
  <spinwidth>int</spinwidth>
274
272
  <spinheight>int</spinheight>
275
273
  <reverse>bool</reverse>
@@ -280,25 +278,22 @@
280
278
  <textureupdisabled colordiffuse="color" flipx="bool" flipy="bool" border="coords" diffuse="path" infill="bool" background="bool">path</textureupdisabled>
281
279
  <texturedowndisabled colordiffuse="color" flipx="bool" flipy="bool" border="coords" diffuse="path" infill="bool" background="bool">path</texturedowndisabled>
282
280
  <onback condition="condition">builtin</onback>
283
- <onfocus condition="condition">builtin</onfocus>
284
- <onunfocus condition="condition">builtin</onunfocus>
281
+ <subtype>subtype</subtype>
285
282
  </control>
286
283
  <control type="slider" id="int">
287
284
  <width max="int">int</width>
288
285
  <height max="int">int</height>
289
286
  <include>common</include>
290
287
  <include>nav_common</include>
291
- <texturesliderbackground colordiffuse="color" border="coords" diffuse="path" flipx="bool" flipy="bool" infill="bool" background="bool">path</texturesliderbackground>
292
288
  <texturesliderbar colordiffuse="color" border="coords" diffuse="path" flipx="bool" flipy="bool" infill="bool" background="bool">path</texturesliderbar>
293
- <texturesliderbarfocus colordiffuse="color" border="coords" diffuse="path" flipx="bool" flipy="bool" infill="bool" background="bool">path</texturesliderbarfocus>
294
289
  <texturesliderbardisabled colordiffuse="color" border="coords" diffuse="path" flipx="bool" flipy="bool" infill="bool" background="bool">path</texturesliderbardisabled>
295
290
  <textureslidernib colordiffuse="color" border="coords" diffuse="path" flipx="bool" flipy="bool" infill="bool" background="bool">path</textureslidernib>
296
291
  <textureslidernibfocus colordiffuse="color" border="coords" diffuse="path" flipx="bool" flipy="bool" infill="bool" background="bool">path</textureslidernibfocus>
297
292
  <textureslidernibdisabled colordiffuse="color" border="coords" diffuse="path" flipx="bool" flipy="bool" infill="bool" background="bool">path</textureslidernibdisabled>
298
293
  <info>info</info>
299
294
  <action>action</action>
300
- <pulseonselect>bool</pulseonselect>
301
295
  <orientation>orientation</orientation>
296
+ <colordiffuse>color</colordiffuse>
302
297
  </control>
303
298
  <control type="sliderex" id="int">
304
299
  <width max="int">int</width>
@@ -311,9 +306,10 @@
311
306
  <texturesliderbar colordiffuse="color" border="coords" diffuse="path" flipx="bool" flipy="bool" infill="bool" background="bool">path</texturesliderbar>
312
307
  <textureslidernib colordiffuse="color" border="coords" diffuse="path" flipx="bool" flipy="bool" infill="bool" background="bool">path</textureslidernib>
313
308
  <textureslidernibfocus colordiffuse="color" border="coords" diffuse="path" flipx="bool" flipy="bool" infill="bool" background="bool">path</textureslidernibfocus>
309
+ <texturesliderbardisabled colordiffuse="color" border="coords" diffuse="path" flipx="bool" flipy="bool" infill="bool" background="bool">path</texturesliderbardisabled>
310
+ <textureslidernibdisabled colordiffuse="color" border="coords" diffuse="path" flipx="bool" flipy="bool" infill="bool" background="bool">path</textureslidernibdisabled>
314
311
  <onback condition="condition">builtin</onback>
315
- <onfocus condition="condition">builtin</onfocus>
316
- <onunfocus condition="condition">builtin</onunfocus>
312
+ <info>info</info>
317
313
  </control>
318
314
  <control type="mover" id="int">
319
315
  <width max="int">int</width>
@@ -322,7 +318,7 @@
322
318
  <texturefocus colordiffuse="color" flipx="bool" flipy="bool" border="coords" diffuse="path" infill="bool" background="bool">path</texturefocus>
323
319
  <texturenofocus colordiffuse="color" flipx="bool" flipy="bool" border="coords" diffuse="path" infill="bool" background="bool">path</texturenofocus>
324
320
  <movingspeed acceleration="int" maxvelocity="int" resettimeout="int" delta="int"></movingspeed>
325
- <pulseonselect>bool</pulseonselect>
321
+ <colordiffuse>color</colordiffuse>
326
322
  </control>
327
323
  <control type="gamecontroller" id="int">
328
324
  <width max="int">int</width>
@@ -335,6 +331,7 @@
335
331
  <controllerdiffuse>color</controllerdiffuse>
336
332
  <portaddress>label</portaddress>
337
333
  <peripherallocation>label</peripherallocation>
334
+ <info>info</info>
338
335
  </control>
339
336
  <control type="progress" id="int">
340
337
  <width max="int">int</width>
@@ -354,7 +351,6 @@
354
351
  <width max="int">int</width>
355
352
  <height max="int">int</height>
356
353
  <include>common</include>
357
- <reveal>bool</reveal>
358
354
  <texturebg colordiffuse="color" border="coords" infill="bool" diffuse="path" flipx="bool" flipy="bool" background="bool">path</texturebg>
359
355
  <colordiffuse>color</colordiffuse>
360
356
  <lefttexture border="coords" colordiffuse="color" diffuse="path" flipx="bool" flipy="bool" infill="bool" background="bool">path</lefttexture>
@@ -367,7 +363,6 @@
367
363
  <width max="int">int</width>
368
364
  <height min="int" max="int">int</height>
369
365
  <include>common</include>
370
- <colordiffuse>color</colordiffuse>
371
366
  <font>font</font>
372
367
  <monofont>font</monofont>
373
368
  <textcolor>color</textcolor>
@@ -375,7 +370,6 @@
375
370
  <disabledcolor>color</disabledcolor>
376
371
  <shadowcolor>color</shadowcolor>
377
372
  <selectedcolor>color</selectedcolor>
378
- <pulseonselect>bool</pulseonselect>
379
373
  <pagecontrol>int</pagecontrol>
380
374
  <scrolltime tween="tween" easing="easing">int</scrolltime>
381
375
  <align>align</align>
@@ -385,6 +379,7 @@
385
379
  <autoscroll delay="int" time="int" repeat="int">condition</autoscroll>
386
380
  <label fallback="label">label</label>
387
381
  <info>label</info>
382
+ <number></number>
388
383
  </control>
389
384
  <control type="rss" id="int">
390
385
  <width max="int">int</width>
@@ -395,7 +390,6 @@
395
390
  <textcolor>color</textcolor>
396
391
  <headlinecolor>color</headlinecolor>
397
392
  <titlecolor>color</titlecolor>
398
- <title>xxx</title>
399
393
  <shadowcolor>color</shadowcolor>
400
394
  <urlset>int</urlset>
401
395
  <tagset>xxx</tagset>
@@ -433,7 +427,7 @@
433
427
  <texturefocus colordiffuse="color" flipx="bool" flipy="bool" border="coords" diffuse="path" infill="bool" background="bool">path</texturefocus>
434
428
  <texturenofocus colordiffuse="color" flipx="bool" flipy="bool" border="coords" diffuse="path" infill="bool" background="bool">path</texturenofocus>
435
429
  <movingspeed acceleration="int" maxvelocity="int" resettimeout="int" delta="int"></movingspeed>
436
- <pulseonselect>bool</pulseonselect>
430
+ <colordiffuse>color</colordiffuse>
437
431
  </control>
438
432
  <control type="edit" id="int">
439
433
  <width max="int">int</width>
@@ -464,6 +458,9 @@
464
458
  <focusedchannellayout height="int" width="int" condition="condition"></focusedchannellayout>
465
459
  <itemlayout height="int" width="int" condition="condition"></itemlayout>
466
460
  <focusedlayout height="int" width="int" condition="condition"></focusedlayout>
461
+ <preloaditems>int</preloaditems>
462
+ <offsetx>int</offsetx>
463
+ <offsety>int</offsety>
467
464
  </control>
468
465
  <control type="list" id="int">
469
466
  <include>common</include>
@@ -535,6 +532,7 @@
535
532
  <itemlayout width="int" height="int" condition="condition" infoupdate="int"></itemlayout>
536
533
  <focusedlayout height="int" width="int" condition="condition" infoupdate="int"></focusedlayout>
537
534
  <content sortby="sort" sortorder="order" target="target" limit="int" browse="browse"></content>
535
+ <defaultcontrol always="bool">int</defaultcontrol>
538
536
  </include>
539
537
  <include name="nav_common">
540
538
  <onup condition="condition">builtin</onup>
@@ -542,8 +540,6 @@
542
540
  <onleft condition="condition">builtin</onleft>
543
541
  <onright condition="condition">builtin</onright>
544
542
  <onback condition="condition">builtin</onback>
545
- <onfocus condition="condition">builtin</onfocus>
546
- <onunfocus condition="condition">builtin</onunfocus>
547
543
  <oninfo condition="condition">builtin</oninfo>
548
544
  <onnext condition="condition">builtin</onnext>
549
545
  <onprev condition="condition">builtin</onprev>
@@ -106,6 +106,7 @@
106
106
  <scrollsuffix>label</scrollsuffix>
107
107
  <randomize>bool</randomize>
108
108
  <resetonlabelchange>bool</resetonlabelchange>
109
+ <number></number>
109
110
  </control>
110
111
  <control type="scrollbar" id="int">
111
112
  <width max="int">int</width>
@@ -120,9 +121,10 @@
120
121
  <texturesliderbarfocus colordiffuse="color" border="coords" diffuse="path" flipx="bool" flipy="bool" infill="bool" background="bool">path</texturesliderbarfocus>
121
122
  <textureslidernib colordiffuse="color" border="coords" diffuse="path" flipx="bool" flipy="bool" infill="bool" background="bool">path</textureslidernib>
122
123
  <textureslidernibfocus colordiffuse="color" border="coords" diffuse="path" flipx="bool" flipy="bool" infill="bool" background="bool">path</textureslidernibfocus>
123
- <textureslidernibdisabled colordiffuse="color" border="coords" diffuse="path" flipx="bool" flipy="bool" infill="bool" background="bool">path</textureslidernibdisabled>
124
124
  <orientation>orientation</orientation>
125
125
  <showonepage>bool</showonepage>
126
+ <texturebg colordiffuse="color" border="coords" diffuse="path" flipx="bool" flipy="bool" infill="bool" background="bool">path</texturebg>
127
+ <colordiffuse>color</colordiffuse>
126
128
  </control>
127
129
  <control type="button" id="int">
128
130
  <width min="int" max="int">int</width>
@@ -152,8 +154,6 @@
152
154
  <include>common</include>
153
155
  <include>button_common</include>
154
156
  <include>nav_common</include>
155
- <label2>label</label2>
156
- <wrapmultiline>bool</wrapmultiline>
157
157
  <selectedcolor>color</selectedcolor>
158
158
  <onclick condition="condition">builtin</onclick>
159
159
  <onback condition="condition">builtin</onback>
@@ -167,8 +167,6 @@
167
167
  <include>common</include>
168
168
  <colordiffuse>color</colordiffuse>
169
169
  <fadetime>int</fadetime>
170
- <align>align</align>
171
- <aligny>aligny</aligny>
172
170
  <texture border="coords" flipy="bool" flipx="bool" background="bool" diffuse="path" colordiffuse="color" fallback="path" infill="bool">path</texture>
173
171
  <bordertexture border="coords" colordiffuse="color" infill="bool" diffuse="path" flipx="bool" flipy="bool" background="bool">path</bordertexture>
174
172
  <bordersize>int</bordersize>
@@ -262,8 +260,9 @@
262
260
  <textoffsetx>int</textoffsetx>
263
261
  <textoffsety>int</textoffsety>
264
262
  <reverse>bool</reverse>
265
- <pulseonselect>bool</pulseonselect>
266
263
  <showonepage>bool</showonepage>
264
+ <shadowcolor>color</shadowcolor>
265
+ <angle>int</angle>
267
266
  </control>
268
267
  <control type="spincontrolex" id="int">
269
268
  <width max="int">int</width>
@@ -272,7 +271,6 @@
272
271
  <include>nav_common</include>
273
272
  <include>button_common</include>
274
273
  <spinposx>int</spinposx>
275
- <spinposy>int</spinposy>
276
274
  <spinwidth>int</spinwidth>
277
275
  <spinheight>int</spinheight>
278
276
  <reverse>bool</reverse>
@@ -283,25 +281,22 @@
283
281
  <textureupdisabled colordiffuse="color" flipx="bool" flipy="bool" border="coords" diffuse="path" infill="bool" background="bool">path</textureupdisabled>
284
282
  <texturedowndisabled colordiffuse="color" flipx="bool" flipy="bool" border="coords" diffuse="path" infill="bool" background="bool">path</texturedowndisabled>
285
283
  <onback condition="condition">builtin</onback>
286
- <onfocus condition="condition">builtin</onfocus>
287
- <onunfocus condition="condition">builtin</onunfocus>
284
+ <subtype>subtype</subtype>
288
285
  </control>
289
286
  <control type="slider" id="int">
290
287
  <width max="int">int</width>
291
288
  <height max="int">int</height>
292
289
  <include>common</include>
293
290
  <include>nav_common</include>
294
- <texturesliderbackground colordiffuse="color" border="coords" diffuse="path" flipx="bool" flipy="bool" infill="bool" background="bool">path</texturesliderbackground>
295
291
  <texturesliderbar colordiffuse="color" border="coords" diffuse="path" flipx="bool" flipy="bool" infill="bool" background="bool">path</texturesliderbar>
296
- <texturesliderbarfocus colordiffuse="color" border="coords" diffuse="path" flipx="bool" flipy="bool" infill="bool" background="bool">path</texturesliderbarfocus>
297
292
  <texturesliderbardisabled colordiffuse="color" border="coords" diffuse="path" flipx="bool" flipy="bool" infill="bool" background="bool">path</texturesliderbardisabled>
298
293
  <textureslidernib colordiffuse="color" border="coords" diffuse="path" flipx="bool" flipy="bool" infill="bool" background="bool">path</textureslidernib>
299
294
  <textureslidernibfocus colordiffuse="color" border="coords" diffuse="path" flipx="bool" flipy="bool" infill="bool" background="bool">path</textureslidernibfocus>
300
295
  <textureslidernibdisabled colordiffuse="color" border="coords" diffuse="path" flipx="bool" flipy="bool" infill="bool" background="bool">path</textureslidernibdisabled>
301
296
  <info>info</info>
302
297
  <action>action</action>
303
- <pulseonselect>bool</pulseonselect>
304
298
  <orientation>orientation</orientation>
299
+ <colordiffuse>color</colordiffuse>
305
300
  </control>
306
301
  <control type="sliderex" id="int">
307
302
  <width max="int">int</width>
@@ -314,9 +309,10 @@
314
309
  <texturesliderbar colordiffuse="color" border="coords" diffuse="path" flipx="bool" flipy="bool" infill="bool" background="bool">path</texturesliderbar>
315
310
  <textureslidernib colordiffuse="color" border="coords" diffuse="path" flipx="bool" flipy="bool" infill="bool" background="bool">path</textureslidernib>
316
311
  <textureslidernibfocus colordiffuse="color" border="coords" diffuse="path" flipx="bool" flipy="bool" infill="bool" background="bool">path</textureslidernibfocus>
312
+ <texturesliderbardisabled colordiffuse="color" border="coords" diffuse="path" flipx="bool" flipy="bool" infill="bool" background="bool">path</texturesliderbardisabled>
313
+ <textureslidernibdisabled colordiffuse="color" border="coords" diffuse="path" flipx="bool" flipy="bool" infill="bool" background="bool">path</textureslidernibdisabled>
317
314
  <onback condition="condition">builtin</onback>
318
- <onfocus condition="condition">builtin</onfocus>
319
- <onunfocus condition="condition">builtin</onunfocus>
315
+ <info>info</info>
320
316
  </control>
321
317
  <control type="mover" id="int">
322
318
  <width max="int">int</width>
@@ -325,7 +321,7 @@
325
321
  <texturefocus colordiffuse="color" flipx="bool" flipy="bool" border="coords" diffuse="path" infill="bool" background="bool">path</texturefocus>
326
322
  <texturenofocus colordiffuse="color" flipx="bool" flipy="bool" border="coords" diffuse="path" infill="bool" background="bool">path</texturenofocus>
327
323
  <movingspeed acceleration="int" maxvelocity="int" resettimeout="int" delta="int"></movingspeed>
328
- <pulseonselect>bool</pulseonselect>
324
+ <colordiffuse>color</colordiffuse>
329
325
  </control>
330
326
  <control type="gamecontroller" id="int">
331
327
  <width max="int">int</width>
@@ -338,6 +334,7 @@
338
334
  <controllerdiffuse>color</controllerdiffuse>
339
335
  <portaddress>label</portaddress>
340
336
  <peripherallocation>label</peripherallocation>
337
+ <info>info</info>
341
338
  </control>
342
339
  <control type="progress" id="int">
343
340
  <width max="int">int</width>
@@ -357,7 +354,6 @@
357
354
  <width max="int">int</width>
358
355
  <height max="int">int</height>
359
356
  <include>common</include>
360
- <reveal>bool</reveal>
361
357
  <texturebg colordiffuse="color" border="coords" infill="bool" diffuse="path" flipx="bool" flipy="bool" background="bool">path</texturebg>
362
358
  <colordiffuse>color</colordiffuse>
363
359
  <lefttexture border="coords" colordiffuse="color" diffuse="path" flipx="bool" flipy="bool" infill="bool" background="bool">path</lefttexture>
@@ -370,7 +366,6 @@
370
366
  <width max="int">int</width>
371
367
  <height min="int" max="int">int</height>
372
368
  <include>common</include>
373
- <colordiffuse>color</colordiffuse>
374
369
  <font>font</font>
375
370
  <monofont>font</monofont>
376
371
  <textcolor>color</textcolor>
@@ -378,7 +373,6 @@
378
373
  <disabledcolor>color</disabledcolor>
379
374
  <shadowcolor>color</shadowcolor>
380
375
  <selectedcolor>color</selectedcolor>
381
- <pulseonselect>bool</pulseonselect>
382
376
  <pagecontrol>int</pagecontrol>
383
377
  <scrolltime tween="tween" easing="easing">int</scrolltime>
384
378
  <align>align</align>
@@ -388,6 +382,7 @@
388
382
  <autoscroll delay="int" time="int" repeat="int">condition</autoscroll>
389
383
  <label fallback="label">label</label>
390
384
  <info>label</info>
385
+ <number></number>
391
386
  </control>
392
387
  <control type="rss" id="int">
393
388
  <width max="int">int</width>
@@ -398,7 +393,6 @@
398
393
  <textcolor>color</textcolor>
399
394
  <headlinecolor>color</headlinecolor>
400
395
  <titlecolor>color</titlecolor>
401
- <title>xxx</title>
402
396
  <shadowcolor>color</shadowcolor>
403
397
  <urlset>int</urlset>
404
398
  <tagset>xxx</tagset>
@@ -436,7 +430,7 @@
436
430
  <texturefocus colordiffuse="color" flipx="bool" flipy="bool" border="coords" diffuse="path" infill="bool" background="bool">path</texturefocus>
437
431
  <texturenofocus colordiffuse="color" flipx="bool" flipy="bool" border="coords" diffuse="path" infill="bool" background="bool">path</texturenofocus>
438
432
  <movingspeed acceleration="int" maxvelocity="int" resettimeout="int" delta="int"></movingspeed>
439
- <pulseonselect>bool</pulseonselect>
433
+ <colordiffuse>color</colordiffuse>
440
434
  </control>
441
435
  <control type="edit" id="int">
442
436
  <width max="int">int</width>
@@ -468,6 +462,9 @@
468
462
  <focusedchannellayout height="int" width="int" condition="condition"></focusedchannellayout>
469
463
  <itemlayout height="int" width="int" condition="condition"></itemlayout>
470
464
  <focusedlayout height="int" width="int" condition="condition"></focusedlayout>
465
+ <preloaditems>int</preloaditems>
466
+ <offsetx>int</offsetx>
467
+ <offsety>int</offsety>
471
468
  </control>
472
469
  <control type="list" id="int">
473
470
  <include>common</include>
@@ -542,6 +539,7 @@
542
539
  <itemlayout width="int" height="int" condition="condition" infoupdate="int"></itemlayout>
543
540
  <focusedlayout height="int" width="int" condition="condition" infoupdate="int"></focusedlayout>
544
541
  <content sortby="sort" sortorder="order" target="target" limit="int" browse="browse"></content>
542
+ <defaultcontrol always="bool">int</defaultcontrol>
545
543
  </include>
546
544
  <include name="nav_common">
547
545
  <onup condition="condition">builtin</onup>
@@ -549,8 +547,6 @@
549
547
  <onleft condition="condition">builtin</onleft>
550
548
  <onright condition="condition">builtin</onright>
551
549
  <onback condition="condition">builtin</onback>
552
- <onfocus condition="condition">builtin</onfocus>
553
- <onunfocus condition="condition">builtin</onunfocus>
554
550
  <oninfo condition="condition">builtin</oninfo>
555
551
  <onnext condition="condition">builtin</onnext>
556
552
  <onprev condition="condition">builtin</onprev>