Extensions: remove intermediate operators for upgrade and sync
The buttons to upgrade or sync extensions called extension operators via bpy.app.handlers, requiring awkward glue-code which didn't show error reports in to the user. Remove these operators and call the upgrade & sync operators directly.
This commit is contained in:
@@ -300,26 +300,6 @@ def extenion_repos_sync(*_):
|
||||
repo_status_text.from_message("Sync \"{:s}\"".format(active_repo.name), text)
|
||||
|
||||
|
||||
@bpy.app.handlers.persistent
|
||||
def extenion_repos_upgrade(*_):
|
||||
# This is called from operators (create or an explicit call to sync)
|
||||
# so calling a modal operator is "safe".
|
||||
if (active_repo := repo_active_or_none()) is None:
|
||||
return
|
||||
|
||||
print_debug("UPGRADE:", active_repo.name)
|
||||
|
||||
from contextlib import redirect_stdout
|
||||
import io
|
||||
stdout = io.StringIO()
|
||||
|
||||
with redirect_stdout(stdout):
|
||||
bpy.ops.extensions.package_upgrade_all('INVOKE_DEFAULT', use_active_only=True)
|
||||
|
||||
if text := stdout.getvalue():
|
||||
repo_status_text.from_message("Upgrade \"{:s}\"".format(active_repo.name), text)
|
||||
|
||||
|
||||
@bpy.app.handlers.persistent
|
||||
def extenion_repos_files_clear(directory, _):
|
||||
# Perform a "safe" file deletion by only removing files known to be either
|
||||
@@ -601,9 +581,6 @@ def register():
|
||||
handlers = bpy.app.handlers._extension_repos_sync
|
||||
handlers.append(extenion_repos_sync)
|
||||
|
||||
handlers = bpy.app.handlers._extension_repos_upgrade
|
||||
handlers.append(extenion_repos_upgrade)
|
||||
|
||||
handlers = bpy.app.handlers._extension_repos_files_clear
|
||||
handlers.append(extenion_repos_files_clear)
|
||||
|
||||
@@ -653,10 +630,6 @@ def unregister():
|
||||
if extenion_repos_sync in handlers:
|
||||
handlers.remove(extenion_repos_sync)
|
||||
|
||||
handlers = bpy.app.handlers._extension_repos_upgrade
|
||||
if extenion_repos_upgrade in handlers:
|
||||
handlers.remove(extenion_repos_upgrade)
|
||||
|
||||
handlers = bpy.app.handlers._extension_repos_files_clear
|
||||
if extenion_repos_files_clear in handlers:
|
||||
handlers.remove(extenion_repos_files_clear)
|
||||
|
||||
@@ -916,7 +916,17 @@ def _repo_dir_and_index_get(repo_index, directory, report_fn):
|
||||
return directory
|
||||
|
||||
|
||||
def _extensions_maybe_online_action_poll_impl(cls, action_text):
|
||||
def _extensions_maybe_online_action_poll_impl(cls, repo, action_text):
|
||||
|
||||
# Only operating on the active repository.
|
||||
if repo is not None:
|
||||
if not repo.enabled:
|
||||
cls.poll_message_set("Active repository is disabled")
|
||||
return False
|
||||
if not repo.use_remote_url:
|
||||
cls.poll_message_set("Local repositories do not support: {:s}".format(action_text))
|
||||
return False
|
||||
|
||||
if not bpy.app.online_access:
|
||||
cls.poll_message_set(
|
||||
"Online access required to {:s}. {:s}".format(
|
||||
@@ -1087,6 +1097,8 @@ class EXTENSIONS_OT_repo_sync(Operator, _ExtCmdMixIn):
|
||||
|
||||
|
||||
class EXTENSIONS_OT_repo_sync_all(Operator, _ExtCmdMixIn):
|
||||
# TODO: this text should be dynamic, changing when `use_active_only is True`.
|
||||
# """Refresh the list of extensions for the active repository"""
|
||||
"""Refresh the list of extensions for all the remote repositories"""
|
||||
bl_idname = "extensions.repo_sync_all"
|
||||
bl_label = "Check for Updates"
|
||||
@@ -1098,8 +1110,9 @@ class EXTENSIONS_OT_repo_sync_all(Operator, _ExtCmdMixIn):
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def poll(cls, _context):
|
||||
return _extensions_maybe_online_action_poll_impl(cls, "check for updates")
|
||||
def poll(cls, context):
|
||||
repo = getattr(context, "extension_repo", None)
|
||||
return _extensions_maybe_online_action_poll_impl(cls, repo, "check for updates")
|
||||
|
||||
def exec_command_iter(self, is_modal):
|
||||
use_active_only = self.use_active_only
|
||||
@@ -1168,6 +1181,8 @@ class EXTENSIONS_OT_repo_sync_all(Operator, _ExtCmdMixIn):
|
||||
|
||||
|
||||
class EXTENSIONS_OT_package_upgrade_all(Operator, _ExtCmdMixIn):
|
||||
# TODO: this text should be dynamic, changing when `use_active_only is True`.
|
||||
# """Upgrade all the extensions to their latest version for the active repository"""
|
||||
"""Upgrade all the extensions to their latest version for all the remote repositories"""
|
||||
bl_idname = "extensions.package_upgrade_all"
|
||||
bl_label = "Ext Package Upgrade All"
|
||||
@@ -1182,8 +1197,9 @@ class EXTENSIONS_OT_package_upgrade_all(Operator, _ExtCmdMixIn):
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def poll(cls, _context):
|
||||
return _extensions_maybe_online_action_poll_impl(cls, "install updates")
|
||||
def poll(cls, context):
|
||||
repo = getattr(context, "extension_repo", None)
|
||||
return _extensions_maybe_online_action_poll_impl(cls, repo, "install updates")
|
||||
|
||||
def exec_command_iter(self, is_modal):
|
||||
from . import repo_cache_store
|
||||
|
||||
@@ -22,6 +22,7 @@ from bpy.types import (
|
||||
|
||||
from bl_ui.space_userpref import (
|
||||
USERPREF_PT_addons,
|
||||
USERPREF_MT_extensions_active_repo,
|
||||
)
|
||||
|
||||
from . import repo_status_text
|
||||
@@ -1195,6 +1196,19 @@ def tags_panel_draw(panel, context):
|
||||
col.prop(wm.extension_tags, "[\"{:s}\"]".format(escape_identifier(t)))
|
||||
|
||||
|
||||
def extensions_repo_active_draw(self, context):
|
||||
# Draw icon buttons on the right hand side of the UI-list.
|
||||
from . import repo_active_or_none
|
||||
layout = self.layout
|
||||
|
||||
# Allow the poll functions to only check against the active repository.
|
||||
if (repo := repo_active_or_none()) is not None:
|
||||
layout.context_pointer_set("extension_repo", repo)
|
||||
|
||||
layout.operator("extensions.repo_sync_all", text="", icon='FILE_REFRESH').use_active_only = True
|
||||
layout.operator("extensions.package_upgrade_all", text="", icon='IMPORT').use_active_only = True
|
||||
|
||||
|
||||
classes = (
|
||||
# Pop-overs.
|
||||
USERPREF_PT_extensions_filter,
|
||||
@@ -1206,6 +1220,7 @@ classes = (
|
||||
def register():
|
||||
USERPREF_PT_addons.append(extensions_panel_draw)
|
||||
USERPREF_PT_extensions_tags.append(tags_panel_draw)
|
||||
USERPREF_MT_extensions_active_repo.append(extensions_repo_active_draw)
|
||||
|
||||
for cls in classes:
|
||||
bpy.utils.register_class(cls)
|
||||
@@ -1214,6 +1229,7 @@ def register():
|
||||
def unregister():
|
||||
USERPREF_PT_addons.remove(extensions_panel_draw)
|
||||
USERPREF_PT_extensions_tags.remove(tags_panel_draw)
|
||||
USERPREF_MT_extensions_active_repo.remove(extensions_repo_active_draw)
|
||||
|
||||
for cls in reversed(classes):
|
||||
bpy.utils.unregister_class(cls)
|
||||
|
||||
@@ -2122,6 +2122,15 @@ class USERPREF_PT_keymap(KeymapPanel, Panel):
|
||||
# -----------------------------------------------------------------------------
|
||||
# Extension Panels
|
||||
|
||||
|
||||
class USERPREF_MT_extensions_active_repo(Menu):
|
||||
bl_label = "Active Repository"
|
||||
|
||||
def draw(self, _context):
|
||||
# Add-ons may extend.
|
||||
pass
|
||||
|
||||
|
||||
class USERPREF_PT_extensions_repos(Panel):
|
||||
bl_label = "Repositories"
|
||||
bl_options = {'HIDE_HEADER'}
|
||||
@@ -2154,8 +2163,8 @@ class USERPREF_PT_extensions_repos(Panel):
|
||||
props.index = active_repo_index
|
||||
|
||||
col.separator()
|
||||
col.operator("preferences.extension_repo_sync", text="", icon='FILE_REFRESH')
|
||||
col.operator("preferences.extension_repo_upgrade", text="", icon='IMPORT')
|
||||
|
||||
col.menu_contents("USERPREF_MT_extensions_active_repo")
|
||||
|
||||
try:
|
||||
active_repo = None if active_repo_index < 0 else extensions.repos[active_repo_index]
|
||||
@@ -2922,6 +2931,7 @@ classes = (
|
||||
|
||||
USERPREF_PT_addons,
|
||||
|
||||
USERPREF_MT_extensions_active_repo,
|
||||
USERPREF_PT_extensions_repos,
|
||||
|
||||
USERPREF_PT_studiolight_lights,
|
||||
|
||||
Reference in New Issue
Block a user