diff options
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) |