Skip to content

Commit 422a434

Browse files
committed
Another partial revision and cleanup for 1.5 fixed custom menu error reporting
1 parent f9f5c70 commit 422a434

File tree

2 files changed

+128
-54
lines changed

2 files changed

+128
-54
lines changed

Utils/CustomMenu.xml

Lines changed: 57 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,10 @@
11
<root>
22
<menu area="VIEW_3D" mode="OBJECT">
3-
<item type="OP">
4-
<path>object.duplicate_move</path>
5-
<name>none</name>
6-
<icon>NONE</icon>
7-
<menu>False</menu>
8-
<arg>none</arg>
9-
<arg_val>none</arg_val>
10-
</item>
113
<item type="PROP">
12-
<path>context.object.rotation_mode</path>
4+
<path>asdffdsafasdfasdfprop</path>
135
<name>none</name>
146
<icon>NONE</icon>
15-
<menu>True</menu>
7+
<menu>False</menu>
168
<expand>False</expand>
179
<slider>False</slider>
1810
<toggle>False</toggle>
@@ -21,18 +13,18 @@
2113
<fullevent>False</fullevent>
2214
<emboss>True</emboss>
2315
</item>
24-
<item type="PROP">
25-
<path>context.object.rotation_mode</path>
16+
<item type="MENU">
17+
<path>asdffdsa</path>
18+
<name>none</name>
19+
<icon>NONE</icon>
20+
</item>
21+
<item type="OP">
22+
<path>object.duplicate_moves</path>
2623
<name>none</name>
2724
<icon>NONE</icon>
2825
<menu>False</menu>
29-
<expand>False</expand>
30-
<slider>False</slider>
31-
<toggle>False</toggle>
32-
<icononly>False</icononly>
33-
<event>False</event>
34-
<fullevent>False</fullevent>
35-
<emboss>True</emboss>
26+
<arg>none</arg>
27+
<arg_val>none</arg_val>
3628
</item>
3729
<item type="OP">
3830
<path>object.duplicate_move</path>
@@ -108,6 +100,19 @@
108100
<name>none</name>
109101
<icon>NONE</icon>
110102
</item>
103+
<item type="PROP">
104+
<path>klasjdflk;;;</path>
105+
<name>none</name>
106+
<icon>NONE</icon>
107+
<menu>False</menu>
108+
<expand>False</expand>
109+
<slider>False</slider>
110+
<toggle>False</toggle>
111+
<icononly>False</icononly>
112+
<event>False</event>
113+
<fullevent>False</fullevent>
114+
<emboss>True</emboss>
115+
</item>
111116
<item type="PROP">
112117
<path>context.scene.render.resolution_percentage</path>
113118
<name>none</name>
@@ -160,6 +165,19 @@
160165
<arg>none</arg>
161166
<arg_val>none</arg_val>
162167
</item>
168+
<item type="PROP">
169+
<path>ui79507jlfj))(</path>
170+
<name>none</name>
171+
<icon>NONE</icon>
172+
<menu>False</menu>
173+
<expand>False</expand>
174+
<slider>False</slider>
175+
<toggle>False</toggle>
176+
<icononly>False</icononly>
177+
<event>False</event>
178+
<fullevent>False</fullevent>
179+
<emboss>True</emboss>
180+
</item>
163181
<item type="OP">
164182
<path>transform.tosphere</path>
165183
<name>none</name>
@@ -176,6 +194,11 @@
176194
<arg>none</arg>
177195
<arg_val>none</arg_val>
178196
</item>
197+
<item type="MENU">
198+
<path>menulol</path>
199+
<name>none</name>
200+
<icon>NONE</icon>
201+
</item>
179202
<item type="OP">
180203
<path>transform.bend</path>
181204
<name>none</name>
@@ -227,6 +250,20 @@
227250
<arg>none</arg>
228251
<arg_val>none</arg_val>
229252
</item>
253+
<item type="OP">
254+
<path>fsdfsdfdsfsdf</path>
255+
<name>none</name>
256+
<icon>NONE</icon>
257+
<menu>False</menu>
258+
<arg>none</arg>
259+
<arg_val>none</arg_val>
260+
</item>
261+
<item type="OP">
262+
<path>action.clean</path>
263+
<name>none</name>
264+
<icon>NONE</icon>
265+
<menu>False</menu>
266+
</item>
230267
<item type="OP">
231268
<path>anim.keying_set_active_set</path>
232269
<name>none</name>
@@ -481,4 +518,5 @@
481518
<menu area="VIEW_3D" mode="VERTEX_PAINT" />
482519
<menu area="VIEW_3D" mode="WEIGHT_PAINT" />
483520
<menu area="VIEW_3D" mode="PARTICLE_EDIT" />
521+
<menu area="VIEW_3D" mode="POSE" />
484522
</root>

custom_menu.py

Lines changed: 71 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,11 @@ def get_custom_item_list():
7575
desc = item[0].text
7676
else:
7777
ent_op = "bpy.ops.{0}()".format(item[0].text)
78-
op = eval("{0}.get_rna()".format(ent_op[:str.find(ent_op, "(")]))
79-
name = "OP: {0}".format(op.bl_rna.name)
78+
try:
79+
op = eval("{0}.get_rna()".format(ent_op[:str.find(ent_op, "(")]))
80+
name = "OP: {0}".format(op.bl_rna.name)
81+
except:
82+
name = "OP: {0}".format(item[0].text)
8083
desc = item[0].text
8184

8285
elif item_type == "MENU":
@@ -102,8 +105,8 @@ def get_custom_item_list():
102105
name = "SEP: Separator"
103106
desc = "Separator"
104107

105-
item_list.append((str(place+1), name, desc))
106-
rem_item_list.append((str(place), name, desc))
108+
item_list.append((str(place+1), "item ({0}) {1}".format(place+1, name), desc))
109+
rem_item_list.append((str(place), "item ({0}) {1}".format(place+1, name), desc))
107110

108111
set_prop("EnumProperty",
109112
"bpy.types.Scene.CustomMenuItemList",
@@ -231,11 +234,11 @@ def format_xml(elem, level=0):
231234
if level and (not elem.tail or not elem.tail.strip()):
232235
elem.tail = i
233236

234-
def errmsg(self, context, errlst):
235-
def draw(self, context):
236-
for entry in errlst:
237-
self.layout.row().label(entry)
238-
return draw
237+
#def errmsg(self, context, errlst):
238+
# def draw(self, context):
239+
# for entry in errlst:
240+
# self.layout.row().label(entry)
241+
# return draw
239242

240243
def get_arg_list(argstring):
241244
opkwarg_string = argstring
@@ -300,7 +303,17 @@ class RemItemListMenu(bpy.types.Menu):
300303
def draw(self, context):
301304
menu = Menu(self)
302305
menu.add_item().props_enum(bpy.context.scene, "CustomMenuItemRemList")
306+
307+
class ArgErrorListMenu(bpy.types.Menu):
308+
bl_label = "Invalid Arguments for Item(s):"
309+
bl_idname = "VIEW3D_MT_arg_error_list_menu"
303310

311+
errlst = []
312+
313+
def draw(self, context):
314+
for entry in self.errlst:
315+
self.layout.row().label(entry, icon='ERROR')
316+
304317
class CustomMenu(bpy.types.Menu):
305318
bl_label = "Custom Menu"
306319
bl_idname = "VIEW3D_MT_custom_menu"
@@ -314,24 +327,27 @@ def draw(self, context):
314327
global tree
315328
global root
316329
global cur_menu
330+
num = 0
317331

318332
cur_menu = get_menu(context)
319333

320334
error_str = "Invalid Arguments for Item(s):"
321335
errors = []
322-
336+
337+
split = menu.add_item("split", align=True)
338+
master_column = menu.add_item("column", parent=split)
339+
323340
for item in cur_menu:
341+
num += 1
324342
if item.get("type") == "SEP":
325-
menu.add_item().separator()
343+
menu.add_item(parent=master_column).separator()
326344
elif item.get("type") == "LAB":
327-
menu.add_item().label(item[0].text, icon=item[1].text)
345+
menu.add_item(parent=master_column).label(item[0].text, icon=item[1].text)
328346
elif item.get("type") == "OP":
329-
op_row = menu.add_item()
347+
op_row = menu.add_item(parent=master_column)
330348
#print(op_row.operator_context)
331349
op_row.operator_context = 'INVOKE_DEFAULT'
332350

333-
print()
334-
335351
if item[1].text != "none":
336352
if item[3].text == "True":
337353
op_row.operator_menu_enum(item[0].text, item[4].text.split(";")[0], text=item[1].text, icon=item[2].text)
@@ -343,27 +359,39 @@ def draw(self, context):
343359
else:
344360
op = op_row.operator(item[0].text, icon=item[2].text)
345361

362+
try:
363+
eval("bpy.ops.{0}.poll()".format(item[0].text))
364+
except:
365+
menu.add_item(parent=master_column).label("OP: "+item[0].text, icon='ERROR')
366+
346367
#print(item[3].text)
347368
if item[3].text == "False":
348-
if item[4].text != "none":
349-
if ";" in item[3].text:
350-
args = item[3].text.split(";")
351-
arg_vals = item[4].text.split(";")
352-
else:
353-
args = [item[3].text]
354-
arg_vals = [item[5].text]
355-
try:
369+
try:
370+
if item[4].text != "none":
371+
if ";" in item[4].text:
372+
args = item[4].text.split(";")
373+
arg_vals = item[5].text.split(";")
374+
else:
375+
args = [item[4].text]
376+
arg_vals = [item[5].text]
377+
356378
#print(args, " ", arg_vals)
357379
for int, arg in enumerate(args):
358380
exec("op.{0} = {1}".format(arg, arg_vals[int]))
359-
except:
360-
errors.append("{0}".format(item[0].text))
381+
except:
382+
errors.append("item ({0}) {1}".format(num, item[0].text))
361383

362384
elif item.get("type") == "MENU":
363385
if item[1].text != "none":
364-
menu.add_item().menu(item[0].text, text=item[1].text, icon=item[2].text)
386+
menu.add_item(parent=master_column).menu(item[0].text, text=item[1].text, icon=item[2].text)
365387
else:
366-
menu.add_item().menu(item[0].text, icon=item[2].text)
388+
menu.add_item(parent=master_column).menu(item[0].text, icon=item[2].text)
389+
390+
#print(eval("bpy.types."+item[0].text))
391+
try:
392+
eval("bpy.types."+item[0].text)
393+
except:
394+
menu.add_item(parent=master_column).label("MENU: "+item[0].text, icon='ERROR')
367395

368396
elif item.get("type") == "PROP":
369397
path = item[0].text
@@ -372,28 +400,36 @@ def draw(self, context):
372400
try:
373401
if item[1].text != "none":
374402
if item[3].text == "True":
375-
menu.add_item().prop_menu_enum(eval(path[:path.rfind(".")]), path[path.rfind(".")+1:], text=item[1].text, icon=item[2].text)
403+
menu.add_item(parent=master_column).prop_menu_enum(eval(path[:path.rfind(".")]), path[path.rfind(".")+1:], text=item[1].text, icon=item[2].text)
376404
else:
377-
menu.add_item().prop(eval(path[:path.rfind(".")]), path[path.rfind(".")+1:], text=item[1].text, icon=item[2].text, expand=eval(item[4].text), slider=eval(item[5].text), toggle=eval(item[6].text), icon_only=eval(item[7].text), event=eval(item[8].text), full_event=eval(item[9].text), emboss=eval(item[10].text))
405+
menu.add_item(parent=master_column).prop(eval(path[:path.rfind(".")]), path[path.rfind(".")+1:], text=item[1].text, icon=item[2].text, expand=eval(item[4].text), slider=eval(item[5].text), toggle=eval(item[6].text), icon_only=eval(item[7].text), event=eval(item[8].text), full_event=eval(item[9].text), emboss=eval(item[10].text))
378406
else:
379407
if item[3].text == "True":
380-
menu.add_item().prop_menu_enum(eval(path[:path.rfind(".")]), path[path.rfind(".")+1:], icon=item[2].text)
408+
menu.add_item(parent=master_column).prop_menu_enum(eval(path[:path.rfind(".")]), path[path.rfind(".")+1:], icon=item[2].text)
381409
#print(path[:path.rfind(".")], path[path.rfind(".")+1:])
382410
else:
383-
menu.add_item().prop(eval(path[:path.rfind(".")]), path[path.rfind(".")+1:], icon=item[2].text, expand=eval(item[4].text), slider=eval(item[5].text), toggle=eval(item[6].text), icon_only=eval(item[7].text), event=eval(item[8].text), full_event=eval(item[9].text), emboss=eval(item[10].text))
411+
menu.add_item(parent=master_column).prop(eval(path[:path.rfind(".")]), path[path.rfind(".")+1:], icon=item[2].text, expand=eval(item[4].text), slider=eval(item[5].text), toggle=eval(item[6].text), icon_only=eval(item[7].text), event=eval(item[8].text), full_event=eval(item[9].text), emboss=eval(item[10].text))
384412
except:
385-
errors.append("{0}".format(item[0].text))
413+
menu.add_item(parent=master_column).label("PROP: "+item[0].text, icon='ERROR')
386414

387-
menu.add_item().separator()
415+
menu.add_item(parent=master_column).separator()
388416

389-
op = menu.add_item()
417+
op = menu.add_item(parent=master_column)
390418
op.operator_context = 'INVOKE_DEFAULT'
391419
op.operator("view3d.custom_menu_editor", text="Edit Custom Menu")
392420

393421
#message = lambda x, y : errmsg(x, errors)
394422

395423
if errors:
396-
send_report("".format(errors))
424+
menu.add_item(parent=master_column).menu(ArgErrorListMenu.bl_idname, icon='ERROR')
425+
bpy.types.VIEW3D_MT_arg_error_list_menu.errlst = errors
426+
#error_column = menu.add_item("column", parent=split)
427+
#report = menu.add_item().operator(SendReport.bl_idname, text="Errors Occurred, click for more information", icon='ERROR')
428+
#report.message = "\n".join(errors)
429+
#menu.add_item(parent=error_column).label(error_str, icon='ERROR')
430+
#for error in errors:
431+
#menu.add_item(parent=error_column).label(error)
432+
#send_report("".format(errors))
397433
#context.window_manager.popup_menu(errmsg(self, context, errors), title=error_str, icon='ERROR')
398434

399435
class CustomMenuEditor(bpy.types.Operator):

0 commit comments

Comments
 (0)