diff options
author | Xiao Xiangquan <xiaoxiangquan@gmail.com> | 2011-08-10 18:32:03 +0400 |
---|---|---|
committer | Xiao Xiangquan <xiaoxiangquan@gmail.com> | 2011-08-10 18:32:03 +0400 |
commit | 465c3b82fa8320c0366eaa72b2319c8b42f9c8f1 (patch) | |
tree | 9d458a8e0fdd9f12f3cb03eeeab246ca2523a707 /release/scripts/startup | |
parent | 16deef9e79721d3525244eaef11190b5ff0fd58b (diff) | |
parent | 22694c993a7e32767db4719e9fa37e93445b66a8 (diff) |
merge with trunk r39216
Diffstat (limited to 'release/scripts/startup')
15 files changed, 119 insertions, 82 deletions
diff --git a/release/scripts/startup/bl_operators/image.py b/release/scripts/startup/bl_operators/image.py index a0267b8b947..6fec536a9a6 100644 --- a/release/scripts/startup/bl_operators/image.py +++ b/release/scripts/startup/bl_operators/image.py @@ -61,13 +61,19 @@ class EditExternally(bpy.types.Operator): def execute(self, context): import os import subprocess - filepath = os.path.normpath(bpy.path.abspath(self.filepath)) + + filepath = self.filepath + + if not filepath: + self.report({'ERROR'}, "Image path not set") + return {'CANCELLED'} + + filepath = os.path.normpath(bpy.path.abspath(filepath)) if not os.path.exists(filepath): self.report({'ERROR'}, "Image path %r not found, image may be packed or " "unsaved." % filepath) - return {'CANCELLED'} cmd = self._editor_guess(context) + [filepath] diff --git a/release/scripts/startup/bl_operators/object_align.py b/release/scripts/startup/bl_operators/object_align.py index 04a4d7d8f42..99507aadc12 100644 --- a/release/scripts/startup/bl_operators/object_align.py +++ b/release/scripts/startup/bl_operators/object_align.py @@ -22,6 +22,7 @@ import bpy from mathutils import Vector from blf import gettext as _ + def GlobalBB_LQ(bb_world): # Initialize the variables with the 8th vertex @@ -34,7 +35,7 @@ def GlobalBB_LQ(bb_world): ) # Test against the other 7 verts - for i in range (7): + for i in range(7): # X Range val = bb_world[i][0] @@ -62,6 +63,7 @@ def GlobalBB_LQ(bb_world): return (Vector((left, front, up)), Vector((right, back, down))) + def GlobalBB_HQ(obj): matrix_world = obj.matrix_world.copy() @@ -81,7 +83,7 @@ def GlobalBB_HQ(obj): ) # Test against all other verts - for i in range (len(verts)-1): + for i in range(len(verts) - 1): vco = matrix_world * verts[i].co diff --git a/release/scripts/startup/bl_operators/uvcalc_lightmap.py b/release/scripts/startup/bl_operators/uvcalc_lightmap.py index 9ae0cd0ddf9..2f1acf0a5dc 100644 --- a/release/scripts/startup/bl_operators/uvcalc_lightmap.py +++ b/release/scripts/startup/bl_operators/uvcalc_lightmap.py @@ -520,7 +520,7 @@ def unwrap(operator, context, **kwargs): if obj and obj.type == 'MESH': meshes = [obj.data] else: - meshes = {me.name: me for obj in context.selected_objects if obj.type == 'MESH' for me in (obj.data,) if not me.library if len(me.faces)}.values() + meshes = list({me for obj in context.selected_objects if obj.type == 'MESH' for me in (obj.data,) if me.faces and me.library is None}) if not meshes: operator.report({'ERROR'}, "No mesh object.") diff --git a/release/scripts/startup/bl_operators/wm.py b/release/scripts/startup/bl_operators/wm.py index ae44860c3dd..4d0c143eab5 100644 --- a/release/scripts/startup/bl_operators/wm.py +++ b/release/scripts/startup/bl_operators/wm.py @@ -587,7 +587,7 @@ class WM_OT_context_modal_mouse(bpy.types.Operator): self._values_clear() return {'FINISHED'} - elif event_type in ('RIGHTMOUSE', 'ESC'): + elif event_type in {'RIGHTMOUSE', 'ESC'}: self._values_restore() return {'FINISHED'} @@ -841,7 +841,7 @@ class WM_OT_properties_edit(bpy.types.Operator): prop_ui = rna_idprop_ui_prop_get(item, prop) - if prop_type in (float, int): + if prop_type in {float, int}: prop_ui['soft_min'] = prop_ui['min'] = prop_type(self.min) prop_ui['soft_max'] = prop_ui['max'] = prop_type(self.max) diff --git a/release/scripts/startup/bl_ui/properties_data_curve.py b/release/scripts/startup/bl_ui/properties_data_curve.py index 316ea167597..cd15f978e26 100644 --- a/release/scripts/startup/bl_ui/properties_data_curve.py +++ b/release/scripts/startup/bl_ui/properties_data_curve.py @@ -361,7 +361,7 @@ class DATA_PT_paragraph(CurveButtonsPanel, bpy.types.Panel): col.prop(text, "offset_y", text="Y") -class DATA_PT_textboxes(CurveButtonsPanel, bpy.types.Panel): +class DATA_PT_text_boxes(CurveButtonsPanel, bpy.types.Panel): bl_label = _("Text Boxes") @classmethod diff --git a/release/scripts/startup/bl_ui/properties_data_empty.py b/release/scripts/startup/bl_ui/properties_data_empty.py index 377f637e72c..4ed1d23f814 100644 --- a/release/scripts/startup/bl_ui/properties_data_empty.py +++ b/release/scripts/startup/bl_ui/properties_data_empty.py @@ -41,11 +41,9 @@ class DATA_PT_empty(DataButtonsPanel, bpy.types.Panel): layout.prop(ob, "empty_draw_type", text=_("Display")) if ob.empty_draw_type == 'IMAGE': - # layout.template_image(ob, "data", None) layout.template_ID(ob, "data", open="image.open", unlink="image.unlink") - row = layout.row(align=True) - row.prop(ob, "color", text=_("Transparency"), index=3, slider=True) + layout.prop(ob, "color", text=_("Transparency"), index=3, slider=True) row = layout.row(align=True) row.prop(ob, "empty_image_offset", text=_("Offset X"), index=0) row.prop(ob, "empty_image_offset", text=_("Offset Y"), index=1) diff --git a/release/scripts/startup/bl_ui/properties_material.py b/release/scripts/startup/bl_ui/properties_material.py index 9f988f58b24..1148d6f1660 100644 --- a/release/scripts/startup/bl_ui/properties_material.py +++ b/release/scripts/startup/bl_ui/properties_material.py @@ -247,15 +247,17 @@ class MATERIAL_PT_diffuse(MaterialButtonsPanel, bpy.types.Panel): row.prop(mat, "diffuse_fresnel_factor", text=_("Factor")) if mat.use_diffuse_ramp: - layout.separator() - layout.template_color_ramp(mat, "diffuse_ramp", expand=True) - layout.separator() + col = layout.column() + col.active = (not mat.use_shadeless) + col.separator() + col.template_color_ramp(mat, "diffuse_ramp", expand=True) + col.separator() - row = layout.row() + row = col.row() row.prop(mat, "diffuse_ramp_input", text=_("Input")) row.prop(mat, "diffuse_ramp_blend", text=_("Blend")) - layout.prop(mat, "diffuse_ramp_factor", text=_("Factor")) + col.prop(mat, "diffuse_ramp_factor", text=_("Factor")) class MATERIAL_PT_specular(MaterialButtonsPanel, bpy.types.Panel): diff --git a/release/scripts/startup/bl_ui/properties_particle.py b/release/scripts/startup/bl_ui/properties_particle.py index dfb90617893..d19fa6c2ad6 100644 --- a/release/scripts/startup/bl_ui/properties_particle.py +++ b/release/scripts/startup/bl_ui/properties_particle.py @@ -463,7 +463,7 @@ class PARTICLE_PT_physics(ParticleButtonsPanel, bpy.types.Panel): col.prop(part, "mass") col.prop(part, "use_multiply_size_mass", text=_("Multiply mass with size")) - if part.physics_type in ('NEWTON', 'FLUID'): + if part.physics_type in {'NEWTON', 'FLUID'}: split = layout.split() col = split.column() @@ -922,7 +922,7 @@ class PARTICLE_PT_render(ParticleButtonsPanel, bpy.types.Panel): col = row.column() col.label(text="") - if part.render_type in ('OBJECT', 'GROUP') and not part.use_advanced_hair: + if part.render_type in {'OBJECT', 'GROUP'} and not part.use_advanced_hair: row = layout.row(align=True) row.prop(part, "particle_size") row.prop(part, "size_random", slider=True) diff --git a/release/scripts/startup/bl_ui/properties_world.py b/release/scripts/startup/bl_ui/properties_world.py index 63f8e88147b..cfaf6ae6a18 100644 --- a/release/scripts/startup/bl_ui/properties_world.py +++ b/release/scripts/startup/bl_ui/properties_world.py @@ -94,7 +94,7 @@ class WORLD_PT_world(WorldButtonsPanel, bpy.types.Panel): col.prop(world, "zenith_color") col.active = world.use_sky_blend row.column().prop(world, "ambient_color") - + row = layout.row() row.prop(world, "exposure") row.prop(world, "color_range") diff --git a/release/scripts/startup/bl_ui/space_info.py b/release/scripts/startup/bl_ui/space_info.py index fadd3ec73be..723bab605e3 100644 --- a/release/scripts/startup/bl_ui/space_info.py +++ b/release/scripts/startup/bl_ui/space_info.py @@ -61,7 +61,7 @@ class INFO_HT_header(bpy.types.Header): layout.template_running_jobs() layout.template_reports_banner() - + row = layout.row(align=True) row.operator("wm.splash", text="", icon='BLENDER', emboss=False) row.label(text=scene.statistics()) @@ -353,7 +353,7 @@ class INFO_MT_help(bpy.types.Menu): layout = self.layout layout.operator("wm.url_open", text=_("Manual"), icon='HELP').url = 'http://wiki.blender.org/index.php/Doc:Manual' - layout.operator("wm.url_open", text=_("Release Log"), icon='URL').url = 'http://www.blender.org/development/release-logs/blender-257/' + layout.operator("wm.url_open", text=_("Release Log"), icon='URL').url = 'http://www.blender.org/development/release-logs/blender-259/' layout.separator() diff --git a/release/scripts/startup/bl_ui/space_node.py b/release/scripts/startup/bl_ui/space_node.py index b854d157fd0..99b6ba2463f 100644 --- a/release/scripts/startup/bl_ui/space_node.py +++ b/release/scripts/startup/bl_ui/space_node.py @@ -136,7 +136,7 @@ class NODE_MT_node(bpy.types.Menu): layout.operator("transform.resize") layout.separator() - + layout.operator("node.duplicate_move") layout.operator("node.delete") layout.operator("node.delete_reconnect") diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py index fb5f2de7115..0783790c12c 100644 --- a/release/scripts/startup/bl_ui/space_userpref.py +++ b/release/scripts/startup/bl_ui/space_userpref.py @@ -755,6 +755,31 @@ class USERPREF_PT_file(bpy.types.Panel): from bl_ui.space_userpref_keymap import InputKeyMapPanel +class USERPREF_MT_ndof_settings(bpy.types.Menu): + # accessed from the window keybindings in C (only) + bl_label = _("3D Mouse Settings") + + def draw(self, context): + layout = self.layout + input_prefs = context.user_preferences.inputs + + layout.separator() + layout.prop(input_prefs, "ndof_sensitivity") + + if context.space_data.type == 'VIEW_3D': + layout.separator() + layout.prop(input_prefs, "ndof_show_guide") + + layout.separator() + layout.label(text="orbit options") + layout.prop(input_prefs, "ndof_orbit_invert_axes") + + layout.separator() + layout.label(text="fly options") + layout.prop(input_prefs, "ndof_fly_helicopter", icon='NDOF_FLY') + layout.prop(input_prefs, "ndof_lock_horizon", icon='NDOF_DOM') + + class USERPREF_PT_input(bpy.types.Panel, InputKeyMapPanel): bl_space_type = 'USER_PREFERENCES' bl_label = _("Input") @@ -817,12 +842,9 @@ class USERPREF_PT_input(bpy.types.Panel, InputKeyMapPanel): #sub.prop(view, "wheel_scroll_lines", text="Scroll Lines") col.separator() - ''' not implemented yet sub = col.column() sub.label(text="NDOF Device:") - sub.prop(inputs, "ndof_pan_speed", text="Pan Speed") - sub.prop(inputs, "ndof_rotate_speed", text="Orbit Speed") - ''' + sub.prop(inputs, "ndof_sensitivity", text="NDOF Sensitivity") row.separator() @@ -881,7 +903,7 @@ class USERPREF_PT_addons(bpy.types.Panel): if not user_addon_paths: user_script_path = bpy.utils.user_script_path() if user_script_path is not None: - user_addon_paths.append(os.path.join(user_script_path(), "addons")) + user_addon_paths.append(os.path.join(user_script_path, "addons")) user_addon_paths.append(os.path.join(bpy.utils.resource_path('USER'), "scripts", "addons")) for path in user_addon_paths: @@ -927,6 +949,12 @@ class USERPREF_PT_addons(bpy.types.Panel): "(see console for details)", ) + if addon_utils.error_encoding: + self.draw_error(col, + "One or more addons do not have UTF-8 encoding\n" + "(see console for details)", + ) + filter = context.window_manager.addon_filter search = context.window_manager.addon_search.lower() support = context.window_manager.addon_support @@ -1020,7 +1048,6 @@ class USERPREF_PT_addons(bpy.types.Panel): for i in range(4 - tot_row): split.separator() - # Append missing scripts # First collect scripts that are used but have no script file. module_names = {mod.__name__ for mod, info in addons} @@ -1049,17 +1076,25 @@ class WM_OT_addon_enable(bpy.types.Operator): bl_idname = "wm.addon_enable" bl_label = _("Enable Add-On") - module = StringProperty(name=_("Module"), description=_("Module name of the addon to enable")) + module = StringProperty( + name=_("Module"), + description=_("Module name of the addon to enable"), + ) def execute(self, context): mod = addon_utils.enable(self.module) if mod: - # check if add-on is written for current blender version, or raise a warning info = addon_utils.module_bl_info(mod) - if info.get("blender", (0, 0, 0)) > bpy.app.version: - self.report("WARNING','This script was written for a newer version of Blender and might not function (correctly).\nThe script is enabled though.") + info_ver = info.get("blender", (0, 0, 0)) + + if info_ver > bpy.app.version: + self.report({'WARNING'}, ("This script was written Blender " + "version %d.%d.%d and might not " + "function (correctly).\n" + "The script is enabled though.") % + info_ver) return {'FINISHED'} else: return {'CANCELLED'} diff --git a/release/scripts/startup/bl_ui/space_userpref_keymap.py b/release/scripts/startup/bl_ui/space_userpref_keymap.py index fde11a0ac29..0281f49f1a5 100644 --- a/release/scripts/startup/bl_ui/space_userpref_keymap.py +++ b/release/scripts/startup/bl_ui/space_userpref_keymap.py @@ -190,10 +190,10 @@ class InputKeyMapPanel: if km.is_modal: row.label(text="", icon='LINKED') - if km.is_user_defined: + if km.is_user_modified: row.operator("wm.keymap_restore", text=_("Restore")) else: - row.operator("wm.keymap_edit", text=_("Edit")) + row.label() if km.show_expanded_children: if children: @@ -214,7 +214,6 @@ class InputKeyMapPanel: # "Add New" at end of keymap item list col = self.indented_layout(col, level + 1) subcol = col.split(percentage=0.2).column() - subcol.enabled = km.is_user_defined subcol.operator("wm.keyitem_add", text=_("Add New"), icon='ZOOMIN') col.separator() @@ -245,7 +244,7 @@ class InputKeyMapPanel: col = self.indented_layout(layout, level) - if km.is_user_defined: + if kmi.show_expanded: col = col.column(align=True) box = col.box() else: @@ -258,7 +257,6 @@ class InputKeyMapPanel: row.prop(kmi, "show_expanded", text="", emboss=False) row = split.row() - row.enabled = km.is_user_defined row.prop(kmi, "active", text="", emboss=False) if km.is_modal: @@ -267,12 +265,13 @@ class InputKeyMapPanel: row.label(text=kmi.name) row = split.row() - row.enabled = km.is_user_defined row.prop(kmi, "map_type", text="") if map_type == 'KEYBOARD': row.prop(kmi, "type", text="", full_event=True) elif map_type == 'MOUSE': row.prop(kmi, "type", text="", full_event=True) + elif map_type == 'NDOF': + row.prop(kmi, "type", text="", full_event=True) elif map_type == 'TWEAK': subrow = row.row() subrow.prop(kmi, "type", text="") @@ -282,18 +281,17 @@ class InputKeyMapPanel: else: row.label() - if not kmi.is_user_defined: + if (not kmi.is_user_defined) and kmi.is_user_modified: op = row.operator("wm.keyitem_restore", text="", icon='BACK') op.item_id = kmi.id - op = row.operator("wm.keyitem_remove", text="", icon='X') - op.item_id = kmi.id + else: + op = row.operator("wm.keyitem_remove", text="", icon='X') + op.item_id = kmi.id # Expanded, additional event settings if kmi.show_expanded: box = col.box() - box.enabled = km.is_user_defined - if map_type not in {'TEXTINPUT', 'TIMER'}: split = box.split(percentage=0.4) sub = split.row() @@ -308,7 +306,7 @@ class InputKeyMapPanel: sub = split.column() subrow = sub.row(align=True) - if map_type == 'KEYBOARD': + if map_type in {'KEYBOARD', 'NDOF'}: subrow.prop(kmi, "type", text="", event=True) subrow.prop(kmi, "value", text="") elif map_type == 'MOUSE': @@ -352,10 +350,10 @@ class InputKeyMapPanel: row.label() row.label() - if km.is_user_defined: + if km.is_user_modified: row.operator("wm.keymap_restore", text=_("Restore")) else: - row.operator("wm.keymap_edit", text=_("Edit")) + row.label() for kmi in filtered_items: self.draw_kmi(display_keymaps, kc, km, kmi, col, 1) @@ -363,7 +361,6 @@ class InputKeyMapPanel: # "Add New" at end of keymap item list col = self.indented_layout(layout, 1) subcol = col.split(percentage=0.2).column() - subcol.enabled = km.is_user_defined subcol.operator("wm.keyitem_add", text=_("Add New"), icon='ZOOMIN') def draw_hierarchy(self, display_keymaps, layout): @@ -372,8 +369,7 @@ class InputKeyMapPanel: def draw_keymaps(self, context, layout): wm = context.window_manager - kc = wm.keyconfigs.active - defkc = wm.keyconfigs.default + kc = wm.keyconfigs.user col = layout.column() sub = col.column() @@ -398,7 +394,7 @@ class InputKeyMapPanel: col.separator() - display_keymaps = _merge_keymaps(kc, defkc) + display_keymaps = _merge_keymaps(kc, kc) if context.space_data.filter_text != "": filter_text = context.space_data.filter_text.lower() self.draw_filtered(display_keymaps, filter_text, col) @@ -550,22 +546,24 @@ class WM_OT_keyconfig_import(bpy.types.Operator): def execute(self, context): from os.path import basename import shutil - if not self.filepath: - raise Exception("Filepath not set") - f = open(self.filepath, "r") - if not f: - raise Exception("Could not open file") + if not self.filepath: + self.report({'ERROR'}, "Filepath not set") + return {'CANCELLED'} config_name = basename(self.filepath) path = bpy.utils.user_resource('SCRIPTS', os.path.join("presets", "keyconfig"), create=True) path = os.path.join(path, config_name) - if self.keep_original: - shutil.copy(self.filepath, path) - else: - shutil.move(self.filepath, path) + try: + if self.keep_original: + shutil.copy(self.filepath, path) + else: + shutil.move(self.filepath, path) + except Exception as e: + self.report({'ERROR'}, "Installing keymap failed: %s" % e) + return {'CANCELLED'} # sneaky way to check we're actually running the code. bpy.utils.keyconfig_set(path) @@ -595,6 +593,9 @@ class WM_OT_keyconfig_export(bpy.types.Operator): if not self.filepath: raise Exception("Filepath not set") + if not self.filepath.endswith('.py'): + self.filepath += '.py' + f = open(self.filepath, "w") if not f: raise Exception("Could not open file") @@ -609,7 +610,7 @@ class WM_OT_keyconfig_export(bpy.types.Operator): # Generate a list of keymaps to export: # - # First add all user_defined keymaps (found in inputs.edited_keymaps list), + # First add all user_modified keymaps (found in keyconfigs.user.keymaps list), # then add all remaining keymaps from the currently active custom keyconfig. # # This will create a final list of keymaps that can be used as a 'diff' against @@ -619,7 +620,9 @@ class WM_OT_keyconfig_export(bpy.types.Operator): class FakeKeyConfig(): keymaps = [] edited_kc = FakeKeyConfig() - edited_kc.keymaps.extend(context.user_preferences.inputs.edited_keymaps) + for km in wm.keyconfigs.user.keymaps: + if km.is_user_modified: + edited_kc.keymaps.append(km) # merge edited keymaps with non-default keyconfig, if it exists if kc != wm.keyconfigs.default: export_keymaps = _merge_keymaps(edited_kc, kc) @@ -669,18 +672,6 @@ class WM_OT_keyconfig_export(bpy.types.Operator): return {'RUNNING_MODAL'} -class WM_OT_keymap_edit(bpy.types.Operator): - "Edit stored key map" - bl_idname = "wm.keymap_edit" - bl_label = _("Edit Key Map") - __doc__ = _("Edit stored key map") - - def execute(self, context): - km = context.keymap - km.copy_to_user() - return {'FINISHED'} - - class WM_OT_keymap_restore(bpy.types.Operator): "Restore key map(s)" bl_idname = "wm.keymap_restore" @@ -693,7 +684,7 @@ class WM_OT_keymap_restore(bpy.types.Operator): wm = context.window_manager if self.all: - for km in wm.keyconfigs.default.keymaps: + for km in wm.keyconfigs.user.keymaps: km.restore_to_default() else: km = context.keymap @@ -713,13 +704,13 @@ class WM_OT_keyitem_restore(bpy.types.Operator): @classmethod def poll(cls, context): keymap = getattr(context, "keymap", None) - return keymap and keymap.is_user_defined + return keymap def execute(self, context): km = context.keymap kmi = km.keymap_items.from_id(self.item_id) - if not kmi.is_user_defined: + if (not kmi.is_user_defined) and kmi.is_user_modified: km.restore_item_to_default(kmi) return {'FINISHED'} @@ -758,7 +749,7 @@ class WM_OT_keyitem_remove(bpy.types.Operator): @classmethod def poll(cls, context): - return hasattr(context, "keymap") and context.keymap.is_user_defined + return hasattr(context, "keymap") def execute(self, context): km = context.keymap diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py index b4adc3bf028..48ad82c9bb4 100644 --- a/release/scripts/startup/bl_ui/space_view3d.py +++ b/release/scripts/startup/bl_ui/space_view3d.py @@ -56,7 +56,7 @@ class VIEW3D_HT_header(bpy.types.Header): row = layout.row() # Contains buttons like Mode, Pivot, Manipulator, Layer, Mesh Select Mode... - row.template_header_3D() + row.template_header_3D() if obj: # Particle edit diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py index d029de3786c..16b5b3e6cc6 100644 --- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py +++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py @@ -59,6 +59,7 @@ def draw_gpencil_tools(context, layout): row = col.row() row.prop(context.tool_settings, "use_grease_pencil_sessions") + # ********** default tools for objectmode **************** class VIEW3D_PT_tools_objectmode(View3DPanel, bpy.types.Panel): @@ -88,8 +89,9 @@ class VIEW3D_PT_tools_objectmode(View3DPanel, bpy.types.Panel): col = layout.column(align=True) col.label(text=_("Shading:")) - col.operator("object.shade_smooth", text=_("Smooth")) - col.operator("object.shade_flat", text=_("Flat")) + row = col.row(align=True) + row.operator("object.shade_smooth", text=_("Smooth")) + row.operator("object.shade_flat", text=_("Flat")) draw_keyframing_tools(context, layout) @@ -155,8 +157,9 @@ class VIEW3D_PT_tools_meshedit(View3DPanel, bpy.types.Panel): col = layout.column(align=True) col.label(text="Shading:") - col.operator("mesh.faces_shade_smooth", text="Smooth") - col.operator("mesh.faces_shade_flat", text="Flat") + row = col.row(align=True) + row.operator("mesh.faces_shade_smooth", text="Smooth") + row.operator("mesh.faces_shade_flat", text="Flat") draw_repeat_tools(context, layout) |