UI: Add a custom text editor preference #108299

Closed
Guillermo Venegas wants to merge 18 commits from guishe:edit-source into main

When changing the target branch, be careful to rebase the branch in your fork to match. See documentation.
Contributor

Add a user preference to set up a custom text editor for editing text
files with the "Edit Source" action in the UI context menu.

  • An operator TEXT_OT_jump_to_file_at_point has been added.
  • A custom editor can be set in the user preferences.
  • A preset has been included for "Visual Studio Code".
  • When the editor is not set, use Blender's internal editor.
Add a user preference to set up a custom text editor for editing text files with the "Edit Source" action in the UI context menu. - An operator TEXT_OT_jump_to_file_at_point has been added. - A custom editor can be set in the user preferences. - A preset has been included for "Visual Studio Code". - When the editor is not set, use Blender's internal editor.
Author
Contributor

here a video showing the added user preference

here a video showing the added user preference
Guillermo Venegas changed title from UI: Add a custom Text Editor to WIP: UI: Add a custom Text Editor 2023-05-26 00:49:01 +02:00
Member

Perhaps a solution similar to the Animation Player would work best.

An enum with options:

  1. Internal
  2. Visual Studio Code
  3. Custom

image

Perhaps a solution similar to the **Animation Player** would work best. An enum with options: 1. `Internal` 2. `Visual Studio Code` 3. `Custom` ![image](/attachments/a956b2d9-c3d3-40b0-8e13-1c45361394a6)

Having the ability to open an external text editor at a location is a nice addition.

Having BLI_windows_open_text_file_execute is unnecessarily low level (and MS-Windows only). In general having C/C++ handle external processes isn't very convenient. Properly reporting if the command isn't found or fails for example - becomes overly involved.
Having this hard-coded to VS-Code formatted arguments is also not acceptable, as Pablo suggests, this can use presets with the option of a custom editor.

Instead of launching the process via ShellExecuteExW, an operator can be added e.g. TEXT_OT_jump_to_file_at_point which can implemented in Python and either call into Blender's text editor (as happens already), or opens an external process - depending on a user-preference.

Having the ability to open an external text editor at a location is a nice addition. Having `BLI_windows_open_text_file_execute` is unnecessarily low level (and MS-Windows only). In general having C/C++ handle external processes isn't very convenient. Properly reporting if the command isn't found or fails for example - becomes overly involved. Having this hard-coded to VS-Code formatted arguments is also not acceptable, as Pablo suggests, this can use presets with the option of a custom editor. Instead of launching the process via ShellExecuteExW, an operator can be added e.g. `TEXT_OT_jump_to_file_at_point` which can implemented in Python and either call into Blender's text editor (as happens already), or opens an external process - depending on a user-preference.
Campbell Barton requested changes 2023-05-26 06:09:23 +02:00
Campbell Barton left a comment
Owner

Requesting this be implemented as an operator in Python to avoid platform spesific handling of external processes.

Requesting this be implemented as an operator in Python to avoid platform spesific handling of external processes.
Guillermo Venegas force-pushed edit-source from 3a13854695 to 530607c8b3 2023-05-26 20:34:20 +02:00 Compare
Guillermo Venegas force-pushed edit-source from 530607c8b3 to f4581cfc9a 2023-05-26 20:37:01 +02:00 Compare
Guillermo Venegas force-pushed edit-source from f4581cfc9a to deb923f0b0 2023-05-26 20:45:00 +02:00 Compare
Author
Contributor

I would like to know if you have any suggestions for other text editors to add as presets

I would like to know if you have any suggestions for other text editors to add as presets
Author
Contributor

should these preferences be hidden if context.preferences.view.show_developer_ui == false?

should these preferences be hidden if `context.preferences.view.show_developer_ui == false`?
Member

should these preferences be hidden if context.preferences.view.show_developer_ui == false?

No I think it should always be visible. And we could add the operator to the Text menu in the Text Editor header to "Edit Externally", just like the image editor: https://docs.blender.org/manual/en/latest/editors/image/editing.html#edit-externally

> should these preferences be hidden if `context.preferences.view.show_developer_ui == false`? No I think it should always be visible. And we could add the operator to the Text menu in the Text Editor header to "Edit Externally", just like the image editor: https://docs.blender.org/manual/en/latest/editors/image/editing.html#edit-externally
Guillermo Venegas force-pushed edit-source from deb923f0b0 to 662aee7838 2023-05-26 22:55:39 +02:00 Compare
Author
Contributor

And we could add the operator to the Text menu in the Text Editor header to "Edit Externally"...

Added!

> And we could add the operator to the Text menu in the Text Editor header to "Edit Externally"... Added!
Guillermo Venegas force-pushed edit-source from 662aee7838 to a358c3e45c 2023-05-26 23:03:13 +02:00 Compare
Guillermo Venegas force-pushed edit-source from a358c3e45c to 4211c1a3dd 2023-05-27 22:16:13 +02:00 Compare
Guillermo Venegas force-pushed edit-source from 4211c1a3dd to eb96b6e231 2023-05-27 22:25:06 +02:00 Compare
Guillermo Venegas changed title from WIP: UI: Add a custom Text Editor to UI: Add a custom Text Editor 2023-05-27 22:26:22 +02:00
Guillermo Venegas requested review from Campbell Barton 2023-05-27 22:26:32 +02:00
Guillermo Venegas force-pushed edit-source from eb96b6e231 to f91ace53f5 2023-05-27 22:53:11 +02:00 Compare
Campbell Barton requested changes 2023-05-29 12:10:05 +02:00
@ -433,6 +441,32 @@ class TEXT_MT_context_menu(Menu):
layout.operator("text.autocomplete")
class TEXT_OT_jump_to_file_at_line(Operator):

Should be added to scripts/startup/bl_operators/text.py

Should be added to `scripts/startup/bl_operators/text.py`
guishe marked this conversation as resolved
@ -1751,0 +1754,4 @@
RNA_int_set(&op_props, "line", line);
int result = WM_operator_name_call_ptr(C, ot, WM_OP_EXEC_DEFAULT, &op_props, NULL);
if (result == OPERATOR_FINISHED) {

Should be result & OPERATOR_FINISHED

Should be `result & OPERATOR_FINISHED`
guishe marked this conversation as resolved
Campbell Barton reviewed 2023-05-29 12:11:51 +02:00
@ -250,0 +252,4 @@
row = layout.row()
op = row.operator("text.jump_to_file_at_line", text="Edit Externally")
op.filepath = text.filepath

There is no need to set these variables, the jump_to_file_at_line operator can initialize them from the context if they are not already set.

e.g. if self.properties.is_property_set("filepath")

There is no need to set these variables, the jump_to_file_at_line operator can initialize them from the context if they are not already set. e.g. `if self.properties.is_property_set("filepath")`
guishe marked this conversation as resolved
Guillermo Venegas force-pushed edit-source from efe759a3a5 to 8fa4ef1e84 2023-05-29 17:09:06 +02:00 Compare
Guillermo Venegas requested review from Campbell Barton 2023-05-29 17:10:11 +02:00
Guillermo Venegas added 1 commit 2023-05-29 17:32:21 +02:00
Guillermo Venegas added 1 commit 2023-06-01 14:38:33 +02:00

Looking into this I think it would be better if some of the details of this patch were changed.

Mainly because there are so many editors, they come and go, having a comprehensive list with invocation commands on all platforms over time is likely to get messy, if we had maintained such a list over the last decade it would include editors that are no longer in common use, but as they would have a "slot" in blender's UI & preferences, removing them could always annoy some developers.

The changes I'd like to see to this patch aren't so large but involve some different areas of the API.

  • Keep text_editor field, when it's a blank string, use blender's internal text editor.
  • Remove the text_editor_preset.
  • Use a generic invocation with basic string substitution e.g. {file} {line} {column}.
  • The operator can then execute the text editor without having to know details about each editor.
  • The presets system can then be used to provide a drop-down with popular editors, see: scripts/presets/framerate.

This way the preset just sets the command to open the editor, removing a preset wont prevent someone continuing to use their editor.

Looking into this I think it would be better if some of the details of this patch were changed. Mainly because there are so many editors, they come and go, having a comprehensive list with invocation commands on all platforms over time is likely to get messy, if we had maintained such a list over the last decade it would include editors that are no longer in common use, but as they would have a "slot" in blender's UI & preferences, removing them could always annoy some developers. The changes I'd like to see to this patch aren't so large but involve some different areas of the API. - Keep `text_editor` field, when it's a blank string, use blender's internal text editor. - Remove the `text_editor_preset`. - Use a generic invocation with basic string substitution e.g. `{file}` `{line}` `{column}`. - The operator can then execute the text editor without having to know details about each editor. - The presets system can then be used to provide a drop-down with popular editors, see: `scripts/presets/framerate`. This way the preset just sets the command to open the editor, removing a preset wont prevent someone continuing to use their editor.
Campbell Barton requested changes 2023-06-01 16:26:11 +02:00
Campbell Barton left a comment
Owner

Requesting removal of hard coded presets in favor of only an editor command, with presets that fill in it's value.

Requesting removal of hard coded presets in favor of only an editor command, with presets that fill in it's value.
Author
Contributor

Use a generic invocation with basic string substitution e.g. {file} {line} {column}.

Instead of a generic invocation, can i set a string field text_editor_args where the user can specify the format of arguments of the specific editor, if not specified use the generic invocation

>> Use a generic invocation with basic string substitution e.g. `{file}` `{line}` `{column}`. Instead of a generic invocation, can i set a string field `text_editor_args` where the user can specify the format of arguments of the specific editor, if not specified use the generic invocation
Guillermo Venegas added 1 commit 2023-06-01 20:30:14 +02:00
Author
Contributor

Here the changes. One problem I need to fix is ​​that when saving a custom setting, then reopening Blender, the inputs won't be visible until the user selects custom again

Here the changes. One problem I need to fix is ​​that when saving a custom setting, then reopening Blender, the inputs won't be visible until the user selects custom again
Campbell Barton requested changes 2023-06-02 01:04:25 +02:00
@ -0,0 +28,4 @@
args = [text_editor]
if not text_editor_args:
text_editor_args = "{file} {line} {column}"

Prefer not to do this, it's unlikely to work for most editors and will just leave the user with a confusing error message, instead, report an error that no argument preferences were set and return.

Prefer not to do this, it's unlikely to work for most editors and will just leave the user with a confusing error message, instead, report an error that no argument preferences were set and return.
guishe marked this conversation as resolved
@ -0,0 +30,4 @@
if not text_editor_args:
text_editor_args = "{file} {line} {column}"
text_editor_args = text_editor_args.format(file=self.filepath, line=self.line, column=self.column)

Even though str.format(..) seems useful, I think it's best not to use it because it potentially exposes a lot of complexity for a situation where we only want to substitute a few known identifiers. Format strings could be malformed which should be reported to the user (if formatting fails), and there are even security implications although in practice anyone with control over the preferences can already change automatic execution options. Nevertheless, I'd rather avoid and instead replace known identifiers, where each element is searched and replaced.

Python's standard library already has a solution for this which I think fits this use case well: https://docs.python.org/3/library/string.html#string.Template.substitute

Even though `str.format(..)` seems useful, I think it's best not to use it because it potentially exposes a lot of complexity for a situation where we only want to substitute a few known identifiers. Format strings could be malformed which should be reported to the user (if formatting fails), and there are even [security implications](https://lucumr.pocoo.org/2016/12/29/careful-with-str-format/) although in practice anyone with control over the preferences can already change automatic execution options. Nevertheless, I'd rather avoid and instead replace known identifiers, where each element is searched and replaced. Python's standard library already has a solution for this which I think fits this use case well: https://docs.python.org/3/library/string.html#string.Template.substitute
guishe marked this conversation as resolved
@ -0,0 +31,4 @@
text_editor_args = "{file} {line} {column}"
text_editor_args = text_editor_args.format(file=self.filepath, line=self.line, column=self.column)
args.extend(text_editor_args.split(" "))

Use shlex.split to account for quoted arguments.

Also, safest to split before substituting in arguments so spaces or quotes in filenames don't cause problems.

Use `shlex.split` to account for quoted arguments. Also, safest to split before substituting in arguments so spaces or quotes in filenames don't cause problems.
guishe marked this conversation as resolved
@ -0,0 +40,4 @@
return {'CANCELLED'}
return {'FINISHED'}
except:
return {'CANCELLED'}

The error output should be included in a report if the process fails to start, otherwise it's difficult to know what went wrong.

The error output should be included in a report if the process fails to start, otherwise it's difficult to know what went wrong.
guishe marked this conversation as resolved
@ -1405,0 +1425,4 @@
show_input = preset_label == "Custom"
if show_input:
text_editor_label = tip_("Custom (%s)") % text_editor

Prefer term "External" to custom (as all editors are effectively custom now).

Prefer term "External" to custom (as all editors are effectively custom now).
guishe marked this conversation as resolved
@ -728,2 +728,4 @@
char image_editor[1024];
/** 1024 = FILE_MAX. */
char text_editor[1024];
char text_editor_args[1024];

Worth noting that text_editor_args is not actually a file-path as hinted by the FILE_MAX length, can be much smaller as the value is expanded - although the value is arbitrary, suggest 256.

Worth noting that `text_editor_args` is not actually a file-path as hinted by the `FILE_MAX` length, can be much smaller as the value is expanded - although the value is arbitrary, suggest 256.
guishe marked this conversation as resolved
@ -6507,0 +6511,4 @@
prop = RNA_def_property(srna, "text_editor_args", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "text_editor_args");
RNA_def_property_ui_text(prop, "Text Editor Args", "text_editor_args");

Supported expansions should be noted here (file/line/column).

Supported expansions should be noted here (file/line/column).
guishe marked this conversation as resolved
Campbell Barton requested changes 2023-06-02 01:40:24 +02:00
@ -0,0 +1,5 @@
import bpy
import platform
bpy.context.preferences.filepaths.text_editor = "code.cmd" if platform.system() == 'Windows' else "code"

In this case I think it makes most sense to use a match statement, this allows for other platforms to be added more easily as well as the default case to be clearer.

In this case I think it makes most sense to use a `match` statement, this allows for other platforms to be added more easily as well as the default case to be clearer.
guishe marked this conversation as resolved
@ -0,0 +1,5 @@
import bpy

Notepad is MS-Windows only and not likely to be used by developers (for whom this feature is intended).

Currently we don't support platform spesific presets so including simple text editors only available on spesific platforms seems like a bug (or paper cut) that needs to be fixed.

Most popular editors for scripts/code are cross platform so I'd rather limit editor presets to these.


Note: presets that don't make sense for a platform could be excluded by CMake (as part of the install target), in this particular case I'm not convinced it's worth including.

Notepad is MS-Windows only and not likely to be used by developers (for whom this feature is intended). Currently we don't support platform spesific presets so including simple text editors only available on spesific platforms seems like a bug (or paper cut) that needs to be _fixed_. Most popular editors for scripts/code are cross platform so I'd rather limit editor presets to these. ---- *Note*: presets that don't make sense for a platform could be excluded by CMake (as part of the install target), in this particular case I'm not convinced it's worth including.
guishe marked this conversation as resolved
Guillermo Venegas added 1 commit 2023-06-02 05:43:44 +02:00
Guillermo Venegas added 1 commit 2023-06-02 05:57:56 +02:00
Guillermo Venegas added 1 commit 2023-06-02 06:07:12 +02:00
Guillermo Venegas added 1 commit 2023-06-02 06:08:09 +02:00
Guillermo Venegas added 1 commit 2023-06-02 06:09:52 +02:00
Guillermo Venegas requested review from Campbell Barton 2023-06-02 06:56:02 +02:00
Campbell Barton requested changes 2023-06-02 06:56:23 +02:00
@ -0,0 +6,4 @@
match platform.system():
case 'Windows':
bpy.context.preferences.filepaths.text_editor = "code.cmd"
case other:

_ as the variable isn't used.

`_` as the variable isn't used.
guishe marked this conversation as resolved
@ -0,0 +30,4 @@
if not text_editor_args:
self.report(
{'ERROR_INVALID_INPUT'},
("Please provide the specific format of the arguments with which the text editor opens files."

Duplicating the documentation isn't necessary, either refer to the text editor arguments tool-tip, or - if you feel strongly that it's useful to include the message inline here, it can be accessed from RNA and included.

type(context.preferences.filepaths).bl_rna.properties["text_editor_args"].description

Duplicating the documentation isn't necessary, either refer to the text editor arguments tool-tip, or - if you feel strongly that it's useful to include the message inline here, it can be accessed from RNA and included. `type(context.preferences.filepaths).bl_rna.properties["text_editor_args"].description`
guishe marked this conversation as resolved
@ -0,0 +45,4 @@
from string import Template
import shlex
for plain_arg in shlex.split(text_editor_args):
arg = Template(plain_arg).substitute(file=self.filepath, line=self.line, column=self.column)

picky create a dictionary for file=self.filepath, line=self.line, column=self.column, then pass it as **template_vars.

This should also catch exceptions since references in the string to variables that don't exist raises an error.

e.g.

template_vars = {
    "file": self.filepath,
    ... snip ...
}
try:
    args = [Template(arg).substitute(**template_vars) for arg in shlex.split(text_editor_args)]
except Exception as ex:
    self.report({'ERROR'}, "Exception parsing template: %r" % ex)
*picky* create a dictionary for `file=self.filepath, line=self.line, column=self.column`, then pass it as `**template_vars`. This should also catch exceptions since references in the string to variables that don't exist raises an error. e.g. ``` template_vars = { "file": self.filepath, ... snip ... } try: args = [Template(arg).substitute(**template_vars) for arg in shlex.split(text_editor_args)] except Exception as ex: self.report({'ERROR'}, "Exception parsing template: %r" % ex) ```
guishe marked this conversation as resolved
@ -0,0 +53,4 @@
# whit check=True if process.returncode !=0 a exception will be raised
process = subprocess.run(args, check=True)
return {'FINISHED'}
except subprocess.CalledProcessError as exception:

Catching a spesific exception means other exceptions will still cause errors that arent handled gracefully, for e.g. if the command isn't found a FileNotFoundError will be raised.

except Exception as ex: ... should be sufficient.

Catching a spesific exception means other exceptions will still cause errors that arent handled gracefully, for e.g. if the command isn't found a `FileNotFoundError` will be raised. `except Exception as ex:` ... should be sufficient.
guishe marked this conversation as resolved
Campbell Barton requested changes 2023-06-02 07:15:11 +02:00
Campbell Barton left a comment
Owner

Requested changes inline.

Requested changes inline.
Guillermo Venegas added 1 commit 2023-06-02 07:36:34 +02:00
Guillermo Venegas requested review from Campbell Barton 2023-06-02 07:40:55 +02:00
Author
Contributor

Wouldn't it be better to do it in a sub-panel?

image

Wouldn't it be better to do it in a sub-panel? ![image](/attachments/183610d8-72a8-4537-b79b-05e1f9f49608)
Campbell Barton requested changes 2023-06-02 08:00:39 +02:00
@ -0,0 +1 @@
import bpy

No need to capitalize file names (preset logic handles that).

Also, it seems including this file at all might be avoided, although I'd need to dig into details.

No need to capitalize file names (preset logic handles that). Also, it seems including this file at all might be avoided, although I'd need to dig into details.
guishe marked this conversation as resolved
@ -0,0 +1,4 @@
import bpy

No need to capitalize file names (preset logic handles that).

No need to capitalize file names (preset logic handles that).
guishe marked this conversation as resolved
@ -0,0 +1,10 @@
import bpy

code is the name of the command, the application is "Visual Studio Code", naming the file: visual_studio_code.py will display as expected.

`code` is the name of the command, the application is "Visual Studio Code", naming the file: `visual_studio_code.py` will display as expected.
guishe marked this conversation as resolved
@ -0,0 +39,4 @@
template_vars = {"file": self.filepath, "line": self.line, "column": self.column}
try:
from string import Template

Move imports to the beginning of the function.

Move imports to the beginning of the function.
guishe marked this conversation as resolved
@ -0,0 +46,4 @@
self.report({'ERROR'}, "Exception parsing template: %r" % ex)
return {'CANCELLED'}
args.insert(0, text_editor)

picky prefer:

args = [text_editor]
...
args.extend([Template(arg).substitute(**template_vars) for arg in shlex.split(text_editor_args)])
*picky* prefer: ``` args = [text_editor] ... args.extend([Template(arg).substitute(**template_vars) for arg in shlex.split(text_editor_args)]) ```
guishe marked this conversation as resolved
@ -0,0 +49,4 @@
args.insert(0, text_editor)
try:
import subprocess

move imports to beginning of the function.

move imports to beginning of the function.
guishe marked this conversation as resolved
@ -6507,0 +6519,4 @@
"$line Specifies the line where the cursor will be placed on. (Optional)\n"
"$column Specifies the character position within the $line where the cursor will be "
"placed. (Optional)\n\n"
"Ex: -f $file -l $line -c $column");

Use full text Example:

Use full text `Example:`
guishe marked this conversation as resolved

Wouldn't it be better to do it in a sub-panel?

image

Not sure of the best solution here, currently the editor & arguments read as if they might also be programs and are not so clearly related to the text editor, so a visual separation that groups these would be good.

> Wouldn't it be better to do it in a sub-panel? > > ![image](/attachments/183610d8-72a8-4537-b79b-05e1f9f49608) Not sure of the best solution here, currently the editor & arguments read as if they might also be programs and are not so clearly related to the text editor, so a visual separation that groups these would be good.
Campbell Barton reviewed 2023-06-02 10:58:58 +02:00
@ -1405,0 +1422,4 @@
text_editor_label = text_editor
show_input = text_editor or preset_label == "Custom"
if show_input:

The "External:" prefix doesn't seem necessary, everything that isn't "Internal" is implicitly external.

The "External:" prefix doesn't seem necessary, everything that isn't "Internal" is implicitly external.
Author
Contributor

it was removed because PresetPanel is now used

it was removed because PresetPanel is now used
Guillermo Venegas added 1 commit 2023-06-02 19:44:18 +02:00
Author
Contributor

i moved the preferences to sub-panel, now it look like
image

i moved the preferences to sub-panel, now it look like ![image](/attachments/fb5ae63c-60f5-4272-9c4a-efbfe9e2bdf6)
Guillermo Venegas added 1 commit 2023-06-02 19:49:59 +02:00
Guillermo Venegas added 1 commit 2023-06-02 19:52:38 +02:00
Guillermo Venegas added 1 commit 2023-06-02 19:53:41 +02:00
Author
Contributor

I had to upload a commit just to remove the Internal.py file, because renaming it to internal.py didn't update.

I had to upload a commit just to remove the Internal.py file, because renaming it to internal.py didn't update.
Guillermo Venegas requested review from Campbell Barton 2023-06-02 20:00:53 +02:00
Guillermo Venegas added 1 commit 2023-06-03 00:25:00 +02:00
Campbell Barton requested changes 2023-06-04 06:28:16 +02:00
Campbell Barton left a comment
Owner

Applied locally and noticed various issues, attached patch on this branch, also a patch on main (if that helps).

  • Rename file -> filepath.
  • Added line0, column0 (zero based variables), mainly useful for column0 as some editors expect this.
  • Assign filepaths = bpy.context.preferences.filepaths in presets.
  • Fixed row.enabled assignment.

Requesting these changes are applied.

Applied locally and noticed various issues, attached patch on this branch, also a patch on main (if that helps). - Rename file -> filepath. - Added `line0`, `column0` (zero based variables), mainly useful for `column0` as some editors expect this. - Assign `filepaths = bpy.context.preferences.filepaths` in presets. - Fixed `row.enabled` assignment. Requesting these changes are applied.
Guillermo Venegas added 1 commit 2023-06-04 15:44:19 +02:00
Guillermo Venegas requested review from Campbell Barton 2023-06-04 16:07:06 +02:00
Guillermo Venegas force-pushed edit-source from 91d3de2949 to 8e6d8b260f 2023-06-05 06:01:05 +02:00 Compare
Campbell Barton approved these changes 2023-06-07 05:52:47 +02:00
Campbell Barton changed title from UI: Add a custom Text Editor to UI: Add a custom text editor preference 2023-06-07 05:55:32 +02:00

Committed e16ec95a16 with some minor corrections.

  • Fix leak, call WM_operator_properties_free(..).
  • Rename file to filepath.
  • Note that Blender's internal editor is used when the preference isn't set.
Committed e16ec95a16669d7d0dada95a57dcc7528de98df7 with some minor corrections. - Fix leak, call `WM_operator_properties_free(..)`. - Rename `file` to `filepath`. - Note that Blender's internal editor is used when the preference isn't set.
Campbell Barton closed this pull request 2023-06-07 06:11:30 +02:00
Guillermo Venegas deleted branch edit-source 2023-06-07 14:10:19 +02:00

Pull request closed

Sign in to join this conversation.
No reviewers
No Label
Interest
Alembic
Interest
Animation & Rigging
Interest
Asset Browser
Interest
Asset Browser Project Overview
Interest
Audio
Interest
Automated Testing
Interest
Blender Asset Bundle
Interest
BlendFile
Interest
Collada
Interest
Compatibility
Interest
Compositing
Interest
Core
Interest
Cycles
Interest
Dependency Graph
Interest
Development Management
Interest
EEVEE
Interest
EEVEE & Viewport
Interest
Freestyle
Interest
Geometry Nodes
Interest
Grease Pencil
Interest
ID Management
Interest
Images & Movies
Interest
Import Export
Interest
Line Art
Interest
Masking
Interest
Metal
Interest
Modeling
Interest
Modifiers
Interest
Motion Tracking
Interest
Nodes & Physics
Interest
OpenGL
Interest
Overlay
Interest
Overrides
Interest
Performance
Interest
Physics
Interest
Pipeline, Assets & IO
Interest
Platforms, Builds & Tests
Interest
Python API
Interest
Render & Cycles
Interest
Render Pipeline
Interest
Sculpt, Paint & Texture
Interest
Text Editor
Interest
Translations
Interest
Triaging
Interest
Undo
Interest
USD
Interest
User Interface
Interest
UV Editing
Interest
VFX & Video
Interest
Video Sequencer
Interest
Virtual Reality
Interest
Vulkan
Interest
Wayland
Interest
Workbench
Interest: X11
Legacy
Blender 2.8 Project
Legacy
Milestone 1: Basic, Local Asset Browser
Legacy
OpenGL Error
Meta
Good First Issue
Meta
Papercut
Meta
Retrospective
Meta
Security
Module
Animation & Rigging
Module
Core
Module
Development Management
Module
EEVEE & Viewport
Module
Grease Pencil
Module
Modeling
Module
Nodes & Physics
Module
Pipeline, Assets & IO
Module
Platforms, Builds & Tests
Module
Python API
Module
Render & Cycles
Module
Sculpt, Paint & Texture
Module
Triaging
Module
User Interface
Module
VFX & Video
Platform
FreeBSD
Platform
Linux
Platform
macOS
Platform
Windows
Priority
High
Priority
Low
Priority
Normal
Priority
Unbreak Now!
Status
Archived
Status
Confirmed
Status
Duplicate
Status
Needs Info from Developers
Status
Needs Information from User
Status
Needs Triage
Status
Resolved
Type
Bug
Type
Design
Type
Known Issue
Type
Patch
Type
Report
Type
To Do
No Milestone
No project
No Assignees
3 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: blender/blender#108299
No description provided.