Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Define prop without exporting it #3

Closed
bojjenclon opened this issue Nov 17, 2021 · 4 comments
Closed

Define prop without exporting it #3

bojjenclon opened this issue Nov 17, 2021 · 4 comments

Comments

@bojjenclon
Copy link
Contributor

Currently, all variables defined in a class are exported to the editor. There doesn't seem to be a value one can set to keep them from being exported.

@gilzoide
Copy link
Owner

Hi there! I'm sorry for the current lack of documentation =/

There is a way to mark properties to not show in editor, based on the PropertyUsage enum taken from GDNative's godot_property_usage_flags:

MyClass.some_property = property {
  "This String property is not exported to editor!",
  usage = PropertyUsage.NOEDITOR,
}

This will register some_property in ClassDB and it will be available from GDScript or other languages via instance.some_property or instance.get("some_property") or the like, it will just not show in the inspector.

Now, depending on your use case, if you only need a "private" (hidden from ClassDB or other languages) instance variable, you can also just set it on _init, which is called whenever an instance is created, right after initializing other registered properties from class:

MyClass.some_public_property = 42

function MyClass:_init()
  assert(self.some_public_property == 42)
  self.some_private_property = Array()
end

Also, if you want a class-wide (called static in C/C++/C#/...) private constant/variable, using Lua's locals should be enough:

local class_wide_variable = Dictionary()

function MyClass:get_from_class_cache(key)
  return class_wide_variable[key]
end

@gilzoide
Copy link
Owner

As a side note, properties are exported by default just because GODOT_PROPERTY_USAGE_DEFAULT exports properties to the editor.

In a first moment, I thought of making properties not exported by default, and have an alias of the property function called export that exports properties by default. I don't recall now why exactly I didn't go with this idea, but it can surely be revisited!

Something like:

-- by default, `property` has `usage = PropertyUsage.NOEDITOR`
-- although setting it explicitly would override this default
MyClass.noeditor_property = property { "not shown in inspector" }
MyClass.another_noeditor_property = "also not shown in inspector"
-- export would be an alias to `property { usage = PropertyUsage.DEFAULT }`
MyClass.exported_property = export { "shown in inspector" }

@bojjenclon
Copy link
Contributor Author

Thank you for the detailed explanation! And no worries on the documentation, we all know that's the hardest part of being a dev.

Personally, I'd prefer the property vs export syntax. I think it'd make for a cleaner style. Just my two cents though.

@gilzoide
Copy link
Owner

we all know that's the hardest part of being a dev.

I think it competes with naming things =P

I think it'd make for a cleaner style.

I think so too, will probably implement it in a near future.
Thanks for the feedback!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants