Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlijenstina <lijenstina@gmail.com>2017-04-22 04:54:45 +0300
committerlijenstina <lijenstina@gmail.com>2017-04-22 04:54:45 +0300
commit29f2b2f34a8255828cf1621edd5c725167338f9f (patch)
treed478f0eb44d078137d62ad5b76d7320bbaf4f494 /space_view3d_brush_menus/brush_menu.py
parent3fe42bb946bd780e7732afc4c1d100d13830d7e3 (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.py630
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)