From 3581b997d4793e8fd9ad7be7722b01edb2d75287 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 24 Apr 2018 09:19:28 +0200 Subject: [PATCH] UI: use icons for the toolbar --- release/datafiles/blender_icons_geom.py | 20 +++++-- .../datafiles/icons/ops.generic.cursor.dat | Bin 0 -> 2600 bytes .../icons/ops.generic.select_border.dat | Bin 0 -> 1700 bytes .../icons/ops.generic.select_circle.dat | Bin 0 -> 2996 bytes .../icons/ops.generic.select_lasso.dat | Bin 0 -> 6776 bytes .../icons/ops.transform.resize.cage.dat | Bin 0 -> 1106 bytes .../datafiles/icons/ops.transform.resize.dat | Bin 0 -> 2078 bytes .../datafiles/icons/ops.transform.rotate.dat | Bin 0 -> 5732 bytes .../icons/ops.transform.translate.dat | Bin 0 -> 3716 bytes .../startup/bl_ui/space_toolsystem_common.py | 55 ++++++++++++++---- .../startup/bl_ui/space_toolsystem_toolbar.py | 44 +++++++------- .../editors/interface/interface_icons.c | 9 +++ source/creator/CMakeLists.txt | 6 ++ 13 files changed, 97 insertions(+), 37 deletions(-) create mode 100644 release/datafiles/icons/ops.generic.cursor.dat create mode 100644 release/datafiles/icons/ops.generic.select_border.dat create mode 100644 release/datafiles/icons/ops.generic.select_circle.dat create mode 100644 release/datafiles/icons/ops.generic.select_lasso.dat create mode 100644 release/datafiles/icons/ops.transform.resize.cage.dat create mode 100644 release/datafiles/icons/ops.transform.resize.dat create mode 100644 release/datafiles/icons/ops.transform.rotate.dat create mode 100644 release/datafiles/icons/ops.transform.translate.dat diff --git a/release/datafiles/blender_icons_geom.py b/release/datafiles/blender_icons_geom.py index b98f5a5a67d..3e2e5732074 100644 --- a/release/datafiles/blender_icons_geom.py +++ b/release/datafiles/blender_icons_geom.py @@ -123,7 +123,7 @@ def write_mesh_data_lists(me): return (tris_coords, tris_colors) -def write_mesh_to_py(fh, me): +def write_mesh_to_py(fh, ob): def float_as_byte(f): # -1..1 -> 0..255 @@ -131,14 +131,24 @@ def write_mesh_to_py(fh, me): f = int(round(f * 255)) return min(max(f, 0), 255) - tris_coords, tris_colors = write_mesh_data_lists(me) + with TriMesh(ob) as me: + tris_coords, tris_colors = write_mesh_data_lists(me) + + # pixel size needs to be increased since a pixel needs one extra geom coordinate + coords_range = ( + ob.get("size_x") or 255, + ob.get("size_y") or 255, + ) + + + print("Writing:", fh.name, coords_range) fw = fh.write # Header (version 0). fw(b'VCO\x00') # Width, Height - fw(bytes((255, 255))) + fw(bytes(coords_range)) # X, Y fw(bytes((0, 0))) @@ -197,10 +207,8 @@ def main(): for name, ob in objects: filename = os.path.join(args.output_dir, name + ".dat") - print("Writing:", filename) with open(filename, 'wb') as fh: - with TriMesh(ob) as me: - write_mesh_to_py(fh, me) + write_mesh_to_py(fh, ob) if __name__ == "__main__": diff --git a/release/datafiles/icons/ops.generic.cursor.dat b/release/datafiles/icons/ops.generic.cursor.dat new file mode 100644 index 0000000000000000000000000000000000000000..cdb38ace5098a43c565b46f46eb8eb98a8c5d4f1 GIT binary patch literal 2600 zcmeHFvC6AR82!852gnm_al3_m2NlsM24OCkLWCe#h=r*H!2!Wa3rQh}AQoB(qNo{y z<~i<5Aq%|E`Z)LRevb3-9+2P}zJgcq^k4p(2lp@!;pr3n#4rE#eugV776S3@ z&-&p1wqpVo?7$xq0{9$?n86SU{*Zw4fcSUte{60~$j@@Q#1t6(YeO5+;Y3 z4_l15gpC$=avnAlh!Gpzy~SNU)_eaC!K?SgoGZfnJ%ZJd6DY(!xLQ&hFCF_lq~6Vdtkw1F>{^0)m@@Bo|7eFv49z8 zau@r7Nwnf;e2mzHvj+QNl2l5#8*hx(V3JI^@wuS4#(3@vH5W=*YtB7tD^$w$=~QbC zY8$OSwMZ>awOsb+Mr)Ch$)%8wMyvN{DHU@5M$GOq8eAf!{B3dui<0X*|^`clLAF?S$ zx_Xg~t{5_sBcy3ahX$*z(BBwAgH>M}@*!shCX3L80H?&a2VhuJJWS`7w8j4gg)VjSc5a! zk5r0}31^I#&Kfc$m2SM=UOHne)J(|*tR&t)f-L8 z)B?sdx=X7|sgemfF$b%=aLF;2(!c)r^ZWPx|8?-|?|;5OxxcB4UPsaY@uT@Y_)||> zzX#JZ(E2?*t=Ym`p0xf`&6b|#X}pz1Yqs##+C4n2*}`-#t=YrVnl1dPC#~Ou>0DaB rho?1L_)||>zX#K~Tl!BmTY8$OF`Y~Ed+^rUJv^=1!t@NZW{dw9QRFZh literal 0 HcmV?d00001 diff --git a/release/datafiles/icons/ops.generic.select_border.dat b/release/datafiles/icons/ops.generic.select_border.dat new file mode 100644 index 0000000000000000000000000000000000000000..9a05dbc7c8dcfd0d794b1a29fc5ace5410821a94 GIT binary patch literal 1700 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 Q(J*-sJ*oy0jzcAU0E=g%O#lD@ literal 0 HcmV?d00001 diff --git a/release/datafiles/icons/ops.transform.resize.dat b/release/datafiles/icons/ops.transform.resize.dat new file mode 100644 index 0000000000000000000000000000000000000000..bd1688705aa4678e85f7dcd63955eac4d751826d GIT binary patch literal 2078 zcmeH`QES^)6vzENWK}4>R3Nb7f~XLZ9?DABJQc#Wr_Ku)ck9?1+legf7*`=dmK}_B zm2Nn#4QAGZz2K)c47Rl76ZD~Z2q83iXrKBe)N|}A^+OxT9=4Yuj{f)fo_p`{|NivN z7k3lauO|}j`Xbl5@$Spl_x7o~u3uZ^ZYFPWi`;GQ4!m18@YmZgy2a_&ZYCGGefs*I zyRM`um823Y_{+}rCZ$Tc?I>wg_G_xFNvxttItj`;F~nfi5KSQ{nu5tYSx}zRtyV_K zC>w2AmDPGj(j=|w6P@Tb6AjT=3j`=GG2R^K-g@V|z3$;rv%l=*M@tj7GR}oo!OxGD zouC}7hSo-VtJUo1N6j}&6MOjd3`YIQi9PIfj}KnG9Jr@@#|NQxzI(d2z1emKu06C_ z)gR}a>|}}3j6&p$BCBFXRwYfKl16l1A-ZTJRnZVkPJ^~hPUp>}!Rhco&S^N8RI!d% zaE(B5y_mthh%8CyjZBoZOfsS>XGAJ!5)~9)Ckn4}hNyBHX9^l@XYx8{z#AUOO#$Z& z5$kkFe zD6|GHs|;Mf#wtOPt%MewRSd1rg1o%d@*2&)*XVVd{bs-3*=XlSPtTff?BV1Dw10Rs zIq7u=?(xCE4Xx9?&>H9Pe!T|Xjb9tMz3%qrz^(fAPP1_k)jA&63Oe9xffmnen$0BU~T zo$A8FC(%No2m3sU#A0t6nBy4tPJv#8{achO&w@PqJxbNb(;(g-5%HeQqVrco{J&?h z^E@Iu&@aY^zK_2BE{fy+pZB9U;{W$gG~VMfjnBMHFFX6IXJ;38a9Q2|b01l~su%N| z#Jr%+INzP|_<{2&^T0WBf5AHD$UAb5imW5&m;>|3HRkiI$IMT8pMD2jn1?l=;vV>q rxkvrTJ@6lMk9xs9@DKgZGdIsD`tx6KHQ&SM#`8UYZhY1Iy=wh?2McXh literal 0 HcmV?d00001 diff --git a/release/datafiles/icons/ops.transform.rotate.dat b/release/datafiles/icons/ops.transform.rotate.dat new file mode 100644 index 0000000000000000000000000000000000000000..79ebaa46cd2f8a27f3d25d685b3f9460327c1db3 GIT binary patch literal 5732 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 C;IVZ8 literal 0 HcmV?d00001 diff --git a/release/datafiles/icons/ops.transform.translate.dat b/release/datafiles/icons/ops.transform.translate.dat new file mode 100644 index 0000000000000000000000000000000000000000..590fe6339a7ca7bc1c5c07265f487c17fe5e888f GIT binary patch literal 3716 zcmeHG-BVNP9j3k5>GY=4-i8nZXNUq5jT4#>k|T%%6_iB=SqkDRq;(;H;Ug3X62LZm zR0wd+!BvAgp(9y03?yB;4p!yH8@=#GFI*TtlI$)!PItHc2j2dkLk^}hcBU6z_MCan z^ZUJ@=lwnJQ(g37N@iwC%CWQpbx~@}9<}dYbeG=Fzn3>q`5-*{I22cyW2=DjeFm3srOs^H}w6+{xyBSw#Vrkx5wz~F7=e$ z&L60BpLvkyKGR#VV(zWzDG$@xdryVv?C#Qgd9nK4i`({M?)ZUnRiUPUPJjGBq2@H5 zy&w&z#_0>vj?w8oB|Rsun|n?;3w^oH!X|$7XcOO%KXkYuzs}s3({ZRTr_NkwuB94O z8!L}EGAoai=h(UOoYI5!+R}r?+}X5M%M*UA>Iwg}NUVNZ^sMAg&9jmhW%p}el)bE2 zIrp;Sb=BJW*HxP}&o6A&#Ohx)81)8&PN(KOgj8F5*b#CpxFYM(_He`*|0?2&ZO{4V zr8)mjbT$y*nwNr;vw`iXFX#(y#YRJ;q0QLP($LaI%pHzz1}7Is;v0)2%Y*Ut<-tfF z&F_o2CcFlNQ9m_o)SI$qJfTw9cZl^b4Gov-XNwo7UDXYG`nmsOBTikYl-ZG}J5h3+}KZ(0XfVsr8mq z5<7)<$tk$Sp2d+!U!XbSinxN!5vMESSa1Zo#BR|kEf4xzB7JlI@v#Z-j3+obH9Q-* z>hoUn1wGSOeeUpj)DvX7hHfPjlb9${QORqI(EINZGS8e5T)h3lq zYf@QMyv9Py@oKBeMqhd<=QZfFX)(^qVU9(I`KBzarKXy62<_q4B}XW>9o?Dp&-tS} zJJI-7Y& z8Xg~;^Lww&`DX+8)7b!Sa=+l2c851&>(P{ylr_Q=!Xv^5gr5?AMYu#z9=j3{|2`>B z9@CW6{z+2&lce}dioYOyPQaeX|3<*xVDzDVm4LoA!b1Xb#2AOXk$`{1(@ZEMAnzjJ z|B&}5<$p@bCn=T)e@yU1BEC&LOF+IrxJy93M8N;vCEz(jNUjI+_w}sNLI7$29q`~> z|0{l(7z_SIA_gbNKTouSf0l^BA0%REiu&TgIZ;nMU`21RqBmI48?20h?utgx651*H zD%ztBF|-G-5frTvLu)XAvG_0Ojdj7$8(M>*H~tX}z0n4S-e`l~VB~<0fO`Nyd*}{c zAV7EU65(!waR%H2<$0gFV@=s7XIHkE0#1C)WC)L0=i|%!*llcN@4}DckXOH+itRSr=Qlj z$+YeM{{Ys`ptgPdA;2=a_rQ7Xvy6eyWN@Q@W!&f&d+@C?ZtCG4ghz~{ddf)D_tz7} zOhL5%?_wPT&2A72m9s*Dakp%RUO$vuZ-+UuxOK>uVD=QCVP!?#c#@(WZn0?c0=}?;x*ZK icon_value) map +_icon_cache = {} + class ToolSelectPanelHelper: """ Generic Class, can be used for any toolbar. @@ -51,6 +54,28 @@ class ToolSelectPanelHelper: an optional triple of: ``(operator_id, operator_properties, keymap_item_args)`` """ + @staticmethod + def _icon_value_from_icon_handle(icon_name): + import os + if icon_name is not None: + assert(type(icon_name) is str) + icon_value = _icon_cache.get(icon_name) + if icon_value is None: + dirname = bpy.utils.resource_path('SYSTEM') + filename = os.path.join(dirname, "datafiles", "icons", icon_name + ".dat") + try: + icon_value = bpy.app.icons.new_triangles_from_file(filename) + except Exception as ex: + if os.path.exists(filename): + print("Missing icons:", filename, ex) + else: + print("Corrupt icon:", filename, ex) + icon_value = 0 + _icon_cache[icon_name] = icon_value + return icon_value + else: + return 0 + @staticmethod def _tool_is_group(tool): return type(tool[0]) is not str @@ -68,9 +93,9 @@ class ToolSelectPanelHelper: @classmethod def _tool_vars_from_def(cls, item): - text, mp_idname, actions = item + text, icon_name, mp_idname, actions = item km, km_idname = (None, None) if actions is None else cls._tool_keymap[text] - return (km_idname, mp_idname) + return (km_idname, mp_idname), icon_name @staticmethod def _tool_vars_from_active_with_index(context): @@ -89,7 +114,7 @@ class ToolSelectPanelHelper: ) @classmethod - def _km_actionmouse_simple(cls, kc, text, actions): + def _km_actionmouse_simple(cls, kc, text, icon_name, actions): # standalone def props_assign_recursive(rna_props, py_props): @@ -135,9 +160,9 @@ class ToolSelectPanelHelper: return for item in ToolSelectPanelHelper._tools_flatten(cls.tools_all()): - text, mp_idname, actions = item + text, icon_name, mp_idname, actions = item if actions is not None: - km, km_idname = cls._km_actionmouse_simple(kc, text, actions) + km, km_idname = cls._km_actionmouse_simple(kc, text, icon_name, actions) cls._tool_keymap[text] = km, km_idname def draw(self, context): @@ -151,12 +176,16 @@ class ToolSelectPanelHelper: tool_def_active, index_active = self._tool_vars_from_active_with_index(context) layout = self.layout + scale_y = 2.0 + for tool_items in self.tools_from_context(context): if tool_items: col = layout.column(align=True) + col.scale_y = scale_y for item in tool_items: if item is None: col = layout.column(align=True) + col.scale_y = scale_y continue if self._tool_is_group(item): @@ -165,7 +194,7 @@ class ToolSelectPanelHelper: for i, sub_item in enumerate(item): if sub_item is None: continue - tool_def = self._tool_vars_from_def(sub_item) + tool_def, icon_name = self._tool_vars_from_def(sub_item) is_active = (tool_def == tool_def_active) if is_active: index = i @@ -184,21 +213,23 @@ class ToolSelectPanelHelper: index = -1 use_menu = False - tool_def = self._tool_vars_from_def(item) + tool_def, icon_name = self._tool_vars_from_def(item) is_active = (tool_def == tool_def_active) - + icon_value = ToolSelectPanelHelper._icon_value_from_icon_handle(icon_name) if use_menu: props = col.operator_menu_hold( "wm.tool_set", text=item[0], depress=is_active, menu="WM_MT_toolsystem_submenu", + icon_value=icon_value, ) else: props = col.operator( "wm.tool_set", text=item[0], depress=is_active, + icon_value=icon_value, ) props.keymap = tool_def[0] or "" @@ -231,7 +262,7 @@ class WM_MT_toolsystem_submenu(Menu): if (item_group is not None) and ToolSelectPanelHelper._tool_is_group(item_group): if index_button < len(item_group): item = item_group[index_button] - tool_def = cls._tool_vars_from_def(item) + tool_def, icon_name = cls._tool_vars_from_def(item) is_active = (tool_def == tool_def_button) if is_active: return cls, item_group, index_button @@ -239,6 +270,8 @@ class WM_MT_toolsystem_submenu(Menu): def draw(self, context): layout = self.layout + layout.scale_y = 2.0 + cls, item_group, index_active = self._tool_group_from_button(context) if item_group is None: # Should never happen, just in case @@ -250,10 +283,12 @@ class WM_MT_toolsystem_submenu(Menu): if item is None: layout.separator() continue - tool_def = cls._tool_vars_from_def(item) + tool_def, icon_name = cls._tool_vars_from_def(item) + icon_value = ToolSelectPanelHelper._icon_value_from_icon_handle(icon_name) props = layout.operator( "wm.tool_set", text=item[0], + icon_value=icon_value, ) props.keymap = tool_def[0] or "" props.manipulator_group = tool_def[1] or "" diff --git a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py index d08c7cd8815..77708a3ee5c 100644 --- a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py +++ b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py @@ -53,34 +53,36 @@ class VIEW3D_PT_tools_active(ToolSelectPanelHelper, Panel): # for reuse _tools_transform = ( - ("Translate", "TRANSFORM_WGT_manipulator", + ("Translate", "ops.transform.translate", "TRANSFORM_WGT_manipulator", (("transform.translate", dict(release_confirm=True), dict(type='EVT_TWEAK_A', value='ANY')),)), - ("Rotate", "TRANSFORM_WGT_manipulator", + ("Rotate", "ops.transform.rotate", "TRANSFORM_WGT_manipulator", (("transform.rotate", dict(release_confirm=True), dict(type='EVT_TWEAK_A', value='ANY')),)), - ("Scale", "TRANSFORM_WGT_manipulator", - (("transform.resize", dict(release_confirm=True), dict(type='EVT_TWEAK_A', value='ANY')),)), - ("Scale Cage", "VIEW3D_WGT_xform_cage", None), + ( + ("Scale", "ops.transform.resize", "TRANSFORM_WGT_manipulator", + (("transform.resize", dict(release_confirm=True), dict(type='EVT_TWEAK_A', value='ANY')),)), + ("Scale Cage", "ops.transform.resize.cage", "VIEW3D_WGT_xform_cage", None), + ), None, - ("Ruler/Protractor", "VIEW3D_WGT_ruler", + ("Ruler/Protractor", None, "VIEW3D_WGT_ruler", (("view3d.ruler_add", dict(), dict(type='EVT_TWEAK_A', value='ANY')),)), ) _tools = { None: [ - ("Cursor", None, + ("Cursor", "ops.generic.cursor", None, (("view3d.cursor3d", dict(), dict(type='ACTIONMOUSE', value='CLICK')),)), # 'Select' Group ( - ("Select Border", None, ( + ("Select Border", "ops.generic.select_border", None, ( ("view3d.select_border", dict(deselect=False), dict(type='EVT_TWEAK_A', value='ANY')), ("view3d.select_border", dict(deselect=True), dict(type='EVT_TWEAK_A', value='ANY', ctrl=True)), )), - ("Select Circle", None, ( + ("Select Circle", "ops.generic.select_circle", None, ( ("view3d.select_circle", dict(deselect=False), dict(type='ACTIONMOUSE', value='PRESS')), ("view3d.select_circle", dict(deselect=True), dict(type='ACTIONMOUSE', value='PRESS', ctrl=True)), )), - ("Select Lasso", None, ( + ("Select Lasso", "ops.generic.select_lasso", None, ( ("view3d.select_lasso", dict(deselect=False), dict(type='EVT_TWEAK_A', value='ANY')), ("view3d.select_lasso", @@ -97,28 +99,28 @@ class VIEW3D_PT_tools_active(ToolSelectPanelHelper, Panel): ], 'EDIT_ARMATURE': [ *_tools_transform, - ("Roll", None, ( + ("Roll", None, None, ( ("transform.transform", dict(release_confirm=True, mode='BONE_ROLL'), dict(type='EVT_TWEAK_A', value='ANY')), )), None, - ("Extrude Cursor", None, + ("Extrude Cursor", None, None, (("armature.click_extrude", dict(), dict(type='ACTIONMOUSE', value='PRESS')),)), ], 'EDIT_MESH': [ *_tools_transform, None, - ("Rip Region", None, ( + ("Rip Region", None, None, ( ("mesh.rip_move", dict(TRANSFORM_OT_translate=dict(release_confirm=True)), dict(type='ACTIONMOUSE', value='PRESS')), )), - ("Rip Edge", None, ( + ("Rip Edge", None, None, ( ("mesh.rip_edge_move", dict(TRANSFORM_OT_translate=dict(release_confirm=True)), dict(type='ACTIONMOUSE', value='PRESS')), )), - ("Poly Build", None, ( + ("Poly Build", None, None, ( ("mesh.polybuild_face_at_cursor_move", dict(TRANSFORM_OT_translate=dict(release_confirm=True)), dict(type='ACTIONMOUSE', value='PRESS')), @@ -132,30 +134,30 @@ class VIEW3D_PT_tools_active(ToolSelectPanelHelper, Panel): # Knife Group ( - ("Knife", None, ( + ("Knife", None, None, ( ("mesh.knife_tool", dict(wait_for_input=False, use_occlude_geometry=True, only_selected=False), dict(type='ACTIONMOUSE', value='PRESS')),)), - ("Knife (Selected)", None, ( + ("Knife (Selected)", None, None, ( ("mesh.knife_tool", dict(wait_for_input=False, use_occlude_geometry=False, only_selected=True), dict(type='ACTIONMOUSE', value='PRESS')),)), None, - ("Bisect", None, ( + ("Bisect", None, None, ( ("mesh.bisect", dict(), dict(type='EVT_TWEAK_A', value='ANY')),)), ), # End group. - ("Extrude Cursor", None, + ("Extrude Cursor", None, None, (("mesh.dupli_extrude_cursor", dict(), dict(type='ACTIONMOUSE', value='PRESS')),)), ], 'EDIT_CURVE': [ *_tools_transform, None, - ("Draw", None, + ("Draw", None, None, (("curve.draw", dict(wait_for_input=False), dict(type='ACTIONMOUSE', value='PRESS')),)), - ("Extrude Cursor", None, + ("Extrude Cursor", None, None, (("curve.vertex_add", dict(), dict(type='ACTIONMOUSE', value='PRESS')),)), ], } diff --git a/source/blender/editors/interface/interface_icons.c b/source/blender/editors/interface/interface_icons.c index ec255ed73a0..e81ab44150f 100644 --- a/source/blender/editors/interface/interface_icons.c +++ b/source/blender/editors/interface/interface_icons.c @@ -1226,6 +1226,15 @@ static void icon_draw_size( /* We need to flush widget base first to ensure correct ordering. */ UI_widgetbase_draw_cache_flush(); + /* TODO(campbell): scale icons up for toolbar, we need a way to detect larger buttons and do this automatic. */ + { + /* Icons are currently 38 aligned, scale from 16 -> 38. */ + float scale = 2.375f; + y = (y + (h / 2)) - ((h * scale) / 2); + w *= scale; + h *= scale; + } + /* This could re-generate often if rendered at different sizes in the one interface. * TODO(campbell): support caching multiple sizes. */ ImBuf *ibuf = di->data.geom.image_cache; diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt index c5d1a55dfd6..5ed9355105a 100644 --- a/source/creator/CMakeLists.txt +++ b/source/creator/CMakeLists.txt @@ -958,6 +958,12 @@ delayed_do_install(${TARGETDIR_VER}) unset(BLENDER_TEXT_FILES) unset(BLENDER_TEXT_FILES_DESTINATION) +# Geometry icons. +install( + DIRECTORY + ${CMAKE_SOURCE_DIR}/release/datafiles/icons + DESTINATION ${TARGETDIR_VER}/datafiles +) # ----------------------------------------------------------------------------- # Setup link libs