UI: add URL presets
This adds a url-preset operator to simplify opening re-usable links. - Standard websites have their own tool-tip. - De-duplicate logic to get URL's that include version information. - Reporting bugs no longer needs to have all information included in the URL. D5498 by @luisbg with edits.
This commit is contained in:
@@ -64,10 +64,7 @@ def url_prefill_from_blender(addon_info=None):
|
||||
"\n"
|
||||
"**Addon Information**\n"
|
||||
)
|
||||
fh.write((
|
||||
"Name: {name} {version}\n"
|
||||
"Author: {author}\n").format(**addon_info)
|
||||
)
|
||||
fh.write(addon_info)
|
||||
|
||||
fh.write(
|
||||
"\n"
|
||||
|
||||
@@ -846,6 +846,86 @@ class WM_OT_url_open(Operator):
|
||||
return {'FINISHED'}
|
||||
|
||||
|
||||
class WM_OT_url_open_preset(Operator):
|
||||
"""Open a preset website in the web-browser"""
|
||||
bl_idname = "wm.url_open_preset"
|
||||
bl_label = "Open Preset Website"
|
||||
bl_options = {'INTERNAL'}
|
||||
|
||||
type: EnumProperty(
|
||||
name="Site",
|
||||
items=lambda self, _context: (
|
||||
item for (item, _) in WM_OT_url_open_preset.preset_items
|
||||
),
|
||||
)
|
||||
|
||||
id: StringProperty(
|
||||
name="Identifier",
|
||||
description="Optional identifier",
|
||||
)
|
||||
|
||||
def _url_from_bug(self, _context):
|
||||
from bl_ui_utils.bug_report_url import url_prefill_from_blender
|
||||
return url_prefill_from_blender()
|
||||
|
||||
def _url_from_bug_addon(self, _context):
|
||||
from bl_ui_utils.bug_report_url import url_prefill_from_blender
|
||||
return url_prefill_from_blender(addon_info=self.id)
|
||||
|
||||
def _url_from_release_notes(self, _context):
|
||||
return "https://www.blender.org/download/releases/%d-%d/" % bpy.app.version[:2]
|
||||
|
||||
def _url_from_manual(self, _context):
|
||||
if bpy.app.version_cycle in {"rc", "release"}:
|
||||
manual_version = "%d.%d" % bpy.app.version[:2]
|
||||
else:
|
||||
manual_version = "dev"
|
||||
return "https://docs.blender.org/manual/en/" + manual_version + "/"
|
||||
|
||||
# This list is: (enum_item, url) pairs.
|
||||
# Allow dynamically extending.
|
||||
preset_items = [
|
||||
# Dynamic URL's.
|
||||
(('BUG', "Bug",
|
||||
"Report a bug with pre-filled version information"),
|
||||
_url_from_bug),
|
||||
(('BUG_ADDON', "Add-On Bug",
|
||||
"Report a bug in an add-on"),
|
||||
_url_from_bug_addon),
|
||||
(('RELEASE_NOTES', "Release Notes",
|
||||
"Read about whats new in this version of Blender"),
|
||||
_url_from_release_notes),
|
||||
(('MANUAL', "Manual",
|
||||
"The reference manual for this version of Blender"),
|
||||
_url_from_manual),
|
||||
|
||||
# Static URL's.
|
||||
(('FUND', "Development Fund",
|
||||
"The donation program to support maintenance and improvements"),
|
||||
"https://fund.blender.org"),
|
||||
(('BLENDER', "blender.org",
|
||||
"Blender's official web-site"),
|
||||
"https://www.blender.org"),
|
||||
(('CREDITS', "Credits",
|
||||
"Lists committers to Blender's source code"),
|
||||
"https://www.blender.org/about/credits/"),
|
||||
]
|
||||
|
||||
def execute(self, context):
|
||||
url = None
|
||||
type = self.type
|
||||
for (item_id, _, _), url in self.preset_items:
|
||||
if item_id == type:
|
||||
if callable(url):
|
||||
url = url(self, context)
|
||||
break
|
||||
|
||||
import webbrowser
|
||||
webbrowser.open(url)
|
||||
|
||||
return {'FINISHED'}
|
||||
|
||||
|
||||
class WM_OT_path_open(Operator):
|
||||
"""Open a path in a file browser"""
|
||||
bl_idname = "wm.path_open"
|
||||
@@ -1808,23 +1888,13 @@ class WM_MT_splash(Menu):
|
||||
if found_recent:
|
||||
col2_title.label(text="Recent Files")
|
||||
else:
|
||||
if bpy.app.version_cycle in {'rc', 'release'}:
|
||||
manual_version = '%d.%d' % bpy.app.version[:2]
|
||||
else:
|
||||
manual_version = 'dev'
|
||||
|
||||
# Links if no recent files
|
||||
col2_title.label(text="Getting Started")
|
||||
|
||||
col2.operator(
|
||||
"wm.url_open", text="Manual", icon='URL'
|
||||
).url = "https://docs.blender.org/manual/en/" + manual_version + "/"
|
||||
col2.operator(
|
||||
"wm.url_open", text="Blender Website", icon='URL',
|
||||
).url = "https://www.blender.org"
|
||||
col2.operator(
|
||||
"wm.url_open", text="Credits", icon='URL',
|
||||
).url = "https://www.blender.org/about/credits/"
|
||||
col2.operator("wm.url_open_preset", text="Manual", icon='URL').type = 'MANUAL'
|
||||
col2.operator("wm.url_open_preset", text="Blender Website", icon='URL').type = 'BLENDER'
|
||||
col2.operator("wm.url_open_preset", text="Credits", icon='URL').type = 'CREDITS'
|
||||
|
||||
layout.separator()
|
||||
|
||||
@@ -1837,12 +1907,9 @@ class WM_MT_splash(Menu):
|
||||
col1.operator("wm.recover_last_session", icon='RECOVER_LAST')
|
||||
|
||||
col2 = split.column()
|
||||
col2.operator(
|
||||
"wm.url_open", text="Release Notes", icon='URL',
|
||||
).url = "https://www.blender.org/download/releases/%d-%d/" % bpy.app.version[:2]
|
||||
col2.operator(
|
||||
"wm.url_open", text="Development Fund", icon='FUND'
|
||||
).url = "https://fund.blender.org"
|
||||
|
||||
col2.operator("wm.url_open_preset", text="Release Notes", icon='URL').type = 'RELEASE_NOTES'
|
||||
col2.operator("wm.url_open_preset", text="Development Fund", icon='FUND').type = 'FUND'
|
||||
|
||||
layout.separator()
|
||||
layout.separator()
|
||||
@@ -1908,6 +1975,7 @@ classes = (
|
||||
WM_OT_owner_disable,
|
||||
WM_OT_owner_enable,
|
||||
WM_OT_url_open,
|
||||
WM_OT_url_open_preset,
|
||||
WM_OT_tool_set_by_id,
|
||||
WM_OT_tool_set_by_index,
|
||||
WM_OT_toolbar,
|
||||
|
||||
@@ -344,18 +344,12 @@ class TOPBAR_MT_app_about(Menu):
|
||||
def draw(self, _context):
|
||||
layout = self.layout
|
||||
|
||||
layout.operator(
|
||||
"wm.url_open", text="Release Notes", icon='URL',
|
||||
).url = "https://www.blender.org/download/releases/%d-%d/" % bpy.app.version[:2]
|
||||
layout.operator("wm.url_open_preset", text="Release Notes", icon='URL').type = 'RELEASE_NOTES'
|
||||
|
||||
layout.separator()
|
||||
|
||||
layout.operator(
|
||||
"wm.url_open", text="Blender Website", icon='URL',
|
||||
).url = "https://www.blender.org/"
|
||||
layout.operator(
|
||||
"wm.url_open", text="Credits", icon='URL',
|
||||
).url = "https://www.blender.org/about/credits/"
|
||||
layout.operator("wm.url_open_preset", text="Blender Website", icon='URL').type = 'BLENDER'
|
||||
layout.operator("wm.url_open", text="Credits", icon='URL').type = 'CREDITS'
|
||||
|
||||
layout.separator()
|
||||
|
||||
@@ -370,9 +364,7 @@ class TOPBAR_MT_app_support(Menu):
|
||||
def draw(self, _context):
|
||||
layout = self.layout
|
||||
|
||||
layout.operator(
|
||||
"wm.url_open", text="Development Fund", icon='FUND',
|
||||
).url = "https://fund.blender.org"
|
||||
layout.operator("wm.url_open_preset", text="Development Fund", icon='FUND').type = 'FUND'
|
||||
|
||||
layout.separator()
|
||||
|
||||
@@ -565,22 +557,12 @@ class TOPBAR_MT_help(Menu):
|
||||
bl_label = "Help"
|
||||
|
||||
def draw(self, context):
|
||||
# If 'url_prefill_from_blender' becomes slow it could be made into a separate operator
|
||||
# to avoid constructing the bug report just to show this menu.
|
||||
from bl_ui_utils.bug_report_url import url_prefill_from_blender
|
||||
|
||||
layout = self.layout
|
||||
|
||||
show_developer = context.preferences.view.show_developer_ui
|
||||
|
||||
if bpy.app.version_cycle in {'rc', 'release'}:
|
||||
manual_version = '%d.%d' % bpy.app.version[:2]
|
||||
else:
|
||||
manual_version = 'dev'
|
||||
layout.operator("wm.url_open_preset", text="Manual", icon='HELP',).type = 'MANUAL'
|
||||
|
||||
layout.operator(
|
||||
"wm.url_open", text="Manual", icon='HELP',
|
||||
).url = "https://docs.blender.org/manual/en/" + manual_version + "/"
|
||||
layout.operator(
|
||||
"wm.url_open", text="Tutorials", icon='URL',
|
||||
).url = "https://www.blender.org/tutorials"
|
||||
@@ -612,9 +594,7 @@ class TOPBAR_MT_help(Menu):
|
||||
|
||||
layout.separator()
|
||||
|
||||
layout.operator(
|
||||
"wm.url_open", text="Report a Bug", icon='URL',
|
||||
).url = url_prefill_from_blender()
|
||||
layout.operator("wm.url_open_preset", text="Report a Bug", icon='URL').type = 'BUG'
|
||||
|
||||
layout.separator()
|
||||
|
||||
|
||||
@@ -1708,7 +1708,6 @@ class USERPREF_PT_addons(Panel):
|
||||
def draw(self, context):
|
||||
import os
|
||||
import addon_utils
|
||||
from bl_ui_utils.bug_report_url import url_prefill_from_blender
|
||||
|
||||
layout = self.layout
|
||||
|
||||
@@ -1887,13 +1886,18 @@ class USERPREF_PT_addons(Panel):
|
||||
).url = info["wiki_url"]
|
||||
# Only add "Report a Bug" button if tracker_url is set
|
||||
# or the add-on is bundled (use official tracker then).
|
||||
if info.get("tracker_url") or not user_addon:
|
||||
if info.get("tracker_url"):
|
||||
sub.operator(
|
||||
"wm.url_open", text="Report a Bug", icon='URL',
|
||||
).url = info.get(
|
||||
"tracker_url",
|
||||
url_prefill_from_blender(info),
|
||||
).url = info["tracker_url"]
|
||||
elif not user_addon:
|
||||
addon_info = ("Name: {} {}\nAuthor: {}\n").format(
|
||||
info["name"], info["version"], info["author"])
|
||||
props = sub.operator(
|
||||
"wm.url_open_preset", text="Report a Bug", icon='URL',
|
||||
)
|
||||
props.type = 'BUG_ADDON'
|
||||
props.id = addon_info
|
||||
if user_addon:
|
||||
sub.operator(
|
||||
"preferences.addon_remove", text="Remove", icon='CANCEL',
|
||||
|
||||
Reference in New Issue
Block a user