diff options
author | Julian Eisel <julian@blender.org> | 2021-07-29 18:27:46 +0300 |
---|---|---|
committer | Julian Eisel <julian@blender.org> | 2021-07-29 18:35:06 +0300 |
commit | 2d3e5eda3f26e59945454cbca0d6533db4d980a8 (patch) | |
tree | e74dfd57b37e7a75ffaafda885bb0189b68be88d /source/blender/editors/asset/intern/asset_filter.cc | |
parent | 8cb4e3d0460eadfbbce0b8f6ba5f5da2915830e9 (diff) |
Assets/UI: Resolve major asset view UI template limitation
Before this, all asset view templates showing the same asset library
would show the same assets, even if they should show different ID types.
That was a major limitation since the design did forsee that this
template can be put anywhere in the UI to display various sub-sets of
assets.
Initially I did the ID type filtering close to the asset-list reading,
because I wanted to optimize reading so that we would only actually read
asset information from disk of the ID type to be shown. But this will be
quite complex and I'm not sure if I'll get to work on this anytime soon.
So this commit moves the filtering to the template display level solving
this limitation.
Note: This also adds the code to filter by tags, together with the ID
type. But it's not actually used anywhere yet.
Diffstat (limited to 'source/blender/editors/asset/intern/asset_filter.cc')
-rw-r--r-- | source/blender/editors/asset/intern/asset_filter.cc | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/source/blender/editors/asset/intern/asset_filter.cc b/source/blender/editors/asset/intern/asset_filter.cc new file mode 100644 index 00000000000..397df33d596 --- /dev/null +++ b/source/blender/editors/asset/intern/asset_filter.cc @@ -0,0 +1,64 @@ +/* + * 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 edasset + */ + +#include "BKE_idtype.h" + +#include "BLI_listbase.h" + +#include "DNA_ID.h" +#include "DNA_asset_types.h" + +#include "ED_asset_filter.h" +#include "ED_asset_handle.h" + +/** + * Compare \a asset against the settings of \a filter. + * + * Individual filter parameters are ORed with the asset properties. That means: + * * The asset type must be one of the ID types filtered by, and + * * The asset must contain at least one of the tags filtered by. + * However for an asset to be matching it must have one match in each of the parameters. I.e. one + * matching type __and__ at least one matching tag. + * + * \returns True if the asset should be visible with these filter settings (parameters match). + * Otherwise returns false (mismatch). + */ +bool ED_asset_filter_matches_asset(const AssetFilterSettings *filter, const AssetHandle *asset) +{ + ID_Type asset_type = ED_asset_handle_get_id_type(asset); + uint64_t asset_id_filter = BKE_idtype_idcode_to_idfilter(asset_type); + + if ((filter->id_types & asset_id_filter) == 0) { + return false; + } + /* Not very efficient (O(n^2)), could be improved quite a bit. */ + LISTBASE_FOREACH (const AssetTag *, filter_tag, &filter->tags) { + AssetMetaData *asset_data = ED_asset_handle_get_metadata(asset); + + AssetTag *matched_tag = (AssetTag *)BLI_findstring( + &asset_data->tags, filter_tag->name, offsetof(AssetTag, name)); + if (matched_tag == nullptr) { + return false; + } + } + + /* Succesfully passed through all filters. */ + return true; +} |