* register operators like other classes

* operators now return sets (converted into flags)
* can't remove bpy_operator_wrap.c since macro's still use the custom register funcs
This commit is contained in:
Campbell Barton 2009-12-24 19:50:43 +00:00
parent 4dd3e6c360
commit bbe13e7823
41 changed files with 274 additions and 227 deletions

@ -1126,7 +1126,7 @@ class Export3DS(bpy.types.Operator):
def execute(self, context): def execute(self, context):
save_3ds(self.properties.path, context) save_3ds(self.properties.path, context)
return ('FINISHED',) return {'FINISHED'}
def invoke(self, context, event): def invoke(self, context, event):
wm = context.manager wm = context.manager
@ -1136,7 +1136,7 @@ class Export3DS(bpy.types.Operator):
def poll(self, context): # Poll isnt working yet def poll(self, context): # Poll isnt working yet
return context.active_object != None return context.active_object != None
bpy.ops.add(Export3DS) bpy.types.register(Export3DS)
# Add to a menu # Add to a menu
import dynamic_menu import dynamic_menu

@ -3426,7 +3426,7 @@ class ExportFBX(bpy.types.Operator):
self.properties.BATCH_FILE_PREFIX, self.properties.BATCH_FILE_PREFIX,
self.properties.BATCH_OWN_DIR) self.properties.BATCH_OWN_DIR)
return ('FINISHED',) return {'FINISHED'}
def invoke(self, context, event): def invoke(self, context, event):
wm = context.manager wm = context.manager
@ -3434,7 +3434,7 @@ class ExportFBX(bpy.types.Operator):
return ('RUNNING_MODAL',) return ('RUNNING_MODAL',)
bpy.ops.add(ExportFBX) bpy.types.register(ExportFBX)
# if __name__ == "__main__": # if __name__ == "__main__":
# bpy.ops.EXPORT_OT_ply(filename="/tmp/test.ply") # bpy.ops.EXPORT_OT_ply(filename="/tmp/test.ply")

@ -173,14 +173,14 @@ class ExportMDD(bpy.types.Operator):
raise Exception("filename not set") raise Exception("filename not set")
write(self.properties.path, context.scene, context.active_object, write(self.properties.path, context.scene, context.active_object,
self.properties.start_frame, self.properties.end_frame, self.properties.fps) self.properties.start_frame, self.properties.end_frame, self.properties.fps)
return ('FINISHED',) return {'FINISHED'}
def invoke(self, context, event): def invoke(self, context, event):
wm = context.manager wm = context.manager
wm.add_fileselect(self) wm.add_fileselect(self)
return ('RUNNING_MODAL',) return ('RUNNING_MODAL',)
bpy.ops.add(ExportMDD) bpy.types.register(ExportMDD)
# Add to a menu # Add to a menu
import dynamic_menu import dynamic_menu

@ -980,7 +980,7 @@ class ExportOBJ(bpy.types.Operator):
EXPORT_SEL_ONLY=self.properties.use_selection, EXPORT_SEL_ONLY=self.properties.use_selection,
EXPORT_ALL_SCENES=self.properties.use_all_scenes) EXPORT_ALL_SCENES=self.properties.use_all_scenes)
return ('FINISHED',) return {'FINISHED'}
def invoke(self, context, event): def invoke(self, context, event):
wm = context.manager wm = context.manager
@ -991,7 +991,7 @@ class ExportOBJ(bpy.types.Operator):
bpy.ops.add(ExportOBJ) bpy.types.register(ExportOBJ)
import dynamic_menu import dynamic_menu

@ -297,7 +297,7 @@ class ExportPLY(bpy.types.Operator):
EXPORT_COLORS=self.properties.use_colors, EXPORT_COLORS=self.properties.use_colors,
) )
return ('FINISHED',) return {'FINISHED'}
def invoke(self, context, event): def invoke(self, context, event):
wm = context.manager wm = context.manager
@ -316,7 +316,7 @@ class ExportPLY(bpy.types.Operator):
row.prop(props, "use_colors") row.prop(props, "use_colors")
bpy.ops.add(ExportPLY) bpy.types.register(ExportPLY)
import dynamic_menu import dynamic_menu

@ -1233,14 +1233,14 @@ class ExportX3D(bpy.types.Operator):
def execute(self, context): def execute(self, context):
x3d_export(self.properties.path, context, self.properties.apply_modifiers, self.properties.triangulate, self.properties.compress) x3d_export(self.properties.path, context, self.properties.apply_modifiers, self.properties.triangulate, self.properties.compress)
return ('FINISHED',) return {'FINISHED'}
def invoke(self, context, event): def invoke(self, context, event):
wm = context.manager wm = context.manager
wm.add_fileselect(self) wm.add_fileselect(self)
return ('RUNNING_MODAL',) return ('RUNNING_MODAL',)
bpy.ops.add(ExportX3D) bpy.types.register(ExportX3D)
import dynamic_menu import dynamic_menu

@ -887,7 +887,7 @@ class BvhImporter(bpy.types.Operator):
read_bvh(context, self.properties.path) read_bvh(context, self.properties.path)
return ('FINISHED',) return {'FINISHED'}
def invoke(self, context, event): def invoke(self, context, event):
wm = context.manager wm = context.manager
@ -895,7 +895,7 @@ class BvhImporter(bpy.types.Operator):
return ('RUNNING_MODAL',) return ('RUNNING_MODAL',)
bpy.ops.add(BvhImporter) bpy.types.register(BvhImporter)
import dynamic_menu import dynamic_menu

@ -1159,14 +1159,14 @@ class IMPORT_OT_autodesk_3ds(bpy.types.Operator):
def execute(self, context): def execute(self, context):
load_3ds(self.properties.path, context, 0.0, False, False) load_3ds(self.properties.path, context, 0.0, False, False)
return ('FINISHED',) return {'FINISHED'}
def invoke(self, context, event): def invoke(self, context, event):
wm = context.manager wm = context.manager
wm.add_fileselect(self) wm.add_fileselect(self)
return ('RUNNING_MODAL',) return ('RUNNING_MODAL',)
bpy.ops.add(IMPORT_OT_autodesk_3ds) bpy.types.register(IMPORT_OT_autodesk_3ds)
import dynamic_menu import dynamic_menu
menu_func = lambda self, context: self.layout.operator(IMPORT_OT_autodesk_3ds.bl_idname, text="3D Studio (.3ds)...") menu_func = lambda self, context: self.layout.operator(IMPORT_OT_autodesk_3ds.bl_idname, text="3D Studio (.3ds)...")

@ -1616,7 +1616,7 @@ class IMPORT_OT_obj(bpy.types.Operator):
self.properties.IMAGE_SEARCH, self.properties.IMAGE_SEARCH,
self.properties.POLYGROUPS) self.properties.POLYGROUPS)
return ('FINISHED',) return {'FINISHED'}
def invoke(self, context, event): def invoke(self, context, event):
wm = context.manager wm = context.manager
@ -1624,7 +1624,7 @@ class IMPORT_OT_obj(bpy.types.Operator):
return ('RUNNING_MODAL',) return ('RUNNING_MODAL',)
bpy.ops.add(IMPORT_OT_obj) bpy.types.register(IMPORT_OT_obj)
import dynamic_menu import dynamic_menu

@ -79,7 +79,7 @@ class RENDER_OT_netslave_bake(bpy.types.Operator):
#bpy.ops.wm.save_mainfile(path = path + os.sep + root + "_baked.blend") #bpy.ops.wm.save_mainfile(path = path + os.sep + root + "_baked.blend")
return ('FINISHED',) return {'FINISHED'}
def invoke(self, context, event): def invoke(self, context, event):
return self.execute(context) return self.execute(context)
@ -106,7 +106,7 @@ class RENDER_OT_netclientanim(bpy.types.Operator):
bpy.ops.screen.render('INVOKE_AREA', animation=True) bpy.ops.screen.render('INVOKE_AREA', animation=True)
return ('FINISHED',) return {'FINISHED'}
def invoke(self, context, event): def invoke(self, context, event):
return self.execute(context) return self.execute(context)
@ -136,7 +136,7 @@ class RENDER_OT_netclientsend(bpy.types.Operator):
self.report('ERROR', str(err)) self.report('ERROR', str(err))
return ('FINISHED',) return {'FINISHED'}
def invoke(self, context, event): def invoke(self, context, event):
return self.execute(context) return self.execute(context)
@ -176,7 +176,7 @@ class RENDER_OT_netclientstatus(bpy.types.Operator):
job.name = j.name job.name = j.name
return ('FINISHED',) return {'FINISHED'}
def invoke(self, context, event): def invoke(self, context, event):
return self.execute(context) return self.execute(context)
@ -206,7 +206,7 @@ class RENDER_OT_netclientblacklistslave(bpy.types.Operator):
netsettings.slaves.remove(netsettings.active_slave_index) netsettings.slaves.remove(netsettings.active_slave_index)
netsettings.active_slave_index = -1 netsettings.active_slave_index = -1
return ('FINISHED',) return {'FINISHED'}
def invoke(self, context, event): def invoke(self, context, event):
return self.execute(context) return self.execute(context)
@ -236,7 +236,7 @@ class RENDER_OT_netclientwhitelistslave(bpy.types.Operator):
netsettings.slaves_blacklist.remove(netsettings.active_blacklisted_slave_index) netsettings.slaves_blacklist.remove(netsettings.active_blacklisted_slave_index)
netsettings.active_blacklisted_slave_index = -1 netsettings.active_blacklisted_slave_index = -1
return ('FINISHED',) return {'FINISHED'}
def invoke(self, context, event): def invoke(self, context, event):
return self.execute(context) return self.execute(context)
@ -282,7 +282,7 @@ class RENDER_OT_netclientslaves(bpy.types.Operator):
slave = netsettings.slaves[-1] slave = netsettings.slaves[-1]
slave.name = s.name slave.name = s.name
return ('FINISHED',) return {'FINISHED'}
def invoke(self, context, event): def invoke(self, context, event):
return self.execute(context) return self.execute(context)
@ -311,7 +311,7 @@ class RENDER_OT_netclientcancel(bpy.types.Operator):
netsettings.jobs.remove(netsettings.active_job_index) netsettings.jobs.remove(netsettings.active_job_index)
return ('FINISHED',) return {'FINISHED'}
def invoke(self, context, event): def invoke(self, context, event):
return self.execute(context) return self.execute(context)
@ -338,7 +338,7 @@ class RENDER_OT_netclientcancelall(bpy.types.Operator):
while(len(netsettings.jobs) > 0): while(len(netsettings.jobs) > 0):
netsettings.jobs.remove(0) netsettings.jobs.remove(0)
return ('FINISHED',) return {'FINISHED'}
def invoke(self, context, event): def invoke(self, context, event):
return self.execute(context) return self.execute(context)
@ -383,7 +383,7 @@ class netclientdownload(bpy.types.Operator):
conn.close() conn.close()
return ('FINISHED',) return {'FINISHED'}
def invoke(self, context, event): def invoke(self, context, event):
return self.execute(context) return self.execute(context)
@ -406,7 +406,7 @@ class netclientscan(bpy.types.Operator):
netsettings.server_address = address netsettings.server_address = address
netsettings.server_port = port netsettings.server_port = port
return ('FINISHED',) return {'FINISHED'}
def invoke(self, context, event): def invoke(self, context, event):
return self.execute(context) return self.execute(context)
@ -432,7 +432,7 @@ class netclientweb(bpy.types.Operator):
webbrowser.open("http://%s:%i" % (netsettings.server_address, netsettings.server_port)) webbrowser.open("http://%s:%i" % (netsettings.server_address, netsettings.server_port))
return ('FINISHED',) return {'FINISHED'}
def invoke(self, context, event): def invoke(self, context, event):
return self.execute(context) return self.execute(context)

@ -62,7 +62,7 @@ def rnaType(rna_type):
return rna_type return rna_type
def rnaOperator(rna_op): def rnaOperator(rna_op):
if bpy: bpy.ops.add(rna_op) if bpy: bpy.types.register(rna_op)
return rna_op return rna_op
def reporting(report, message, errorType = None): def reporting(report, message, errorType = None):

@ -21,7 +21,7 @@
# for slightly faster access # for slightly faster access
from _bpy import ops as ops_module from _bpy import ops as ops_module
op_add = ops_module.add # op_add = ops_module.add
op_remove = ops_module.remove op_remove = ops_module.remove
op_add_macro = ops_module.add_macro op_add_macro = ops_module.add_macro
op_dir = ops_module.dir op_dir = ops_module.dir

@ -121,12 +121,18 @@ class InfoFunctionRNA:
# self.name = rna_func.name # functions have no name! # self.name = rna_func.name # functions have no name!
self.description = rna_func.description.strip() self.description = rna_func.description.strip()
self.args = [] # todo self.args = []
self.return_value = None # todo self.return_value = None
def build(self): def build(self):
rna_prop = self.bl_prop rna_prop = self.bl_prop
pass
for rna_id, rna_prop in rna_type.parameters.items():
prop = GetInfoPropertyRNA(rna_prop, parent_id)
if rna_prop.use_return:
self.return_value = prop
else:
self.args.append(prop)
def __repr__(self): def __repr__(self):
txt = '' txt = ''

@ -196,7 +196,7 @@ class WM_OT_properties_edit(bpy.types.Operator):
prop_ui['description'] = self.properties.description prop_ui['description'] = self.properties.description
return ('FINISHED',) return {'FINISHED'}
def invoke(self, context, event): def invoke(self, context, event):
@ -242,7 +242,7 @@ class WM_OT_properties_add(bpy.types.Operator):
property = unique_name(item.keys()) property = unique_name(item.keys())
item[property] = 1.0 item[property] = 1.0
return ('FINISHED',) return {'FINISHED'}
class WM_OT_properties_remove(bpy.types.Operator): class WM_OT_properties_remove(bpy.types.Operator):
@ -256,4 +256,4 @@ class WM_OT_properties_remove(bpy.types.Operator):
def execute(self, context): def execute(self, context):
item = eval("context.%s" % self.properties.path) item = eval("context.%s" % self.properties.path)
del item[self.properties.property] del item[self.properties.property]
return ('FINISHED',) return {'FINISHED'}

@ -607,10 +607,10 @@ class AddHuman(bpy.types.Operator):
bones.remove(bones[0]) bones.remove(bones[0])
metarig_template() metarig_template()
bpy.ops.object.mode_set(mode=mode_orig) bpy.ops.object.mode_set(mode=mode_orig)
return ('FINISHED',) return {'FINISHED'}
# Register the operator # Register the operator
bpy.ops.add(AddHuman) bpy.types.register(AddHuman)
# Add to a menu # Add to a menu
import dynamic_menu import dynamic_menu

@ -122,10 +122,10 @@ class AddTorus(bpy.types.Operator):
ob_new.location = tuple(context.scene.cursor_location) ob_new.location = tuple(context.scene.cursor_location)
return ('FINISHED',) return {'FINISHED'}
# Register the operator # Register the operator
bpy.ops.add(AddTorus) bpy.types.register(AddTorus)
# Add to a menu # Add to a menu
import dynamic_menu import dynamic_menu

@ -79,10 +79,10 @@ def execute(context):
try: try:
line = sc.history[-1].line line = sc.history[-1].line
except: except:
return ('CANCELLED',) return {'CANCELLED'}
if sc.console_type != 'PYTHON': if sc.console_type != 'PYTHON':
return ('CANCELLED',) return {'CANCELLED'}
console, stdout, stderr = get_console(hash(context.region)) console, stdout, stderr = get_console(hash(context.region))
@ -136,7 +136,7 @@ def execute(context):
if output_err: if output_err:
add_scrollback(output_err, 'ERROR') add_scrollback(output_err, 'ERROR')
return ('FINISHED',) return {'FINISHED'}
def autocomplete(context): def autocomplete(context):
@ -150,10 +150,10 @@ def autocomplete(context):
line = current_line.line line = current_line.line
if not console: if not console:
return ('CANCELLED',) return {'CANCELLED'}
if sc.console_type != 'PYTHON': if sc.console_type != 'PYTHON':
return ('CANCELLED',) return {'CANCELLED'}
# This function isnt aware of the text editor or being an operator # This function isnt aware of the text editor or being an operator
# just does the autocomp then copy its results back # just does the autocomp then copy its results back
@ -172,7 +172,7 @@ def autocomplete(context):
context.area.tag_redraw() context.area.tag_redraw()
return ('FINISHED',) return {'FINISHED'}
def banner(context): def banner(context):
@ -195,4 +195,4 @@ def banner(context):
console = get_console(hash(context.region))[0] console = get_console(hash(context.region))[0]
console.locals["C"] = bpy.context console.locals["C"] = bpy.context
return ('FINISHED',) return {'FINISHED'}

@ -49,7 +49,7 @@ def execute(context):
try: try:
line = sc.history[-1].line line = sc.history[-1].line
except: except:
return ('CANCELLED',) return {'CANCELLED'}
bpy.ops.console.scrollback_append(text=sc.prompt + line, type='INPUT') bpy.ops.console.scrollback_append(text=sc.prompt + line, type='INPUT')
@ -60,13 +60,13 @@ def execute(context):
remove_duplicates=True) remove_duplicates=True)
sc.prompt = os.getcwd() + PROMPT sc.prompt = os.getcwd() + PROMPT
return ('FINISHED',) return {'FINISHED'}
def autocomplete(context): def autocomplete(context):
# sc = context.space_data # sc = context.space_data
# TODO # TODO
return ('CANCELLED',) return {'CANCELLED'}
def banner(context): def banner(context):
@ -75,4 +75,4 @@ def banner(context):
shell_run("bash --version") shell_run("bash --version")
sc.prompt = os.getcwd() + PROMPT sc.prompt = os.getcwd() + PROMPT
return ('FINISHED',) return {'FINISHED'}

@ -65,11 +65,11 @@ class MeshSelectInteriorFaces(bpy.types.Operator):
def execute(self, context): def execute(self, context):
main(context) main(context)
return ('FINISHED',) return {'FINISHED'}
# Register the operator # Register the operator
bpy.ops.add(MeshSelectInteriorFaces) bpy.types.register(MeshSelectInteriorFaces)
if __name__ == "__main__": if __name__ == "__main__":
bpy.ops.mesh.faces_select_interior() bpy.ops.mesh.faces_select_interior()

@ -643,11 +643,11 @@ class MESH_OT_skin(bpy.types.Operator):
def execute(self, context): def execute(self, context):
main(context) main(context)
return ('FINISHED',) return {'FINISHED'}
# Register the operator # Register the operator
bpy.ops.add(MESH_OT_skin) bpy.types.register(MESH_OT_skin)
# Add to a menu # Add to a menu
import dynamic_menu import dynamic_menu

@ -57,7 +57,7 @@ class SelectPattern(bpy.types.Operator):
elif not self.properties.extend: elif not self.properties.extend:
item.selected = False item.selected = False
return ('FINISHED',) return {'FINISHED'}
def invoke(self, context, event): def invoke(self, context, event):
wm = context.manager wm = context.manager
@ -97,7 +97,7 @@ class SubdivisionSet(bpy.types.Operator):
relative = self.properties.relative relative = self.properties.relative
if relative and level == 0: if relative and level == 0:
return ('CANCELLED',) # nothing to do return {'CANCELLED'} # nothing to do
def set_object_subd(obj): def set_object_subd(obj):
for mod in obj.modifiers: for mod in obj.modifiers:
@ -132,7 +132,7 @@ class SubdivisionSet(bpy.types.Operator):
for obj in context.selected_editable_objects: for obj in context.selected_editable_objects:
set_object_subd(obj) set_object_subd(obj)
return ('FINISHED',) return {'FINISHED'}
class Retopo(bpy.types.Operator): class Retopo(bpy.types.Operator):
@ -146,9 +146,9 @@ class Retopo(bpy.types.Operator):
def execute(self, context): def execute(self, context):
import retopo import retopo
retopo.main() retopo.main()
return ('FINISHED',) return {'FINISHED'}
bpy.ops.add(SelectPattern) bpy.types.register(SelectPattern)
bpy.ops.add(SubdivisionSet) bpy.types.register(SubdivisionSet)
bpy.ops.add(Retopo) bpy.types.register(Retopo)

@ -40,7 +40,7 @@ class AddPresetBase(bpy.types.Operator):
def execute(self, context): def execute(self, context):
if not self.properties.name: if not self.properties.name:
return ('FINISHED',) return {'FINISHED'}
filename = self._as_filename(self.properties.name) + ".py" filename = self._as_filename(self.properties.name) + ".py"
@ -53,7 +53,7 @@ class AddPresetBase(bpy.types.Operator):
file_preset.close() file_preset.close()
return ('FINISHED',) return {'FINISHED'}
def invoke(self, context, event): def invoke(self, context, event):
wm = context.manager wm = context.manager
@ -125,6 +125,6 @@ class AddPresetCloth(AddPresetBase):
preset_subdir = "cloth" preset_subdir = "cloth"
bpy.ops.add(AddPresetRender) bpy.types.register(AddPresetRender)
bpy.ops.add(AddPresetSSS) bpy.types.register(AddPresetSSS)
bpy.ops.add(AddPresetCloth) bpy.types.register(AddPresetCloth)

@ -146,4 +146,4 @@ class PlayRenderedAnim(bpy.types.Operator):
return('FINISHED',) return('FINISHED',)
bpy.ops.add(PlayRenderedAnim) bpy.types.register(PlayRenderedAnim)

@ -257,9 +257,9 @@ class FollowActiveQuads(bpy.types.Operator):
def execute(self, context): def execute(self, context):
main(context, self) main(context, self)
return ('FINISHED',) return {'FINISHED'}
bpy.ops.add(FollowActiveQuads) bpy.types.register(FollowActiveQuads)
# Add to a menu # Add to a menu
import dynamic_menu import dynamic_menu

@ -1130,9 +1130,9 @@ class SmartProject(bpy.types.Operator):
def execute(self, context): def execute(self, context):
main(context, self.properties.island_margin, self.properties.angle_limit) main(context, self.properties.island_margin, self.properties.angle_limit)
return ('FINISHED',) return {'FINISHED'}
bpy.ops.add(SmartProject) bpy.types.register(SmartProject)
# Add to a menu # Add to a menu
import dynamic_menu import dynamic_menu

@ -175,7 +175,7 @@ class VertexPaintDirt(bpy.types.Operator):
return('FINISHED',) return('FINISHED',)
bpy.ops.add(VertexPaintDirt) bpy.types.register(VertexPaintDirt)
if __name__ == "__main__": if __name__ == "__main__":
bpy.ops.mesh.vertex_paint_dirt() bpy.ops.mesh.vertex_paint_dirt()

@ -34,7 +34,7 @@ class MESH_OT_delete_edgeloop(bpy.types.Operator):
bpy.ops.mesh.select_more() bpy.ops.mesh.select_more()
bpy.ops.mesh.remove_doubles() bpy.ops.mesh.remove_doubles()
return ('FINISHED',) return {'FINISHED'}
rna_path_prop = StringProperty(name="Context Attributes", rna_path_prop = StringProperty(name="Context Attributes",
description="rna context string", maxlen=1024, default="") description="rna context string", maxlen=1024, default="")
@ -60,9 +60,9 @@ def context_path_validate(context, path):
def execute_context_assign(self, context): def execute_context_assign(self, context):
if context_path_validate(context, self.properties.path) is Ellipsis: if context_path_validate(context, self.properties.path) is Ellipsis:
return ('PASS_THROUGH',) return {'PASS_THROUGH'}
exec("context.%s=self.properties.value" % self.properties.path) exec("context.%s=self.properties.value" % self.properties.path)
return ('FINISHED',) return {'FINISHED'}
class WM_OT_context_set_boolean(bpy.types.Operator): class WM_OT_context_set_boolean(bpy.types.Operator):
@ -143,9 +143,9 @@ class WM_OT_context_set_value(bpy.types.Operator):
def execute(self, context): def execute(self, context):
if context_path_validate(context, self.properties.path) is Ellipsis: if context_path_validate(context, self.properties.path) is Ellipsis:
return ('PASS_THROUGH',) return {'PASS_THROUGH'}
exec("context.%s=%s" % (self.properties.path, self.properties.value)) exec("context.%s=%s" % (self.properties.path, self.properties.value))
return ('FINISHED',) return {'FINISHED'}
class WM_OT_context_toggle(bpy.types.Operator): class WM_OT_context_toggle(bpy.types.Operator):
@ -159,12 +159,12 @@ class WM_OT_context_toggle(bpy.types.Operator):
def execute(self, context): def execute(self, context):
if context_path_validate(context, self.properties.path) is Ellipsis: if context_path_validate(context, self.properties.path) is Ellipsis:
return ('PASS_THROUGH',) return {'PASS_THROUGH'}
exec("context.%s=not (context.%s)" % exec("context.%s=not (context.%s)" %
(self.properties.path, self.properties.path)) (self.properties.path, self.properties.path))
return ('FINISHED',) return {'FINISHED'}
class WM_OT_context_toggle_enum(bpy.types.Operator): class WM_OT_context_toggle_enum(bpy.types.Operator):
@ -183,14 +183,14 @@ class WM_OT_context_toggle_enum(bpy.types.Operator):
def execute(self, context): def execute(self, context):
if context_path_validate(context, self.properties.path) is Ellipsis: if context_path_validate(context, self.properties.path) is Ellipsis:
return ('PASS_THROUGH',) return {'PASS_THROUGH'}
exec("context.%s = ['%s', '%s'][context.%s!='%s']" % \ exec("context.%s = ['%s', '%s'][context.%s!='%s']" % \
(self.properties.path, self.properties.value_1,\ (self.properties.path, self.properties.value_1,\
self.properties.value_2, self.properties.path, self.properties.value_2, self.properties.path,
self.properties.value_2)) self.properties.value_2))
return ('FINISHED',) return {'FINISHED'}
class WM_OT_context_cycle_int(bpy.types.Operator): class WM_OT_context_cycle_int(bpy.types.Operator):
@ -207,7 +207,7 @@ class WM_OT_context_cycle_int(bpy.types.Operator):
value = context_path_validate(context, self.properties.path) value = context_path_validate(context, self.properties.path)
if value is Ellipsis: if value is Ellipsis:
return ('PASS_THROUGH',) return {'PASS_THROUGH'}
self.properties.value = value self.properties.value = value
if self.properties.reverse: if self.properties.reverse:
@ -224,7 +224,7 @@ class WM_OT_context_cycle_int(bpy.types.Operator):
self.properties.value = - (1 << 32) self.properties.value = - (1 << 32)
execute_context_assign(self, context) execute_context_assign(self, context)
return ('FINISHED',) return {'FINISHED'}
class WM_OT_context_cycle_enum(bpy.types.Operator): class WM_OT_context_cycle_enum(bpy.types.Operator):
@ -240,7 +240,7 @@ class WM_OT_context_cycle_enum(bpy.types.Operator):
value = context_path_validate(context, self.properties.path) value = context_path_validate(context, self.properties.path)
if value is Ellipsis: if value is Ellipsis:
return ('PASS_THROUGH',) return {'PASS_THROUGH'}
orig_value = value orig_value = value
@ -276,7 +276,7 @@ class WM_OT_context_cycle_enum(bpy.types.Operator):
# set the new value # set the new value
exec("context.%s=advance_enum" % self.properties.path) exec("context.%s=advance_enum" % self.properties.path)
return ('FINISHED',) return {'FINISHED'}
doc_id = StringProperty(name="Doc ID", doc_id = StringProperty(name="Doc ID",
description="", maxlen=1024, default="", hidden=True) description="", maxlen=1024, default="", hidden=True)
@ -318,12 +318,12 @@ class WM_OT_doc_view(bpy.types.Operator):
(self._prefix, class_name_full, class_prop) (self._prefix, class_name_full, class_prop)
else: else:
return ('PASS_THROUGH',) return {'PASS_THROUGH'}
import webbrowser import webbrowser
webbrowser.open(url) webbrowser.open(url)
return ('FINISHED',) return {'FINISHED'}
class WM_OT_doc_edit(bpy.types.Operator): class WM_OT_doc_edit(bpy.types.Operator):
@ -388,7 +388,7 @@ class WM_OT_doc_edit(bpy.types.Operator):
self._send_xmlrpc(upload) self._send_xmlrpc(upload)
return ('FINISHED',) return {'FINISHED'}
def invoke(self, context, event): def invoke(self, context, event):
wm = context.manager wm = context.manager
@ -403,29 +403,29 @@ class WM_OT_reload_scripts(bpy.types.Operator):
def execute(self, context): def execute(self, context):
MOD = type(bpy) MOD = type(bpy)
bpy.load_scripts(True) bpy.load_scripts(True)
return ('FINISHED',) return {'FINISHED'}
bpy.ops.add(MESH_OT_delete_edgeloop) bpy.types.register(MESH_OT_delete_edgeloop)
bpy.ops.add(WM_OT_context_set_boolean) bpy.types.register(WM_OT_context_set_boolean)
bpy.ops.add(WM_OT_context_set_int) bpy.types.register(WM_OT_context_set_int)
bpy.ops.add(WM_OT_context_set_float) bpy.types.register(WM_OT_context_set_float)
bpy.ops.add(WM_OT_context_set_string) bpy.types.register(WM_OT_context_set_string)
bpy.ops.add(WM_OT_context_set_enum) bpy.types.register(WM_OT_context_set_enum)
bpy.ops.add(WM_OT_context_set_value) bpy.types.register(WM_OT_context_set_value)
bpy.ops.add(WM_OT_context_toggle) bpy.types.register(WM_OT_context_toggle)
bpy.ops.add(WM_OT_context_toggle_enum) bpy.types.register(WM_OT_context_toggle_enum)
bpy.ops.add(WM_OT_context_cycle_enum) bpy.types.register(WM_OT_context_cycle_enum)
bpy.ops.add(WM_OT_context_cycle_int) bpy.types.register(WM_OT_context_cycle_int)
bpy.ops.add(WM_OT_doc_view) bpy.types.register(WM_OT_doc_view)
bpy.ops.add(WM_OT_doc_edit) bpy.types.register(WM_OT_doc_edit)
bpy.ops.add(WM_OT_reload_scripts) bpy.types.register(WM_OT_reload_scripts)
# experemental! # experemental!
import rna_prop_ui import rna_prop_ui
bpy.ops.add(rna_prop_ui.WM_OT_properties_edit) bpy.types.register(rna_prop_ui.WM_OT_properties_edit)
bpy.ops.add(rna_prop_ui.WM_OT_properties_add) bpy.types.register(rna_prop_ui.WM_OT_properties_add)
bpy.ops.add(rna_prop_ui.WM_OT_properties_remove) bpy.types.register(rna_prop_ui.WM_OT_properties_remove)

@ -30,7 +30,7 @@ class ExportSomeData(bpy.types.Operator):
write_some_data(self.properties.path, context, self.properties.use_setting) write_some_data(self.properties.path, context, self.properties.use_setting)
return ('FINISHED',) return {'FINISHED'}
def invoke(self, context, event): def invoke(self, context, event):
wm = context.manager wm = context.manager
@ -46,7 +46,7 @@ class ExportSomeData(bpy.types.Operator):
return self.execute(context) return self.execute(context)
bpy.ops.add(ExportSomeData) bpy.types.register(ExportSomeData)
# Only needed if you want to add into a dynamic menu # Only needed if you want to add into a dynamic menu
import dynamic_menu import dynamic_menu

@ -13,9 +13,9 @@ class SimpleOperator(bpy.types.Operator):
def execute(self, context): def execute(self, context):
main(context) main(context)
return ('FINISHED',) return {'FINISHED'}
bpy.ops.add(SimpleOperator) bpy.types.register(SimpleOperator)
if __name__ == "__main__": if __name__ == "__main__":
bpy.ops.object.simple_operator() bpy.ops.object.simple_operator()

@ -138,7 +138,7 @@ class Reload(bpy.types.Operator):
def execute(self, context): def execute(self, context):
DATA_PT_template.templates[:] = metarig_templates() DATA_PT_template.templates[:] = metarig_templates()
return ('FINISHED',) return {'FINISHED'}
def rigify_report_exception(operator, exception): def rigify_report_exception(operator, exception):
@ -180,7 +180,7 @@ class Generate(bpy.types.Operator):
except rigify.RigifyError as rig_exception: except rigify.RigifyError as rig_exception:
rigify_report_exception(self, rig_exception) rigify_report_exception(self, rig_exception)
return ('FINISHED',) return {'FINISHED'}
class Validate(bpy.types.Operator): class Validate(bpy.types.Operator):
@ -196,7 +196,7 @@ class Validate(bpy.types.Operator):
rigify.validate_rig(context, context.object) rigify.validate_rig(context, context.object)
except rigify.RigifyError as rig_exception: except rigify.RigifyError as rig_exception:
rigify_report_exception(self, rig_exception) rigify_report_exception(self, rig_exception)
return ('FINISHED',) return {'FINISHED'}
class Sample(bpy.types.Operator): class Sample(bpy.types.Operator):
@ -219,7 +219,7 @@ class Sample(bpy.types.Operator):
if obj_gen: if obj_gen:
obj_gen.location.x = i * 1.0 obj_gen.location.x = i * 1.0
return ('FINISHED',) return {'FINISHED'}
class Graph(bpy.types.Operator): class Graph(bpy.types.Operator):
@ -244,7 +244,7 @@ class Graph(bpy.types.Operator):
os.system("dot -Tpng %s > %s; gnome-open %s &" % (path_dot, path_png, path_png)) os.system("dot -Tpng %s > %s; gnome-open %s &" % (path_dot, path_png, path_png))
#os.system("python /b/xdot.py '%s' &" % path_dot) #os.system("python /b/xdot.py '%s' &" % path_dot)
return ('FINISHED',) return {'FINISHED'}
class AsScript(bpy.types.Operator): class AsScript(bpy.types.Operator):
@ -267,7 +267,7 @@ class AsScript(bpy.types.Operator):
file.write(code) file.write(code)
file.close() file.close()
return ('FINISHED',) return {'FINISHED'}
def invoke(self, context, event): def invoke(self, context, event):
import os import os
@ -294,7 +294,7 @@ class ActiveAssign(bpy.types.Operator):
pose_templates = scene.pose_templates pose_templates = scene.pose_templates
template_name = DATA_PT_template.templates[pose_templates.active_template_index] template_name = DATA_PT_template.templates[pose_templates.active_template_index]
context.active_pose_bone["type"] = template_name context.active_pose_bone["type"] = template_name
return ('FINISHED',) return {'FINISHED'}
class ActiveClear(bpy.types.Operator): class ActiveClear(bpy.types.Operator):
@ -310,7 +310,7 @@ class ActiveClear(bpy.types.Operator):
def execute(self, context): def execute(self, context):
scene = context.scene scene = context.scene
del context.active_pose_bone["type"] del context.active_pose_bone["type"]
return ('FINISHED',) return {'FINISHED'}
import space_info import space_info
@ -336,15 +336,15 @@ bpy.types.register(DATA_PT_template)
bpy.types.register(PoseTemplateSettings) bpy.types.register(PoseTemplateSettings)
bpy.types.register(PoseTemplate) bpy.types.register(PoseTemplate)
bpy.ops.add(Reload) bpy.types.register(Reload)
bpy.ops.add(Generate) bpy.types.register(Generate)
bpy.ops.add(Validate) bpy.types.register(Validate)
bpy.ops.add(Sample) bpy.types.register(Sample)
bpy.ops.add(Graph) bpy.types.register(Graph)
bpy.ops.add(AsScript) bpy.types.register(AsScript)
bpy.ops.add(ActiveAssign) bpy.types.register(ActiveAssign)
bpy.ops.add(ActiveClear) bpy.types.register(ActiveClear)
bpy.types.register(INFO_MT_armature_metarig_add) bpy.types.register(INFO_MT_armature_metarig_add)

@ -131,7 +131,7 @@ class ConsoleExec(bpy.types.Operator):
return execute(context) return execute(context)
else: else:
print("Error: bpy.ops.console.execute_" + sc.language + " - not found") print("Error: bpy.ops.console.execute_" + sc.language + " - not found")
return ('FINISHED',) return {'FINISHED'}
class ConsoleAutocomplete(bpy.types.Operator): class ConsoleAutocomplete(bpy.types.Operator):
@ -153,11 +153,13 @@ class ConsoleAutocomplete(bpy.types.Operator):
return autocomplete(context) return autocomplete(context)
else: else:
print("Error: bpy.ops.console.autocomplete_" + sc.language + " - not found") print("Error: bpy.ops.console.autocomplete_" + sc.language + " - not found")
return ('FINISHED',) return {'FINISHED'}
class ConsoleBanner(bpy.types.Operator): class ConsoleBanner(bpy.types.Operator):
'''Print a message whem the terminal initializes'''
bl_idname = "console.banner" bl_idname = "console.banner"
bl_label = "Console Banner"
def execute(self, context): def execute(self, context):
sc = context.space_data sc = context.space_data
@ -173,12 +175,13 @@ class ConsoleBanner(bpy.types.Operator):
return banner(context) return banner(context)
else: else:
print("Error: bpy.ops.console.banner_" + sc.language + " - not found") print("Error: bpy.ops.console.banner_" + sc.language + " - not found")
return ('FINISHED',) return {'FINISHED'}
class ConsoleLanguage(bpy.types.Operator): class ConsoleLanguage(bpy.types.Operator):
'''Set the current language for this console''' '''Set the current language for this console'''
bl_idname = "console.language" bl_idname = "console.language"
bl_label = "Console Language"
language = StringProperty(name="Language", maxlen=32, default="") language = StringProperty(name="Language", maxlen=32, default="")
def execute(self, context): def execute(self, context):
@ -193,7 +196,7 @@ class ConsoleLanguage(bpy.types.Operator):
bpy.ops.console.history_append(text="", current_character=0, bpy.ops.console.history_append(text="", current_character=0,
remove_duplicates=True) remove_duplicates=True)
return ('FINISHED',) return {'FINISHED'}
bpy.types.register(CONSOLE_HT_header) bpy.types.register(CONSOLE_HT_header)
@ -202,9 +205,9 @@ bpy.types.register(CONSOLE_MT_report)
bpy.types.register(CONSOLE_MT_language) bpy.types.register(CONSOLE_MT_language)
# Stubs that call the language operators # Stubs that call the language operators
bpy.ops.add(ConsoleExec) bpy.types.register(ConsoleExec)
bpy.ops.add(ConsoleAutocomplete) bpy.types.register(ConsoleAutocomplete)
bpy.ops.add(ConsoleBanner) bpy.types.register(ConsoleBanner)
# Set the language and call the banner # Set the language and call the banner
bpy.ops.add(ConsoleLanguage) bpy.types.register(ConsoleLanguage)

@ -308,7 +308,7 @@ class HelpOperator(bpy.types.Operator):
def execute(self, context): def execute(self, context):
import webbrowser import webbrowser
webbrowser.open(self._url) webbrowser.open(self._url)
return ('FINISHED',) return {'FINISHED'}
class HELP_OT_manual(HelpOperator): class HELP_OT_manual(HelpOperator):
@ -391,14 +391,14 @@ class HELP_OT_operator_cheat_sheet(bpy.types.Operator):
textblock.write('\n'.join(op_strings)) textblock.write('\n'.join(op_strings))
textblock.name = "OperatorList.txt" textblock.name = "OperatorList.txt"
print("See OperatorList.txt textblock") print("See OperatorList.txt textblock")
return ('FINISHED',) return {'FINISHED'}
bpy.ops.add(HELP_OT_manual) bpy.types.register(HELP_OT_manual)
bpy.ops.add(HELP_OT_release_logs) bpy.types.register(HELP_OT_release_logs)
bpy.ops.add(HELP_OT_blender_website) bpy.types.register(HELP_OT_blender_website)
bpy.ops.add(HELP_OT_blender_eshop) bpy.types.register(HELP_OT_blender_eshop)
bpy.ops.add(HELP_OT_developer_community) bpy.types.register(HELP_OT_developer_community)
bpy.ops.add(HELP_OT_user_community) bpy.types.register(HELP_OT_user_community)
bpy.ops.add(HELP_OT_report_bug) bpy.types.register(HELP_OT_report_bug)
bpy.ops.add(HELP_OT_python_api) bpy.types.register(HELP_OT_python_api)
bpy.ops.add(HELP_OT_operator_cheat_sheet) bpy.types.register(HELP_OT_operator_cheat_sheet)

@ -1646,7 +1646,7 @@ class WM_OT_keyconfig_test(bpy.types.Operator):
if self.testConfig(kc): if self.testConfig(kc):
print("CONFLICT") print("CONFLICT")
return ('FINISHED',) return {'FINISHED'}
def _string_value(value): def _string_value(value):
result = "" result = ""
@ -1736,7 +1736,7 @@ class WM_OT_keyconfig_export(bpy.types.Operator):
f.close() f.close()
return ('FINISHED',) return {'FINISHED'}
def invoke(self, context, event): def invoke(self, context, event):
wm = context.manager wm = context.manager
@ -1753,7 +1753,7 @@ class WM_OT_keymap_edit(bpy.types.Operator):
wm = context.manager wm = context.manager
km = context.keymap km = context.keymap
km.copy_to_user() km.copy_to_user()
return ('FINISHED',) return {'FINISHED'}
class WM_OT_keymap_restore(bpy.types.Operator): class WM_OT_keymap_restore(bpy.types.Operator):
@ -1773,7 +1773,7 @@ class WM_OT_keymap_restore(bpy.types.Operator):
km = context.keymap km = context.keymap
km.restore_to_default() km.restore_to_default()
return ('FINISHED',) return {'FINISHED'}
class WM_OT_keyitem_restore(bpy.types.Operator): class WM_OT_keyitem_restore(bpy.types.Operator):
"Restore key map item." "Restore key map item."
@ -1792,7 +1792,7 @@ class WM_OT_keyitem_restore(bpy.types.Operator):
km.restore_item_to_default(kmi) km.restore_item_to_default(kmi)
return ('FINISHED',) return {'FINISHED'}
class WM_OT_keyitem_add(bpy.types.Operator): class WM_OT_keyitem_add(bpy.types.Operator):
"Add key map item." "Add key map item."
@ -1806,7 +1806,7 @@ class WM_OT_keyitem_add(bpy.types.Operator):
km.add_modal_item("", 'A', 'PRESS') # kmi km.add_modal_item("", 'A', 'PRESS') # kmi
else: else:
km.add_item("", 'A', 'PRESS') # kmi km.add_item("", 'A', 'PRESS') # kmi
return ('FINISHED',) return {'FINISHED'}
class WM_OT_keyitem_remove(bpy.types.Operator): class WM_OT_keyitem_remove(bpy.types.Operator):
@ -1819,12 +1819,12 @@ class WM_OT_keyitem_remove(bpy.types.Operator):
kmi = context.keyitem kmi = context.keyitem
km = context.keymap km = context.keymap
km.remove_item(kmi) km.remove_item(kmi)
return ('FINISHED',) return {'FINISHED'}
bpy.ops.add(WM_OT_keyconfig_export) bpy.types.register(WM_OT_keyconfig_export)
bpy.ops.add(WM_OT_keyconfig_test) bpy.types.register(WM_OT_keyconfig_test)
bpy.ops.add(WM_OT_keymap_edit) bpy.types.register(WM_OT_keymap_edit)
bpy.ops.add(WM_OT_keymap_restore) bpy.types.register(WM_OT_keymap_restore)
bpy.ops.add(WM_OT_keyitem_add) bpy.types.register(WM_OT_keyitem_add)
bpy.ops.add(WM_OT_keyitem_remove) bpy.types.register(WM_OT_keyitem_remove)
bpy.ops.add(WM_OT_keyitem_restore) bpy.types.register(WM_OT_keyitem_restore)

@ -562,7 +562,7 @@ short bezt_to_cfraelem(BeztEditData *bed, BezTriple *bezt)
/* used to remap times from one range to another /* used to remap times from one range to another
* requires: bed->data = BeztEditCD_Remap * requires: bed->data = BeztEditCD_Remap
*/ */
short bezt_remap_times(BeztEditData *bed, BezTriple *bezt) void bezt_remap_times(BeztEditData *bed, BezTriple *bezt)
{ {
BeztEditCD_Remap *rmap= (BeztEditCD_Remap*)bed->data; BeztEditCD_Remap *rmap= (BeztEditCD_Remap*)bed->data;
const float scale = (rmap->newMax - rmap->newMin) / (rmap->oldMax - rmap->oldMin); const float scale = (rmap->newMax - rmap->newMin) / (rmap->oldMax - rmap->oldMin);

@ -154,7 +154,7 @@ short bezt_to_cfraelem(BeztEditData *bed, struct BezTriple *bezt);
/* used to remap times from one range to another /* used to remap times from one range to another
* requires: bed->custom = BeztEditCD_Remap * requires: bed->custom = BeztEditCD_Remap
*/ */
short bezt_remap_times(BeztEditData *bed, struct BezTriple *bezt); void bezt_remap_times(BeztEditData *bed, struct BezTriple *bezt);
/* ************************************************ */ /* ************************************************ */
/* Destructive Editing API (keyframes_general.c) */ /* Destructive Editing API (keyframes_general.c) */

@ -2102,7 +2102,7 @@ static int sequencer_meta_make_exec(bContext *C, wmOperator *op)
Sequence *seq, *seqm, *next; Sequence *seq, *seqm, *next;
int tot, channel_max= 1; int channel_max= 1;
if(ed==NULL) if(ed==NULL)
return OPERATOR_CANCELLED; return OPERATOR_CANCELLED;
@ -2241,10 +2241,10 @@ void SEQUENCER_OT_meta_separate(wmOperatorType *ot)
/* view_all operator */ /* view_all operator */
static int sequencer_view_all_exec(bContext *C, wmOperator *op) static int sequencer_view_all_exec(bContext *C, wmOperator *op)
{ {
Scene *scene= CTX_data_scene(C); //Scene *scene= CTX_data_scene(C);
bScreen *sc= CTX_wm_screen(C); bScreen *sc= CTX_wm_screen(C);
ScrArea *area= CTX_wm_area(C); ScrArea *area= CTX_wm_area(C);
ARegion *ar= CTX_wm_region(C); //ARegion *ar= CTX_wm_region(C);
View2D *v2d= UI_view2d_fromcontext(C); View2D *v2d= UI_view2d_fromcontext(C);
v2d->cur= v2d->tot; v2d->cur= v2d->tot;
@ -2275,11 +2275,11 @@ void SEQUENCER_OT_view_all(wmOperatorType *ot)
static int sequencer_view_all_preview_exec(bContext *C, wmOperator *op) static int sequencer_view_all_preview_exec(bContext *C, wmOperator *op)
{ {
Scene *scene= CTX_data_scene(C); Scene *scene= CTX_data_scene(C);
bScreen *sc= CTX_wm_screen(C); //bScreen *sc= CTX_wm_screen(C);
ScrArea *area= CTX_wm_area(C); ScrArea *area= CTX_wm_area(C);
ARegion *ar= CTX_wm_region(C); ARegion *ar= CTX_wm_region(C);
SpaceSeq *sseq= area->spacedata.first; SpaceSeq *sseq= area->spacedata.first;
View2D *v2d= UI_view2d_fromcontext(C); //View2D *v2d= UI_view2d_fromcontext(C);
/* Like zooming on an image view */ /* Like zooming on an image view */
@ -2735,7 +2735,7 @@ static int sequencer_copy_exec(bContext *C, wmOperator *op)
{ {
Scene *scene= CTX_data_scene(C); Scene *scene= CTX_data_scene(C);
Editing *ed= seq_give_editing(scene, FALSE); Editing *ed= seq_give_editing(scene, FALSE);
Sequence *seq, *seq_act; Sequence *seq;
if(ed==NULL) if(ed==NULL)
return OPERATOR_CANCELLED; return OPERATOR_CANCELLED;

@ -605,39 +605,6 @@ static void rna_Operator_unregister(const bContext *C, StructRNA *type)
WM_main_add_notifier(NC_SCREEN|NA_EDITED, NULL); WM_main_add_notifier(NC_SCREEN|NA_EDITED, NULL);
} }
void operator_wrapper(wmOperatorType *ot, void *userdata)
{
/* take care not to overwrite anything set in
* WM_operatortype_append_ptr before opfunc() is called */
StructRNA *srna = ot->srna;
*ot= *((wmOperatorType *)userdata);
ot->srna= srna; /* restore */
RNA_struct_blender_type_set(ot->ext.srna, ot);
}
#if 0
static int PYTHON_OT_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
return PYTHON_OT_generic(PYOP_INVOKE, C, op->type, op, event, NULL);
}
static int PYTHON_OT_execute(bContext *C, wmOperator *op)
{
return PYTHON_OT_generic(PYOP_EXEC, C, op->type, op, NULL, NULL);
}
static int PYTHON_OT_poll(bContext *C, wmOperatorType *ot)
{
return PYTHON_OT_generic(PYOP_POLL, C, ot, NULL, NULL, NULL);
}
static void PYTHON_OT_draw(bContext *C, wmOperator *op, uiLayout *layout)
{
PYTHON_OT_generic(PYOP_DRAW, C, op->type, op, NULL, layout);
}
#endif
static int operator_poll(bContext *C, wmOperatorType *ot) static int operator_poll(bContext *C, wmOperatorType *ot)
{ {
PointerRNA ptr; PointerRNA ptr;
@ -708,7 +675,11 @@ static int operator_invoke(bContext *C, wmOperator *op, wmEvent *event)
return result; return result;
} }
void operator_wrapper(wmOperatorType *ot, void *userdata);
static char _operator_idname[OP_MAX_TYPENAME]; static char _operator_idname[OP_MAX_TYPENAME];
static char _operator_name[OP_MAX_TYPENAME];
static char _operator_descr[1024]; static char _operator_descr[1024];
static StructRNA *rna_Operator_register(const bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free) static StructRNA *rna_Operator_register(const bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
{ {
@ -720,6 +691,7 @@ static StructRNA *rna_Operator_register(const bContext *C, ReportList *reports,
/* setup dummy operator & operator type to store static properties in */ /* setup dummy operator & operator type to store static properties in */
dummyop.type= &dummyot; dummyop.type= &dummyot;
dummyot.idname= _operator_idname; /* only assigne the pointer, string is NULL'd */ dummyot.idname= _operator_idname; /* only assigne the pointer, string is NULL'd */
dummyot.name= _operator_name; /* only assigne the pointer, string is NULL'd */
dummyot.description= _operator_descr; /* only assigne the pointer, string is NULL'd */ dummyot.description= _operator_descr; /* only assigne the pointer, string is NULL'd */
RNA_pointer_create(NULL, &RNA_Operator, &dummyop, &dummyotr); RNA_pointer_create(NULL, &RNA_Operator, &dummyop, &dummyotr);
@ -729,12 +701,19 @@ static StructRNA *rna_Operator_register(const bContext *C, ReportList *reports,
{ /* convert foo.bar to FOO_OT_bar { /* convert foo.bar to FOO_OT_bar
* allocate the description and the idname in 1 go */ * allocate the description and the idname in 1 go */
int idlen = strlen(_operator_idname); int idlen = strlen(_operator_idname) + 4;
int desclen = strlen(_operator_descr); int namelen = strlen(_operator_name) + 1;
dummyot.idname= MEM_callocN(sizeof(char) * (idlen + desclen + 2 + 3), "_operator_idname"); /* 2 terminators and 3 to convert a.b -> A_OT_b */ int desclen = strlen(_operator_descr) + 1;
WM_operator_bl_idname(dummyot.idname, _operator_idname); /* convert the idname from python */ char *ch, *ch_arr;
dummyot.description = dummyot.idname + (idlen + 4); ch_arr= ch= MEM_callocN(sizeof(char) * (idlen + namelen + desclen), "_operator_idname"); /* 2 terminators and 3 to convert a.b -> A_OT_b */
strcpy(dummyot.description, _operator_descr); WM_operator_bl_idname(ch, _operator_idname); /* convert the idname from python */
dummyot.idname= ch;
ch += idlen;
strcpy(ch, _operator_name);
dummyot.name = ch;
ch += namelen;
strcpy(ch, _operator_descr);
dummyot.description = ch;
} }
if(strlen(identifier) >= sizeof(dummyop.idname)) { if(strlen(identifier) >= sizeof(dummyop.idname)) {
@ -806,7 +785,7 @@ static void rna_def_operator(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_REGISTER); RNA_def_property_flag(prop, PROP_REGISTER);
prop= RNA_def_property(srna, "bl_label", PROP_STRING, PROP_NONE); prop= RNA_def_property(srna, "bl_label", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "type->description"); RNA_def_property_string_sdna(prop, NULL, "type->name");
RNA_def_property_string_maxlength(prop, 1024); /* else it uses the pointer size! */ RNA_def_property_string_maxlength(prop, 1024); /* else it uses the pointer size! */
RNA_def_property_flag(prop, PROP_REGISTER); RNA_def_property_flag(prop, PROP_REGISTER);

@ -244,7 +244,7 @@ PyObject *BPY_operator_module( void )
static PyMethodDef pyop_as_string_meth ={"as_string", (PyCFunction) pyop_as_string, METH_VARARGS, NULL}; static PyMethodDef pyop_as_string_meth ={"as_string", (PyCFunction) pyop_as_string, METH_VARARGS, NULL};
static PyMethodDef pyop_dir_meth = {"dir", (PyCFunction) pyop_dir, METH_NOARGS, NULL}; static PyMethodDef pyop_dir_meth = {"dir", (PyCFunction) pyop_dir, METH_NOARGS, NULL};
static PyMethodDef pyop_getrna_meth = {"get_rna", (PyCFunction) pyop_getrna, METH_O, NULL}; static PyMethodDef pyop_getrna_meth = {"get_rna", (PyCFunction) pyop_getrna, METH_O, NULL};
static PyMethodDef pyop_add_meth = {"add", (PyCFunction) PYOP_wrap_add, METH_O, NULL}; // static PyMethodDef pyop_add_meth = {"add", (PyCFunction) PYOP_wrap_add, METH_O, NULL};
static PyMethodDef pyop_add_macro_meth ={"add_macro", (PyCFunction) PYOP_wrap_add_macro, METH_O, NULL}; static PyMethodDef pyop_add_macro_meth ={"add_macro", (PyCFunction) PYOP_wrap_add_macro, METH_O, NULL};
static PyMethodDef pyop_macro_def_meth ={"macro_define", (PyCFunction) PYOP_wrap_macro_define, METH_VARARGS, NULL}; static PyMethodDef pyop_macro_def_meth ={"macro_define", (PyCFunction) PYOP_wrap_macro_define, METH_VARARGS, NULL};
static PyMethodDef pyop_remove_meth = {"remove", (PyCFunction) PYOP_wrap_remove, METH_O, NULL}; static PyMethodDef pyop_remove_meth = {"remove", (PyCFunction) PYOP_wrap_remove, METH_O, NULL};
@ -256,7 +256,7 @@ PyObject *BPY_operator_module( void )
PyModule_AddObject( submodule, "as_string",PyCFunction_New(&pyop_as_string_meth,NULL) ); PyModule_AddObject( submodule, "as_string",PyCFunction_New(&pyop_as_string_meth,NULL) );
PyModule_AddObject( submodule, "dir", PyCFunction_New(&pyop_dir_meth, NULL) ); PyModule_AddObject( submodule, "dir", PyCFunction_New(&pyop_dir_meth, NULL) );
PyModule_AddObject( submodule, "get_rna", PyCFunction_New(&pyop_getrna_meth, NULL) ); PyModule_AddObject( submodule, "get_rna", PyCFunction_New(&pyop_getrna_meth, NULL) );
PyModule_AddObject( submodule, "add", PyCFunction_New(&pyop_add_meth, NULL) ); // PyModule_AddObject( submodule, "add", PyCFunction_New(&pyop_add_meth, NULL) );
PyModule_AddObject( submodule, "add_macro", PyCFunction_New(&pyop_add_macro_meth, NULL) ); PyModule_AddObject( submodule, "add_macro", PyCFunction_New(&pyop_add_macro_meth, NULL) );
PyModule_AddObject( submodule, "macro_define",PyCFunction_New(&pyop_macro_def_meth, NULL) ); PyModule_AddObject( submodule, "macro_define",PyCFunction_New(&pyop_macro_def_meth, NULL) );
PyModule_AddObject( submodule, "remove", PyCFunction_New(&pyop_remove_meth, NULL) ); PyModule_AddObject( submodule, "remove", PyCFunction_New(&pyop_remove_meth, NULL) );

@ -105,7 +105,7 @@ static int PYTHON_OT_generic(int mode, bContext *C, wmOperatorType *ot, wmOperat
py_class_instance = PyObject_Call(py_class, args, NULL); py_class_instance = PyObject_Call(py_class, args, NULL);
Py_DECREF(args); Py_DECREF(args);
if (py_class_instance==NULL) { /* Initializing the class worked, now run its invoke function */ if (py_class_instance==NULL) { /* Initializing the class worked, now run its invoke function */
PyErr_Print(); PyErr_Print();
PyErr_Clear(); PyErr_Clear();
@ -128,7 +128,7 @@ static int PYTHON_OT_generic(int mode, bContext *C, wmOperatorType *ot, wmOperat
else if (mode==PYOP_EXEC) { else if (mode==PYOP_EXEC) {
item= PyObject_GetAttrString(py_class, "execute"); item= PyObject_GetAttrString(py_class, "execute");
args = PyTuple_New(2); args = PyTuple_New(2);
PyTuple_SET_ITEM(args, 1, pyrna_struct_CreatePyObject(&ptr_context)); PyTuple_SET_ITEM(args, 1, pyrna_struct_CreatePyObject(&ptr_context));
} }
else if (mode==PYOP_POLL) { else if (mode==PYOP_POLL) {
@ -173,7 +173,7 @@ static int PYTHON_OT_generic(int mode, bContext *C, wmOperatorType *ot, wmOperat
Py_DECREF(args); Py_DECREF(args);
Py_DECREF(item); Py_DECREF(item);
} }
if (ret == NULL) { /* covers py_class_instance failing too */ if (ret == NULL) { /* covers py_class_instance failing too */
if(op) if(op)
BPy_errors_to_report(op->reports); BPy_errors_to_report(op->reports);
@ -202,7 +202,7 @@ static int PYTHON_OT_generic(int mode, bContext *C, wmOperatorType *ot, wmOperat
* If we ever want to do this and use the props again, * If we ever want to do this and use the props again,
* it can be done with - pyrna_pydict_to_props(op->ptr, kw, "") * it can be done with - pyrna_pydict_to_props(op->ptr, kw, "")
*/ */
Py_DECREF(ret); Py_DECREF(ret);
} }
@ -215,7 +215,7 @@ static int PYTHON_OT_generic(int mode, bContext *C, wmOperatorType *ot, wmOperat
BPY_flag_def *flag_def = pyop_ret_flags; BPY_flag_def *flag_def = pyop_ret_flags;
strcpy(flag_str, ""); strcpy(flag_str, "");
while(flag_def->name) { while(flag_def->name) {
if (ret_flag & flag_def->flag) { if (ret_flag & flag_def->flag) {
if(flag_str[1]) if(flag_str[1])
@ -260,6 +260,49 @@ static void PYTHON_OT_draw(bContext *C, wmOperator *op, uiLayout *layout)
PYTHON_OT_generic(PYOP_DRAW, C, op->type, op, NULL, layout); PYTHON_OT_generic(PYOP_DRAW, C, op->type, op, NULL, layout);
} }
void operator_wrapper(wmOperatorType *ot, void *userdata)
{
/* take care not to overwrite anything set in
* WM_operatortype_append_ptr before opfunc() is called */
StructRNA *srna = ot->srna;
*ot= *((wmOperatorType *)userdata);
ot->srna= srna; /* restore */
RNA_struct_blender_type_set(ot->ext.srna, ot);
/* Can't use this because it returns a dict proxy
*
* item= PyObject_GetAttrString(py_class, "__dict__");
*/
{
PyObject *py_class = ot->ext.data;
PyObject *item= ((PyTypeObject*)py_class)->tp_dict;
if(item) {
/* only call this so pyrna_deferred_register_props gives a useful error
* WM_operatortype_append_ptr will call RNA_def_struct_identifier
* later */
RNA_def_struct_identifier(ot->srna, ot->idname);
if(pyrna_deferred_register_props(ot->srna, item)!=0) {
/* failed to register operator props */
PyErr_Print();
PyErr_Clear();
}
}
else {
PyErr_Clear();
}
}
}
void PYTHON_OT_wrapper(wmOperatorType *ot, void *userdata) void PYTHON_OT_wrapper(wmOperatorType *ot, void *userdata)
{ {
PyObject *py_class = (PyObject *)userdata; PyObject *py_class = (PyObject *)userdata;
@ -283,8 +326,8 @@ void PYTHON_OT_wrapper(wmOperatorType *ot, void *userdata)
item= PyObject_GetAttrString(py_class, PYOP_ATTR_DESCRIPTION); item= PyObject_GetAttrString(py_class, PYOP_ATTR_DESCRIPTION);
ot->description= (item && PyUnicode_Check(item)) ? _PyUnicode_AsString(item):"undocumented python operator"; ot->description= (item && PyUnicode_Check(item)) ? _PyUnicode_AsString(item):"undocumented python operator";
Py_XDECREF(item); Py_XDECREF(item);
/* api callbacks, detailed checks dont on adding */ /* api callbacks, detailed checks dont on adding */
if (PyObject_HasAttrString(py_class, "invoke")) if (PyObject_HasAttrString(py_class, "invoke"))
ot->invoke= PYTHON_OT_invoke; ot->invoke= PYTHON_OT_invoke;
//else //else
@ -296,9 +339,9 @@ void PYTHON_OT_wrapper(wmOperatorType *ot, void *userdata)
ot->pyop_poll= PYTHON_OT_poll; ot->pyop_poll= PYTHON_OT_poll;
if (PyObject_HasAttrString(py_class, "draw")) if (PyObject_HasAttrString(py_class, "draw"))
ot->ui= PYTHON_OT_draw; ot->ui= PYTHON_OT_draw;
ot->pyop_data= userdata; ot->pyop_data= userdata;
/* flags */ /* flags */
ot->flag= 0; ot->flag= 0;
@ -419,11 +462,11 @@ void PYTHON_OT_MACRO_wrapper(wmOperatorType *ot, void *userdata)
/* pyOperators - Operators defined IN Python */ /* pyOperators - Operators defined IN Python */
PyObject *PYOP_wrap_add(PyObject *self, PyObject *py_class) PyObject *PYOP_wrap_add(PyObject *self, PyObject *py_class)
{ {
PyObject *base_class, *item; PyObject *base_class, *item;
wmOperatorType *ot; wmOperatorType *ot;
char *idname= NULL; char *idname= NULL;
char idname_bl[OP_MAX_TYPENAME]; /* converted to blender syntax */ char idname_bl[OP_MAX_TYPENAME]; /* converted to blender syntax */
@ -466,7 +509,7 @@ PyObject *PYOP_wrap_add(PyObject *self, PyObject *py_class)
Py_DECREF(item); Py_DECREF(item);
/* end annoying conversion! */ /* end annoying conversion! */
/* remove if it already exists */ /* remove if it already exists */
if ((ot=WM_operatortype_exists(idname))) { if ((ot=WM_operatortype_exists(idname))) {
if(ot->pyop_data) { if(ot->pyop_data) {
@ -474,7 +517,7 @@ PyObject *PYOP_wrap_add(PyObject *self, PyObject *py_class)
} }
WM_operatortype_remove(idname); WM_operatortype_remove(idname);
} }
Py_INCREF(py_class); Py_INCREF(py_class);
WM_operatortype_append_ptr(PYTHON_OT_wrapper, py_class); WM_operatortype_append_ptr(PYTHON_OT_wrapper, py_class);

@ -3912,7 +3912,18 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
} }
} }
#if 0
if(strcmp(identifier, "bl_label") == 0) {
item= PyObject_GetAttrString(py_class, "__doc__");
if(item) {
Py_DECREF(item); /* no need to keep a ref, the class owns it */
if(pyrna_py_to_prop(dummyptr, prop, NULL, item, "validating class error:") != 0)
return -1;
}
}
#endif
if (item == NULL && (((flag & PROP_REGISTER_OPTIONAL) != PROP_REGISTER_OPTIONAL))) { if (item == NULL && (((flag & PROP_REGISTER_OPTIONAL) != PROP_REGISTER_OPTIONAL))) {
PyErr_Format( PyExc_AttributeError, "expected %.200s, %.200s class to have an \"%.200s\" attribute", class_type, py_class_name, identifier); PyErr_Format( PyExc_AttributeError, "expected %.200s, %.200s class to have an \"%.200s\" attribute", class_type, py_class_name, identifier);
return -1; return -1;
@ -4092,6 +4103,7 @@ void pyrna_free_types(void)
} }
} }
RNA_PROP_END; RNA_PROP_END;
} }
/* Note! MemLeak XXX /* Note! MemLeak XXX

@ -2655,9 +2655,13 @@ void wm_operatortype_free(void)
{ {
wmOperatorType *ot; wmOperatorType *ot;
for(ot= global_ops.first; ot; ot= ot->next) for(ot= global_ops.first; ot; ot= ot->next) {
if(ot->macro.first) if(ot->macro.first)
wm_operatortype_free_macro(ot); wm_operatortype_free_macro(ot);
if(ot->ext.srna) /* python operator, allocs own string */
MEM_freeN(ot->idname);
}
BLI_freelistN(&global_ops); BLI_freelistN(&global_ops);
} }