diff options
author | lijenstina <lijenstina@gmail.com> | 2017-04-22 04:54:45 +0300 |
---|---|---|
committer | lijenstina <lijenstina@gmail.com> | 2017-04-22 04:54:45 +0300 |
commit | 29f2b2f34a8255828cf1621edd5c725167338f9f (patch) | |
tree | d478f0eb44d078137d62ad5b76d7320bbaf4f494 /space_view3d_brush_menus/brush_menu.py | |
parent | 3fe42bb946bd780e7732afc4c1d100d13830d7e3 (diff) |
Sculpt Paint Brush Menus: cleanup, refactor, various fixes
Bumped version to 1.1.4
Remove the Utils folder and move it to file utils_core
Remove star imports and replace them with namespace
Remove unused imports
Use importlib for reloading files
Add customization to the brushes (column size, 3 types of menus)
Remove the VIEW3D_MT_Brush_Selection1 menu
Remove versioning code
Add some helper functions in utils_core
Fix crash with poll functions get_mode if no active object
Fix several crashes with unlinked missing active brush
(hope i got it all)
Move the shortcut register to the init
Update wiki link
NOTE:
Remove unused operators and functions
Part of it is something to do with properties creation
Haven't seen the code used anywhere so it was removed
If it is needed for something it could be restored later
Diffstat (limited to 'space_view3d_brush_menus/brush_menu.py')
-rw-r--r-- | space_view3d_brush_menus/brush_menu.py | 630 |
1 files changed, 379 insertions, 251 deletions
diff --git a/space_view3d_brush_menus/brush_menu.py b/space_view3d_brush_menus/brush_menu.py index 91daf19c..6940304e 100644 --- a/space_view3d_brush_menus/brush_menu.py +++ b/space_view3d_brush_menus/brush_menu.py @@ -1,156 +1,212 @@ -from bpy.props import * -from .Utils.core import * +# gpl author: Ryan Inch (Imaginer) + +import bpy +from bpy.types import ( + Operator, + Menu, + ) +from bpy.props import BoolProperty +from . import utils_core +from bl_ui.properties_paint_common import UnifiedPaintPanel + def get_current_brush_icon(tool): - if get_mode() == sculpt: - icons = {"BLOB":'BRUSH_BLOB', - "CLAY":'BRUSH_CLAY', - "CLAY_STRIPS":'BRUSH_CLAY_STRIPS', - "CREASE":'BRUSH_CREASE', - "DRAW":'BRUSH_SCULPT_DRAW', - "FILL":'BRUSH_FILL', - "FLATTEN":'BRUSH_FLATTEN', - "GRAB":'BRUSH_GRAB', - "INFLATE":'BRUSH_INFLATE', - "LAYER":'BRUSH_LAYER', - "MASK":'BRUSH_MASK', - "NUDGE":'BRUSH_NUDGE', - "PINCH":'BRUSH_PINCH', - "ROTATE":'BRUSH_ROTATE', - "SCRAPE":'BRUSH_SCRAPE', - "SIMPLIFY":'BRUSH_SUBTRACT', - "SMOOTH":'BRUSH_SMOOTH', - "SNAKE_HOOK":'BRUSH_SNAKE_HOOK', - "THUMB":'BRUSH_THUMB'} - - elif get_mode() == vertex_paint: - icons = {"ADD":'BRUSH_ADD', - "BLUR":'BRUSH_BLUR', - "DARKEN":'BRUSH_DARKEN', - "LIGHTEN":'BRUSH_LIGHTEN', - "MIX":'BRUSH_MIX', - "MUL":'BRUSH_MULTIPLY', - "SUB":'BRUSH_SUBTRACT'} - - elif get_mode() == weight_paint: - icons = {"ADD":'BRUSH_ADD', - "BLUR":'BRUSH_BLUR', - "DARKEN":'BRUSH_DARKEN', - "LIGHTEN":'BRUSH_LIGHTEN', - "MIX":'BRUSH_MIX', - "MUL":'BRUSH_MULTIPLY', - "SUB":'BRUSH_SUBTRACT'} - - elif get_mode() == texture_paint: - icons = {"CLONE":'BRUSH_CLONE', - "DRAW":'BRUSH_TEXDRAW', - "FILL":'BRUSH_TEXFILL', - "MASK":'BRUSH_TEXMASK', - "SMEAR":'BRUSH_SMEAR', - "SOFTEN":'BRUSH_SOFTEN'} - + if utils_core.get_mode() == utils_core.sculpt: + icons = {"BLOB": 'BRUSH_BLOB', + "CLAY": 'BRUSH_CLAY', + "CLAY_STRIPS": 'BRUSH_CLAY_STRIPS', + "CREASE": 'BRUSH_CREASE', + "DRAW": 'BRUSH_SCULPT_DRAW', + "FILL": 'BRUSH_FILL', + "FLATTEN": 'BRUSH_FLATTEN', + "GRAB": 'BRUSH_GRAB', + "INFLATE": 'BRUSH_INFLATE', + "LAYER": 'BRUSH_LAYER', + "MASK": 'BRUSH_MASK', + "NUDGE": 'BRUSH_NUDGE', + "PINCH": 'BRUSH_PINCH', + "ROTATE": 'BRUSH_ROTATE', + "SCRAPE": 'BRUSH_SCRAPE', + "SIMPLIFY": 'BRUSH_SUBTRACT', + "SMOOTH": 'BRUSH_SMOOTH', + "SNAKE_HOOK": 'BRUSH_SNAKE_HOOK', + "THUMB": 'BRUSH_THUMB'} + + elif utils_core.get_mode() == utils_core.vertex_paint: + icons = {"ADD": 'BRUSH_ADD', + "BLUR": 'BRUSH_BLUR', + "DARKEN": 'BRUSH_DARKEN', + "LIGHTEN": 'BRUSH_LIGHTEN', + "MIX": 'BRUSH_MIX', + "MUL": 'BRUSH_MULTIPLY', + "SUB": 'BRUSH_SUBTRACT'} + + elif utils_core.get_mode() == utils_core.weight_paint: + icons = {"ADD": 'BRUSH_ADD', + "BLUR": 'BRUSH_BLUR', + "DARKEN": 'BRUSH_DARKEN', + "LIGHTEN": 'BRUSH_LIGHTEN', + "MIX": 'BRUSH_MIX', + "MUL": 'BRUSH_MULTIPLY', + "SUB": 'BRUSH_SUBTRACT'} + + elif utils_core.get_mode() == utils_core.texture_paint: + icons = {"CLONE": 'BRUSH_CLONE', + "DRAW": 'BRUSH_TEXDRAW', + "FILL": 'BRUSH_TEXFILL', + "MASK": 'BRUSH_TEXMASK', + "SMEAR": 'BRUSH_SMEAR', + "SOFTEN": 'BRUSH_SOFTEN'} + icon = icons[tool] return icon -class BrushOptionsMenu(bpy.types.Menu): + +class BrushOptionsMenu(Menu): bl_label = "Brush Options" bl_idname = "VIEW3D_MT_sv3_brush_options" @classmethod def poll(self, context): - if get_mode() in [sculpt, vertex_paint, weight_paint, texture_paint, particle_edit]: - return True + return utils_core.get_mode() in ( + utils_core.sculpt, utils_core.vertex_paint, + utils_core.weight_paint, utils_core.texture_paint, + utils_core.particle_edit + ) + + def draw_brushes(self, menu, h_brush, ico, context): + if utils_core.addon_settings(lists=True) == 'popup' or not h_brush: + menu.add_item().operator( + "view3d.sv3_brush_menu_popup", text="Brush", + icon=ico + ) else: - return False + menu.add_item().menu( + "VIEW3D_MT_sv3_brushes_menu", text="Brush", + icon=ico + ) def draw(self, context): - menu = Menu(self) + menu = utils_core.Menu(self) - if get_mode() == sculpt: + if utils_core.get_mode() == utils_core.sculpt: self.sculpt(menu, context) - elif get_mode() in [vertex_paint, weight_paint]: + elif utils_core.get_mode() in (utils_core.vertex_paint, + utils_core.weight_paint): self.vw_paint(menu, context) - elif get_mode() == texture_paint: + elif utils_core.get_mode() == utils_core.texture_paint: self.texpaint(menu, context) else: self.particle(menu, context) def sculpt(self, menu, context): - menu.add_item().menu("VIEW3D_MT_Brush_Selection1", text="Brush", icon=get_current_brush_icon(context.tool_settings.sculpt.brush.sculpt_tool)) + has_brush = utils_core.get_brush_link(context, types="brush") + icons = get_current_brush_icon(has_brush.sculpt_tool) if \ + has_brush else "BRUSH_DATA" + + self.draw_brushes(menu, has_brush, icons, context) + menu.add_item().menu(BrushRadiusMenu.bl_idname) - menu.add_item().menu(BrushStrengthMenu.bl_idname) - menu.add_item().menu(BrushAutosmoothMenu.bl_idname) - menu.add_item().menu(BrushModeMenu.bl_idname) - menu.add_item().menu("VIEW3D_MT_sv3_texture_menu") - menu.add_item().menu("VIEW3D_MT_sv3_stroke_options") - menu.add_item().menu("VIEW3D_MT_sv3_brush_curve_menu") + + if has_brush: + # if the active brush is unlinked these menus don't do anything + menu.add_item().menu(BrushStrengthMenu.bl_idname) + menu.add_item().menu(BrushAutosmoothMenu.bl_idname) + menu.add_item().menu(BrushModeMenu.bl_idname) + menu.add_item().menu("VIEW3D_MT_sv3_texture_menu") + menu.add_item().menu("VIEW3D_MT_sv3_stroke_options") + menu.add_item().menu("VIEW3D_MT_sv3_brush_curve_menu") + menu.add_item().menu("VIEW3D_MT_sv3_dyntopo") menu.add_item().menu("VIEW3D_MT_sv3_master_symmetry_menu") - + def vw_paint(self, menu, context): - if get_mode() == vertex_paint: + has_brush = utils_core.get_brush_link(context, types="brush") + icons = get_current_brush_icon(has_brush.vertex_tool) if \ + has_brush else "BRUSH_DATA" + + if utils_core.get_mode() == utils_core.vertex_paint: menu.add_item().operator(ColorPickerPopup.bl_idname, icon="COLOR") menu.add_item().separator() - menu.add_item().menu("VIEW3D_MT_Brush_Selection1", text="Brush", icon=get_current_brush_icon(context.tool_settings.vertex_paint.brush.vertex_tool)) + + self.draw_brushes(menu, has_brush, icons, context) + + if utils_core.get_mode() == utils_core.vertex_paint: menu.add_item().menu(BrushRadiusMenu.bl_idname) - menu.add_item().menu(BrushStrengthMenu.bl_idname) - menu.add_item().menu(BrushModeMenu.bl_idname) - menu.add_item().menu("VIEW3D_MT_sv3_texture_menu") - menu.add_item().menu("VIEW3D_MT_sv3_stroke_options") - menu.add_item().menu("VIEW3D_MT_sv3_brush_curve_menu") - if get_mode() == weight_paint: - menu.add_item().menu("VIEW3D_MT_Brush_Selection1", text="Brush", icon=get_current_brush_icon(context.tool_settings.vertex_paint.brush.vertex_tool)) + + if has_brush: + # if the active brush is unlinked these menus don't do anything + menu.add_item().menu(BrushStrengthMenu.bl_idname) + menu.add_item().menu(BrushModeMenu.bl_idname) + menu.add_item().menu("VIEW3D_MT_sv3_texture_menu") + menu.add_item().menu("VIEW3D_MT_sv3_stroke_options") + menu.add_item().menu("VIEW3D_MT_sv3_brush_curve_menu") + + if utils_core.get_mode() == utils_core.weight_paint: menu.add_item().menu(BrushWeightMenu.bl_idname) menu.add_item().menu(BrushRadiusMenu.bl_idname) - menu.add_item().menu(BrushStrengthMenu.bl_idname) - menu.add_item().menu(BrushModeMenu.bl_idname) - menu.add_item().menu("VIEW3D_MT_sv3_stroke_options") - menu.add_item().menu("VIEW3D_MT_sv3_brush_curve_menu") + + if has_brush: + # if the active brush is unlinked these menus don't do anything + menu.add_item().menu(BrushStrengthMenu.bl_idname) + menu.add_item().menu(BrushModeMenu.bl_idname) + menu.add_item().menu("VIEW3D_MT_sv3_stroke_options") + menu.add_item().menu("VIEW3D_MT_sv3_brush_curve_menu") def texpaint(self, menu, context): toolsettings = context.tool_settings.image_paint - + if context.image_paint_object and not toolsettings.detect_data(): - menu.add_item().label("Missing Data", icon='ERROR') - menu.add_item().label("See Tool Shelf") + menu.add_item().label("Missing Data", icon="INFO") + menu.add_item().label("See Tool Shelf", icon="BACK") else: - if toolsettings.brush.image_tool in {'DRAW', 'FILL'} and \ - toolsettings.brush.blend not in {'ERASE_ALPHA', 'ADD_ALPHA'}: + has_brush = utils_core.get_brush_link(context, types="brush") + if has_brush and has_brush.image_tool in {'DRAW', 'FILL'} and \ + has_brush.blend not in {'ERASE_ALPHA', 'ADD_ALPHA'}: menu.add_item().operator(ColorPickerPopup.bl_idname, icon="COLOR") menu.add_item().separator() - - menu.add_item().menu("VIEW3D_MT_Brush_Selection1", text="Brush", icon=get_current_brush_icon(toolsettings.brush.image_tool)) - - if toolsettings.brush.image_tool in {'MASK'}: - menu.add_item().menu(BrushWeightMenu.bl_idname, text="Mask Value") - - if toolsettings.brush.image_tool not in {'FILL'}: - menu.add_item().menu(BrushRadiusMenu.bl_idname) - - menu.add_item().menu(BrushStrengthMenu.bl_idname) - - if toolsettings.brush.image_tool in {'DRAW'}: - menu.add_item().menu(BrushModeMenu.bl_idname) - menu.add_item().menu("VIEW3D_MT_sv3_texture_menu") - menu.add_item().menu("VIEW3D_MT_sv3_stroke_options") - menu.add_item().menu("VIEW3D_MT_sv3_brush_curve_menu") - menu.add_item().menu("VIEW3D_MT_sv3_master_symmetry_menu") + icons = get_current_brush_icon(has_brush.image_tool) if \ + has_brush else "BRUSH_DATA" + + self.draw_brushes(menu, has_brush, icons, context) + + if has_brush: + # if the active brush is unlinked these menus don't do anything + if has_brush and has_brush.image_tool in {'MASK'}: + menu.add_item().menu(BrushWeightMenu.bl_idname, text="Mask Value") + + if has_brush and has_brush.image_tool not in {'FILL'}: + menu.add_item().menu(BrushRadiusMenu.bl_idname) + + menu.add_item().menu(BrushStrengthMenu.bl_idname) + + if has_brush and has_brush.image_tool in {'DRAW'}: + menu.add_item().menu(BrushModeMenu.bl_idname) + + menu.add_item().menu("VIEW3D_MT_sv3_texture_menu") + menu.add_item().menu("VIEW3D_MT_sv3_stroke_options") + menu.add_item().menu("VIEW3D_MT_sv3_brush_curve_menu") + + menu.add_item().menu("VIEW3D_MT_sv3_master_symmetry_menu") def particle(self, menu, context): if context.tool_settings.particle_edit.tool == 'NONE': - menu.add_item().label("No Brush Selected") - menu.add_item().menu("VIEW3D_MT_sv3_brushes_menu", text="Select Brush") + menu.add_item().label("No Brush Selected", icon="INFO") + menu.add_item().separator() + menu.add_item().menu("VIEW3D_MT_sv3_brushes_menu", + text="Select Brush", icon="BRUSH_DATA") else: - menu.add_item().menu("VIEW3D_MT_sv3_brushes_menu") + menu.add_item().menu("VIEW3D_MT_sv3_brushes_menu", + icon="BRUSH_DATA") menu.add_item().menu(BrushRadiusMenu.bl_idname) + if context.tool_settings.particle_edit.tool != 'ADD': menu.add_item().menu(BrushStrengthMenu.bl_idname) - else: menu.add_item().menu(ParticleCountMenu.bl_idname) menu.add_item().separator() @@ -173,19 +229,20 @@ class BrushOptionsMenu(bpy.types.Menu): "use_puff_volume", toggle=True) -class BrushRadiusMenu(bpy.types.Menu): +class BrushRadiusMenu(Menu): bl_label = "Radius" bl_idname = "VIEW3D_MT_sv3_brush_radius_menu" + bl_description = "Change the size of the brushes" def init(self, context): - if get_mode() == particle_edit: + if utils_core.get_mode() == utils_core.particle_edit: settings = [["100", 100], ["70", 70], ["50", 50], ["30", 30], ["20", 20], ["10", 10]] - + datapath = "tool_settings.particle_edit.brush.size" proppath = context.tool_settings.particle_edit.brush @@ -196,7 +253,7 @@ class BrushRadiusMenu(bpy.types.Menu): ["50", 50], ["35", 35], ["10", 10]] - + datapath = "tool_settings.unified_paint_settings.size" proppath = context.tool_settings.unified_paint_settings @@ -204,7 +261,7 @@ class BrushRadiusMenu(bpy.types.Menu): def draw(self, context): settings, datapath, proppath = self.init(context) - menu = Menu(self) + menu = utils_core.Menu(self) # add the top slider menu.add_item().prop(proppath, "size", slider=True) @@ -212,12 +269,14 @@ class BrushRadiusMenu(bpy.types.Menu): # add the rest of the menu items for i in range(len(settings)): - menuprop(menu.add_item(), settings[i][0], settings[i][1], - datapath, icon='RADIOBUT_OFF', disable=True, - disable_icon='RADIOBUT_ON') + utils_core.menuprop( + menu.add_item(), settings[i][0], settings[i][1], + datapath, icon='RADIOBUT_OFF', disable=True, + disable_icon='RADIOBUT_ON' + ) -class BrushStrengthMenu(bpy.types.Menu): +class BrushStrengthMenu(Menu): bl_label = "Strength" bl_idname = "VIEW3D_MT_sv3_brush_strength_menu" @@ -229,21 +288,19 @@ class BrushStrengthMenu(bpy.types.Menu): ["0.2", 0.2], ["0.1", 0.1]] - if get_mode() == sculpt: + proppath = utils_core.get_brush_link(context, types="brush") + + if utils_core.get_mode() == utils_core.sculpt: datapath = "tool_settings.sculpt.brush.strength" - proppath = context.tool_settings.sculpt.brush - elif get_mode() == vertex_paint: + elif utils_core.get_mode() == utils_core.vertex_paint: datapath = "tool_settings.vertex_paint.brush.strength" - proppath = context.tool_settings.vertex_paint.brush - elif get_mode() == weight_paint: + elif utils_core.get_mode() == utils_core.weight_paint: datapath = "tool_settings.weight_paint.brush.strength" - proppath = context.tool_settings.weight_paint.brush - elif get_mode() == texture_paint: + elif utils_core.get_mode() == utils_core.texture_paint: datapath = "tool_settings.image_paint.brush.strength" - proppath = context.tool_settings.image_paint.brush else: datapath = "tool_settings.particle_edit.brush.strength" @@ -253,63 +310,80 @@ class BrushStrengthMenu(bpy.types.Menu): def draw(self, context): settings, datapath, proppath = self.init(context) - menu = Menu(self) + menu = utils_core.Menu(self) # add the top slider - menu.add_item().prop(proppath, "strength", slider=True) - menu.add_item().separator() + if proppath: + menu.add_item().prop(proppath, "strength", slider=True) + menu.add_item().separator() - # add the rest of the menu items - for i in range(len(settings)): - menuprop(menu.add_item(), settings[i][0], settings[i][1], - datapath, icon='RADIOBUT_OFF', disable=True, - disable_icon='RADIOBUT_ON') + # add the rest of the menu items + for i in range(len(settings)): + utils_core.menuprop( + menu.add_item(), settings[i][0], settings[i][1], + datapath, icon='RADIOBUT_OFF', disable=True, + disable_icon='RADIOBUT_ON' + ) + else: + menu.add_item().label("No brushes available", icon="INFO") -class BrushModeMenu(bpy.types.Menu): +class BrushModeMenu(Menu): bl_label = "Brush Mode" bl_idname = "VIEW3D_MT_sv3_brush_mode_menu" def init(self): - if get_mode() == sculpt: - enum = bpy.context.tool_settings.sculpt.brush.bl_rna.properties['sculpt_plane'].enum_items + has_brush = utils_core.get_brush_link(bpy.context, types="brush") + + if utils_core.get_mode() == utils_core.sculpt: + enum = has_brush.bl_rna.properties['sculpt_plane'].enum_items if \ + has_brush else None path = "tool_settings.sculpt.brush.sculpt_plane" - elif get_mode() == texture_paint: - enum = bpy.context.tool_settings.image_paint.brush.bl_rna.properties['blend'].enum_items + elif utils_core.get_mode() == utils_core.texture_paint: + enum = has_brush.bl_rna.properties['blend'].enum_items if \ + has_brush else None path = "tool_settings.image_paint.brush.blend" else: - enum = bpy.context.tool_settings.vertex_paint.brush.bl_rna.properties['vertex_tool'].enum_items + enum = has_brush.bl_rna.properties['vertex_tool'].enum_items if \ + has_brush else None path = "tool_settings.vertex_paint.brush.vertex_tool" return enum, path def draw(self, context): enum, path = self.init() - menu = Menu(self) + menu = utils_core.Menu(self) + colum_n = utils_core.addon_settings(lists=False) menu.add_item().label(text="Brush Mode") menu.add_item().separator() - if get_mode() == texture_paint: - column_flow = menu.add_item("column_flow", columns=2) - - # add all the brush modes to the menu - for brush in enum: - menuprop(menu.add_item(parent=column_flow), brush.name, - brush.identifier, path, icon='RADIOBUT_OFF', - disable=True, disable_icon='RADIOBUT_ON') - + if enum: + if utils_core.get_mode() == utils_core.texture_paint: + column_flow = menu.add_item("column_flow", columns=colum_n) + + # add all the brush modes to the menu + for brush in enum: + utils_core.menuprop( + menu.add_item(parent=column_flow), brush.name, + brush.identifier, path, icon='RADIOBUT_OFF', + disable=True, disable_icon='RADIOBUT_ON' + ) + else: + # add all the brush modes to the menu + for brush in enum: + utils_core.menuprop( + menu.add_item(), brush.name, + brush.identifier, path, icon='RADIOBUT_OFF', + disable=True, disable_icon='RADIOBUT_ON' + ) else: - # add all the brush modes to the menu - for brush in enum: - menuprop(menu.add_item(), brush.name, - brush.identifier, path, icon='RADIOBUT_OFF', - disable=True, disable_icon='RADIOBUT_ON') + menu.add_item().label("No brushes available", icon="INFO") -class BrushAutosmoothMenu(bpy.types.Menu): +class BrushAutosmoothMenu(Menu): bl_label = "Autosmooth" bl_idname = "VIEW3D_MT_sv3_brush_autosmooth_menu" @@ -325,27 +399,32 @@ class BrushAutosmoothMenu(bpy.types.Menu): def draw(self, context): settings = self.init() - menu = Menu(self) + menu = utils_core.Menu(self) + has_brush = utils_core.get_brush_link(context, types="brush") - # add the top slider - menu.add_item().prop(context.tool_settings.sculpt.brush, - "auto_smooth_factor", slider=True) - menu.add_item().separator() + if has_brush: + # add the top slider + menu.add_item().prop(has_brush, "auto_smooth_factor", slider=True) + menu.add_item().separator() - # add the rest of the menu items - for i in range(len(settings)): - menuprop(menu.add_item(), settings[i][0], settings[i][1], - "tool_settings.sculpt.brush.auto_smooth_factor", - icon='RADIOBUT_OFF', disable=True, - disable_icon='RADIOBUT_ON') + # add the rest of the menu items + for i in range(len(settings)): + utils_core.menuprop( + menu.add_item(), settings[i][0], settings[i][1], + "tool_settings.sculpt.brush.auto_smooth_factor", + icon='RADIOBUT_OFF', disable=True, + disable_icon='RADIOBUT_ON' + ) + else: + menu.add_item().label("No Smooth options available", icon="INFO") -class BrushWeightMenu(bpy.types.Menu): +class BrushWeightMenu(Menu): bl_label = "Weight" bl_idname = "VIEW3D_MT_sv3_brush_weight_menu" def draw(self, context): - if get_mode() == weight_paint: + if utils_core.get_mode() == utils_core.weight_paint: brush = context.tool_settings.unified_paint_settings brushstr = "tool_settings.unified_paint_settings.weight" name = "Weight" @@ -353,29 +432,33 @@ class BrushWeightMenu(bpy.types.Menu): brush = context.tool_settings.image_paint.brush brushstr = "tool_settings.image_paint.brush.weight" name = "Mask Value" - - menu = Menu(self) + + menu = utils_core.Menu(self) settings = [["1.0", 1.0], ["0.7", 0.7], ["0.5", 0.5], ["0.3", 0.3], ["0.2", 0.2], ["0.1", 0.1]] + if brush: + # add the top slider + menu.add_item().prop(brush, + "weight", text=name, slider=True) + menu.add_item().separator() - # add the top slider - menu.add_item().prop(brush, - "weight", text=name, slider=True) - menu.add_item().separator() - - # add the rest of the menu items - for i in range(len(settings)): - menuprop(menu.add_item(), settings[i][0], settings[i][1], - brushstr, - icon='RADIOBUT_OFF', disable=True, - disable_icon='RADIOBUT_ON') + # add the rest of the menu items + for i in range(len(settings)): + utils_core.menuprop( + menu.add_item(), settings[i][0], settings[i][1], + brushstr, + icon='RADIOBUT_OFF', disable=True, + disable_icon='RADIOBUT_ON' + ) + else: + menu.add_item().label("No brush available", icon="INFO") -class ParticleCountMenu(bpy.types.Menu): +class ParticleCountMenu(Menu): bl_label = "Count" bl_idname = "VIEW3D_MT_sv3_particle_count_menu" @@ -391,7 +474,7 @@ class ParticleCountMenu(bpy.types.Menu): def draw(self, context): settings = self.init() - menu = Menu(self) + menu = utils_core.Menu(self) # add the top slider menu.add_item().prop(context.tool_settings.particle_edit.brush, @@ -400,123 +483,168 @@ class ParticleCountMenu(bpy.types.Menu): # add the rest of the menu items for i in range(len(settings)): - menuprop(menu.add_item(), settings[i][0], settings[i][1], - "tool_settings.particle_edit.brush.count", - icon='RADIOBUT_OFF', disable=True, - disable_icon='RADIOBUT_ON') + utils_core.menuprop( + menu.add_item(), settings[i][0], settings[i][1], + "tool_settings.particle_edit.brush.count", + icon='RADIOBUT_OFF', disable=True, + disable_icon='RADIOBUT_ON' + ) -class ParticleLengthMenu(bpy.types.Menu): +class ParticleLengthMenu(Menu): bl_label = "Length Mode" bl_idname = "VIEW3D_MT_sv3_particle_length_menu" def draw(self, context): - menu = Menu(self) + menu = utils_core.Menu(self) path = "tool_settings.particle_edit.brush.length_mode" # add the menu items - for item in context.tool_settings.particle_edit.brush.bl_rna.properties['length_mode'].enum_items: - menuprop(menu.add_item(), item.name, item.identifier, path, - icon='RADIOBUT_OFF', - disable=True, - disable_icon='RADIOBUT_ON') + for item in context.tool_settings.particle_edit.brush. \ + bl_rna.properties['length_mode'].enum_items: + utils_core.menuprop( + menu.add_item(), item.name, item.identifier, path, + icon='RADIOBUT_OFF', + disable=True, + disable_icon='RADIOBUT_ON' + ) -class ParticlePuffMenu(bpy.types.Menu): + +class ParticlePuffMenu(Menu): bl_label = "Puff Mode" bl_idname = "VIEW3D_MT_sv3_particle_puff_menu" def draw(self, context): - menu = Menu(self) + menu = utils_core.Menu(self) path = "tool_settings.particle_edit.brush.puff_mode" # add the menu items - for item in context.tool_settings.particle_edit.brush.bl_rna.properties['puff_mode'].enum_items: - menuprop(menu.add_item(), item.name, item.identifier, path, - icon='RADIOBUT_OFF', - disable=True, - disable_icon='RADIOBUT_ON') + for item in context.tool_settings.particle_edit.brush. \ + bl_rna.properties['puff_mode'].enum_items: + utils_core.menuprop( + menu.add_item(), item.name, item.identifier, path, + icon='RADIOBUT_OFF', + disable=True, + disable_icon='RADIOBUT_ON' + ) + -class FlipColorsTex(bpy.types.Operator): +class FlipColorsAll(Operator): bl_label = "Flip Colors" - bl_idname = "view3d.sv3_flip_colors_tex" + bl_idname = "view3d.sv3_flip_colors_all" + bl_description = "Switch between Foreground and Background colors" + + is_tex = BoolProperty( + default=False, + options={'HIDDEN'} + ) def execute(self, context): try: - bpy.ops.paint.brush_colors_flip() - except: - pass + if self.is_tex is False: + color = context.tool_settings.vertex_paint.brush.color + secondary_color = context.tool_settings.vertex_paint.brush.secondary_color - return {'FINISHED'} - -class FlipColorsVert(bpy.types.Operator): - bl_label = "Flip Colors" - bl_idname = "view3d.sv3_flip_colors_vert" - - def execute(self, context): - color = context.tool_settings.vertex_paint.brush.color - secondary_color = context.tool_settings.vertex_paint.brush.secondary_color - - orig_prim = color.hsv - orig_sec = secondary_color.hsv - - color.hsv = orig_sec - secondary_color.hsv = orig_prim - - return {'FINISHED'} - -class ColorPickerPopup(bpy.types.Operator): + orig_prim = color.hsv + orig_sec = secondary_color.hsv + + color.hsv = orig_sec + secondary_color.hsv = orig_prim + else: + bpy.ops.paint.brush_colors_flip() + + return {'FINISHED'} + + except Exception as e: + utils_core.error_handlers(self, "view3d.sv3_flip_colors_all", e, + "Flip Colors could not be completed") + + return {'CANCELLED'} + + +class ColorPickerPopup(Operator): bl_label = "Color" bl_idname = "view3d.sv3_color_picker_popup" bl_options = {'REGISTER'} + @classmethod + def poll(self, context): + return utils_core.get_mode() in ( + utils_core.vertex_paint, + utils_core.texture_paint + ) + def check(self, context): return True - + def draw(self, context): - menu = Menu(self) + menu = utils_core.Menu(self) - if get_mode() == texture_paint: + if utils_core.get_mode() == utils_core.texture_paint: settings = context.tool_settings.image_paint - brush = settings.brush - + brush = getattr(settings, "brush", None) else: settings = context.tool_settings.vertex_paint brush = settings.brush + brush = getattr(settings, "brush", None) + + if brush: + menu.add_item().template_color_picker(brush, "color", value_slider=True) + menu.add_item("row", align=True).prop(brush, "color", text="") + menu.current_item.prop(brush, "secondary_color", text="") + + if utils_core.get_mode() == utils_core.vertex_paint: + menu.current_item.operator( + FlipColorsAll.bl_idname, + icon='FILE_REFRESH', text="" + ).is_tex = False + else: + menu.current_item.operator( + FlipColorsAll.bl_idname, + icon='FILE_REFRESH', text="" + ).is_tex = True - menu.add_item().template_color_picker(brush, "color", value_slider=True) - menu.add_item().prop(brush, "color", text="") - menu.current_item.prop(brush, "secondary_color", text="") - if get_mode() == vertex_paint: - menu.current_item.operator(FlipColorsVert.bl_idname, icon='FILE_REFRESH', text="") + if settings.palette: + menu.add_item("column").template_palette(settings, "palette", color=True) + + menu.add_item().template_ID(settings, "palette", new="palette.new") else: - menu.current_item.operator(FlipColorsTex.bl_idname, icon='FILE_REFRESH', text="") + menu.add_item().label("No brushes currently available", icon="INFO") + + return - if settings.palette: - menu.add_item("column").template_palette(settings, "palette", color=True) - - menu.add_item().template_ID(settings, "palette", new="palette.new") - def execute(self, context): return context.window_manager.invoke_popup(self, width=180) -### ------------ New hotkeys and registration ------------ ### +class BrushMenuPopup(Operator): + bl_label = "Color" + bl_idname = "view3d.sv3_brush_menu_popup" + bl_options = {'REGISTER'} -addon_keymaps = [] + @classmethod + def poll(self, context): + return utils_core.get_mode() in ( + utils_core.vertex_paint, + utils_core.texture_paint, + utils_core.sculpt, + utils_core.weight_paint + ) + def check(self, context): + return True -def register(): - wm = bpy.context.window_manager - modes = ['Sculpt', 'Vertex Paint', 'Weight Paint', 'Image Paint', 'Particle'] + def draw(self, context): + layout = self.layout + settings = UnifiedPaintPanel.paint_settings(context) + colum_n = utils_core.addon_settings(lists=False) - for mode in modes: - km = wm.keyconfigs.addon.keymaps.new(name=mode) - kmi = km.keymap_items.new('wm.call_menu', 'V', 'PRESS', alt=True) - kmi.properties.name = "VIEW3D_MT_sv3_brush_options" - addon_keymaps.append((km, kmi)) + if utils_core.addon_settings(lists=True) != 'popup': + layout.label(text="Seems no active brush", icon="INFO") + layout.label(text="in the Tool Shelf", icon="BACK") + layout.template_ID_preview(settings, "brush", + new="brush.add", rows=3, cols=colum_n) -def unregister(): - for km, kmi in addon_keymaps: - km.keymap_items.remove(kmi) - addon_keymaps.clear() + def execute(self, context): + return context.window_manager.invoke_popup(self, width=180) |