0
$\begingroup$

I saw that the F2 rename operator use a dialog box drawing without any OK button is this achievable with python? Perhaps there's something i missed?

enter image description here

$\endgroup$
1

1 Answer 1

2
$\begingroup$

The Rename Active Item dialog is actually a regular Panel rather than a confirmation dialog box which is then called using WM.call_panel(), see startup/bl_ui/space_topbar.py:

import bpy

class LayoutDemoPanel(bpy.types.Panel):
    bl_space_type = 'TOPBAR'  # dummy
    bl_region_type = 'HEADER'
    bl_label = "Rename Active Item"
    bl_ui_units_x = 14

    def draw(self, context):
        layout = self.layout
        
        item = context.object
        if item:
            layout.label(text="Object Name")
            row = layout.row()
            row.activate_init = True
            row.label(icon='OBJECT_DATA')
            row.prop(item, "name", text="")

def register():
    bpy.utils.register_class(LayoutDemoPanel)

def unregister():
    bpy.utils.unregister_class(LayoutDemoPanel)

if __name__ == "__main__":
    register()
    
    # Test call
    bpy.ops.wm.call_panel(name="LayoutDemoPanel")

I'd recommend just use invoke_popup() instead. It does the same thing, easier to maintain and there is no extra panel class needed to display a few properties:

import bpy

class SimplePopUpOperator(bpy.types.Operator):
    """Really?"""
    bl_idname = "my_category.custom_popup_dialog"
    bl_options = {'REGISTER', 'INTERNAL'}

    item: bpy.props.PointerProperty(type=bpy.types.Object)

    @classmethod
    def poll(cls, context):
        return True

    def execute(self, context):
        self.report({'INFO'}, "YES!")
        return {'FINISHED'}

    def invoke(self, context, event):
        self.item = context.object
        return context.window_manager.invoke_popup(self)

    def draw(self, context):
        layout = self.layout
        layout.label(text="Object Name")
        row = layout.row()
        row.activate_init = True
        row.label(icon='OBJECT_DATA')
        row.prop(self.item, "name", text="")


class OBJECT_PT_CustomPanel(bpy.types.Panel):
    bl_label = "My Panel"
    bl_idname = "OBJECT_PT_custom_panel"
    bl_space_type = "VIEW_3D"   
    bl_region_type = "UI"
    bl_category = "Tools"
    bl_context = "objectmode"

    def draw(self, context):
        layout = self.layout
        layout.operator(SimplePopUpOperator.bl_idname)

def register():
    bpy.utils.register_class(OBJECT_PT_CustomPanel)
    bpy.utils.register_class(SimplePopUpOperator)

def unregister():
    bpy.utils.unregister_class(SimplePropConfirmOperator)
    bpy.utils.unregister_class(SimplePopUpOperator)

if __name__ == "__main__":
    register()

Code is based on: How to call a confirmation dialog box?

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.