Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'blenderkit/bl_ui_widgets/bl_ui_button.py')
-rw-r--r--blenderkit/bl_ui_widgets/bl_ui_button.py192
1 files changed, 192 insertions, 0 deletions
diff --git a/blenderkit/bl_ui_widgets/bl_ui_button.py b/blenderkit/bl_ui_widgets/bl_ui_button.py
new file mode 100644
index 00000000..ce26c54e
--- /dev/null
+++ b/blenderkit/bl_ui_widgets/bl_ui_button.py
@@ -0,0 +1,192 @@
+from . bl_ui_widget import *
+
+import blf
+import bpy
+
+class BL_UI_Button(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
+
+ def set_image_position(self, image_position):
+ self.__image_position = image_position
+
+ def set_image(self, rel_filepath):
+ try:
+ self.__image = bpy.data.images.load(rel_filepath, check_existing=True)
+ self.__image.gl_load()
+ except:
+ pass
+
+ def update(self, x, y):
+ super().update(x, y)
+ self._textpos = [x, y]
+
+ def draw(self):
+ if not self.visible:
+ return
+
+ area_height = self.get_area_height()
+
+ self.shader.bind()
+
+ self.set_colors()
+
+ bgl.glEnable(bgl.GL_BLEND)
+
+ self.batch_panel.draw(self.shader)
+
+ self.draw_image()
+
+ 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):
+ blf.size(0, 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(0, self._textpos[0] + (self.width - size[0]) / 2.0, textpos_y + 1, 0)
+
+ r, g, b, a = self._text_color
+ blf.color(0, r, g, b, a)
+
+ blf.draw(0, self._text)
+
+ def draw_image(self):
+ if self.__image is not None:
+ try:
+ y_screen_flip = self.get_area_height() - self.y_screen
+
+ off_x, off_y = self.__image_position
+ sx, sy = self.__image_size
+
+ # bottom left, top left, top right, bottom right
+ vertices = (
+ (self.x_screen + off_x, y_screen_flip - off_y),
+ (self.x_screen + off_x, y_screen_flip - sy - off_y),
+ (self.x_screen + off_x + sx, y_screen_flip - sy - off_y),
+ (self.x_screen + off_x + sx, y_screen_flip - off_y))
+
+ self.shader_img = gpu.shader.from_builtin('2D_IMAGE')
+ self.batch_img = batch_for_shader(self.shader_img, 'TRI_FAN',
+ { "pos" : vertices,
+ "texCoord": ((0, 1), (0, 0), (1, 0), (1, 1))
+ },)
+
+ # send image to gpu if it isn't there already
+ if self.__image.gl_load():
+ raise Exception()
+
+ bgl.glActiveTexture(bgl.GL_TEXTURE0)
+ bgl.glBindTexture(bgl.GL_TEXTURE_2D, self.__image.bindcode)
+
+ self.shader_img.bind()
+ self.shader_img.uniform_int("image", 0)
+ self.batch_img.draw(self.shader_img)
+ return True
+ except:
+ pass
+
+ return False
+
+ def set_mouse_down(self, mouse_down_func):
+ 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
+
+ def mouse_up(self, x, y):
+ if self.is_in_rect(x,y):
+ self.__state = 2
+ else:
+ self.__state = 0 \ No newline at end of file