[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