diff --git a/blenderkit/__init__.py b/blenderkit/__init__.py index 494b530e79edca355258a6e177d46468f92cc2b9..90a50e6e7e8cd1d4b8f227600d611a17b9ff5091 100644 --- a/blenderkit/__init__.py +++ b/blenderkit/__init__.py @@ -138,7 +138,10 @@ from bpy.types import ( @persistent def scene_load(context): + print('loading in background') + print(bpy.context.window_manager) if not bpy.app.background: + search.load_previews() ui_props = bpy.context.scene.blenderkitUI ui_props.assetbar_on = False @@ -249,37 +252,39 @@ thumbnail_resolutions = ( def udate_down_up(self, context): """Perform a search if results are empty.""" s = context.scene + wm = bpy.context.window_manager props = s.blenderkitUI - if s['search results'] == None and props.down_up == 'SEARCH': + if wm['search results'] == None and props.down_up == 'SEARCH': search.search() def switch_search_results(self, context): s = bpy.context.scene + wm = bpy.context.window_manager props = s.blenderkitUI if props.asset_type == 'MODEL': - s['search results'] = s.get('bkit model search') - s['search results orig'] = s.get('bkit model search orig') + wm['search results'] = wm.get('bkit model search') + wm['search results orig'] = wm.get('bkit model search orig') elif props.asset_type == 'SCENE': - s['search results'] = s.get('bkit scene search') - s['search results orig'] = s.get('bkit scene search orig') + wm['search results'] = wm.get('bkit scene search') + wm['search results orig'] = wm.get('bkit scene search orig') elif props.asset_type == 'HDR': - s['search results'] = s.get('bkit hdr search') - s['search results orig'] = s.get('bkit hdr search orig') + wm['search results'] = wm.get('bkit hdr search') + wm['search results orig'] = wm.get('bkit hdr search orig') elif props.asset_type == 'MATERIAL': - s['search results'] = s.get('bkit material search') - s['search results orig'] = s.get('bkit material search orig') + wm['search results'] = wm.get('bkit material search') + wm['search results orig'] = wm.get('bkit material search orig') elif props.asset_type == 'TEXTURE': - s['search results'] = s.get('bkit texture search') - s['search results orig'] = s.get('bkit texture search orig') + wm['search results'] = wm.get('bkit texture search') + wm['search results orig'] = wm.get('bkit texture search orig') elif props.asset_type == 'BRUSH': - s['search results'] = s.get('bkit brush search') - s['search results orig'] = s.get('bkit brush search orig') + wm['search results'] = wm.get('bkit brush search') + wm['search results orig'] = wm.get('bkit brush search orig') if not(context.sculpt_object or context.image_paint_object): ui.add_report( 'Switch to paint or sculpt mode to search in BlenderKit brushes.') search.load_previews() - if s['search results'] == None and props.down_up == 'SEARCH': + if wm['search results'] == None and props.down_up == 'SEARCH': search.search() diff --git a/blenderkit/asset_bar_op.py b/blenderkit/asset_bar_op.py index 612f588528a0aee60783f188c6f2fa20fc7a0cde..2c445ad4b70cc4b01225f5f04dfcafde72d9dda1 100644 --- a/blenderkit/asset_bar_op.py +++ b/blenderkit/asset_bar_op.py @@ -25,8 +25,8 @@ from bpy.props import ( def draw_callback_tooltip(self, context): if self.draw_tooltip: - s = bpy.context.scene - sr = s.get('search results') + wm = bpy.context.window_manager + sr = wm.get('search results') r = sr[self.active_index] ui.draw_tooltip_with_author(r, 0, 500) @@ -269,7 +269,7 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): self.wcount = math.floor( (self.bar_width) / (self.button_size)) - search_results = bpy.context.scene.get('search results') + search_results = bpy.context.window_manager.get('search results') if search_results is not None and self.wcount > 0: self.hcount = min(user_preferences.max_assetbar_rows, math.ceil(len(search_results) / self.wcount)) else: @@ -311,8 +311,6 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): self.panel = BL_UI_Drag_Panel(0, 0, self.bar_width, self.bar_height) self.panel.bg_color = (0.0, 0.0, 0.0, 0.5) - sr = bpy.context.scene['search results'] - for a in range(0, self.wcount): for b in range(0, self.hcount): asset_x = self.assetbar_margin + a * (self.button_size) @@ -478,7 +476,8 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): if self.active_index != widget.search_index: scene = bpy.context.scene - sr = scene['search results'] + wm = bpy.context.window_manager + sr = wm['search results'] asset_data = sr[widget.search_index + self.scroll_offset] self.active_index = widget.search_index @@ -514,11 +513,11 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): # bpy.ops.wm.call_menu(name='OBJECT_MT_blenderkit_asset_menu') def search_more(self): - sro = bpy.context.scene.get('search results orig') + sro = bpy.context.window_manager.get('search results orig') if sro is not None and sro.get('next') is not None: blenderkit.search.search(get_next=True) def update_images(self): - sr = bpy.context.scene['search results'] + sr = bpy.context.window_manager['search results'] for asset_button in self.asset_buttons: asset_button.asset_index = asset_button.button_index + self.scroll_offset @@ -548,7 +547,7 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): asset_button.validation_icon.visible = False def scroll_update(self): - sr = bpy.context.scene['search results'] + sr = bpy.context.window_manager['search results'] self.scroll_offset = min(self.scroll_offset, len(sr) - (self.wcount * self.hcount)) self.scroll_offset = max(self.scroll_offset, 0) self.update_images() @@ -556,7 +555,7 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): self.search_more() def search_by_author(self, asset_index): - sr = bpy.context.scene['search results'] + sr = bpy.context.window_manager['search results'] asset_data = sr[asset_index] a = asset_data['author']['id'] if a is not None: @@ -573,12 +572,10 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): return False def scroll_up(self, widget): - sr = bpy.context.scene['search results'] self.scroll_offset += self.wcount * self.hcount self.scroll_update() def scroll_down(self, widget): - sr = bpy.context.scene['search results'] self.scroll_offset -= self.wcount * self.hcount self.scroll_update() diff --git a/blenderkit/download.py b/blenderkit/download.py index 71cc6239ea9047cfb601bd00adc32fedd4562449..7a233c6f5db6669351cdedb5ed598b5d7d3d7f35 100644 --- a/blenderkit/download.py +++ b/blenderkit/download.py @@ -280,7 +280,7 @@ def udpate_asset_data_in_dicts(asset_data): scene['assets rated'] = scene.get('assets rated', {}) id = asset_data['assetBaseId'] scene['assets rated'][id] = scene['assets rated'].get(id, False) - sr = bpy.context.scene['search results'] + sr = bpy.context.window_manager['search results'] if not sr: return; for i, r in enumerate(sr): @@ -577,7 +577,7 @@ def timer_update(): downloaders = [] if t.is_alive(): # set downloader size - sr = bpy.context.scene.get('search results') + sr = bpy.context.window_manager.get('search results') if sr is not None: for r in sr: if asset_data['id'] == r['id']: @@ -646,8 +646,8 @@ def timer_update(): tcom.passargs['retry_counter'] = tcom.passargs.get('retry_counter', 0) + 1 download(asset_data, **tcom.passargs) - if bpy.context.scene['search results'] is not None and done: - for sres in bpy.context.scene['search results']: + if bpy.context.window_manager['search results'] is not None and done: + for sres in bpy.context.window_manager['search results']: if asset_data['id'] == sres['id']: sres['downloaded'] = 100 @@ -1282,7 +1282,7 @@ class BlenderkitDownloadOperator(bpy.types.Operator): if self.asset_index > -1: # either get the data from search results - sr = s['search results'] + sr = bpy.context.window_manager['search results'] asset_data = sr[ self.asset_index].to_dict() # TODO CHECK ALL OCCURRENCES OF PASSING BLENDER ID PROPS TO THREADS! asset_base_id = asset_data['assetBaseId'] diff --git a/blenderkit/ratings.py b/blenderkit/ratings.py index 4ef194c69178567185b59134a0e909d1f686aea8..86d204e29d312614cbeacc5900c48cb3775a0368 100644 --- a/blenderkit/ratings.py +++ b/blenderkit/ratings.py @@ -429,7 +429,7 @@ class FastRateMenu(Operator): scene = bpy.context.scene ui_props = scene.blenderkitUI if ui_props.active_index > -1: - sr = bpy.context.scene['search results'] + sr = bpy.context.window_manager['search results'] asset_data = dict(sr[ui_props.active_index]) self.asset_id = asset_data['id'] self.asset_type = asset_data['assetType'] @@ -448,7 +448,7 @@ def rating_menu_draw(self, context): layout = self.layout ui_props = context.scene.blenderkitUI - sr = bpy.context.scene['search results orig'] + sr = bpy.context.window_manager['search results orig'] asset_search_index = ui_props.active_index if asset_search_index > -1: diff --git a/blenderkit/search.py b/blenderkit/search.py index 00f8eda002ecff6bc08a004903ef0379fdc97232..e362a928df79579db5ca44730eecb7e59a67918d 100644 --- a/blenderkit/search.py +++ b/blenderkit/search.py @@ -144,6 +144,26 @@ def update_assets_data(): # updates assets data on scene load. # bpy.context.scene['assets used'][ad] = ad +def purge_search_results(): + ''' clean up search results on save/load.''' + + s = bpy.context.scene + + sr_props = [ + 'search results', + 'search results orig', + ] + print('purge search') + asset_types = ['model', 'material', 'scene', 'hdr', 'brush'] + for at in asset_types: + sr_props.append('bkit {at} search') + sr_props.append('bkit {at} search orig') + for sr_prop in sr_props: + if s.get(sr_prop): + print(sr_prop) + del (s[sr_prop]) + + @persistent def scene_load(context): ''' @@ -151,6 +171,7 @@ def scene_load(context): Should (probably)also update asset data from server (after user consent) ''' wm = bpy.context.window_manager + purge_search_results() fetch_server_data() categories.load_categories() if not bpy.app.timers.is_registered(refresh_token_timer): @@ -323,7 +344,7 @@ def timer_update(): first_time = False if preferences.show_on_start: # TODO here it should check if there are some results, and only open assetbar if this is the case, not search. - # if bpy.context.scene.get('search results') is None: + # if bpy.context.window_manager.get('search results') is None: search() # preferences.first_run = False if preferences.tips_on_start: @@ -353,7 +374,7 @@ def timer_update(): icons_dir = thread[1] scene = bpy.context.scene # these 2 lines should update the previews enum and set the first result as active. - s = bpy.context.scene + wm = bpy.context.window_manager asset_type = thread[2] if asset_type == 'model': props = scene.blenderkit_models @@ -372,7 +393,7 @@ def timer_update(): # json_filepath = os.path.join(icons_dir, 'brush_searchresult.json') search_name = f'bkit {asset_type} search' - s[search_name] = [] + wm[search_name] = [] global reports if reports != '': @@ -384,6 +405,7 @@ def timer_update(): result_field = [] ok, error = check_errors(rdata) if ok: + bpy.ops.object.run_assetbar_fix_context() for r in rdata['results']: asset_data = parse_result(r) @@ -391,10 +413,10 @@ def timer_update(): result_field.append(asset_data) # results = rdata['results'] - s[search_name] = result_field - s['search results'] = result_field - s[search_name + ' orig'] = copy.deepcopy(rdata) - s['search results orig'] = s[search_name + ' orig'] + wm[search_name] = result_field + wm['search results'] = result_field + wm[search_name + ' orig'] = copy.deepcopy(rdata) + wm['search results orig'] = wm[search_name + ' orig'] load_previews() ui_props = bpy.context.scene.blenderkitUI @@ -402,8 +424,8 @@ def timer_update(): ui_props.scrolloffset = 0 props.is_searching = False props.search_error = False - props.report = 'Found %i results. ' % (s['search results orig']['count']) - if len(s['search results']) == 0: + props.report = 'Found %i results. ' % (wm['search results orig']['count']) + if len(wm['search results']) == 0: tasks_queue.add_task((ui.add_report, ('No matching results found.',))) # undo push bpy.ops.wm.undo_push_context(message='Get BlenderKit search') @@ -425,7 +447,7 @@ def load_previews(): props = scene.blenderkitUI directory = paths.get_temp_dir('%s_search' % props.asset_type.lower()) s = bpy.context.scene - results = s.get('search results') + results = bpy.context.window_manager.get('search results') # if results is not None: inames = [] @@ -664,6 +686,8 @@ def generate_tooltip(mdata): t += f"Quality rating: {int(mdata['ratingsAverage']['quality']) * '*'}\n" t += f"Hours saved rating: {int(mdata['ratingsAverage']['workingHours'])}\n" if utils.profile_is_validator(): + t += f"Score: {int(mdata['score'])}\n" + t += f"Ratings count {rc['quality']}*/{rc['workingHours']}wh value " \ f"{mdata['ratingsAverage']['quality']}*/{mdata['ratingsAverage']['workingHours']}wh\n" if len(t.split('\n')) < 11: @@ -1311,7 +1335,7 @@ def get_search_simple(parameters, filepath=None, page_size=100, max_results=1000 if not filepath: return results - with open(filepath, 'w', encoding = 'utf-8') as s: + with open(filepath, 'w', encoding='utf-8') as s: json.dump(results, s, ensure_ascii=False, indent=4) bk_logger.info(f'retrieved {len(results)} assets from elastic search') return results diff --git a/blenderkit/ui.py b/blenderkit/ui.py index 8d39b56f73127e5026c95ee47eb7c914faaf1fbc..844d87c5bae7901f8b73b6c54bc975dd5aa484d0 100644 --- a/blenderkit/ui.py +++ b/blenderkit/ui.py @@ -138,10 +138,11 @@ class Report(): def get_asset_under_mouse(mousex, mousey): s = bpy.context.scene + wm = bpy.context.window_manager ui_props = bpy.context.scene.blenderkitUI r = bpy.context.region - search_results = s.get('search results') + search_results = wm.get('search results') if search_results is not None: h_draw = min(ui_props.hcount, math.ceil(len(search_results) / ui_props.wcount)) @@ -741,8 +742,8 @@ def draw_asset_bar(self, context): # img, # 1) if not ui_props.dragging and ui_props.hcount > 0 and ui_props.wcount > 0: - search_results = s.get('search results') - search_results_orig = s.get('search results orig') + search_results = bpy.context.window_manager.get('search results') + search_results_orig = bpy.context.window_manager.get('search results orig') if search_results == None: return h_draw = min(ui_props.hcount, math.ceil(len(search_results) / ui_props.wcount)) @@ -1078,10 +1079,9 @@ def mouse_in_area(mx, my, x, y, w, h): def mouse_in_asset_bar(mx, my): - s = bpy.context.scene ui_props = bpy.context.scene.blenderkitUI - # search_results = s.get('search results') + # search_results = bpy.context.window_manager.get('search results') # if search_results == None: # return False # @@ -1127,7 +1127,7 @@ def update_ui_size(area, region): ui.wcount = math.floor( (ui.bar_width - 2 * ui.drawoffset) / (ui.thumb_size + ui.margin)) - search_results = bpy.context.scene.get('search results') + search_results = bpy.context.window_manager.get('search results') if search_results != None and ui.wcount > 0: ui.hcount = min(user_preferences.max_assetbar_rows, math.ceil(len(search_results) / ui.wcount)) else: @@ -1220,7 +1220,7 @@ class AssetBarOperator(bpy.types.Operator): return properties.tooltip def search_more(self): - sro = bpy.context.scene.get('search results orig') + sro = bpy.context.window_manager.get('search results orig') if sro is not None and sro.get('next') is not None: search.search(get_next=True) @@ -1336,8 +1336,8 @@ class AssetBarOperator(bpy.types.Operator): # TODO add one more condition here to take less performance. r = self.region s = bpy.context.scene - sr = s.get('search results') - search_results_orig = s.get('search results orig') + sr = bpy.context.window_manager.get('search results') + search_results_orig = bpy.context.window_manager.get('search results orig') # If there aren't any results, we need no interaction(yet) if sr is None: return {'PASS_THROUGH'} @@ -1424,7 +1424,7 @@ class AssetBarOperator(bpy.types.Operator): bpy.context.window.cursor_set("DEFAULT") return {'PASS_THROUGH'} - sr = bpy.context.scene['search results'] + sr = bpy.context.window_manager['search results'] if not ui_props.dragging: bpy.context.window.cursor_set("DEFAULT") @@ -1672,7 +1672,7 @@ class AssetBarOperator(bpy.types.Operator): return {'RUNNING_MODAL'} if event.type == 'W' and ui_props.active_index > -1: - sr = bpy.context.scene['search results'] + sr = bpy.context.window_manager['search results'] asset_data = sr[ui_props.active_index] a = bpy.context.window_manager['bkit authors'].get(asset_data['author']['id']) if a is not None: @@ -1681,7 +1681,7 @@ class AssetBarOperator(bpy.types.Operator): bpy.ops.wm.url_open(url=a['aboutMeUrl']) return {'RUNNING_MODAL'} if event.type == 'A' and ui_props.active_index > -1: - sr = bpy.context.scene['search results'] + sr = bpy.context.window_manager['search results'] asset_data = sr[ui_props.active_index] a = asset_data['author']['id'] if a is not None: @@ -1694,7 +1694,7 @@ class AssetBarOperator(bpy.types.Operator): if event.type == 'X' and ui_props.active_index > -1: # delete downloaded files for this asset - sr = bpy.context.scene['search results'] + sr = bpy.context.window_manager['search results'] asset_data = sr[ui_props.active_index] bk_logger.info('delete asset from local drive:' + asset_data['name']) paths.delete_asset_debug(asset_data) @@ -1734,9 +1734,9 @@ class AssetBarOperator(bpy.types.Operator): ui_props.assetbar_on = True ui_props.turn_off = False - sr = bpy.context.scene.get('search results') + sr = bpy.context.window_manager.get('search results') if sr is None: - bpy.context.scene['search results'] = [] + bpy.context.window_manager['search results'] = [] if context.area.type != 'VIEW_3D': self.report({'WARNING'}, "View3D not found, cannot run operator") @@ -2003,7 +2003,7 @@ class AssetDragOperator(bpy.types.Operator): object = None self.matrix = None - sr = bpy.context.scene['search results'] + sr = bpy.context.window_manager['search results'] self.asset_data = sr[self.asset_search_index] context.window_manager.modal_handler_add(self) diff --git a/blenderkit/ui_panels.py b/blenderkit/ui_panels.py index 921d0453098ab0efe5f32b5bfc5acf2651a21a8c..deb3c0bb07874373bfa7c56637886c2870378916 100644 --- a/blenderkit/ui_panels.py +++ b/blenderkit/ui_panels.py @@ -1244,7 +1244,7 @@ def draw_asset_context_menu(layout, context, asset_data, from_panel=False): op.invoke_resolution = True o = utils.get_active_model() if o and o.get('asset_data'): - if o['asset_data']['assetBaseId'] == bpy.context.scene['search results'][ui_props.active_index]: + if o['asset_data']['assetBaseId'] == bpy.context.window_manager['search results'][ui_props.active_index]: op.model_location = o.location op.model_rotation = o.rotation_euler else: @@ -1339,9 +1339,9 @@ def draw_asset_context_menu(layout, context, asset_data, from_panel=False): # def draw(self, context): # ui_props = context.scene.blenderkitUI # -# # sr = bpy.context.scene['search results'] +# # sr = bpy.context.window_manager['search results'] # -# # sr = bpy.context.scene['search results'] +# # sr = bpy.context.window_manager['search results'] # # asset_data = sr[ui_props.active_index] # # for k in resolutions.resolution_props_to_server.keys(): @@ -1355,13 +1355,13 @@ class OBJECT_MT_blenderkit_asset_menu(bpy.types.Menu): def draw(self, context): ui_props = context.scene.blenderkitUI - sr = bpy.context.scene['search results'] + sr = bpy.context.window_manager['search results'] asset_data = sr[ui_props.active_index] draw_asset_context_menu(self.layout, context, asset_data, from_panel=False) # ui_props = context.scene.blenderkitUI # - # sr = bpy.context.scene['search results'] + # sr = bpy.context.window_manager['search results'] # asset_data = sr[ui_props.active_index] # layout = self.layout # row = layout.row() @@ -1403,7 +1403,7 @@ class AssetPopupCard(bpy.types.Operator): def draw(self, context): ui_props = context.scene.blenderkitUI - sr = bpy.context.scene['search results'] + sr = bpy.context.window_manager['search results'] asset_data = sr[ui_props.active_index] layout = self.layout row = layout.row() @@ -1442,7 +1442,7 @@ class AssetPopupCard(bpy.types.Operator): wm = context.window_manager ui_props = context.scene.blenderkitUI ui_props.draw_tooltip = False - sr = bpy.context.scene['search results'] + sr = bpy.context.window_manager['search results'] asset_data = sr[ui_props.active_index] self.img = ui.get_large_thumbnail_image(asset_data) # self.tex = utils.get_hidden_texture(self.img) diff --git a/blenderkit/upload.py b/blenderkit/upload.py index 2cd23f727371b94d3c35d84bfcd2f254a5f2d8d1..8a905cecca03860ae2fe8c6844bd0337bb01ec83 100644 --- a/blenderkit/upload.py +++ b/blenderkit/upload.py @@ -524,8 +524,8 @@ def patch_individual_metadata(asset_id, metadata_dict, api_key): # layout = self.layout # ui_props = context.scene.blenderkitUI # -# # sr = bpy.context.scene['search results'] -# sr = bpy.context.scene['search results'] +# # sr = bpy.context.window_manager['search results'] +# sr = bpy.context.window_manager['search results'] # asset_data = sr[ui_props.active_index] # categories = bpy.context.window_manager['bkit_categories'] # wm = bpy.context.win @@ -654,10 +654,10 @@ class FastMetadata(bpy.types.Operator): scene = bpy.context.scene ui_props = scene.blenderkitUI if ui_props.active_index > -1: - sr = bpy.context.scene['search results'] + sr = bpy.context.window_manager['search results'] asset_data = dict(sr[ui_props.active_index]) else: - for result in bpy.context.scene['search results']: + for result in bpy.context.window_manager['search results']: if result['id'] == self.asset_id: asset_data = dict(result) @@ -1196,12 +1196,12 @@ class AssetDebugPrint(Operator): def execute(self, context): preferences = bpy.context.preferences.addons['blenderkit'].preferences - if not bpy.context.scene['search results']: + if not bpy.context.window_manager['search results']: print('no search results found') return {'CANCELLED'}; # update status in search results for validator's clarity - sr = bpy.context.scene['search results'] - sro = bpy.context.scene['search results orig']['results'] + sr = bpy.context.window_manager['search results'] + sro = bpy.context.window_manager['search results orig']['results'] result = None for r in sr: @@ -1250,11 +1250,11 @@ class AssetVerificationStatusChange(Operator): def execute(self, context): preferences = bpy.context.preferences.addons['blenderkit'].preferences - if not bpy.context.scene['search results']: + if not bpy.context.window_manager['search results']: return {'CANCELLED'}; # update status in search results for validator's clarity - sr = bpy.context.scene['search results'] - sro = bpy.context.scene['search results orig']['results'] + sr = bpy.context.window_manager['search results'] + sro = bpy.context.window_manager['search results orig']['results'] for r in sr: if r['id'] == self.asset_id: diff --git a/blenderkit/utils.py b/blenderkit/utils.py index 94f795c14071e2a81405bc474651b8348447414e..adf5bd03f3a119c55d114f5fe52850c1cf40426f 100644 --- a/blenderkit/utils.py +++ b/blenderkit/utils.py @@ -780,13 +780,13 @@ def get_fake_context(context, area_type='VIEW_3D'): C_dict = {} # context.copy() #context.copy was a source of problems - incompatibility with addons that also define context C_dict.update(region='WINDOW') - try: - context = context.copy() - # print('bk context copied successfully') - except Exception as e: - print(e) - print('BlenderKit: context.copy() failed. Can be a colliding addon.') - context = {} + # try: + # context = context.copy() + # # print('bk context copied successfully') + # except Exception as e: + # print(e) + # print('BlenderKit: context.copy() failed. Can be a colliding addon.') + context = {} if context.get('area') is None or context.get('area').type != area_type: w, a, r = get_largest_area(area_type=area_type)