diff options
author | Vilem Duha <vilem.duha@gmail.com> | 2021-10-18 14:30:35 +0300 |
---|---|---|
committer | Vilem Duha <vilem.duha@gmail.com> | 2021-10-18 14:30:35 +0300 |
commit | 6892d3a92e94867c80bdc25373ee9d6ef5e8c6ce (patch) | |
tree | 0dd602f858f00f761af0dcc58d6f4819f20e5e71 | |
parent | 3a2d00cba384426378628fd9920e838d56d70c01 (diff) |
BlenderKit: progress on asset bar
Forgot to add files to last commit
-rw-r--r-- | blenderkit/__init__.py | 2 | ||||
-rw-r--r-- | blenderkit/asset_bar_op.py | 121 | ||||
-rw-r--r-- | blenderkit/bkit_oauth.py | 8 | ||||
-rw-r--r-- | blenderkit/bl_ui_widgets/bl_ui_draw_op.py | 1 | ||||
-rw-r--r-- | blenderkit/bl_ui_widgets/bl_ui_image.py | 103 | ||||
-rw-r--r-- | blenderkit/reports.py | 57 | ||||
-rw-r--r-- | blenderkit/ui.py | 2 | ||||
-rw-r--r-- | blenderkit/ui_panels.py | 4 |
8 files changed, 130 insertions, 168 deletions
diff --git a/blenderkit/__init__.py b/blenderkit/__init__.py index 45ae8daa..75787065 100644 --- a/blenderkit/__init__.py +++ b/blenderkit/__init__.py @@ -64,6 +64,7 @@ if "bpy" in locals(): bl_ui_widget = reload(bl_ui_widget) bl_ui_label = reload(bl_ui_label) bl_ui_button = reload(bl_ui_button) + bl_ui_image = reload(bl_ui_image) # bl_ui_checkbox = reload(bl_ui_checkbox) # bl_ui_slider = reload(bl_ui_slider) # bl_ui_up_down = reload(bl_ui_up_down) @@ -102,6 +103,7 @@ else: from blenderkit.bl_ui_widgets import bl_ui_widget from blenderkit.bl_ui_widgets import bl_ui_label from blenderkit.bl_ui_widgets import bl_ui_button + from blenderkit.bl_ui_widgets import bl_ui_image # from blenderkit.bl_ui_widgets import bl_ui_checkbox # from blenderkit.bl_ui_widgets import bl_ui_slider # from blenderkit.bl_ui_widgets import bl_ui_up_down diff --git a/blenderkit/asset_bar_op.py b/blenderkit/asset_bar_op.py index a7ad1b7a..fb87452a 100644 --- a/blenderkit/asset_bar_op.py +++ b/blenderkit/asset_bar_op.py @@ -4,6 +4,7 @@ from bpy.types import Operator from blenderkit.bl_ui_widgets.bl_ui_label import * from blenderkit.bl_ui_widgets.bl_ui_button import * +from blenderkit.bl_ui_widgets.bl_ui_image import * # from blenderkit.bl_ui_widgets.bl_ui_checkbox import * # from blenderkit.bl_ui_widgets.bl_ui_slider import * # from blenderkit.bl_ui_widgets.bl_ui_up_down import * @@ -70,23 +71,40 @@ def asset_bar_modal(self, context, event): self.finish() return {'FINISHED'} + # progress bar + # Todo: put this into a timer? + sr = bpy.context.window_manager.get('search results') + ui_scale = bpy.context.preferences.view.ui_scale + for asset_button in self.asset_buttons: + + if sr is not None and len(sr)> asset_button.asset_index: + asset_data = sr[asset_button.asset_index] + + if asset_data['downloaded'] > 0: + asset_button.progress_bar.width = int(self.button_size * ui_scale * asset_data['downloaded'] / 100) + asset_button.progress_bar.visible = True + else: + asset_button.progress_bar.visible = False if self.handle_widget_events(event): return {'RUNNING_MODAL'} if event.type in {"ESC"}: self.finish() - if event.type == 'WHEELUPMOUSE': + x = event.mouse_region_x + y = event.mouse_region_y + if event.type == 'WHEELUPMOUSE' and self.panel.is_in_rect(x, y): self.scroll_offset -= 5 self.scroll_update() return {'RUNNING_MODAL'} - elif event.type == 'WHEELDOWNMOUSE': + + elif event.type == 'WHEELDOWNMOUSE' and self.panel.is_in_rect(x, y): self.scroll_offset += 5 self.scroll_update() return {'RUNNING_MODAL'} if self.check_ui_resized(context) or self.check_new_search_results(context): - self.update_ui_size(context) + # self.update_ui_size(context) self.update_layout(context, event) return {"PASS_THROUGH"} @@ -125,48 +143,6 @@ def mouse_down_right(self, x, y): return False -# def handle_event(self, event): -# x = event.mouse_region_x -# y = event.mouse_region_y -# -# if (event.type == 'LEFTMOUSE'): -# if (event.value == 'PRESS'): -# self._mouse_down = True -# return self.mouse_down(x, y) -# else: -# self._mouse_down = False -# self.mouse_up(x, y) -# -# elif (event.type == 'RIGHTMOUSE'): -# if (event.value == 'PRESS'): -# self._mouse_down_right = True -# return self.mouse_down_right(x, y) -# else: -# self._mouse_down_right = False -# self.mouse_up(x, y) -# -# elif (event.type == 'MOUSEMOVE'): -# self.mouse_move(x, y) -# -# inrect = self.is_in_rect(x, y) -# -# # we enter the rect -# if not self.__inrect and inrect: -# self.__inrect = True -# self.mouse_enter(event, x, y) -# -# # we are leaving the rect -# elif self.__inrect and not inrect: -# self.__inrect = False -# self.mouse_exit(event, x, y) -# -# return False -# -# elif event.value == 'PRESS' and (event.ascii != '' or event.type in self.get_input_keys()): -# return self.text_input(event) -# -# return False - BL_UI_Button.mouse_down_right = mouse_down_right BL_UI_Button.set_mouse_down_right = set_mouse_down_right @@ -258,8 +234,7 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): self.tooltip_panel.bg_color = (0.0, 0.0, 0.0, 0.5) self.tooltip_panel.visible = False - tooltip_image = BL_UI_Button(0, 0, 1, 1) - tooltip_image.text = "" + tooltip_image = BL_UI_Image(0, 0, 1, 1) img_path = paths.get_addon_thumbnail_path('thumbnail_notready.jpg') tooltip_image.set_image(img_path) tooltip_image.set_image_size((tooltip_width, tooltip_height)) @@ -287,8 +262,7 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): self.authors_name = authors_name self.tooltip_widgets.append(authors_name) - gravatar_image = BL_UI_Button(tooltip_width - gravatar_size, tooltip_height - gravatar_size, 1, 1) - gravatar_image.text = "" + gravatar_image = BL_UI_Image(tooltip_width - gravatar_size, tooltip_height - gravatar_size, 1, 1) img_path = paths.get_addon_thumbnail_path('thumbnail_notready.jpg') gravatar_image.set_image(img_path) gravatar_image.set_image_size((gravatar_size - 1 * self.margin, gravatar_size - 1 * self.margin)) @@ -372,12 +346,12 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): ui_scale = bpy.context.preferences.view.ui_scale self.margin = ui_props.bl_rna.properties['margin'].default * ui_scale - self.margin = int(7 * ui_scale) + self.margin = int(9 * ui_scale) self.button_margin = int(0 * ui_scale) - self.author_text_size = int(15 * ui_scale) self.asset_name_text_size = int(20 * ui_scale) + self.author_text_size = int(self.asset_name_text_size * .7 * ui_scale) self.assetbar_margin = int(2 * ui_scale) - self.tooltip_size = int(500 * ui_scale) + self.tooltip_size = int(512 * ui_scale) self.thumb_size = user_preferences.thumb_size * ui_scale self.button_size = 2 * self.button_margin + self.thumb_size @@ -417,12 +391,23 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): self.reports_x = self.bar_x def update_layout(self, context, event): - self.init_ui() - self.setup_widgets(context, event) - self.tooltip_panel.add_widgets(self.tooltip_widgets) - self.scroll_update() + #restarting asset_bar completely since the widgets are too hard to get working with updates. + ui_props = bpy.context.window_manager.blenderkitUI + ui_props.turn_off = False + self.finish() + C_dict = utils.get_fake_context(context) + if C_dict.get('window'): # no 3d view, no asset bar. + bpy.ops.view3d.blenderkit_asset_bar_widget(C_dict, 'INVOKE_REGION_WIN', keep_running=self.keep_running, + do_search=False) + # self.init_ui() + # self.init_tooltip() + # self.hide_tooltip() + # self.setup_widgets(context, event) + # self.scroll_update() def asset_button_init(self, asset_x, asset_y, button_idx): + ui_scale = bpy.context.preferences.view.ui_scale + button_bg_color = (0.2, 0.2, 0.2, .1) button_hover_color = (0.8, 0.8, 0.8, .2) @@ -448,9 +433,9 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): new_button.set_mouse_exit(self.exit_button) new_button.text_input = self.handle_key_input # add validation icon to button - icon_size = 24 - validation_icon_margin = 3 - validation_icon = BL_UI_Button( + icon_size = int(24 * ui_scale) + validation_icon_margin = int(3 * ui_scale) + validation_icon = BL_UI_Image( asset_x + self.button_size - icon_size - self.button_margin - validation_icon_margin, asset_y + self.button_size - icon_size - self.button_margin - validation_icon_margin, 0, 0) @@ -458,20 +443,30 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): # if v_icon is not None: # img_fp = paths.get_addon_thumbnail_path(v_icon) # validation_icon.set_image(img_fp) - validation_icon.text = '' validation_icon.set_image_size((icon_size, icon_size)) validation_icon.set_image_position((0, 0)) self.validation_icons.append(validation_icon) new_button.validation_icon = validation_icon + + progress_bar = BL_UI_Widget(asset_x, asset_y + self.button_size - 3, self.button_size, 3) + progress_bar.bg_color = (0.0, 1.0, 0.0, 1.0) + new_button.progress_bar = progress_bar + self.progress_bars.append(progress_bar) + # if result['downloaded'] > 0: + # ui_bgl.draw_rect(x, y, int(ui_props.thumb_size * result['downloaded'] / 100.0), 2, green) + return new_button def init_ui(self): + ui_scale = bpy.context.preferences.view.ui_scale + button_bg_color = (0.2, 0.2, 0.2, .1) button_hover_color = (0.8, 0.8, 0.8, .2) self.buttons = [] self.asset_buttons = [] self.validation_icons = [] + self.progress_bars = [] self.widgets_panel = [] self.panel = BL_UI_Drag_Panel(0, 0, self.bar_width, self.bar_height) @@ -490,7 +485,7 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): new_button = self.asset_button_init(asset_x, asset_y, button_idx) self.asset_buttons.append(new_button) - other_button_size = 30 + other_button_size = int(30 * ui_scale) self.button_close = BL_UI_Button(self.bar_width - other_button_size, -0, other_button_size, other_button_size) self.button_close.bg_color = button_bg_color @@ -550,6 +545,7 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): widgets_panel.extend(self.buttons) widgets_panel.extend(self.asset_buttons) widgets_panel.extend(self.validation_icons) + widgets_panel.extend(self.progress_bars) widgets = [self.panel] @@ -560,6 +556,8 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): self.init_widgets(context, widgets) self.panel.add_widgets(widgets_panel) + self.tooltip_panel.add_widgets(self.tooltip_widgets) + self.hide_tooltip() self.panel.set_location(self.bar_x, self.bar_y) @@ -606,7 +604,6 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): self.active_index = -1 self.setup_widgets(context, event) - self.tooltip_panel.add_widgets(self.tooltip_widgets) # to hide arrows accordingly self.scroll_update() diff --git a/blenderkit/bkit_oauth.py b/blenderkit/bkit_oauth.py index f044cd0c..e080845a 100644 --- a/blenderkit/bkit_oauth.py +++ b/blenderkit/bkit_oauth.py @@ -17,7 +17,7 @@ # ##### END GPL LICENSE BLOCK ##### -from blenderkit import tasks_queue, utils, paths, search, categories, oauth, ui, ui_panels +from blenderkit import tasks_queue, utils, paths, search, categories, oauth, ui, ui_panels, colors import bpy @@ -49,7 +49,11 @@ def login_thread(signup=False): def login(signup, url, r_url, authenticator): - auth_token, refresh_token, oauth_response = authenticator.get_new_token(register=signup, redirect_url=r_url) + try: + auth_token, refresh_token, oauth_response = authenticator.get_new_token(register=signup, redirect_url=r_url) + except Exception as e: + tasks_queue.add_task((ui.add_report, (e, 20, colors.RED))) + bk_logger.debug('tokens retrieved') tasks_queue.add_task((write_tokens, (auth_token, refresh_token, oauth_response))) diff --git a/blenderkit/bl_ui_widgets/bl_ui_draw_op.py b/blenderkit/bl_ui_widgets/bl_ui_draw_op.py index d54b3ab9..ab407f47 100644 --- a/blenderkit/bl_ui_widgets/bl_ui_draw_op.py +++ b/blenderkit/bl_ui_widgets/bl_ui_draw_op.py @@ -54,7 +54,6 @@ class BL_UI_OT_draw_operator(Operator): result = False for widget in self.widgets: if widget.handle_event(event): - print(type(widget)) result = True return result diff --git a/blenderkit/bl_ui_widgets/bl_ui_image.py b/blenderkit/bl_ui_widgets/bl_ui_image.py index 9667b54e..2656bcea 100644 --- a/blenderkit/bl_ui_widgets/bl_ui_image.py +++ b/blenderkit/bl_ui_widgets/bl_ui_image.py @@ -3,63 +3,16 @@ from . bl_ui_widget import * import blf import bpy -class BL_UI_Button(BL_UI_Widget): +class BL_UI_Image(BL_UI_Widget): def __init__(self, x, y, width, height): super().__init__(x, y, width, height) - self._text_color = (1.0, 1.0, 1.0, 1.0) - self._hover_bg_color = (0.5, 0.5, 0.5, 1.0) - self._select_bg_color = (0.7, 0.7, 0.7, 1.0) - - self._text = "Button" - self._text_size = 16 - self._textpos = (x, y) self.__state = 0 self.__image = None self.__image_size = (24, 24) self.__image_position = (4, 2) - @property - def text_color(self): - return self._text_color - - @text_color.setter - def text_color(self, value): - self._text_color = value - - @property - def text(self): - return self._text - - @text.setter - def text(self, value): - self._text = value - - @property - def text_size(self): - return self._text_size - - @text_size.setter - def text_size(self, value): - self._text_size = value - - @property - def hover_bg_color(self): - return self._hover_bg_color - - @hover_bg_color.setter - def hover_bg_color(self, value): - self._hover_bg_color = value - - @property - def select_bg_color(self): - return self._select_bg_color - - @select_bg_color.setter - def select_bg_color(self, value): - self._select_bg_color = value - def set_image_size(self, imgage_size): self.__image_size = imgage_size @@ -75,7 +28,6 @@ class BL_UI_Button(BL_UI_Widget): def update(self, x, y): super().update(x, y) - self._textpos = [x, y] def draw(self): if not self.visible: @@ -85,8 +37,6 @@ class BL_UI_Button(BL_UI_Widget): self.shader.bind() - self.set_colors() - bgl.glEnable(bgl.GL_BLEND) self.batch_panel.draw(self.shader) @@ -95,35 +45,6 @@ class BL_UI_Button(BL_UI_Widget): bgl.glDisable(bgl.GL_BLEND) - # Draw text - self.draw_text(area_height) - - def set_colors(self): - color = self._bg_color - text_color = self._text_color - - # pressed - if self.__state == 1: - color = self._select_bg_color - - # hover - elif self.__state == 2: - color = self._hover_bg_color - - self.shader.uniform_float("color", color) - - def draw_text(self, area_height): - font_id = 1 - blf.size(font_id, self._text_size, 72) - size = blf.dimensions(0, self._text) - - textpos_y = area_height - self._textpos[1] - (self.height + size[1]) / 2.0 - blf.position(font_id, self._textpos[0] + (self.width - size[0]) / 2.0, textpos_y + 1, 0) - - r, g, b, a = self._text_color - blf.color(font_id, r, g, b, a) - - blf.draw(font_id, self._text) def draw_image(self): if self.__image is not None: @@ -166,28 +87,10 @@ class BL_UI_Button(BL_UI_Widget): self.mouse_down_func = mouse_down_func def mouse_down(self, x, y): - if self.is_in_rect(x,y): - self.__state = 1 - try: - self.mouse_down_func(self) - except Exception as e: - print(e) - - return True - return False def mouse_move(self, x, y): - if self.is_in_rect(x,y): - if(self.__state != 1): - - # hover state - self.__state = 2 - else: - self.__state = 0 + return def mouse_up(self, x, y): - if self.is_in_rect(x,y): - self.__state = 2 - else: - self.__state = 0 + return diff --git a/blenderkit/reports.py b/blenderkit/reports.py index e69de29b..816ac791 100644 --- a/blenderkit/reports.py +++ b/blenderkit/reports.py @@ -0,0 +1,57 @@ +# ##### BEGIN GPL LICENSE BLOCK ##### +# +# 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. +# +# ##### END GPL LICENSE BLOCK ##### + +import time +from blenderkit import colors + +def add_report(text='', timeout=5, color=colors.GREEN): + global reports + # check for same reports and just make them longer by the timeout. + for old_report in reports: + if old_report.text == text: + old_report.timeout = old_report.age + timeout + return + report = Report(text=text, timeout=timeout, color=color) + reports.append(report) + + +class Report(): + def __init__(self, text='', timeout=5, color=(.5, 1, .5, 1)): + self.text = text + self.timeout = timeout + self.start_time = time.time() + self.color = color + self.draw_color = color + self.age = 0 + + def fade(self): + fade_time = 1 + self.age = time.time() - self.start_time + if self.age + fade_time > self.timeout: + alpha_multiplier = (self.timeout - self.age) / fade_time + self.draw_color = (self.color[0], self.color[1], self.color[2], self.color[3] * alpha_multiplier) + if self.age > self.timeout: + global reports + try: + reports.remove(self) + except Exception as e: + pass; + + def draw(self, x, y): + if bpy.context.area.as_pointer() == active_area_pointer: + ui_bgl.draw_text(self.text, x, y + 8, 16, self.draw_color)
\ No newline at end of file diff --git a/blenderkit/ui.py b/blenderkit/ui.py index 547235ac..b8689f5b 100644 --- a/blenderkit/ui.py +++ b/blenderkit/ui.py @@ -1903,7 +1903,7 @@ class RunAssetBarWithContext(bpy.types.Operator): C_dict = utils.get_fake_context(context) if C_dict.get('window'): # no 3d view, no asset bar. preferences = bpy.context.preferences.addons['blenderkit'].preferences - if preferences.experimental_features or 1: + if preferences.experimental_features: bpy.ops.view3d.blenderkit_asset_bar_widget(C_dict, 'INVOKE_REGION_WIN', keep_running=self.keep_running, do_search=self.do_search) diff --git a/blenderkit/ui_panels.py b/blenderkit/ui_panels.py index e4342017..af8f1993 100644 --- a/blenderkit/ui_panels.py +++ b/blenderkit/ui_panels.py @@ -334,7 +334,7 @@ def draw_assetbar_show_hide(layout, props): ttip = 'Click to Show Asset Bar' preferences = bpy.context.preferences.addons['blenderkit'].preferences - if preferences.experimental_features or 1: + if preferences.experimental_features: op = layout.operator('view3d.blenderkit_asset_bar_widget', text='', icon=icon) else: op = layout.operator('view3d.blenderkit_asset_bar', text='', icon=icon) @@ -2232,7 +2232,7 @@ def draw_panel_categories(self, context): ctext = '%s (%i)' % (c['name'], c['assetCount']) preferences = bpy.context.preferences.addons['blenderkit'].preferences - if preferences.experimental_features or 1: + if preferences.experimental_features: op = row.operator('view3d.blenderkit_asset_bar_widget', text=ctext) else: op = row.operator('view3d.blenderkit_asset_bar', text=ctext) |