| 5749 | } |
| 5750 | |
| 5751 | void register_class_api(nb::module_& m) { |
| 5752 | m.def( |
| 5753 | "register_class", |
| 5754 | [](nb::object cls) { |
| 5755 | nb::module_ builtins = nb::module_::import_("builtins"); |
| 5756 | auto issubclass = builtins.attr("issubclass"); |
| 5757 | |
| 5758 | nb::object Panel_type = nb::module_::import_("lichtfeld").attr("ui").attr("Panel"); |
| 5759 | nb::module_ types_module = nb::module_::import_("lfs_plugins.types"); |
| 5760 | nb::object Operator_type = types_module.attr("Operator"); |
| 5761 | const nb::object Menu_type = types_module.attr("Menu"); |
| 5762 | |
| 5763 | if (nb::cast<bool>(issubclass(cls, Panel_type))) { |
| 5764 | PyPanelRegistry::instance().register_panel(cls); |
| 5765 | } else if (nb::cast<bool>(issubclass(cls, Operator_type))) { |
| 5766 | register_python_operator_to_cpp(cls); |
| 5767 | std::string idname = get_class_id(cls); |
| 5768 | std::string label = idname; |
| 5769 | if (nb::hasattr(cls, "label")) { |
| 5770 | label = nb::cast<std::string>(cls.attr("label")); |
| 5771 | } |
| 5772 | register_python_property_group("operator." + idname, label, cls); |
| 5773 | } else if (nb::cast<bool>(issubclass(cls, Menu_type))) { |
| 5774 | PyMenuRegistry::instance().register_menu(cls); |
| 5775 | } else { |
| 5776 | throw nb::type_error( |
| 5777 | "register_class: cls must be a subclass of Panel, Operator, or Menu"); |
| 5778 | } |
| 5779 | }, |
| 5780 | nb::arg("cls"), "Register a class (Panel, Operator, or Menu)"); |
| 5781 | |
| 5782 | m.def( |
| 5783 | "unregister_class", |
| 5784 | [](nb::object cls) { |
| 5785 | nb::module_ builtins = nb::module_::import_("builtins"); |
| 5786 | auto issubclass = builtins.attr("issubclass"); |
| 5787 | |
| 5788 | nb::object Panel_type = nb::module_::import_("lichtfeld").attr("ui").attr("Panel"); |
| 5789 | nb::module_ types_module = nb::module_::import_("lfs_plugins.types"); |
| 5790 | nb::object Operator_type = types_module.attr("Operator"); |
| 5791 | const nb::object Menu_type = types_module.attr("Menu"); |
| 5792 | |
| 5793 | if (nb::cast<bool>(issubclass(cls, Panel_type))) { |
| 5794 | PyPanelRegistry::instance().unregister_panel(cls); |
| 5795 | } else if (nb::cast<bool>(issubclass(cls, Operator_type))) { |
| 5796 | std::string idname = get_class_id(cls); |
| 5797 | vis::op::operators().unregisterOperator(idname); |
| 5798 | vis::op::propertySchemas().unregisterSchema(idname); |
| 5799 | remove_python_operator_instance(idname); |
| 5800 | } else if (nb::cast<bool>(issubclass(cls, Menu_type))) { |
| 5801 | PyMenuRegistry::instance().unregister_menu(cls); |
| 5802 | } |
| 5803 | }, |
| 5804 | nb::arg("cls"), "Unregister a class (Panel, Operator, or Menu)"); |
| 5805 | } |
| 5806 | |
| 5807 | } // namespace lfs::python |
no test coverage detected