This repository has been archived on 2023-10-09. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
blender-archive/source/blender/blenkernel/intern/asset_library_service.hh
Sybren A. Stüvel 823996b034 Asset Browser: Improved workflow for asset catalog saving
No longer save asset catalogs on blendfile save. Instead:

- extend the confirmation prompt for unsaved changes to show unsaved
  catalogs.
- In the confirmation prompt, make catalog saving explicit & optional,
  just like we do it for external images. {F10881736}
- In the Asset Browser catalog tree, show an operator icon to save the
  catalogs to disk. It's grayed out if there are no changes to save, or
  if the .blend wasn't saved yet (required to know where to save the
  catalog definitions to). {F10881743}

Much of the work was done by @Severin and reviewed by me, then we
swapped roles.

Reviewed By: Severin

Differential Revision: https://developer.blender.org/D12796
2021-10-19 18:07:22 +02:00

94 lines
3.1 KiB
C++

/*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/** \file
* \ingroup bke
*/
#pragma once
#ifndef __cplusplus
# error This is a C++-only header file.
#endif
#include "BKE_asset_library.hh"
#include "BLI_map.hh"
#include <memory>
namespace blender::bke {
/**
* Global singleton-ish that provides access to individual #AssetLibrary instances.
*
* Whenever a blend file is loaded, the existing instance of AssetLibraryService is destructed, and
* a new one is created -- hence the "singleton-ish". This ensures only information about relevant
* asset libraries is loaded.
*
* \note How Asset libraries are identified may change in the future.
* For now they are assumed to be:
* - on disk (identified by the absolute directory), or
* - the "current file" library (which is in memory but could have catalogs
* loaded from a file on disk).
*/
class AssetLibraryService {
public:
using AssetLibraryPtr = std::unique_ptr<AssetLibrary>;
AssetLibraryService() = default;
~AssetLibraryService() = default;
/** Return the AssetLibraryService singleton, allocating it if necessary. */
static AssetLibraryService *get();
/** Destroy the AssetLibraryService singleton. It will be reallocated by #get() if necessary. */
static void destroy();
/**
* Get the given asset library. Opens it (i.e. creates a new AssetLibrary instance) if necessary.
*/
AssetLibrary *get_asset_library_on_disk(StringRefNull top_level_directory);
/** Get the "Current File" asset library. */
AssetLibrary *get_asset_library_current_file();
/** Returns whether there are any known asset libraries with unsaved catalog edits. */
bool has_any_unsaved_catalogs() const;
protected:
static std::unique_ptr<AssetLibraryService> instance_;
/* Mapping absolute path of the library's top-level directory to the AssetLibrary instance. */
Map<std::string, AssetLibraryPtr> on_disk_libraries_;
AssetLibraryPtr current_file_library_;
/* Handlers for managing the life cycle of the AssetLibraryService instance. */
bCallbackFuncStore on_load_callback_store_;
static bool atexit_handler_registered_;
/** Allocate a new instance of the service and assign it to `instance_`. */
static void allocate_service_instance();
/**
* Ensure the AssetLibraryService instance is destroyed before a new blend file is loaded.
* This makes memory management simple, and ensures a fresh start for every blend file. */
void app_handler_register();
void app_handler_unregister();
};
} // namespace blender::bke