object_print3d_utils: replace f-strings by str.format() for I18n
[blender-addons.git] / space_view3d_pie_menus / pie_save_open_menu.py
bloba3243fd24b0f9b9f2e38b54c31556cd743c88ab9
1 # SPDX-License-Identifier: GPL-2.0-or-later
3 bl_info = {
4 "name": "Hotkey: 'Ctrl S'",
5 "description": "Save/Open & File Menus",
6 "blender": (2, 80, 0),
7 "location": "All Editors",
8 "warning": "",
9 "doc_url": "",
10 "category": "Save Open Pie"
13 import bpy
14 from bpy.types import (
15 Menu,
16 Operator,
18 import os
21 # Pie Save/Open
22 class PIE_MT_SaveOpen(Menu):
23 bl_idname = "PIE_MT_saveopen"
24 bl_label = "Pie Save/Open"
26 @staticmethod
27 def _save_as_mainfile_calc_incremental_name():
28 import re
29 dirname, base_name = os.path.split(bpy.data.filepath)
30 base_name_no_ext, ext = os.path.splitext(base_name)
31 match = re.match(r"(.*)_([\d]+)$", base_name_no_ext)
32 if match:
33 prefix, number = match.groups()
34 number = int(number) + 1
35 else:
36 prefix, number = base_name_no_ext, 1
37 prefix = os.path.join(dirname, prefix)
38 while os.path.isfile(output := "%s_%03d%s" % (prefix, number, ext)):
39 number += 1
40 return output
42 def draw(self, context):
43 layout = self.layout
44 pie = layout.menu_pie()
45 # 4 - LEFT
46 pie.operator("wm.read_homefile", text="New", icon='FILE_NEW')
47 # 6 - RIGHT
48 pie.menu("PIE_MT_link", text="Link Menu", icon='LINK_BLEND')
49 # 2 - BOTTOM
50 pie.menu("PIE_MT_fileio", text="Import/Export Menu", icon='IMPORT')
51 # 8 - TOP
52 pie.operator("wm.open_mainfile", text="Open File", icon='FILE_FOLDER')
53 # 7 - TOP - LEFT
54 pie.operator("wm.save_mainfile", text="Save", icon='FILE_TICK')
55 # 9 - TOP - RIGHT
56 pie.operator("wm.save_as_mainfile", text="Save As...", icon='NONE')
57 # 1 - BOTTOM - LEFT
58 if bpy.data.is_saved:
59 default_operator_contest = layout.operator_context
60 layout.operator_context = 'EXEC_DEFAULT'
61 pie.operator(
62 "wm.save_as_mainfile", text="Incremental Save", icon='NONE',
63 ).filepath = self._save_as_mainfile_calc_incremental_name()
64 layout.operator_context = default_operator_contest
65 else:
66 pie.box().label(text="Incremental Save (unsaved)")
68 # 3 - BOTTOM - RIGHT
69 pie.menu("PIE_MT_recover", text="Recovery Menu", icon='RECOVER_LAST')
72 class PIE_MT_link(Menu):
73 bl_idname = "PIE_MT_link"
74 bl_label = "Link"
76 def draw(self, context):
77 layout = self.layout
78 pie = layout.menu_pie()
79 box = pie.split().column()
80 box.operator("wm.link", text="Link", icon='LINK_BLEND')
81 box.operator("wm.append", text="Append", icon='APPEND_BLEND')
82 box.separator()
83 box.operator("file.autopack_toggle", text="Automatically Pack Into .blend")
84 box.operator("file.pack_all", text="Pack All Into .blend")
85 box.operator("file.unpack_all", text="Unpack All Into Files")
86 box.separator()
87 box.operator("file.make_paths_relative", text="Make All Paths Relative")
88 box.operator("file.make_paths_absolute", text="Make All Paths Absolute")
91 class PIE_MT_recover(Menu):
92 bl_idname = "PIE_MT_recover"
93 bl_label = "Recovery"
95 def draw(self, context):
96 layout = self.layout
97 pie = layout.menu_pie()
98 box = pie.split().column()
99 box.operator("wm.recover_auto_save", text="Recover Auto Save...", icon='NONE')
100 box.operator("wm.recover_last_session", text="Recover Last Session", icon='RECOVER_LAST')
101 box.operator("wm.revert_mainfile", text="Revert", icon='FILE_REFRESH')
102 box.separator()
103 box.operator("file.report_missing_files", text="Report Missing Files")
104 box.operator("file.find_missing_files", text="Find Missing Files")
106 class PIE_MT_fileio(Menu):
107 bl_idname = "PIE_MT_fileio"
108 bl_label = "Import/Export"
110 def draw(self, context):
111 layout = self.layout
112 pie = layout.menu_pie()
113 box = pie.split().column()
114 box.menu("TOPBAR_MT_file_import", icon='IMPORT')
115 box.separator()
116 box.menu("TOPBAR_MT_file_export", icon='EXPORT')
119 classes = (
120 PIE_MT_SaveOpen,
121 PIE_MT_fileio,
122 PIE_MT_recover,
123 PIE_MT_link,
126 addon_keymaps = []
129 def register():
130 for cls in classes:
131 bpy.utils.register_class(cls)
133 wm = bpy.context.window_manager
134 if wm.keyconfigs.addon:
135 # Save/Open/...
136 km = wm.keyconfigs.addon.keymaps.new(name='Window')
137 kmi = km.keymap_items.new('wm.call_menu_pie', 'S', 'PRESS', ctrl=True)
138 kmi.properties.name = "PIE_MT_saveopen"
139 addon_keymaps.append((km, kmi))
142 def unregister():
143 for cls in classes:
144 bpy.utils.unregister_class(cls)
146 wm = bpy.context.window_manager
147 kc = wm.keyconfigs.addon
148 if kc:
149 for km, kmi in addon_keymaps:
150 km.keymap_items.remove(kmi)
151 addon_keymaps.clear()
154 if __name__ == "__main__":
155 register()