2

In sculpt mode you get this menu with a right click:

enter image description here

The UI elements in this menu are visually the same you would get by drawing a UI using bpy.types.UILayout functions. Yet, the only answers I found for drawing custom floating UI elements referred to bgl and blf, like in these two Blender StackExchange questions:

  1. How to draw shapes in the node editor with python bgl
  2. Floating UI window in 3D view

However, ideally I would use standard Blender UI elements to create something like that. Is there a way to draw standard Blender UI elements in floating windows like those in the screenshot using Python?

narranoid
  • 197
  • 3
  • 9

1 Answers1

4

WindowManager.invoke_props_popup(operator, event)

Operator popup invoke (show operator properties and execute it automatically on changes)

Code based on How to call a confirmation dialog box?, I just replaced invoke_props_dialog by invoke_props_popup to diplay the popup without confirmation option:

enter image description here

import bpy

class SimplePropConfirmOperator(bpy.types.Operator): """Really?""" bl_idname = "my_category.custom_confirm_dialog" bl_label = "Do you really want to do that?" bl_options = {'REGISTER', 'UNDO'}

prop1: bpy.props.BoolProperty()
prop2: bpy.props.BoolProperty()

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

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

def invoke(self, context, event):
    return context.window_manager.invoke_props_popup(self, event)

def draw(self, context):
    row = self.layout
    row.prop(self, "prop1", text="Property A")
    row.prop(self, "prop2", text="Property B")


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(SimplePropConfirmOperator.bl_idname)

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

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

if name == "main": register()

brockmann
  • 12,613
  • 4
  • 50
  • 93