Repository files navigation

NinePatchContainer

A custom Godot container that provides enhanced nine-patch functionality with support for customizable background, frame, and content margins.

Overview

While Godot provides built-in support for nine-patch rectangles and basic nine-patch containers (PanelContainer with a custom StyleBoxTexture), these implementations have limitations:

  • Content is always placed only in the middle cell of the nine-patch. In the following image, the content is only rendered in the red square. Depending on styling, this can be highly undesirable and lead to excessive padding.

PanelContainerMargin

  • Background customization is limited. If your background is not part of the nine-patch sprite, it can be difficult to have the background resize with the container, preserving margins.
  • Margin customization is restricted. You can expand margins, but you can't shrink them.

For instance, with stylized corners and no built-in background, here is what is achievable with PanelContainer. This demonstrates the excessive padding, due to the PanelContainer being unable to overlap the corners with the content area. Adding a background that resizes with content also requires advanced manipulation of parent and sibling UI nodes.

PanelContainerMargin

This addon addresses these limitations by using MarginContainer and NinePatchRect to dynamically compose nine-patch containers with full customization capabilities. With NinePatchContainer, it is easy to achieve a better result, with custom content margins and background:

PanelContainerMargin

Features

  • Layered Structure: Content is organized in three distinct layers:
    • NinePatchContainer (MargineContainer)
      • Background (MarginContainer)
      • Frame (NinePatchRect)
      • Content (MarginContainer)

Structuring content in this manner provides a number of benefits:

  • Customizable Margins and Layering: Full control over content margins, content, and layout
  • Editor Integration: Built-in editor tools for quick setup
  • Dynamic Node Management: Automatic handling of node parenting and ordering
  • Negative Margin Support: Unlike PanelContainer, NinePatchContainer fully supports negative margins.

Installation

  1. Download or clone this repository
  2. Copy the addons/NinePathContainer directory into your project's addons folder
  3. Enable the addon in your project settings

Usage

The NinePatchContainer is intended to be easy to use from within the editor, though all of the functionality is exposed through the code API as well. Most users will find the editor access to be vastly simpler.

Visual Setup

  1. Add a NinePatchContainer node to your scene

  2. (Optional) Use the editor inspector buttons to create default nodes for:

    • Background (optional)
    • Frame (nine-patch)
    • Content

    as required. Alternatively, use the picker to assign an existing node to one of the roles above, which will reparent the control such that it adheres to the above structure. This ensures that content layers itself properly.

Code Setup

Manually create the desired nodes and assign them via code.

Properties

Background (Optional)
  • background_node: Control node for the background layer
  • create_default_background_action: Creates a default MarginContainer as background
Frame
  • frame_node: Control node for the nine-patch frame
  • create_default_frame_action: Creates a default NinePatchRect as frame
Content
  • content_node: Control node for the content
  • create_default_content_action: Creates a default MarginContainer for content

Code Example

# Create a new NinePatchContainervarcontainer=NinePatchContainer.new()
# Create default nodescontainer.create_default_background()
container.create_default_frame()
container.create_default_content()
# Customize the framevarframe=container.frame_nodeframe.texture=preload("res://path/to/your/texture.png")
frame.patch_margin_left=10frame.patch_margin_top=10frame.patch_margin_right=10frame.patch_margin_bottom=10# Add contentvarlabel=Label.new()
label.text="Hello, World!"container.content_node.add_child(label)

FAQ

How do I manually adjust margins?

Assuming you used the buttons to create the default structure, there are three places to adjust margins, depending on the desired effect.

  • Adjusting the root node's style constants can provide a margin around all content at once. This is useful if the control is hosted inside of a larger UI layout.
  • Adjusting the Background node's MarginContainer allows you to control how much space is automatically added before the background content is drawn. Increasing the margins here will shrink the background inward. This can be useful if you want fanciful corner effects outside the actual core area.
  • Adjusting the Content node's MarginContainer allows you to control how much space is giving the remaining space to the content. This is usually needed if you have large sides or corners to ensure that the content is inset enough to not overlap the frame.

HELP!

License

This project is licensed under the Mozilla Public License 2.0 - see the LICENSE file for details.

The MPL states that you are free to use the code for any purpose, commercial or otherwise, for any type of application or purpose, and that you are free to release your works under whatever license you choose. However, regardless of application or method, this code remains under the MPL license, and all modifications or portions of this code must also remain under the MPL license and be made available. This is limited to the covered code and modifications to it. It is NOT viral, nor does it enforce the MPL license on any other portion of your code, as in strong copyleft licenses like GPL and its derivatives. The intent is that this code is MPL, shall always be MPL regardless of author (even if GPL is used, see MPL guidelines), and that it and all modified versions should be public and available to all, but no further burden should be placed on your other code or work.

Simple guidelines:

UseModify
Put a text file in your distribution that states OSS usage, with a link to this repository among any others.Same as Use and make modifications public under the MPL by either issuing a pull request to this repository, forking it, or hosting your own.

However, these are only guidelines, please see the actual license and Additional license FAQ for actual terms and conditions.

About

A customizable 9-patch container for Godot

Resources

Stars

8 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

NinePatchContainer

A custom Godot container that provides enhanced nine-patch functionality with support for customizable background, frame, and content margins.

Overview

While Godot provides built-in support for nine-patch rectangles and basic nine-patch containers (PanelContainer with a custom StyleBoxTexture), these implementations have limitations:

  • Content is always placed only in the middle cell of the nine-patch. In the following image, the content is only rendered in the red square. Depending on styling, this can be highly undesirable and lead to excessive padding.

PanelContainerMargin

  • Background customization is limited. If your background is not part of the nine-patch sprite, it can be difficult to have the background resize with the container, preserving margins.
  • Margin customization is restricted. You can expand margins, but you can't shrink them.

For instance, with stylized corners and no built-in background, here is what is achievable with PanelContainer. This demonstrates the excessive padding, due to the PanelContainer being unable to overlap the corners with the content area. Adding a background that resizes with content also requires advanced manipulation of parent and sibling UI nodes.

PanelContainerMargin

This addon addresses these limitations by using MarginContainer and NinePatchRect to dynamically compose nine-patch containers with full customization capabilities. With NinePatchContainer, it is easy to achieve a better result, with custom content margins and background:

PanelContainerMargin

Features

  • Layered Structure: Content is organized in three distinct layers:
    • NinePatchContainer (MargineContainer)
      • Background (MarginContainer)
      • Frame (NinePatchRect)
      • Content (MarginContainer)

Structuring content in this manner provides a number of benefits:

  • Customizable Margins and Layering: Full control over content margins, content, and layout
  • Editor Integration: Built-in editor tools for quick setup
  • Dynamic Node Management: Automatic handling of node parenting and ordering
  • Negative Margin Support: Unlike PanelContainer, NinePatchContainer fully supports negative margins.

Installation

  1. Download or clone this repository
  2. Copy the addons/NinePathContainer directory into your project's addons folder
  3. Enable the addon in your project settings

Usage

The NinePatchContainer is intended to be easy to use from within the editor, though all of the functionality is exposed through the code API as well. Most users will find the editor access to be vastly simpler.

Visual Setup

  1. Add a NinePatchContainer node to your scene

  2. (Optional) Use the editor inspector buttons to create default nodes for:

    • Background (optional)
    • Frame (nine-patch)
    • Content

    as required. Alternatively, use the picker to assign an existing node to one of the roles above, which will reparent the control such that it adheres to the above structure. This ensures that content layers itself properly.

Code Setup

Manually create the desired nodes and assign them via code.

Properties

Background (Optional)
  • background_node: Control node for the background layer
  • create_default_background_action: Creates a default MarginContainer as background
Frame
  • frame_node: Control node for the nine-patch frame
  • create_default_frame_action: Creates a default NinePatchRect as frame
Content
  • content_node: Control node for the content
  • create_default_content_action: Creates a default MarginContainer for content

Code Example

# Create a new NinePatchContainervarcontainer=NinePatchContainer.new()
# Create default nodescontainer.create_default_background()
container.create_default_frame()
container.create_default_content()
# Customize the framevarframe=container.frame_nodeframe.texture=preload("res://path/to/your/texture.png")
frame.patch_margin_left=10frame.patch_margin_top=10frame.patch_margin_right=10frame.patch_margin_bottom=10# Add contentvarlabel=Label.new()
label.text="Hello, World!"container.content_node.add_child(label)

FAQ

How do I manually adjust margins?

Assuming you used the buttons to create the default structure, there are three places to adjust margins, depending on the desired effect.

  • Adjusting the root node's style constants can provide a margin around all content at once. This is useful if the control is hosted inside of a larger UI layout.
  • Adjusting the Background node's MarginContainer allows you to control how much space is automatically added before the background content is drawn. Increasing the margins here will shrink the background inward. This can be useful if you want fanciful corner effects outside the actual core area.
  • Adjusting the Content node's MarginContainer allows you to control how much space is giving the remaining space to the content. This is usually needed if you have large sides or corners to ensure that the content is inset enough to not overlap the frame.

HELP!

License

This project is licensed under the Mozilla Public License 2.0 - see the LICENSE file for details.

The MPL states that you are free to use the code for any purpose, commercial or otherwise, for any type of application or purpose, and that you are free to release your works under whatever license you choose. However, regardless of application or method, this code remains under the MPL license, and all modifications or portions of this code must also remain under the MPL license and be made available. This is limited to the covered code and modifications to it. It is NOT viral, nor does it enforce the MPL license on any other portion of your code, as in strong copyleft licenses like GPL and its derivatives. The intent is that this code is MPL, shall always be MPL regardless of author (even if GPL is used, see MPL guidelines), and that it and all modified versions should be public and available to all, but no further burden should be placed on your other code or work.

Simple guidelines:

UseModify
Put a text file in your distribution that states OSS usage, with a link to this repository among any others.Same as Use and make modifications public under the MPL by either issuing a pull request to this repository, forking it, or hosting your own.

However, these are only guidelines, please see the actual license and Additional license FAQ for actual terms and conditions.

About

A customizable 9-patch container for Godot

Resources

Stars

8 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

NinePatchContainer

A custom Godot container that provides enhanced nine-patch functionality with support for customizable background, frame, and content margins.

Overview

While Godot provides built-in support for nine-patch rectangles and basic nine-patch containers (PanelContainer with a custom StyleBoxTexture), these implementations have limitations:

  • Content is always placed only in the middle cell of the nine-patch. In the following image, the content is only rendered in the red square. Depending on styling, this can be highly undesirable and lead to excessive padding.

PanelContainerMargin

  • Background customization is limited. If your background is not part of the nine-patch sprite, it can be difficult to have the background resize with the container, preserving margins.
  • Margin customization is restricted. You can expand margins, but you can't shrink them.

For instance, with stylized corners and no built-in background, here is what is achievable with PanelContainer. This demonstrates the excessive padding, due to the PanelContainer being unable to overlap the corners with the content area. Adding a background that resizes with content also requires advanced manipulation of parent and sibling UI nodes.

PanelContainerMargin

This addon addresses these limitations by using MarginContainer and NinePatchRect to dynamically compose nine-patch containers with full customization capabilities. With NinePatchContainer, it is easy to achieve a better result, with custom content margins and background:

PanelContainerMargin

Features

  • Layered Structure: Content is organized in three distinct layers:
    • NinePatchContainer (MargineContainer)
      • Background (MarginContainer)
      • Frame (NinePatchRect)
      • Content (MarginContainer)

Structuring content in this manner provides a number of benefits:

  • Customizable Margins and Layering: Full control over content margins, content, and layout
  • Editor Integration: Built-in editor tools for quick setup
  • Dynamic Node Management: Automatic handling of node parenting and ordering
  • Negative Margin Support: Unlike PanelContainer, NinePatchContainer fully supports negative margins.

Installation

  1. Download or clone this repository
  2. Copy the addons/NinePathContainer directory into your project's addons folder
  3. Enable the addon in your project settings

Usage

The NinePatchContainer is intended to be easy to use from within the editor, though all of the functionality is exposed through the code API as well. Most users will find the editor access to be vastly simpler.

Visual Setup

  1. Add a NinePatchContainer node to your scene

  2. (Optional) Use the editor inspector buttons to create default nodes for:

    • Background (optional)
    • Frame (nine-patch)
    • Content

    as required. Alternatively, use the picker to assign an existing node to one of the roles above, which will reparent the control such that it adheres to the above structure. This ensures that content layers itself properly.

Code Setup

Manually create the desired nodes and assign them via code.

Properties

Background (Optional)
  • background_node: Control node for the background layer
  • create_default_background_action: Creates a default MarginContainer as background
Frame
  • frame_node: Control node for the nine-patch frame
  • create_default_frame_action: Creates a default NinePatchRect as frame
Content
  • content_node: Control node for the content
  • create_default_content_action: Creates a default MarginContainer for content

Code Example

# Create a new NinePatchContainervarcontainer=NinePatchContainer.new()
# Create default nodescontainer.create_default_background()
container.create_default_frame()
container.create_default_content()
# Customize the framevarframe=container.frame_nodeframe.texture=preload("res://path/to/your/texture.png")
frame.patch_margin_left=10frame.patch_margin_top=10frame.patch_margin_right=10frame.patch_margin_bottom=10# Add contentvarlabel=Label.new()
label.text="Hello, World!"container.content_node.add_child(label)

FAQ

How do I manually adjust margins?

Assuming you used the buttons to create the default structure, there are three places to adjust margins, depending on the desired effect.

  • Adjusting the root node's style constants can provide a margin around all content at once. This is useful if the control is hosted inside of a larger UI layout.
  • Adjusting the Background node's MarginContainer allows you to control how much space is automatically added before the background content is drawn. Increasing the margins here will shrink the background inward. This can be useful if you want fanciful corner effects outside the actual core area.
  • Adjusting the Content node's MarginContainer allows you to control how much space is giving the remaining space to the content. This is usually needed if you have large sides or corners to ensure that the content is inset enough to not overlap the frame.

HELP!

License

This project is licensed under the Mozilla Public License 2.0 - see the LICENSE file for details.

The MPL states that you are free to use the code for any purpose, commercial or otherwise, for any type of application or purpose, and that you are free to release your works under whatever license you choose. However, regardless of application or method, this code remains under the MPL license, and all modifications or portions of this code must also remain under the MPL license and be made available. This is limited to the covered code and modifications to it. It is NOT viral, nor does it enforce the MPL license on any other portion of your code, as in strong copyleft licenses like GPL and its derivatives. The intent is that this code is MPL, shall always be MPL regardless of author (even if GPL is used, see MPL guidelines), and that it and all modified versions should be public and available to all, but no further burden should be placed on your other code or work.

Simple guidelines:

UseModify
Put a text file in your distribution that states OSS usage, with a link to this repository among any others.Same as Use and make modifications public under the MPL by either issuing a pull request to this repository, forking it, or hosting your own.

However, these are only guidelines, please see the actual license and Additional license FAQ for actual terms and conditions.

About

A customizable 9-patch container for Godot

Resources

Stars

8 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

NinePatchContainer

A custom Godot container that provides enhanced nine-patch functionality with support for customizable background, frame, and content margins.

Overview

While Godot provides built-in support for nine-patch rectangles and basic nine-patch containers (PanelContainer with a custom StyleBoxTexture), these implementations have limitations:

  • Content is always placed only in the middle cell of the nine-patch. In the following image, the content is only rendered in the red square. Depending on styling, this can be highly undesirable and lead to excessive padding.

PanelContainerMargin

  • Background customization is limited. If your background is not part of the nine-patch sprite, it can be difficult to have the background resize with the container, preserving margins.
  • Margin customization is restricted. You can expand margins, but you can't shrink them.

For instance, with stylized corners and no built-in background, here is what is achievable with PanelContainer. This demonstrates the excessive padding, due to the PanelContainer being unable to overlap the corners with the content area. Adding a background that resizes with content also requires advanced manipulation of parent and sibling UI nodes.

PanelContainerMargin

This addon addresses these limitations by using MarginContainer and NinePatchRect to dynamically compose nine-patch containers with full customization capabilities. With NinePatchContainer, it is easy to achieve a better result, with custom content margins and background:

PanelContainerMargin

Features

  • Layered Structure: Content is organized in three distinct layers:
    • NinePatchContainer (MargineContainer)
      • Background (MarginContainer)
      • Frame (NinePatchRect)
      • Content (MarginContainer)

Structuring content in this manner provides a number of benefits:

  • Customizable Margins and Layering: Full control over content margins, content, and layout
  • Editor Integration: Built-in editor tools for quick setup
  • Dynamic Node Management: Automatic handling of node parenting and ordering
  • Negative Margin Support: Unlike PanelContainer, NinePatchContainer fully supports negative margins.

Installation

  1. Download or clone this repository
  2. Copy the addons/NinePathContainer directory into your project's addons folder
  3. Enable the addon in your project settings

Usage

The NinePatchContainer is intended to be easy to use from within the editor, though all of the functionality is exposed through the code API as well. Most users will find the editor access to be vastly simpler.

Visual Setup

  1. Add a NinePatchContainer node to your scene

  2. (Optional) Use the editor inspector buttons to create default nodes for:

    • Background (optional)
    • Frame (nine-patch)
    • Content

    as required. Alternatively, use the picker to assign an existing node to one of the roles above, which will reparent the control such that it adheres to the above structure. This ensures that content layers itself properly.

Code Setup

Manually create the desired nodes and assign them via code.

Properties

Background (Optional)
  • background_node: Control node for the background layer
  • create_default_background_action: Creates a default MarginContainer as background
Frame
  • frame_node: Control node for the nine-patch frame
  • create_default_frame_action: Creates a default NinePatchRect as frame
Content
  • content_node: Control node for the content
  • create_default_content_action: Creates a default MarginContainer for content

Code Example

# Create a new NinePatchContainervarcontainer=NinePatchContainer.new()
# Create default nodescontainer.create_default_background()
container.create_default_frame()
container.create_default_content()
# Customize the framevarframe=container.frame_nodeframe.texture=preload("res://path/to/your/texture.png")
frame.patch_margin_left=10frame.patch_margin_top=10frame.patch_margin_right=10frame.patch_margin_bottom=10# Add contentvarlabel=Label.new()
label.text="Hello, World!"container.content_node.add_child(label)

FAQ

How do I manually adjust margins?

Assuming you used the buttons to create the default structure, there are three places to adjust margins, depending on the desired effect.

  • Adjusting the root node's style constants can provide a margin around all content at once. This is useful if the control is hosted inside of a larger UI layout.
  • Adjusting the Background node's MarginContainer allows you to control how much space is automatically added before the background content is drawn. Increasing the margins here will shrink the background inward. This can be useful if you want fanciful corner effects outside the actual core area.
  • Adjusting the Content node's MarginContainer allows you to control how much space is giving the remaining space to the content. This is usually needed if you have large sides or corners to ensure that the content is inset enough to not overlap the frame.

HELP!

License

This project is licensed under the Mozilla Public License 2.0 - see the LICENSE file for details.

The MPL states that you are free to use the code for any purpose, commercial or otherwise, for any type of application or purpose, and that you are free to release your works under whatever license you choose. However, regardless of application or method, this code remains under the MPL license, and all modifications or portions of this code must also remain under the MPL license and be made available. This is limited to the covered code and modifications to it. It is NOT viral, nor does it enforce the MPL license on any other portion of your code, as in strong copyleft licenses like GPL and its derivatives. The intent is that this code is MPL, shall always be MPL regardless of author (even if GPL is used, see MPL guidelines), and that it and all modified versions should be public and available to all, but no further burden should be placed on your other code or work.

Simple guidelines:

UseModify
Put a text file in your distribution that states OSS usage, with a link to this repository among any others.Same as Use and make modifications public under the MPL by either issuing a pull request to this repository, forking it, or hosting your own.

However, these are only guidelines, please see the actual license and Additional license FAQ for actual terms and conditions.

About

A customizable 9-patch container for Godot

Resources

Stars

8 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

NinePatchContainer

A custom Godot container that provides enhanced nine-patch functionality with support for customizable background, frame, and content margins.

Overview

While Godot provides built-in support for nine-patch rectangles and basic nine-patch containers (PanelContainer with a custom StyleBoxTexture), these implementations have limitations:

  • Content is always placed only in the middle cell of the nine-patch. In the following image, the content is only rendered in the red square. Depending on styling, this can be highly undesirable and lead to excessive padding.

PanelContainerMargin

  • Background customization is limited. If your background is not part of the nine-patch sprite, it can be difficult to have the background resize with the container, preserving margins.
  • Margin customization is restricted. You can expand margins, but you can't shrink them.

For instance, with stylized corners and no built-in background, here is what is achievable with PanelContainer. This demonstrates the excessive padding, due to the PanelContainer being unable to overlap the corners with the content area. Adding a background that resizes with content also requires advanced manipulation of parent and sibling UI nodes.

PanelContainerMargin

This addon addresses these limitations by using MarginContainer and NinePatchRect to dynamically compose nine-patch containers with full customization capabilities. With NinePatchContainer, it is easy to achieve a better result, with custom content margins and background:

PanelContainerMargin

Features

  • Layered Structure: Content is organized in three distinct layers:
    • NinePatchContainer (MargineContainer)
      • Background (MarginContainer)
      • Frame (NinePatchRect)
      • Content (MarginContainer)

Structuring content in this manner provides a number of benefits:

  • Customizable Margins and Layering: Full control over content margins, content, and layout
  • Editor Integration: Built-in editor tools for quick setup
  • Dynamic Node Management: Automatic handling of node parenting and ordering
  • Negative Margin Support: Unlike PanelContainer, NinePatchContainer fully supports negative margins.

Installation

  1. Download or clone this repository
  2. Copy the addons/NinePathContainer directory into your project's addons folder
  3. Enable the addon in your project settings

Usage

The NinePatchContainer is intended to be easy to use from within the editor, though all of the functionality is exposed through the code API as well. Most users will find the editor access to be vastly simpler.

Visual Setup

  1. Add a NinePatchContainer node to your scene

  2. (Optional) Use the editor inspector buttons to create default nodes for:

    • Background (optional)
    • Frame (nine-patch)
    • Content

    as required. Alternatively, use the picker to assign an existing node to one of the roles above, which will reparent the control such that it adheres to the above structure. This ensures that content layers itself properly.

Code Setup

Manually create the desired nodes and assign them via code.

Properties

Background (Optional)
  • background_node: Control node for the background layer
  • create_default_background_action: Creates a default MarginContainer as background
Frame
  • frame_node: Control node for the nine-patch frame
  • create_default_frame_action: Creates a default NinePatchRect as frame
Content
  • content_node: Control node for the content
  • create_default_content_action: Creates a default MarginContainer for content

Code Example

# Create a new NinePatchContainervarcontainer=NinePatchContainer.new()
# Create default nodescontainer.create_default_background()
container.create_default_frame()
container.create_default_content()
# Customize the framevarframe=container.frame_nodeframe.texture=preload("res://path/to/your/texture.png")
frame.patch_margin_left=10frame.patch_margin_top=10frame.patch_margin_right=10frame.patch_margin_bottom=10# Add contentvarlabel=Label.new()
label.text="Hello, World!"container.content_node.add_child(label)

FAQ

How do I manually adjust margins?

Assuming you used the buttons to create the default structure, there are three places to adjust margins, depending on the desired effect.

  • Adjusting the root node's style constants can provide a margin around all content at once. This is useful if the control is hosted inside of a larger UI layout.
  • Adjusting the Background node's MarginContainer allows you to control how much space is automatically added before the background content is drawn. Increasing the margins here will shrink the background inward. This can be useful if you want fanciful corner effects outside the actual core area.
  • Adjusting the Content node's MarginContainer allows you to control how much space is giving the remaining space to the content. This is usually needed if you have large sides or corners to ensure that the content is inset enough to not overlap the frame.

HELP!

License

This project is licensed under the Mozilla Public License 2.0 - see the LICENSE file for details.

The MPL states that you are free to use the code for any purpose, commercial or otherwise, for any type of application or purpose, and that you are free to release your works under whatever license you choose. However, regardless of application or method, this code remains under the MPL license, and all modifications or portions of this code must also remain under the MPL license and be made available. This is limited to the covered code and modifications to it. It is NOT viral, nor does it enforce the MPL license on any other portion of your code, as in strong copyleft licenses like GPL and its derivatives. The intent is that this code is MPL, shall always be MPL regardless of author (even if GPL is used, see MPL guidelines), and that it and all modified versions should be public and available to all, but no further burden should be placed on your other code or work.

Simple guidelines:

UseModify
Put a text file in your distribution that states OSS usage, with a link to this repository among any others.Same as Use and make modifications public under the MPL by either issuing a pull request to this repository, forking it, or hosting your own.

However, these are only guidelines, please see the actual license and Additional license FAQ for actual terms and conditions.

About

A customizable 9-patch container for Godot

Resources

Stars

8 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

NinePatchContainer

A custom Godot container that provides enhanced nine-patch functionality with support for customizable background, frame, and content margins.

Overview

While Godot provides built-in support for nine-patch rectangles and basic nine-patch containers (PanelContainer with a custom StyleBoxTexture), these implementations have limitations:

  • Content is always placed only in the middle cell of the nine-patch. In the following image, the content is only rendered in the red square. Depending on styling, this can be highly undesirable and lead to excessive padding.

PanelContainerMargin

  • Background customization is limited. If your background is not part of the nine-patch sprite, it can be difficult to have the background resize with the container, preserving margins.
  • Margin customization is restricted. You can expand margins, but you can't shrink them.

For instance, with stylized corners and no built-in background, here is what is achievable with PanelContainer. This demonstrates the excessive padding, due to the PanelContainer being unable to overlap the corners with the content area. Adding a background that resizes with content also requires advanced manipulation of parent and sibling UI nodes.

PanelContainerMargin

This addon addresses these limitations by using MarginContainer and NinePatchRect to dynamically compose nine-patch containers with full customization capabilities. With NinePatchContainer, it is easy to achieve a better result, with custom content margins and background:

PanelContainerMargin

Features

  • Layered Structure: Content is organized in three distinct layers:
    • NinePatchContainer (MargineContainer)
      • Background (MarginContainer)
      • Frame (NinePatchRect)
      • Content (MarginContainer)

Structuring content in this manner provides a number of benefits:

  • Customizable Margins and Layering: Full control over content margins, content, and layout
  • Editor Integration: Built-in editor tools for quick setup
  • Dynamic Node Management: Automatic handling of node parenting and ordering
  • Negative Margin Support: Unlike PanelContainer, NinePatchContainer fully supports negative margins.

Installation

  1. Download or clone this repository
  2. Copy the addons/NinePathContainer directory into your project's addons folder
  3. Enable the addon in your project settings

Usage

The NinePatchContainer is intended to be easy to use from within the editor, though all of the functionality is exposed through the code API as well. Most users will find the editor access to be vastly simpler.

Visual Setup

  1. Add a NinePatchContainer node to your scene

  2. (Optional) Use the editor inspector buttons to create default nodes for:

    • Background (optional)
    • Frame (nine-patch)
    • Content

    as required. Alternatively, use the picker to assign an existing node to one of the roles above, which will reparent the control such that it adheres to the above structure. This ensures that content layers itself properly.

Code Setup

Manually create the desired nodes and assign them via code.

Properties

Background (Optional)
  • background_node: Control node for the background layer
  • create_default_background_action: Creates a default MarginContainer as background
Frame
  • frame_node: Control node for the nine-patch frame
  • create_default_frame_action: Creates a default NinePatchRect as frame
Content
  • content_node: Control node for the content
  • create_default_content_action: Creates a default MarginContainer for content

Code Example

# Create a new NinePatchContainervarcontainer=NinePatchContainer.new()
# Create default nodescontainer.create_default_background()
container.create_default_frame()
container.create_default_content()
# Customize the framevarframe=container.frame_nodeframe.texture=preload("res://path/to/your/texture.png")
frame.patch_margin_left=10frame.patch_margin_top=10frame.patch_margin_right=10frame.patch_margin_bottom=10# Add contentvarlabel=Label.new()
label.text="Hello, World!"container.content_node.add_child(label)

FAQ

How do I manually adjust margins?

Assuming you used the buttons to create the default structure, there are three places to adjust margins, depending on the desired effect.

  • Adjusting the root node's style constants can provide a margin around all content at once. This is useful if the control is hosted inside of a larger UI layout.
  • Adjusting the Background node's MarginContainer allows you to control how much space is automatically added before the background content is drawn. Increasing the margins here will shrink the background inward. This can be useful if you want fanciful corner effects outside the actual core area.
  • Adjusting the Content node's MarginContainer allows you to control how much space is giving the remaining space to the content. This is usually needed if you have large sides or corners to ensure that the content is inset enough to not overlap the frame.

HELP!

License

This project is licensed under the Mozilla Public License 2.0 - see the LICENSE file for details.

The MPL states that you are free to use the code for any purpose, commercial or otherwise, for any type of application or purpose, and that you are free to release your works under whatever license you choose. However, regardless of application or method, this code remains under the MPL license, and all modifications or portions of this code must also remain under the MPL license and be made available. This is limited to the covered code and modifications to it. It is NOT viral, nor does it enforce the MPL license on any other portion of your code, as in strong copyleft licenses like GPL and its derivatives. The intent is that this code is MPL, shall always be MPL regardless of author (even if GPL is used, see MPL guidelines), and that it and all modified versions should be public and available to all, but no further burden should be placed on your other code or work.

Simple guidelines:

UseModify
Put a text file in your distribution that states OSS usage, with a link to this repository among any others.Same as Use and make modifications public under the MPL by either issuing a pull request to this repository, forking it, or hosting your own.

However, these are only guidelines, please see the actual license and Additional license FAQ for actual terms and conditions.

About

A customizable 9-patch container for Godot

Resources

Stars

8 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

NinePatchContainer

A custom Godot container that provides enhanced nine-patch functionality with support for customizable background, frame, and content margins.

Overview

While Godot provides built-in support for nine-patch rectangles and basic nine-patch containers (PanelContainer with a custom StyleBoxTexture), these implementations have limitations:

  • Content is always placed only in the middle cell of the nine-patch. In the following image, the content is only rendered in the red square. Depending on styling, this can be highly undesirable and lead to excessive padding.

PanelContainerMargin

  • Background customization is limited. If your background is not part of the nine-patch sprite, it can be difficult to have the background resize with the container, preserving margins.
  • Margin customization is restricted. You can expand margins, but you can't shrink them.

For instance, with stylized corners and no built-in background, here is what is achievable with PanelContainer. This demonstrates the excessive padding, due to the PanelContainer being unable to overlap the corners with the content area. Adding a background that resizes with content also requires advanced manipulation of parent and sibling UI nodes.

PanelContainerMargin

This addon addresses these limitations by using MarginContainer and NinePatchRect to dynamically compose nine-patch containers with full customization capabilities. With NinePatchContainer, it is easy to achieve a better result, with custom content margins and background:

PanelContainerMargin

Features

  • Layered Structure: Content is organized in three distinct layers:
    • NinePatchContainer (MargineContainer)
      • Background (MarginContainer)
      • Frame (NinePatchRect)
      • Content (MarginContainer)

Structuring content in this manner provides a number of benefits:

  • Customizable Margins and Layering: Full control over content margins, content, and layout
  • Editor Integration: Built-in editor tools for quick setup
  • Dynamic Node Management: Automatic handling of node parenting and ordering
  • Negative Margin Support: Unlike PanelContainer, NinePatchContainer fully supports negative margins.

Installation

  1. Download or clone this repository
  2. Copy the addons/NinePathContainer directory into your project's addons folder
  3. Enable the addon in your project settings

Usage

The NinePatchContainer is intended to be easy to use from within the editor, though all of the functionality is exposed through the code API as well. Most users will find the editor access to be vastly simpler.

Visual Setup

  1. Add a NinePatchContainer node to your scene

  2. (Optional) Use the editor inspector buttons to create default nodes for:

    • Background (optional)
    • Frame (nine-patch)
    • Content

    as required. Alternatively, use the picker to assign an existing node to one of the roles above, which will reparent the control such that it adheres to the above structure. This ensures that content layers itself properly.

Code Setup

Manually create the desired nodes and assign them via code.

Properties

Background (Optional)
  • background_node: Control node for the background layer
  • create_default_background_action: Creates a default MarginContainer as background
Frame
  • frame_node: Control node for the nine-patch frame
  • create_default_frame_action: Creates a default NinePatchRect as frame
Content
  • content_node: Control node for the content
  • create_default_content_action: Creates a default MarginContainer for content

Code Example

# Create a new NinePatchContainervarcontainer=NinePatchContainer.new()
# Create default nodescontainer.create_default_background()
container.create_default_frame()
container.create_default_content()
# Customize the framevarframe=container.frame_nodeframe.texture=preload("res://path/to/your/texture.png")
frame.patch_margin_left=10frame.patch_margin_top=10frame.patch_margin_right=10frame.patch_margin_bottom=10# Add contentvarlabel=Label.new()
label.text="Hello, World!"container.content_node.add_child(label)

FAQ

How do I manually adjust margins?

Assuming you used the buttons to create the default structure, there are three places to adjust margins, depending on the desired effect.

  • Adjusting the root node's style constants can provide a margin around all content at once. This is useful if the control is hosted inside of a larger UI layout.
  • Adjusting the Background node's MarginContainer allows you to control how much space is automatically added before the background content is drawn. Increasing the margins here will shrink the background inward. This can be useful if you want fanciful corner effects outside the actual core area.
  • Adjusting the Content node's MarginContainer allows you to control how much space is giving the remaining space to the content. This is usually needed if you have large sides or corners to ensure that the content is inset enough to not overlap the frame.

HELP!

License

This project is licensed under the Mozilla Public License 2.0 - see the LICENSE file for details.

The MPL states that you are free to use the code for any purpose, commercial or otherwise, for any type of application or purpose, and that you are free to release your works under whatever license you choose. However, regardless of application or method, this code remains under the MPL license, and all modifications or portions of this code must also remain under the MPL license and be made available. This is limited to the covered code and modifications to it. It is NOT viral, nor does it enforce the MPL license on any other portion of your code, as in strong copyleft licenses like GPL and its derivatives. The intent is that this code is MPL, shall always be MPL regardless of author (even if GPL is used, see MPL guidelines), and that it and all modified versions should be public and available to all, but no further burden should be placed on your other code or work.

Simple guidelines:

UseModify
Put a text file in your distribution that states OSS usage, with a link to this repository among any others.Same as Use and make modifications public under the MPL by either issuing a pull request to this repository, forking it, or hosting your own.

However, these are only guidelines, please see the actual license and Additional license FAQ for actual terms and conditions.

About

A customizable 9-patch container for Godot

Resources

Stars

8 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

NinePatchContainer

A custom Godot container that provides enhanced nine-patch functionality with support for customizable background, frame, and content margins.

Overview

While Godot provides built-in support for nine-patch rectangles and basic nine-patch containers (PanelContainer with a custom StyleBoxTexture), these implementations have limitations:

  • Content is always placed only in the middle cell of the nine-patch. In the following image, the content is only rendered in the red square. Depending on styling, this can be highly undesirable and lead to excessive padding.

PanelContainerMargin

  • Background customization is limited. If your background is not part of the nine-patch sprite, it can be difficult to have the background resize with the container, preserving margins.
  • Margin customization is restricted. You can expand margins, but you can't shrink them.

For instance, with stylized corners and no built-in background, here is what is achievable with PanelContainer. This demonstrates the excessive padding, due to the PanelContainer being unable to overlap the corners with the content area. Adding a background that resizes with content also requires advanced manipulation of parent and sibling UI nodes.

PanelContainerMargin

This addon addresses these limitations by using MarginContainer and NinePatchRect to dynamically compose nine-patch containers with full customization capabilities. With NinePatchContainer, it is easy to achieve a better result, with custom content margins and background:

PanelContainerMargin

Features

  • Layered Structure: Content is organized in three distinct layers:
    • NinePatchContainer (MargineContainer)
      • Background (MarginContainer)
      • Frame (NinePatchRect)
      • Content (MarginContainer)

Structuring content in this manner provides a number of benefits:

  • Customizable Margins and Layering: Full control over content margins, content, and layout
  • Editor Integration: Built-in editor tools for quick setup
  • Dynamic Node Management: Automatic handling of node parenting and ordering
  • Negative Margin Support: Unlike PanelContainer, NinePatchContainer fully supports negative margins.

Installation

  1. Download or clone this repository
  2. Copy the addons/NinePathContainer directory into your project's addons folder
  3. Enable the addon in your project settings

Usage

The NinePatchContainer is intended to be easy to use from within the editor, though all of the functionality is exposed through the code API as well. Most users will find the editor access to be vastly simpler.

Visual Setup

  1. Add a NinePatchContainer node to your scene

  2. (Optional) Use the editor inspector buttons to create default nodes for:

    • Background (optional)
    • Frame (nine-patch)
    • Content

    as required. Alternatively, use the picker to assign an existing node to one of the roles above, which will reparent the control such that it adheres to the above structure. This ensures that content layers itself properly.

Code Setup

Manually create the desired nodes and assign them via code.

Properties

Background (Optional)
  • background_node: Control node for the background layer
  • create_default_background_action: Creates a default MarginContainer as background
Frame
  • frame_node: Control node for the nine-patch frame
  • create_default_frame_action: Creates a default NinePatchRect as frame
Content
  • content_node: Control node for the content
  • create_default_content_action: Creates a default MarginContainer for content

Code Example

# Create a new NinePatchContainervarcontainer=NinePatchContainer.new()
# Create default nodescontainer.create_default_background()
container.create_default_frame()
container.create_default_content()
# Customize the framevarframe=container.frame_nodeframe.texture=preload("res://path/to/your/texture.png")
frame.patch_margin_left=10frame.patch_margin_top=10frame.patch_margin_right=10frame.patch_margin_bottom=10# Add contentvarlabel=Label.new()
label.text="Hello, World!"container.content_node.add_child(label)

FAQ

How do I manually adjust margins?

Assuming you used the buttons to create the default structure, there are three places to adjust margins, depending on the desired effect.

  • Adjusting the root node's style constants can provide a margin around all content at once. This is useful if the control is hosted inside of a larger UI layout.
  • Adjusting the Background node's MarginContainer allows you to control how much space is automatically added before the background content is drawn. Increasing the margins here will shrink the background inward. This can be useful if you want fanciful corner effects outside the actual core area.
  • Adjusting the Content node's MarginContainer allows you to control how much space is giving the remaining space to the content. This is usually needed if you have large sides or corners to ensure that the content is inset enough to not overlap the frame.

HELP!

License

This project is licensed under the Mozilla Public License 2.0 - see the LICENSE file for details.

The MPL states that you are free to use the code for any purpose, commercial or otherwise, for any type of application or purpose, and that you are free to release your works under whatever license you choose. However, regardless of application or method, this code remains under the MPL license, and all modifications or portions of this code must also remain under the MPL license and be made available. This is limited to the covered code and modifications to it. It is NOT viral, nor does it enforce the MPL license on any other portion of your code, as in strong copyleft licenses like GPL and its derivatives. The intent is that this code is MPL, shall always be MPL regardless of author (even if GPL is used, see MPL guidelines), and that it and all modified versions should be public and available to all, but no further burden should be placed on your other code or work.

Simple guidelines:

UseModify
Put a text file in your distribution that states OSS usage, with a link to this repository among any others.Same as Use and make modifications public under the MPL by either issuing a pull request to this repository, forking it, or hosting your own.

However, these are only guidelines, please see the actual license and Additional license FAQ for actual terms and conditions.

About

A customizable 9-patch container for Godot

Resources

Stars

8 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages