Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import bpy
- import blf
- import bgl
- import random
- def drawCallback(self):
- blf.size(0, 16, 72)
- text = ('Last changed: ' + self.currentPropName) if self.currentPropName else 'Press LEFT or RIGHT to change color, ESC to stop'
- blf.enable(0, blf.SHADOW)
- blf.shadow(0, 3, 0.0, 0.0, 0.0, 1.0)
- blf.shadow_offset(0, 2, -2)
- bgl.glColor3f(1.0, 1.0, 1.0)
- blf.position(0, 40, 40, 0)
- blf.draw(0, '(Press ESC to stop)')
- blf.position(0, 40, 70, 0)
- blf.draw(0, text)
- blf.disable(0, blf.SHADOW)
- class RandomThemeOperator(bpy.types.Operator):
- bl_idname = "wm.random_theme_operator"
- bl_label = "Random Theme Operator"
- bl_options = {'REGISTER'}
- def getColorProps(self, colorsList, prop, propName, parentName=''):
- for subProp in prop.rna_type.properties:
- if subProp.identifier in {'rna_type', 'srna', 'fixed_type'}: # Ignore some properties.
- continue
- if hasattr(subProp, 'type'):
- if subProp.type == 'POINTER':
- self.getColorProps(colorsList, getattr(prop, subProp.identifier), subProp.name, parentName if parentName else prop.name)
- elif subProp.subtype == 'COLOR_GAMMA' or subProp.subtype == 'COLOR':
- colorsList.append(
- (prop, subProp.identifier, parentName + ' ' + propName + ' ' + subProp.identifier)
- )
- else:
- self.getColorProps(colorsList, getattr(prop, subProp.identifier), subProp.name, parentName if parentName else prop.name)
- return colorsList
- def updateColor(self, r, g, b):
- prop, attr, name = self.allColorsList[self.index]
- setattr(prop, attr, (r, g, b, 1.0) if len(getattr(prop, attr)) == 4 else (r, g, b))
- self.currentPropName = name
- def modal(self, context, event):
- context.area.tag_redraw()
- if event.type in {'LEFTMOUSE', 'RIGHTMOUSE', 'ESC'}:
- bpy.types.SpaceView3D.draw_handler_remove(self._handle, 'WINDOW')
- bpy.ops.ui.reset_default_theme()
- self.report({'INFO'}, 'Cancelled')
- return {'CANCELLED'}
- if event.type == 'RIGHT_ARROW' and event.value == 'PRESS':
- r, g, b = 0.1, 0.3, 0.7
- if self.lastDirection == 0:
- self.updateColor(r, g, b)
- self.index = min(self.index + 1, self.maxLimit)
- self.updateColor(r, g, b)
- self.lastDirection = 1
- elif event.type == 'LEFT_ARROW' and event.value == 'PRESS':
- r, g, b = 0.7, 0.5, 0.0
- if self.lastDirection == 1:
- self.updateColor(r, g, b)
- self.index = max(self.index - 1, 0)
- self.updateColor(r, g, b)
- self.lastDirection = 0
- return {'RUNNING_MODAL'}
- def execute(self, context):
- self.index = 0
- theme = context.user_preferences.themes[0]
- self.allColorsList = tuple(reversed(self.getColorProps([ ], theme, theme.name)))
- self.currentPropName = ''
- self.maxLimit = len(self.allColorsList)-1
- self.lastDirection = 1
- self._handle = bpy.types.SpaceView3D.draw_handler_add(drawCallback, (self,), 'WINDOW', 'POST_PIXEL')
- context.window_manager.modal_handler_add(self)
- context.area.tag_redraw()
- return {'RUNNING_MODAL'}
- def register():
- bpy.utils.register_class(RandomThemeOperator)
- def unregister():
- bpy.utils.unregister_class(RandomThemeOperator)
- if __name__ == "__main__":
- register()
- # Go to the 3D View, press SPACE and type "random theme operator".
- # Then hold the RIGHT ARROW key.
Add Comment
Please, Sign In to add comment