diff options
Diffstat (limited to 'release/scripts/startup/bl_ui/space_userpref.py')
-rw-r--r-- | release/scripts/startup/bl_ui/space_userpref.py | 574 |
1 files changed, 139 insertions, 435 deletions
diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py index d0e7ae5e609..1ec6cc39164 100644 --- a/release/scripts/startup/bl_ui/space_userpref.py +++ b/release/scripts/startup/bl_ui/space_userpref.py @@ -18,13 +18,10 @@ # <pep8 compliant> import bpy -from bpy.types import Header, Menu, Operator, Panel +from bpy.types import Header, Menu, Panel import os import addon_utils -from bpy.props import StringProperty, BoolProperty, EnumProperty -from blf import gettext as _ - def ui_items_general(col, context): """ General UI Theme Settings (User Interface) @@ -66,10 +63,10 @@ def opengl_lamp_buttons(column, lamp): col = split.column() col.active = lamp.use row = col.row() - row.label(text=_("Diffuse:")) + row.label(text="Diffuse:") row.prop(lamp, "diffuse_color", text="") row = col.row() - row.label(text=_("Specular:")) + row.label(text="Specular:") row.prop(lamp, "specular_color", text="") col = split.column() @@ -87,7 +84,7 @@ class USERPREF_HT_header(Header): userpref = context.user_preferences layout.operator_context = 'EXEC_AREA' - layout.operator("wm.save_homefile", text=_("Save As Default")) + layout.operator("wm.save_homefile", text="Save As Default") layout.operator_context = 'INVOKE_DEFAULT' @@ -128,7 +125,7 @@ class USERPREF_MT_appconfigs(Menu): preset_operator = "wm.appconfig_activate" def draw(self, context): - self.layout.operator("wm.appconfig_default", text=_("Blender (default)")) + self.layout.operator("wm.appconfig_default", text="Blender (default)") # now draw the presets Menu.draw_preset(self, context) @@ -143,12 +140,12 @@ class USERPREF_MT_splash(Menu): row = split.row() row.label("") row = split.row() - row.label(_("Interaction:")) + row.label("Interaction:") # XXX, no redraws # text = bpy.path.display_name(context.window_manager.keyconfigs.active.name) # if not text: # text = "Blender (default)" - row.menu("USERPREF_MT_appconfigs", text=_("Preset")) + row.menu("USERPREF_MT_appconfigs", text="Preset") class USERPREF_PT_interface(Panel): @@ -171,13 +168,13 @@ class USERPREF_PT_interface(Panel): row = layout.row() col = row.column() - col.label(text=_("Display:")) + col.label(text="Display:") col.prop(view, "show_tooltips") col.prop(view, "show_tooltips_python") - col.prop(view, "show_object_info", text=_("Object Info")) + col.prop(view, "show_object_info", text="Object Info") col.prop(view, "show_large_cursors") - col.prop(view, "show_view_name", text=_("View Name")) - col.prop(view, "show_playback_fps", text=_("Playback FPS")) + col.prop(view, "show_view_name", text="View Name") + col.prop(view, "show_playback_fps", text="Playback FPS") col.prop(view, "use_global_scene") col.prop(view, "object_origin_size") @@ -185,18 +182,18 @@ class USERPREF_PT_interface(Panel): col.separator() col.separator() - col.prop(view, "show_mini_axis", text=_("Display Mini Axis")) + col.prop(view, "show_mini_axis", text="Display Mini Axis") sub = col.column() sub.active = view.show_mini_axis - sub.prop(view, "mini_axis_size", text=_("Size")) - sub.prop(view, "mini_axis_brightness", text=_("Brightness")) + sub.prop(view, "mini_axis_size", text="Size") + sub.prop(view, "mini_axis_brightness", text="Brightness") col.separator() row.separator() row.separator() col = row.column() - col.label(text=_("View Manipulation:")) + col.label(text="View Manipulation:") col.prop(view, "use_mouse_auto_depth") col.prop(view, "use_zoom_to_mouse") col.prop(view, "use_rotate_around_active") @@ -212,8 +209,8 @@ class USERPREF_PT_interface(Panel): col.separator() col.separator() - col.label(text=_("2D Viewports:")) - col.prop(view, "view2d_grid_spacing_min", text=_("Minimum Grid Spacing")) + col.label(text="2D Viewports:") + col.prop(view, "view2d_grid_spacing_min", text="Minimum Grid Spacing") col.prop(view, "timecode_style") row.separator() @@ -229,19 +226,19 @@ class USERPREF_PT_interface(Panel): col.prop(view, "show_manipulator") sub = col.column() sub.active = view.show_manipulator - sub.prop(view, "manipulator_size", text=_("Size")) - sub.prop(view, "manipulator_handle_size", text=_("Handle Size")) - sub.prop(view, "manipulator_hotspot", text=_("Hotspot")) + sub.prop(view, "manipulator_size", text="Size") + sub.prop(view, "manipulator_handle_size", text="Handle Size") + sub.prop(view, "manipulator_hotspot", text="Hotspot") col.separator() col.separator() col.separator() - col.label(text=_("Menus:")) + col.label(text="Menus:") col.prop(view, "use_mouse_over_open") - col.label(text=_("Menu Open Delay:")) - col.prop(view, "open_toplevel_delay", text=_("Top Level")) - col.prop(view, "open_sublevel_delay", text=_("Sub Level")) + col.label(text="Menu Open Delay:") + col.prop(view, "open_toplevel_delay", text="Top Level") + col.prop(view, "open_sublevel_delay", text="Sub Level") col.separator() @@ -268,97 +265,97 @@ class USERPREF_PT_edit(Panel): row = layout.row() col = row.column() - col.label(text=_("Link Materials To:")) + col.label(text="Link Materials To:") col.prop(edit, "material_link", text="") col.separator() col.separator() col.separator() - col.label(text=_("New Objects:")) + col.label(text="New Objects:") col.prop(edit, "use_enter_edit_mode") - col.label(text=_("Align To:")) + col.label(text="Align To:") col.prop(edit, "object_align", text="") col.separator() col.separator() col.separator() - col.label(text=_("Undo:")) + col.label(text="Undo:") col.prop(edit, "use_global_undo") - col.prop(edit, "undo_steps", text=_("Steps")) - col.prop(edit, "undo_memory_limit", text=_("Memory Limit")) + col.prop(edit, "undo_steps", text="Steps") + col.prop(edit, "undo_memory_limit", text="Memory Limit") row.separator() row.separator() col = row.column() - col.label(text=_("Grease Pencil:")) - col.prop(edit, "grease_pencil_manhattan_distance", text=_("Manhattan Distance")) - col.prop(edit, "grease_pencil_euclidean_distance", text=_("Euclidean Distance")) + col.label(text="Grease Pencil:") + col.prop(edit, "grease_pencil_manhattan_distance", text="Manhattan Distance") + col.prop(edit, "grease_pencil_euclidean_distance", text="Euclidean Distance") #col.prop(edit, "use_grease_pencil_simplify_stroke", text="Simplify Stroke") - col.prop(edit, "grease_pencil_eraser_radius", text=_("Eraser Radius")) - col.prop(edit, "use_grease_pencil_smooth_stroke", text=_("Smooth Stroke")) + col.prop(edit, "grease_pencil_eraser_radius", text="Eraser Radius") + col.prop(edit, "use_grease_pencil_smooth_stroke", text="Smooth Stroke") col.separator() col.separator() col.separator() - col.label(text=_("Playback:")) + col.label(text="Playback:") col.prop(edit, "use_negative_frames") row.separator() row.separator() col = row.column() - col.label(text=_("Keyframing:")) + col.label(text="Keyframing:") col.prop(edit, "use_visual_keying") - col.prop(edit, "use_keyframe_insert_needed", text=_("Only Insert Needed")) + col.prop(edit, "use_keyframe_insert_needed", text="Only Insert Needed") col.separator() - col.prop(edit, "use_auto_keying", text=_("Auto Keyframing:")) + col.prop(edit, "use_auto_keying", text="Auto Keyframing:") sub = col.column() # sub.active = edit.use_keyframe_insert_auto # incorrect, timeline can enable - sub.prop(edit, "use_keyframe_insert_available", text=_("Only Insert Available")) + sub.prop(edit, "use_keyframe_insert_available", text="Only Insert Available") col.separator() - col.label(text=_("New F-Curve Defaults:")) - col.prop(edit, "keyframe_new_interpolation_type", text=_("Interpolation")) - col.prop(edit, "keyframe_new_handle_type", text=_("Handles")) - col.prop(edit, "use_insertkey_xyz_to_rgb", text=_("XYZ to RGB")) + col.label(text="New F-Curve Defaults:") + col.prop(edit, "keyframe_new_interpolation_type", text="Interpolation") + col.prop(edit, "keyframe_new_handle_type", text="Handles") + col.prop(edit, "use_insertkey_xyz_to_rgb", text="XYZ to RGB") col.separator() col.separator() col.separator() - col.label(text=_("Transform:")) + col.label(text="Transform:") col.prop(edit, "use_drag_immediately") row.separator() row.separator() col = row.column() - col.prop(edit, "sculpt_paint_overlay_color", text=_("Sculpt Overlay Color")) + col.prop(edit, "sculpt_paint_overlay_color", text="Sculpt Overlay Color") col.separator() col.separator() col.separator() - col.label(text=_("Duplicate Data:")) - col.prop(edit, "use_duplicate_mesh", text=_("Mesh")) - col.prop(edit, "use_duplicate_surface", text=_("Surface")) - col.prop(edit, "use_duplicate_curve", text=_("Curve")) - col.prop(edit, "use_duplicate_text", text=_("Text")) - col.prop(edit, "use_duplicate_metaball", text=_("Metaball")) - col.prop(edit, "use_duplicate_armature", text=_("Armature")) - col.prop(edit, "use_duplicate_lamp", text=_("Lamp")) - col.prop(edit, "use_duplicate_material", text=_("Material")) - col.prop(edit, "use_duplicate_texture", text=_("Texture")) - #col.prop(edit, "use_duplicate_fcurve", text=_("F-Curve")) - col.prop(edit, "use_duplicate_action", text=_("Action")) - col.prop(edit, "use_duplicate_particle", text=_("Particle")) + col.label(text="Duplicate Data:") + col.prop(edit, "use_duplicate_mesh", text="Mesh") + col.prop(edit, "use_duplicate_surface", text="Surface") + col.prop(edit, "use_duplicate_curve", text="Curve") + col.prop(edit, "use_duplicate_text", text="Text") + col.prop(edit, "use_duplicate_metaball", text="Metaball") + col.prop(edit, "use_duplicate_armature", text="Armature") + col.prop(edit, "use_duplicate_lamp", text="Lamp") + col.prop(edit, "use_duplicate_material", text="Material") + col.prop(edit, "use_duplicate_texture", text="Texture") + #col.prop(edit, "use_duplicate_fcurve", text="F-Curve") + col.prop(edit, "use_duplicate_action", text="Action") + col.prop(edit, "use_duplicate_particle", text="Particle") class USERPREF_PT_system(Panel): @@ -385,11 +382,11 @@ class USERPREF_PT_system(Panel): colsplit = column.split(percentage=0.85) col = colsplit.column() - col.label(text=_("General:")) + col.label(text="General:") col.prop(system, "dpi") col.prop(system, "frame_server_port") - col.prop(system, "scrollback", text=_("Console Scrollback")) - col.prop(system, "author", text=_("Author")) + col.prop(system, "scrollback", text="Console Scrollback") + col.prop(system, "author", text="Author") col.prop(system, "use_scripts_auto_execute") col.prop(system, "use_tabs_as_spaces") @@ -397,21 +394,21 @@ class USERPREF_PT_system(Panel): col.separator() col.separator() - col.label(text=_("Sound:")) + col.label(text="Sound:") col.row().prop(system, "audio_device", expand=True) sub = col.column() sub.active = system.audio_device != 'NONE' #sub.prop(system, "use_preview_images") - sub.prop(system, "audio_channels", text=_("Channels")) - sub.prop(system, "audio_mixing_buffer", text=_("Mixing Buffer")) - sub.prop(system, "audio_sample_rate", text=_("Sample Rate")) - sub.prop(system, "audio_sample_format", text=_("Sample Format")) + sub.prop(system, "audio_channels", text="Channels") + sub.prop(system, "audio_mixing_buffer", text="Mixing Buffer") + sub.prop(system, "audio_sample_rate", text="Sample Rate") + sub.prop(system, "audio_sample_format", text="Sample Format") col.separator() col.separator() col.separator() - col.label(text=_("Screencast:")) + col.label(text="Screencast:") col.prop(system, "screencast_fps") col.prop(system, "screencast_wait_time") col.separator() @@ -423,40 +420,40 @@ class USERPREF_PT_system(Panel): colsplit = column.split(percentage=0.85) col = colsplit.column() - col.label(text=_("OpenGL:")) + col.label(text="OpenGL:") col.prop(system, "gl_clip_alpha", slider=True) col.prop(system, "use_mipmaps") - col.label(text=_("Anisotropic Filtering")) + col.label(text="Anisotropic Filtering") col.prop(system, "anisotropic_filter", text="") col.prop(system, "use_vertex_buffer_objects") #Anti-aliasing is disabled as it breaks broder/lasso select #col.prop(system, "use_antialiasing") - col.label(text=_("Window Draw Method:")) + col.label(text="Window Draw Method:") col.prop(system, "window_draw_method", text="") - col.label(text=_("Text Draw Options:")) + col.label(text="Text Draw Options:") col.prop(system, "use_text_antialiasing") - col.label(text=_("Textures:")) - col.prop(system, "gl_texture_limit", text=_("Limit Size")) - col.prop(system, "texture_time_out", text=_("Time Out")) - col.prop(system, "texture_collection_rate", text=_("Collection Rate")) + col.label(text="Textures:") + col.prop(system, "gl_texture_limit", text="Limit Size") + col.prop(system, "texture_time_out", text="Time Out") + col.prop(system, "texture_collection_rate", text="Collection Rate") col.separator() col.separator() col.separator() - col.label(text=_("Sequencer:")) + col.label(text="Sequencer:") col.prop(system, "prefetch_frames") col.prop(system, "memory_cache_limit") # 3. Column column = split.column() - column.label(text=_("Solid OpenGL lights:")) + column.label(text="Solid OpenGL lights:") split = column.split(percentage=0.1) split.label() - split.label(text=_("Colors:")) - split.label(text=_("Direction:")) + split.label(text="Colors:") + split.label(text="Direction:") lamp = system.solid_lights[0] opengl_lamp_buttons(column, lamp) @@ -469,12 +466,12 @@ class USERPREF_PT_system(Panel): column.separator() - column.label(text=_("Color Picker Type:")) + column.label(text="Color Picker Type:") column.row().prop(system, "color_picker_type", text="") column.separator() - column.prop(system, "use_weight_color_range", text=_("Custom Weight Paint Range")) + column.prop(system, "use_weight_color_range", text="Custom Weight Paint Range") sub = column.column() sub.active = system.use_weight_color_range sub.template_color_ramp(system, "weight_color_range", expand=True) @@ -550,71 +547,71 @@ class USERPREF_PT_theme(Panel): col = split.column() ui = theme.user_interface.wcol_regular - col.label(text=_("Regular:")) + col.label(text="Regular:") ui_items_general(col, ui) ui = theme.user_interface.wcol_tool - col.label(text=_("Tool:")) + col.label(text="Tool:") ui_items_general(col, ui) ui = theme.user_interface.wcol_radio - col.label(text=_("Radio Buttons:")) + col.label(text="Radio Buttons:") ui_items_general(col, ui) ui = theme.user_interface.wcol_text - col.label(text=_("Text:")) + col.label(text="Text:") ui_items_general(col, ui) ui = theme.user_interface.wcol_option - col.label(text=_("Option:")) + col.label(text="Option:") ui_items_general(col, ui) ui = theme.user_interface.wcol_toggle - col.label(text=_("Toggle:")) + col.label(text="Toggle:") ui_items_general(col, ui) ui = theme.user_interface.wcol_num - col.label(text=_("Number Field:")) + col.label(text="Number Field:") ui_items_general(col, ui) ui = theme.user_interface.wcol_numslider - col.label(text=_("Value Slider:")) + col.label(text="Value Slider:") ui_items_general(col, ui) ui = theme.user_interface.wcol_box - col.label(text=_("Box:")) + col.label(text="Box:") ui_items_general(col, ui) ui = theme.user_interface.wcol_menu - col.label(text=_("Menu:")) + col.label(text="Menu:") ui_items_general(col, ui) ui = theme.user_interface.wcol_pulldown - col.label(text=_("Pulldown:")) + col.label(text="Pulldown:") ui_items_general(col, ui) ui = theme.user_interface.wcol_menu_back - col.label(text=_("Menu Back:")) + col.label(text="Menu Back:") ui_items_general(col, ui) ui = theme.user_interface.wcol_menu_item - col.label(text=_("Menu Item:")) + col.label(text="Menu Item:") ui_items_general(col, ui) ui = theme.user_interface.wcol_scroll - col.label(text=_("Scroll Bar:")) + col.label(text="Scroll Bar:") ui_items_general(col, ui) ui = theme.user_interface.wcol_progress - col.label(text=_("Progress Bar:")) + col.label(text="Progress Bar:") ui_items_general(col, ui) ui = theme.user_interface.wcol_list_item - col.label(text=_("List Item:")) + col.label(text="List Item:") ui_items_general(col, ui) ui = theme.user_interface.wcol_state - col.label(text=_("State:")) + col.label(text="State:") row = col.row() @@ -650,7 +647,7 @@ class USERPREF_PT_theme(Panel): col = split.column() for i, ui in enumerate(theme.bone_color_sets): - col.label(text=_("Color Set")+" %d:" % (i + 1)) # i starts from 0 + col.label(text="Color Set" + " %d:" % (i + 1)) # i starts from 0 row = col.row() @@ -693,22 +690,22 @@ class USERPREF_PT_file(Panel): split = layout.split(percentage=0.7) col = split.column() - col.label(text=_("File Paths:")) + col.label(text="File Paths:") colsplit = col.split(percentage=0.95) col1 = colsplit.split(percentage=0.3) sub = col1.column() - sub.label(text=_("Fonts:")) - sub.label(text=_("Textures:")) - sub.label(text=_("Texture Plugins:")) - sub.label(text=_("Sequence Plugins:")) - sub.label(text=_("Render Output:")) - sub.label(text=_("Scripts:")) - sub.label(text=_("Sounds:")) - sub.label(text=_("Temp:")) - sub.label(text=_("Image Editor:")) - sub.label(text=_("Animation Player:")) + sub.label(text="Fonts:") + sub.label(text="Textures:") + sub.label(text="Texture Plugins:") + sub.label(text="Sequence Plugins:") + sub.label(text="Render Output:") + sub.label(text="Scripts:") + sub.label(text="Sounds:") + sub.label(text="Temp:") + sub.label(text="Image Editor:") + sub.label(text="Animation Player:") sub = col1.column() sub.prop(paths, "font_directory", text="") @@ -725,7 +722,7 @@ class USERPREF_PT_file(Panel): subsplit.prop(paths, "animation_player", text="") col = split.column() - col.label(text=_("Save & Load:")) + col.label(text="Save & Load:") col.prop(paths, "use_relative_paths") col.prop(paths, "use_file_compression") col.prop(paths, "use_load_ui") @@ -740,11 +737,11 @@ class USERPREF_PT_file(Panel): col.prop(paths, "save_version") col.prop(paths, "recent_files") col.prop(paths, "use_save_preview_images") - col.label(text=_("Auto Save:")) + col.label(text="Auto Save:") col.prop(paths, "use_auto_save_temporary_files") sub = col.column() sub.active = paths.use_auto_save_temporary_files - sub.prop(paths, "auto_save_time", text=_("Timer (mins)")) + sub.prop(paths, "auto_save_time", text="Timer (mins)") from bl_ui.space_userpref_keymap import InputKeyMapPanel @@ -800,7 +797,7 @@ class USERPREF_PT_input(Panel, InputKeyMapPanel): col = row.column() sub = col.column() - sub.label(text=_("Presets:")) + sub.label(text="Presets:") subrow = sub.row(align=True) subrow.menu("USERPREF_MT_interaction_presets", text=bpy.types.USERPREF_MT_interaction_presets.bl_label) @@ -808,19 +805,19 @@ class USERPREF_PT_input(Panel, InputKeyMapPanel): subrow.operator("wm.interaction_preset_add", text="", icon='ZOOMOUT').remove_active = True sub.separator() - sub.label(text=_("Mouse:")) + sub.label(text="Mouse:") sub1 = sub.column() sub1.active = (inputs.select_mouse == 'RIGHT') sub1.prop(inputs, "use_mouse_emulate_3_button") sub.prop(inputs, "use_mouse_continuous") sub.prop(inputs, "drag_threshold") - sub.label(text=_("Select With:")) + sub.label(text="Select With:") sub.row().prop(inputs, "select_mouse", expand=True) sub = col.column() - sub.label(text=_("Double Click:")) - sub.prop(inputs, "mouse_double_click_time", text=_("Speed")) + sub.label(text="Double Click:") + sub.prop(inputs, "mouse_double_click_time", text="Speed") sub.separator() @@ -828,10 +825,10 @@ class USERPREF_PT_input(Panel, InputKeyMapPanel): sub.separator() - sub.label(text=_("Orbit Style:")) + sub.label(text="Orbit Style:") sub.row().prop(inputs, "view_rotate_method", expand=True) - sub.label(text=_("Zoom Style:")) + sub.label(text="Zoom Style:") sub.row().prop(inputs, "view_zoom_method", text="") if inputs.view_zoom_method in {'DOLLY', 'CONTINUE'}: sub.row().prop(inputs, "view_zoom_axis", expand=True) @@ -842,8 +839,8 @@ class USERPREF_PT_input(Panel, InputKeyMapPanel): #col.separator() sub = col.column() - sub.label(text=_("Mouse Wheel:")) - sub.prop(inputs, "invert_zoom_wheel", text=_("Invert Wheel Zoom Direction")) + sub.label(text="Mouse Wheel:") + sub.prop(inputs, "invert_zoom_wheel", text="Invert Wheel Zoom Direction") #sub.prop(view, "wheel_scroll_lines", text="Scroll Lines") col.separator() @@ -881,9 +878,9 @@ class USERPREF_MT_addons_dev_guides(Menu): # menu to open webpages with addons development guides def draw(self, context): layout = self.layout - layout.operator('wm.url_open', text=_('API Concepts'), icon='URL').url = 'http://wiki.blender.org/index.php/Dev:2.5/Py/API/Intro' - layout.operator('wm.url_open', text=_('Addon Guidelines'), icon='URL').url = 'http://wiki.blender.org/index.php/Dev:2.5/Py/Scripts/Guidelines/Addons' - layout.operator('wm.url_open', text=_('How to share your addon'), icon='URL').url = 'http://wiki.blender.org/index.php/Dev:Py/Sharing' + layout.operator("wm.url_open", text="API Concepts", icon='URL').url = "http://wiki.blender.org/index.php/Dev:2.5/Py/API/Intro" + layout.operator("wm.url_open", text="Addon Guidelines", icon='URL').url = "http://wiki.blender.org/index.php/Dev:2.5/Py/Scripts/Guidelines/Addons" + layout.operator("wm.url_open", text="How to share your addon", icon='URL').url = "http://wiki.blender.org/index.php/Dev:Py/Sharing" class USERPREF_PT_addons(Panel): @@ -892,18 +889,12 @@ class USERPREF_PT_addons(Panel): bl_region_type = 'WINDOW' bl_options = {'HIDE_HEADER'} - _addons_fake_modules = {} - @classmethod def poll(cls, context): userpref = context.user_preferences return (userpref.active_section == 'ADDONS') @staticmethod - def module_get(mod_name): - return USERPREF_PT_addons._addons_fake_modules[mod_name] - - @staticmethod def is_user_addon(mod, user_addon_paths): if not user_addon_paths: user_script_path = bpy.utils.user_script_path() @@ -933,15 +924,15 @@ class USERPREF_PT_addons(Panel): used_ext = {ext.module for ext in userpref.addons} # collect the categories that can be filtered on - addons = [(mod, addon_utils.module_bl_info(mod)) for mod in addon_utils.modules(USERPREF_PT_addons._addons_fake_modules)] + addons = [(mod, addon_utils.module_bl_info(mod)) for mod in addon_utils.modules(addon_utils.addons_fake_modules)] split = layout.split(percentage=0.2) col = split.column() col.prop(context.window_manager, "addon_search", text="", icon='VIEWZOOM') - col.label(text=_("Categories")) + col.label(text="Categories") col.prop(context.window_manager, "addon_filter", expand=True) - col.label(text=_("Supported Level")) + col.label(text="Supported Level") col.prop(context.window_manager, "addon_support", expand=True) col = split.column() @@ -1018,23 +1009,23 @@ class USERPREF_PT_addons(Panel): if info["show_expanded"]: if info["description"]: split = colsub.row().split(percentage=0.15) - split.label(text=_('Description:')) + split.label(text="Description:") split.label(text=info["description"]) if info["location"]: split = colsub.row().split(percentage=0.15) - split.label(text=_('Location:')) + split.label(text="Location:") split.label(text=info["location"]) if info["author"]: split = colsub.row().split(percentage=0.15) - split.label(text=_('Author:')) + split.label(text="Author:") split.label(text=info["author"]) if info["version"]: split = colsub.row().split(percentage=0.15) - split.label(text=_('Version:')) + split.label(text="Version:") split.label(text='.'.join(str(x) for x in info["version"])) if info["warning"]: split = colsub.row().split(percentage=0.15) - split.label(text=_("Warning:")) + split.label(text="Warning:") split.label(text=' ' + info["warning"], icon='ERROR') user_addon = USERPREF_PT_addons.is_user_addon(mod, user_addon_paths) @@ -1042,13 +1033,13 @@ class USERPREF_PT_addons(Panel): if tot_row: split = colsub.row().split(percentage=0.15) - split.label(text=_("Internet:")) + split.label(text="Internet:") if info["wiki_url"]: - split.operator("wm.url_open", text=_("Link to the Wiki"), icon='HELP').url = info["wiki_url"] + split.operator("wm.url_open", text="Link to the Wiki", icon='HELP').url = info["wiki_url"] if info["tracker_url"]: - split.operator("wm.url_open", text=_("Report a Bug"), icon='URL').url = info["tracker_url"] + split.operator("wm.url_open", text="Report a Bug", icon='URL').url = info["tracker_url"] if user_addon: - split.operator("wm.addon_remove", text=_("Remove"), icon='CANCEL').module = mod.__name__ + split.operator("wm.addon_remove", text="Remove", icon='CANCEL').module = mod.__name__ for i in range(4 - tot_row): split.separator() @@ -1060,7 +1051,7 @@ class USERPREF_PT_addons(Panel): if missing_modules and filter in {"All", "Enabled"}: col.column().separator() - col.column().label(text=_("Missing script files")) + col.column().label(text="Missing script files") module_names = {mod.__name__ for mod, info in addons} for module_name in sorted(missing_modules): @@ -1075,292 +1066,5 @@ class USERPREF_PT_addons(Panel): if is_enabled: row.operator("wm.addon_disable", icon='CHECKBOX_HLT', text="", emboss=False).module = module_name - -class WM_OT_addon_enable(Operator): - "Enable an addon" - bl_idname = "wm.addon_enable" - bl_label = "Enable Add-On" - - module = StringProperty( - name="Module", - description="Module name of the addon to enable", - ) - - def execute(self, context): - mod = addon_utils.enable(self.module) - - if mod: - info = addon_utils.module_bl_info(mod) - - 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), " - "though it is enabled") % - info_ver) - return {'FINISHED'} - else: - return {'CANCELLED'} - - -class WM_OT_addon_disable(Operator): - "Disable an addon" - bl_idname = "wm.addon_disable" - bl_label = "Disable Add-On" - - module = StringProperty( - name="Module", - description="Module name of the addon to disable", - ) - - def execute(self, context): - addon_utils.disable(self.module) - return {'FINISHED'} - - -class WM_OT_addon_install(Operator): - "Install an addon" - bl_idname = "wm.addon_install" - bl_label = "Install Add-On..." - - overwrite = BoolProperty( - name="Overwrite", - description="Remove existing addons with the same ID", - default=True, - ) - target = EnumProperty( - name="Target Path", - items=(('DEFAULT', "Default", ""), - ('PREFS', "User Prefs", "")), - ) - - filepath = StringProperty( - name="File Path", - description="File path to write file to", - ) - filter_folder = BoolProperty( - name="Filter folders", - default=True, - options={'HIDDEN'}, - ) - filter_python = BoolProperty( - name="Filter python", - default=True, - options={'HIDDEN'}, - ) - filter_glob = StringProperty( - default="*.py;*.zip", - options={'HIDDEN'}, - ) - - @staticmethod - def _module_remove(path_addons, module): - module = os.path.splitext(module)[0] - for f in os.listdir(path_addons): - f_base = os.path.splitext(f)[0] - if f_base == module: - f_full = os.path.join(path_addons, f) - - if os.path.isdir(f_full): - os.rmdir(f_full) - else: - os.remove(f_full) - - def execute(self, context): - import traceback - import zipfile - import shutil - - pyfile = self.filepath - - if self.target == 'DEFAULT': - # dont use bpy.utils.script_paths("addons") because we may not be able to write to it. - path_addons = bpy.utils.user_resource('SCRIPTS', "addons", create=True) - else: - path_addons = bpy.context.user_preferences.filepaths.script_directory - if path_addons: - path_addons = os.path.join(path_addons, "addons") - - if not path_addons: - self.report({'ERROR'}, "Failed to get addons path") - return {'CANCELLED'} - - # create dir is if missing. - if not os.path.exists(path_addons): - os.makedirs(path_addons) - - # Check if we are installing from a target path, - # doing so causes 2+ addons of same name or when the same from/to - # location is used, removal of the file! - addon_path = "" - pyfile_dir = os.path.dirname(pyfile) - for addon_path in addon_utils.paths(): - if os.path.samefile(pyfile_dir, addon_path): - self.report({'ERROR'}, "Source file is in the addon search path: %r" % addon_path) - return {'CANCELLED'} - del addon_path - del pyfile_dir - # done checking for exceptional case - - addons_old = {mod.__name__ for mod in addon_utils.modules(USERPREF_PT_addons._addons_fake_modules)} - - #check to see if the file is in compressed format (.zip) - if zipfile.is_zipfile(pyfile): - try: - file_to_extract = zipfile.ZipFile(pyfile, 'r') - except: - traceback.print_exc() - return {'CANCELLED'} - - if self.overwrite: - for f in file_to_extract.namelist(): - WM_OT_addon_install._module_remove(path_addons, f) - else: - for f in file_to_extract.namelist(): - path_dest = os.path.join(path_addons, os.path.basename(f)) - if os.path.exists(path_dest): - self.report({'WARNING'}, "File already installed to %r\n" % path_dest) - return {'CANCELLED'} - - try: # extract the file to "addons" - file_to_extract.extractall(path_addons) - - # zip files can create this dir with metadata, don't need it - macosx_dir = os.path.join(path_addons, '__MACOSX') - if os.path.isdir(macosx_dir): - shutil.rmtree(macosx_dir) - - except: - traceback.print_exc() - return {'CANCELLED'} - - else: - path_dest = os.path.join(path_addons, os.path.basename(pyfile)) - - if self.overwrite: - WM_OT_addon_install._module_remove(path_addons, os.path.basename(pyfile)) - elif os.path.exists(path_dest): - self.report({'WARNING'}, "File already installed to %r\n" % path_dest) - return {'CANCELLED'} - - #if not compressed file just copy into the addon path - try: - shutil.copyfile(pyfile, path_dest) - - except: - traceback.print_exc() - return {'CANCELLED'} - - addons_new = {mod.__name__ for mod in addon_utils.modules(USERPREF_PT_addons._addons_fake_modules)} - addons_old - addons_new.discard("modules") - - # disable any addons we may have enabled previously and removed. - # this is unlikely but do just incase. bug [#23978] - for new_addon in addons_new: - addon_utils.disable(new_addon) - - # possible the zip contains multiple addons, we could disallow this - # but for now just use the first - for mod in addon_utils.modules(USERPREF_PT_addons._addons_fake_modules): - if mod.__name__ in addons_new: - info = addon_utils.module_bl_info(mod) - - # show the newly installed addon. - context.window_manager.addon_filter = 'All' - context.window_manager.addon_search = info["name"] - break - - # incase a new module path was created to install this addon. - bpy.utils.refresh_script_paths() - - # TODO, should not be a warning. - # self.report({'WARNING'}, "File installed to '%s'\n" % path_dest) - return {'FINISHED'} - - def invoke(self, context, event): - wm = context.window_manager - wm.fileselect_add(self) - return {'RUNNING_MODAL'} - - -class WM_OT_addon_remove(Operator): - "Disable an addon" - bl_idname = "wm.addon_remove" - bl_label = "Remove Add-On" - - module = StringProperty( - name="Module", - description="Module name of the addon to remove", - ) - - @staticmethod - def path_from_addon(module): - for mod in addon_utils.modules(USERPREF_PT_addons._addons_fake_modules): - if mod.__name__ == module: - filepath = mod.__file__ - if os.path.exists(filepath): - if os.path.splitext(os.path.basename(filepath))[0] == "__init__": - return os.path.dirname(filepath), True - else: - return filepath, False - return None, False - - def execute(self, context): - path, isdir = WM_OT_addon_remove.path_from_addon(self.module) - if path is None: - self.report('WARNING', "Addon path %r could not be found" % path) - return {'CANCELLED'} - - # incase its enabled - addon_utils.disable(self.module) - - import shutil - if isdir: - shutil.rmtree(path) - else: - os.remove(path) - - context.area.tag_redraw() - return {'FINISHED'} - - # lame confirmation check - def draw(self, context): - self.layout.label(text="Remove Addon: %r?" % self.module) - path, isdir = WM_OT_addon_remove.path_from_addon(self.module) - self.layout.label(text="Path: %r" % path) - - def invoke(self, context, event): - wm = context.window_manager - return wm.invoke_props_dialog(self, width=600) - - -class WM_OT_addon_expand(Operator): - "Display more information on this add-on" - bl_idname = "wm.addon_expand" - bl_label = "" - - module = StringProperty( - name="Module", - description="Module name of the addon to expand", - ) - - def execute(self, context): - module_name = self.module - - # unlikely to fail, module should have already been imported - try: - # mod = __import__(module_name) - mod = USERPREF_PT_addons.module_get(module_name) - except: - import traceback - traceback.print_exc() - return {'CANCELLED'} - - info = addon_utils.module_bl_info(mod) - info["show_expanded"] = not info["show_expanded"] - return {'FINISHED'} - if __name__ == "__main__": # only for live edit. bpy.utils.register_module(__name__) |