[Bf-extensions-cvs] [3719604] master: Replace Icons addon with Icon Viewer - T50367
raa
noreply at git.blender.org
Thu Jan 26 18:36:36 CET 2017
Commit: 371960484a38fc64e0a2635170a41a0d8ab2f6bd
Author: raa
Date: Thu Jan 26 20:22:20 2017 +0300
Branches: master
https://developer.blender.org/rBA371960484a38fc64e0a2635170a41a0d8ab2f6bd
Replace Icons addon with Icon Viewer - T50367
===================================================================
M development_icon_get.py
===================================================================
diff --git a/development_icon_get.py b/development_icon_get.py
index 2439355..bebf098 100644
--- a/development_icon_get.py
+++ b/development_icon_get.py
@@ -20,224 +20,463 @@
bl_info = {
- "name": "Icons",
- "author": "Crouch, N.tox, PKHG, Campbell Barton, Dany Lebel",
- "version": (1, 5, 2),
- "blender": (2, 57, 0),
- "location": "Text Editor > Properties or " "Console > Console Menu",
- "warning": "",
- "description": "Click an icon to display its name and "
- "copy it to the clipboard",
- "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.6/"
- "Py/Scripts/System/Display_All_Icons",
- "category": "Development",
+ "name": "Icon Viewer",
+ "description": "Click an icon to copy its name to the clipboard",
+ "author": "roaoao",
+ "version": (1, 3, 1),
+ "blender": (2, 75, 0),
+ "location": "Spacebar > Icon Viewer, Text Editor > Properties",
+ "wiki_url": (
+ "https://wiki.blender.org/index.php/User:Raa/Addons/Icon_Viewer"),
+ "tracker_url": "http://blenderartists.org/forum/showthread.php?392912",
+ "category": "Development"
}
-
import bpy
+import math
+
+DPI = 72
+POPUP_PADDING = 10
+PANEL_PADDING = 44
+WIN_PADDING = 32
+ICON_SIZE = 20
+HISTORY_SIZE = 100
+HISTORY = []
+
+
+def ui_scale():
+ ret = bpy.context.user_preferences.system.dpi / DPI
+ if bpy.context.user_preferences.system.virtual_pixel_mode == 'DOUBLE':
+ ret *= 2
+ return ret
+
+
+def prefs():
+ return bpy.context.user_preferences.addons[__name__].preferences
+
+
+class Icons:
+ def __init__(self):
+ self._filtered_icons = None
+ self._filter = ""
+ self.filter = ""
+ self.selected_icon = ""
+
+ @property
+ def filter(self):
+ return self._filter
+
+ @filter.setter
+ def filter(self, value):
+ if self._filter == value:
+ return
+
+ self._filter = value
+ self.update()
+
+ @property
+ def filtered_icons(self):
+ if self._filtered_icons is None:
+ self._filtered_icons = []
+ icon_filter = self._filter.upper()
+ self.filtered_icons.clear()
+ pr = prefs()
+
+ icons = bpy.types.UILayout.bl_rna.functions[
+ "prop"].parameters["icon"].enum_items.keys()
+ for icon in icons:
+ if icon == 'NONE' or \
+ icon_filter and icon_filter not in icon or \
+ not pr.show_brush_icons and "BRUSH_" in icon and \
+ icon != 'BRUSH_DATA' or \
+ not pr.show_matcap_icons and "MATCAP_" in icon or \
+ not pr.show_colorset_icons and "COLORSET_" in icon:
+ continue
+ self._filtered_icons.append(icon)
+
+ return self._filtered_icons
+
+ @property
+ def num_icons(self):
+ return len(self.filtered_icons)
+
+ def update(self):
+ if self._filtered_icons is not None:
+ self._filtered_icons.clear()
+ self._filtered_icons = None
+
+ def draw(self, layout, num_cols=0, icons=None, select=True):
+ if icons:
+ filtered_icons = reversed(icons)
+ else:
+ filtered_icons = self.filtered_icons
+
+ column = layout.column(True)
+ row = column.row(True)
+ row.alignment = 'CENTER'
+
+ op_name = IV_OT_icon_select.bl_idname if select else \
+ IV_OT_icon_copy.bl_idname
+
+ col_idx = 0
+ for i, icon in enumerate(filtered_icons):
+ p = row.operator(
+ op_name, "",
+ icon=icon, emboss=select and icon == self.selected_icon)
+ p.icon = icon
+
+ col_idx += 1
+ if col_idx > num_cols - 1:
+ if icons:
+ break
+ col_idx = 0
+ if i < len(filtered_icons) - 1:
+ row = column.row(True)
+ row.alignment = 'CENTER'
+
+ if col_idx != 0 and not icons and i >= num_cols:
+ sub = row.row(True)
+ sub.scale_x = num_cols - col_idx
+ sub.label("", icon='BLANK1')
+
+ if not filtered_icons:
+ row.label("No icons were found")
+
+
+class IV_Preferences(bpy.types.AddonPreferences):
+ bl_idname = __name__
+
+ panel_icons = Icons()
+ popup_icons = Icons()
+
+ def update_icons(self, context):
+ self.panel_icons.update()
+ self.popup_icons.update()
+
+ def set_panel_filter(self, value):
+ self.panel_icons.filter = value
+
+ panel_filter = bpy.props.StringProperty(
+ description="Filter",
+ default="",
+ get=lambda s: s.panel_icons.filter,
+ set=set_panel_filter,
+ options={'TEXTEDIT_UPDATE'})
+ show_panel_icons = bpy.props.BoolProperty(
+ name="Show Icons",
+ description="Show icons", default=True)
+ show_history = bpy.props.BoolProperty(
+ name="Show History",
+ description="Show history", default=True)
+ show_brush_icons = bpy.props.BoolProperty(
+ name="Show Brush Icons",
+ description="Show brush icons", default=True,
+ update=update_icons)
+ show_matcap_icons = bpy.props.BoolProperty(
+ name="Show Matcap Icons",
+ description="Show matcap icons", default=True,
+ update=update_icons)
+ show_colorset_icons = bpy.props.BoolProperty(
+ name="Show Colorset Icons",
+ description="Show colorset icons", default=True,
+ update=update_icons)
+ copy_on_select = bpy.props.BoolProperty(
+ name="Copy Icon On Click",
+ description="Copy icon on click", default=True)
+ close_on_select = bpy.props.BoolProperty(
+ name="Close Popup On Click",
+ description=(
+ "Close the popup on click.\n"
+ "Not supported by some windows (User Preferences, Render)."
+ ),
+ default=False)
+ auto_focus_filter = bpy.props.BoolProperty(
+ name="Auto Focus Input Field",
+ description="Auto focus input field", default=True)
+
+ def draw(self, context):
+ layout = self.layout
+ row = layout.row()
+ row.scale_y = 1.5
+ row.operator(IV_OT_icons_show.bl_idname)
+
+ row = layout.row()
+
+ col = row.column(True)
+ col.label("Icons:")
+ col.prop(self, "show_matcap_icons")
+ col.prop(self, "show_brush_icons")
+ col.prop(self, "show_colorset_icons")
+ col.separator()
+ col.prop(self, "show_history")
+
+ col = row.column(True)
+ col.label("Popup:")
+ col.prop(self, "auto_focus_filter")
+ col.prop(self, "copy_on_select")
+ if self.copy_on_select:
+ col.prop(self, "close_on_select")
+
+ col = row.column(True)
+ col.label("Panel:")
+ col.prop(self, "show_panel_icons")
+
+
+class IV_PT_icons(bpy.types.Panel):
+ bl_space_type = "TEXT_EDITOR"
+ bl_region_type = "UI"
+ bl_label = "Icon Viewer"
+
+ @staticmethod
+ def tag_redraw():
+ wm = bpy.context.window_manager
+ if not wm:
+ return
+ for w in wm.windows:
+ for a in w.screen.areas:
+ if a.type == 'TEXT_EDITOR':
+ for r in a.regions:
+ if r.type == 'UI':
+ r.tag_redraw()
-def create_icon_list_all():
- icons = bpy.types.UILayout.bl_rna.functions['prop'].parameters['icon'].\
- enum_items.keys()
+ def draw(self, context):
+ pr = prefs()
+ row = self.layout.row(True)
+ if pr.show_panel_icons:
+ row.prop(pr, "panel_filter", "", icon='VIEWZOOM')
+ else:
+ row.operator(IV_OT_icons_show.bl_idname)
+ row.operator(IV_OT_panel_menu_call.bl_idname, "", icon='COLLAPSEMENU')
+
+ _, y0 = context.region.view2d.region_to_view(0, 0)
+ _, y1 = context.region.view2d.region_to_view(0, 10)
+ region_scale = 10 / abs(y0 - y1)
+
+ num_cols = max(
+ 1,
+ (context.region.width - PANEL_PADDING) //
+ math.ceil(ui_scale() * region_scale * ICON_SIZE))
- icons.remove("NONE")
+ col = None
+ if HISTORY and pr.show_history:
+ col = self.layout.column(True)
+ pr.panel_icons.draw(col.box(), num_cols, HISTORY, False)
- return icons
+ if pr.show_panel_icons:
+ col = col or self.layout.column(True)
+ pr.panel_icons.draw(col.box(), num_cols, select=False)
-def create_icon_list():
- icons = create_icon_list_all()
- search = bpy.context.scene.icon_props.search.lower()
+class IV_HT_icons(bpy.types.Header):
+ bl_space_type = 'CONSOLE'
+
+ def draw(self, context):
+ layout = self.layout
+ layout.separator()
+ layout.operator(IV_OT_icons_show.bl_idname)
+
- if search == "":
- pass
- else:
- icons = [key for key in icons if search in key.lower()]
+class IV_OT_panel_menu_call(bpy.types.Operator):
+ bl_idname = "iv.panel_menu_call"
+ bl_label = ""
+ bl_description = "Menu"
+ bl_options = {'INTERNAL'}
- return icons
+ def menu(self, menu, context):
+ pr = prefs()
+ layout = menu.layout
+ layout.prop(pr, "show_panel_icons")
+ layout.prop(pr, "show_history")
+ if not pr.show_panel_icons:
+ return
+
+ layout.separator()
+ layout.prop(pr, "show_matcap_icons")
+ layout.prop(pr, "show_brush_icons")
+ layout.prop(pr, "show_colorset_icons")
+
+ def execute(self, context):
+ context.window_manager.popup_menu(self.menu, "Icon Viewer")
+ return {'FINISHED'}
+
+
+class IV_OT_icon_copy(bpy.types.Operator):
+ bl_idname = "iv.icon_copy"
+ bl_label = ""
+ bl_description = "Copy the icon"
+ bl_options = {'INTERNAL'}
-class WM_OT_icon_info(bpy.types.Operator):
- bl_idname = "wm.icon_info"
- bl_label = "Icon Info"
- bl_description = "Click to copy this icon name to the clipboard"
icon = bpy.props.StringProperty()
- icon_scroll = bpy.props.IntProper
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-extensions-cvs
mailing list