アドオン削除panel 元型

# ========================================================================
# Blender 5.0+ Origin Cylinder (Links & Remove Only)
# リンクパネル と アドオン削除パネル のみを残したバージョン
# ========================================================================

bl_info = {
    "name": "Origin Cylinder Generator (Links & Remove Only)",
    "author": "zionad",
    "version": (4, 2, 0),
    "blender": (5, 0, 0),
    "location": "View3D > Sidebar > Origin Cylinder",
    "description": "リンクパネルとアドオン削除パネルのみ",
    "category": "System",
}

import bpy
import webbrowser

# ========================================================================
# Links データ
# ========================================================================

ADDON_LINKS = {
    "20261005 円柱作成": "<https://app.notion.com/p/20261005-3ef691cbf906807d9521eeb3fecabcf6>",
    "20261003 円錐頂点矢印 と 球体_002": "<https://app.notion.com/p/20261003-3ed691cbf90680a187f7d9c5ea268c2b>",
    "338 Sphere Cam": "<https://app.notion.com/p/338-Sphere-Cam-3c0347b3454a80abbb61ff2cd585792c>",
    "posfie": "<https://posfie.com/@timekagura/t/zionad2022?sort=0>",
    "zionadchat": "<https://x.com/zionadchat>",
    "背後霊カメラ 最新版リンク": "<https://app.notion.com/p/Cam-blender-39f347b3454a806490a6f0107c2347dd>",
    "blender コンテナ 20260713": "<https://note.com/zionadmillion/n/n9a47d88fe7b4>",
    "骨格立方体": "<https://app.notion.com/p/351-2017-3cb347b3454a8086b15fec2f69408bd5>",
}

# ========================================================================
# Operators
# ========================================================================

class ORIGIN_CYLINDER_OT_open_url(bpy.types.Operator):
    bl_idname = "origin_cylinder.open_url"
    bl_label = "リンクを開く"
    url: bpy.props.StringProperty()

    def execute(self, context):
        if self.url:
            webbrowser.open(self.url)
        return {'FINISHED'}

class ORIGIN_CYLINDER_OT_remove_addon(bpy.types.Operator):
    bl_idname = "wm.tangent_cone_remove_addon"
    bl_label = "アドオン削除"

    def execute(self, context):
        unregister()
        return {'FINISHED'}

# ========================================================================
# Panels
# ========================================================================

class VIEW3D_PT_origin_cylinder_links(bpy.types.Panel):
    bl_label = "Links"
    bl_order = 100
    bl_space_type = 'VIEW_3D'
    bl_region_type = 'UI'
    bl_category = 'Origin Cylinder'

    def draw(self, context):
        layout = self.layout
        for name, url in ADDON_LINKS.items():
            if name and url:
                layout.operator("origin_cylinder.open_url", text=name, icon='URL').url = url

class VIEW3D_PT_origin_cylinder_remove(bpy.types.Panel):
    bl_label = "Addon Remove"
    bl_order = 101
    bl_space_type = 'VIEW_3D'
    bl_region_type = 'UI'
    bl_category = 'Origin Cylinder'

    def draw(self, context):
        layout = self.layout
        layout.operator("wm.tangent_cone_remove_addon", icon='CANCEL')

# ========================================================================
# Register
# ========================================================================

classes = (
    ORIGIN_CYLINDER_OT_open_url,
    ORIGIN_CYLINDER_OT_remove_addon,
    VIEW3D_PT_origin_cylinder_links,
    VIEW3D_PT_origin_cylinder_remove,
)

def register():
    for cls in classes:
        bpy.utils.register_class(cls)

def unregister():
    for cls in reversed(classes):
        try:
            bpy.utils.unregister_class(cls)
        except Exception:
            pass

if __name__ == "__main__":
    try:
        unregister()
    except Exception:
        pass
    register()