Bring back editor pulldown menus, get operators to work, T for nav-bar

- Adds the View, Edit & Select pulldown menus
- Makes asset operators work (e.g. catalog management)
- Correct notifiers (fixing missing redraws)
- Add T shortcut to toggle toolbar
This commit is contained in:
Julian Eisel 2022-02-11 18:13:48 +01:00
parent ff213c802c
commit f29fa9895f
7 changed files with 182 additions and 36 deletions

View File

@ -2135,7 +2135,6 @@ def km_info(params):
return keymap
# ------------------------------------------------------------------------------
# Editor (File Browser)
@ -2291,6 +2290,25 @@ def km_file_browser_buttons(_params):
return keymap
# ------------------------------------------------------------------------------
# Editor (Asset Browser)
def km_asset_browser(params):
items = []
keymap = (
"Asset Browser",
{"space_type": 'ASSET_BROWSER', "region_type": 'WINDOW'},
{"items": items},
)
items.extend([
("wm.context_toggle", {"type": 'T', "value": 'PRESS'},
{"properties": [("data_path", 'space_data.show_region_nav_bar')]}),
])
return keymap
# ------------------------------------------------------------------------------
# Editor (Dope Sheet)
@ -7718,6 +7736,7 @@ def generate_keymaps(params=None):
km_node_editor(params),
km_spreadsheet_generic(params),
km_info(params),
km_asset_browser(params),
km_file_browser(params),
km_file_browser_main(params),
km_file_browser_buttons(params),

View File

@ -17,7 +17,7 @@
# ##### END GPL LICENSE BLOCK #####
# <pep8 compliant>
from bpy.types import Header
from bpy.types import Header, Menu
class ASSETBROWSER_HT_header(Header):
@ -29,9 +29,58 @@ class ASSETBROWSER_HT_header(Header):
layout.template_header()
ASSETBROWSER_MT_editor_menus.draw_collapsible(context, layout)
class ASSETBROWSER_MT_editor_menus(Menu):
bl_idname = "ASSETBROWSER_MT_editor_menus"
bl_label = ""
def draw(self, _context):
layout = self.layout
layout.menu("ASSETBROWSER_MT_view")
layout.menu("ASSETBROWSER_MT_select")
layout.menu("ASSETBROWSER_MT_edit")
class ASSETBROWSER_MT_view(Menu):
bl_label = "View"
def draw(self, context):
layout = self.layout
st = context.space_data
layout.prop(st, "show_region_nav_bar", text="Navigation")
layout.separator()
layout.menu("INFO_MT_area")
class ASSETBROWSER_MT_select(Menu):
bl_label = "Select"
def draw(self, _context):
layout = self.layout
class ASSETBROWSER_MT_edit(Menu):
bl_label = "Edit"
def draw(self, _context):
layout = self.layout
layout.operator("asset.catalog_undo", text="Undo")
layout.operator("asset.catalog_redo", text="Redo")
classes = (
ASSETBROWSER_HT_header,
ASSETBROWSER_MT_editor_menus,
ASSETBROWSER_MT_view,
ASSETBROWSER_MT_select,
ASSETBROWSER_MT_edit,
)
if __name__ == "__main__": # only for live edit.

View File

@ -80,7 +80,7 @@ class FILEBROWSER_HT_header(Header):
layout.template_header()
if SpaceAssetInfo.is_asset_browser(space_data):
ASSETBROWSER_MT_editor_menus.draw_collapsible(context, layout)
ASSETBROWSEROLD_MT_editor_menus.draw_collapsible(context, layout)
layout.separator()
self.draw_asset_browser_buttons(context)
else:
@ -638,19 +638,19 @@ class AssetBrowserMenu:
return SpaceAssetInfo.is_asset_browser_poll(context)
class ASSETBROWSER_MT_editor_menus(AssetBrowserMenu, Menu):
bl_idname = "ASSETBROWSER_MT_editor_menus"
class ASSETBROWSEROLD_MT_editor_menus(AssetBrowserMenu, Menu):
bl_idname = "ASSETBROWSEROLD_MT_editor_menus"
bl_label = ""
def draw(self, _context):
layout = self.layout
layout.menu("ASSETBROWSER_MT_view")
layout.menu("ASSETBROWSER_MT_select")
layout.menu("ASSETBROWSEROLD_MT_view")
layout.menu("ASSETBROWSEROLD_MT_select")
layout.menu("ASSETBROWSER_MT_edit")
class ASSETBROWSER_MT_view(AssetBrowserMenu, Menu):
class ASSETBROWSEROLD_MT_view(AssetBrowserMenu, Menu):
bl_label = "View"
def draw(self, context):
@ -671,7 +671,7 @@ class ASSETBROWSER_MT_view(AssetBrowserMenu, Menu):
layout.menu("INFO_MT_area")
class ASSETBROWSER_MT_select(AssetBrowserMenu, Menu):
class ASSETBROWSEROLD_MT_select(AssetBrowserMenu, Menu):
bl_label = "Select"
def draw(self, _context):
@ -686,7 +686,7 @@ class ASSETBROWSER_MT_select(AssetBrowserMenu, Menu):
layout.operator("file.select_box")
class ASSETBROWSER_MT_edit(AssetBrowserMenu, Menu):
class ASSETBROWSEROLD_MT_edit(AssetBrowserMenu, Menu):
bl_label = "Edit"
def draw(self, _context):
@ -845,10 +845,10 @@ classes = (
FILEBROWSER_MT_context_menu,
ASSETBROWSER_PT_display,
ASSETBROWSER_PT_filter,
ASSETBROWSER_MT_editor_menus,
ASSETBROWSER_MT_view,
ASSETBROWSER_MT_select,
ASSETBROWSER_MT_edit,
ASSETBROWSEROLD_MT_editor_menus,
ASSETBROWSEROLD_MT_view,
ASSETBROWSEROLD_MT_select,
ASSETBROWSEROLD_MT_edit,
ASSETBROWSER_MT_metadata_preview_menu,
ASSETBROWSER_PT_metadata,
ASSETBROWSER_PT_metadata_preview,

View File

@ -446,24 +446,38 @@ static void ASSET_OT_library_refresh(struct wmOperatorType *ot)
/* -------------------------------------------------------------------- */
static AssetLibrary *get_asset_library(const bContext *C)
{
if (const SpaceFile *sfile = CTX_wm_space_file(C)) {
return ED_fileselect_active_asset_library_get(sfile);
}
if (const AssetLibraryReference *library_ref = CTX_wm_asset_library_ref(C)) {
return ED_assetlist_library_get(library_ref);
}
return nullptr;
}
static bool asset_catalog_operator_poll(bContext *C)
{
const SpaceFile *sfile = CTX_wm_space_file(C);
return sfile && ED_fileselect_active_asset_library_get(sfile);
return get_asset_library(C) != nullptr;
}
static int asset_catalog_new_exec(bContext *C, wmOperator *op)
{
SpaceFile *sfile = CTX_wm_space_file(C);
struct AssetLibrary *asset_library = ED_fileselect_active_asset_library_get(sfile);
AssetLibrary *asset_library = get_asset_library(C);
char *parent_path = RNA_string_get_alloc(op->ptr, "parent_path", nullptr, 0, nullptr);
blender::bke::AssetCatalog *new_catalog = ED_asset_catalog_add(
asset_library, "Catalog", parent_path);
if (sfile) {
if (SpaceFile *sfile = CTX_wm_space_file(C)) {
ED_fileselect_activate_asset_catalog(sfile, new_catalog->catalog_id);
}
else if (SpaceAssets *sassets = CTX_wm_space_assets(C)) {
/* TODO how can we select the catalog here in a nice way, without being space dependent? Idea:
* use an operator macro instead? */
UNUSED_VARS(sassets);
}
MEM_freeN(parent_path);
@ -494,8 +508,7 @@ static void ASSET_OT_catalog_new(struct wmOperatorType *ot)
static int asset_catalog_delete_exec(bContext *C, wmOperator *op)
{
SpaceFile *sfile = CTX_wm_space_file(C);
struct AssetLibrary *asset_library = ED_fileselect_active_asset_library_get(sfile);
AssetLibrary *asset_library = get_asset_library(C);
char *catalog_id_str = RNA_string_get_alloc(op->ptr, "catalog_id", nullptr, 0, nullptr);
bke::CatalogID catalog_id;
if (!BLI_uuid_parse_string(&catalog_id, catalog_id_str)) {
@ -530,13 +543,16 @@ static void ASSET_OT_catalog_delete(struct wmOperatorType *ot)
static bke::AssetCatalogService *get_catalog_service(bContext *C)
{
const SpaceFile *sfile = CTX_wm_space_file(C);
if (!sfile) {
return nullptr;
if (const SpaceFile *sfile = CTX_wm_space_file(C)) {
AssetLibrary *asset_lib = ED_fileselect_active_asset_library_get(sfile);
return BKE_asset_library_get_catalog_service(asset_lib);
}
if (const AssetLibraryReference *library_ref = CTX_wm_asset_library_ref(C)) {
AssetLibrary *asset_lib = ED_assetlist_library_get(library_ref);
return BKE_asset_library_get_catalog_service(asset_lib);
}
AssetLibrary *asset_lib = ED_fileselect_active_asset_library_get(sfile);
return BKE_asset_library_get_catalog_service(asset_lib);
return nullptr;
}
static int asset_catalog_undo_exec(bContext *C, wmOperator * /*op*/)
@ -547,7 +563,7 @@ static int asset_catalog_undo_exec(bContext *C, wmOperator * /*op*/)
}
catalog_service->undo();
WM_event_add_notifier(C, NC_SPACE | ND_SPACE_ASSET_PARAMS, nullptr);
WM_event_add_notifier(C, NC_ASSET | ND_ASSET_CATALOGS, nullptr);
return OPERATOR_FINISHED;
}
@ -577,7 +593,7 @@ static int asset_catalog_redo_exec(bContext *C, wmOperator * /*op*/)
}
catalog_service->redo();
WM_event_add_notifier(C, NC_SPACE | ND_SPACE_ASSET_PARAMS, nullptr);
WM_event_add_notifier(C, NC_ASSET | ND_ASSET_CATALOGS, nullptr);
return OPERATOR_FINISHED;
}
@ -654,8 +670,7 @@ static bool asset_catalogs_save_poll(bContext *C)
static int asset_catalogs_save_exec(bContext *C, wmOperator * /*op*/)
{
const SpaceFile *sfile = CTX_wm_space_file(C);
::AssetLibrary *asset_library = ED_fileselect_active_asset_library_get(sfile);
::AssetLibrary *asset_library = get_asset_library(C);
ED_asset_catalogs_save_from_main_path(asset_library, CTX_data_main(C));
@ -690,11 +705,12 @@ static bool has_external_files(Main *bmain, struct ReportList *reports);
static bool asset_bundle_install_poll(bContext *C)
{
/* This operator only works when the asset browser is set to Current File. */
const SpaceFile *sfile = CTX_wm_space_file(C);
if (sfile == nullptr) {
const AssetLibraryReference *asset_library_ref = CTX_wm_asset_library_ref(C);
if (asset_library_ref == nullptr) {
return false;
}
if (!ED_fileselect_is_local_asset_library(sfile)) {
if (asset_library_ref->type == ASSET_LIBRARY_LOCAL) {
return false;
}

View File

@ -39,6 +39,7 @@
#include "UI_resources.h"
#include "UI_view2d.h"
#include "WM_api.h"
#include "WM_message.h"
#include "asset_browser_intern.hh"
@ -104,16 +105,49 @@ static SpaceLink *asset_browser_duplicate(SpaceLink *sl)
return (SpaceLink *)asset_browser_new;
}
static void asset_browser_keymap(wmKeyConfig *UNUSED(keyconf))
static void asset_browser_keymap(wmKeyConfig *keyconf)
{
/* keys for all regions */
WM_keymap_ensure(keyconf, "Asset Browser", SPACE_ASSETS, 0);
}
const char *asset_browser_context_dir[] = {
"asset_library_ref",
NULL,
};
static int /*eContextResult*/ asset_browser_context(const bContext *C,
const char *member,
bContextDataResult *result)
{
if (CTX_data_dir(member)) {
CTX_data_dir_set(result, asset_browser_context_dir);
return CTX_RESULT_OK;
}
bScreen *screen = CTX_wm_screen(C);
SpaceAssets *assets_space = CTX_wm_space_assets(C);
if (CTX_data_equals(member, "asset_library_ref")) {
CTX_data_pointer_set(
result, &screen->id, &RNA_AssetLibraryReference, &assets_space->asset_library_ref);
return CTX_RESULT_OK;
}
return CTX_RESULT_MEMBER_NOT_FOUND;
}
/* ---------------------------------------------------------------------- */
/* Main Region */
static void asset_browser_main_region_init(wmWindowManager *UNUSED(wm), ARegion *region)
static void asset_browser_main_region_init(wmWindowManager *wm, ARegion *region)
{
UI_view2d_region_reinit(&region->v2d, V2D_COMMONVIEW_LIST, region->winx, region->winy);
{
wmKeyMap *keymap = WM_keymap_ensure(wm->defaultconf, "Asset Browser", SPACE_ASSETS, 0);
WM_event_add_keymap_handler(&region->handlers, keymap);
}
}
static void asset_browser_main_region_listener(const wmRegionListenerParams *UNUSED(params))
@ -162,6 +196,11 @@ static void asset_browser_navigation_region_init(wmWindowManager *wm, ARegion *r
{
region->v2d.scroll = V2D_SCROLL_RIGHT | V2D_SCROLL_VERTICAL_HIDE;
ED_region_panels_init(wm, region);
{
wmKeyMap *keymap = WM_keymap_ensure(wm->defaultconf, "Asset Browser", SPACE_ASSETS, 0);
WM_event_add_keymap_handler(&region->handlers, keymap);
}
}
static void asset_browser_navigation_region_draw(const bContext *C, ARegion *region)
@ -191,6 +230,7 @@ void ED_spacetype_assets(void)
st->duplicate = asset_browser_duplicate;
st->operatortypes = asset_browser_operatortypes;
st->keymap = asset_browser_keymap;
st->context = asset_browser_context;
/* Main region. */
art = MEM_cnew<ARegionType>("spacetype asset browser main region");

View File

@ -868,6 +868,20 @@ static void rna_Space_show_region_hud_update(bContext *C, PointerRNA *ptr)
rna_Space_bool_from_region_flag_update_by_type(C, ptr, RGN_TYPE_HUD, RGN_FLAG_HIDDEN_BY_USER);
}
/* Navigation Region. */
static bool rna_Space_show_region_nav_bar_get(PointerRNA *ptr)
{
return !rna_Space_bool_from_region_flag_get_by_type(ptr, RGN_TYPE_NAV_BAR, RGN_FLAG_HIDDEN);
}
static void rna_Space_show_region_nav_bar_set(PointerRNA *ptr, bool value)
{
rna_Space_bool_from_region_flag_set_by_type(ptr, RGN_TYPE_NAV_BAR, RGN_FLAG_HIDDEN, !value);
}
static void rna_Space_show_region_nav_bar_update(bContext *C, PointerRNA *ptr)
{
rna_Space_bool_from_region_flag_update_by_type(C, ptr, RGN_TYPE_NAV_BAR, RGN_FLAG_HIDDEN);
}
/** \} */
static bool rna_Space_view2d_sync_get(PointerRNA *ptr)
@ -3385,6 +3399,10 @@ static void rna_def_space_generic_show_region_toggles(StructRNA *srna, int regio
region_type_mask &= ~(1 << RGN_TYPE_HUD);
DEF_SHOW_REGION_PROPERTY(show_region_hud, "Adjust Last Operation", "");
}
if (region_type_mask & (1 << RGN_TYPE_NAV_BAR)) {
region_type_mask &= ~(1 << RGN_TYPE_NAV_BAR);
DEF_SHOW_REGION_PROPERTY(show_region_nav_bar, "Navigation Bar", "");
}
BLI_assert(region_type_mask == 0);
}
@ -8054,7 +8072,7 @@ static void rna_def_space_assets(BlenderRNA *brna)
srna = RNA_def_struct(brna, "SpaceAssets", "Space");
RNA_def_struct_ui_text(srna, "Space Asset Browser", "Asset browser space data");
// rna_def_space_generic_show_region_toggles(srna, (1 << RGN_TYPE_NAV_BAR));
rna_def_space_generic_show_region_toggles(srna, (1 << RGN_TYPE_NAV_BAR));
prop = rna_def_asset_library_reference_common(
srna, "rna_SpaceAssets_asset_library_get", "rna_SpaceAssets_asset_library_set");

View File

@ -433,6 +433,10 @@ wmKeyMap *WM_keymap_guess_opname(const bContext *C, const char *opname)
else if (STRPREFIX(opname, "FILE_OT")) {
km = WM_keymap_find_all(wm, "File Browser", sl->spacetype, 0);
}
/* Asset browser */
else if (STRPREFIX(opname, "ASSET_OT")) {
km = WM_keymap_find_all(wm, "Asset Browser", sl->spacetype, 0);
}
/* Logic Editor */
else if (STRPREFIX(opname, "LOGIC_OT")) {
km = WM_keymap_find_all(wm, "Logic Editor", sl->spacetype, 0);