1 # SPDX-License-Identifier: GPL-2.0-or-later
4 "name": "Hotkey: 'Ctrl S'",
5 "description": "Save/Open & File Menus",
7 "location": "All Editors",
10 "category": "Save Open Pie"
14 from bpy
.types
import (
22 class PIE_MT_SaveOpen(Menu
):
23 bl_idname
= "PIE_MT_saveopen"
24 bl_label
= "Pie Save/Open"
27 def _save_as_mainfile_calc_incremental_name():
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
)
33 prefix
, number
= match
.groups()
34 number
= int(number
) + 1
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
)):
42 def draw(self
, context
):
44 pie
= layout
.menu_pie()
46 pie
.operator("wm.read_homefile", text
="New", icon
='FILE_NEW')
48 pie
.menu("PIE_MT_link", text
="Link Menu", icon
='LINK_BLEND')
50 pie
.menu("PIE_MT_fileio", text
="Import/Export Menu", icon
='IMPORT')
52 pie
.menu("PIE_MT_openio", text
="Open Menu", icon
='FILE_FOLDER')
54 pie
.operator("wm.save_mainfile", text
="Save", icon
='FILE_TICK')
56 pie
.operator("wm.save_as_mainfile", text
="Save As...", icon
='NONE')
59 default_operator_contest
= layout
.operator_context
60 layout
.operator_context
= 'EXEC_DEFAULT'
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
66 pie
.box().label(text
="Incremental Save (unsaved)")
69 pie
.menu("PIE_MT_recover", text
="Recovery Menu", icon
='RECOVER_LAST')
72 class PIE_MT_link(Menu
):
73 bl_idname
= "PIE_MT_link"
76 def draw(self
, context
):
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')
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")
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"
95 def draw(self
, context
):
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')
103 box
.operator("file.report_missing_files", text
="Report Missing Files")
104 box
.operator("file.find_missing_files", text
="Find Missing Files")
107 class PIE_MT_fileio(Menu
):
108 bl_idname
= "PIE_MT_fileio"
109 bl_label
= "Import/Export"
111 def draw(self
, context
):
113 pie
= layout
.menu_pie()
114 box
= pie
.split().column()
115 box
.menu("TOPBAR_MT_file_import", icon
='IMPORT')
117 box
.menu("TOPBAR_MT_file_export", icon
='EXPORT')
120 class PIE_MT_openio(Menu
):
121 bl_idname
= "PIE_MT_openio"
122 bl_label
= "Open/Open Recent"
124 def draw(self
, context
):
126 pie
= layout
.menu_pie()
127 box
= pie
.split().column()
128 box
.operator("wm.open_mainfile", text
="Open File", icon
='FILE_FOLDER')
130 box
.menu("TOPBAR_MT_file_open_recent", icon
='FILE_FOLDER')
146 bpy
.utils
.register_class(cls
)
148 wm
= bpy
.context
.window_manager
149 if wm
.keyconfigs
.addon
:
151 km
= wm
.keyconfigs
.addon
.keymaps
.new(name
='Window')
152 kmi
= km
.keymap_items
.new('wm.call_menu_pie', 'S', 'PRESS', ctrl
=True)
153 kmi
.properties
.name
= "PIE_MT_saveopen"
154 addon_keymaps
.append((km
, kmi
))
159 bpy
.utils
.unregister_class(cls
)
161 wm
= bpy
.context
.window_manager
162 kc
= wm
.keyconfigs
.addon
164 for km
, kmi
in addon_keymaps
:
165 km
.keymap_items
.remove(kmi
)
166 addon_keymaps
.clear()
169 if __name__
== "__main__":