OverviewFilesCommitsIssuesDocsReleasesPeers

hardops / ui_framework / window / panel / widget / layout / grid / cell.py

116 lines · python ref:
from .elements.background import Background_Element
from .elements.drag import Drag_Event
from ......utils.checks import is_mouse_in_quad

class Cell():

    def __init__(self):

        # Data
        self.db = None
        self.window_key = ""
        self.cell_index = None
        
        # Dims
        self.top_left = (0, 0)
        self.top_right = (0, 0)
        self.bottom_left = (0, 0)
        self.bottom_right = (0, 0)

        self.dims_override = (0, 0, 0, 0)

        # Drawing
        self.elements = []
        self.hover_highlight = True
        self.temp_elements = []

        # Events
        self.click_events = []
        self.drag_events = []


    def event(self):

        # Drag cell is being fired off
        if self.cell_index != None:
            if self.cell_index == self.db.ui_event.cell_index:
                for click_event in self.click_events:
                    if type(click_event) == Drag_Event:
                        click_event.cell_center_x = self.bottom_right[0] - (self.bottom_right[0] - self.bottom_left[0]) * .5
                        click_event.event()
                    else:
                        click_event.event()

        self.temp_elements = []

        # Mouse over highlight
        mouse_over = is_mouse_in_quad(
            quad=(self.top_left, self.bottom_left, self.top_right, self.bottom_right),
            mouse_pos=self.db.event.mouse_pos)

        if mouse_over:
            if not self.db.ui_event.cell_blocking:
                if not self.db.ui_event.window_transforming:
                    if self.hover_highlight:
                        self.add_highlight(dragging=False)

                    # Lock cell while mouse is dragging
                    if self.db.event.mouse_dragging:
                        self.db.ui_event.cell_blocking = True

                    # Call cell events
                    if self.db.event.left_clicked:
                        for click_event in self.click_events:
                            if type(click_event) == Drag_Event:
                                click_event.cell_center_x = self.bottom_right[0] - (self.bottom_right[0] - self.bottom_left[0]) * .5
                                click_event.set_hook()
                            else:
                                click_event.event()

                    # Scroll on drag cell
                    if self.db.event.wheel_up:
                        for click_event in self.click_events:
                            click_event.external_cell_event_call(positive=True)
                    if self.db.event.wheel_down:
                        for click_event in self.click_events:
                            click_event.external_cell_event_call(positive=False)


        elif self.cell_index != None:
            if self.cell_index == self.db.ui_event.cell_index:
                if not self.db.ui_event.window_transforming:
                    self.add_highlight(dragging=False)


    def add_highlight(self, dragging=False):

        highlight = Background_Element()
        highlight.db = self.db
        highlight.bevel = True

        if dragging:
            highlight.highlight = False
            highlight.drag_highlight = True

        else:
            highlight.highlight = True
            highlight.drag_highlight = False

        self.temp_elements.append(highlight)


    def draw(self):

        for element in self.elements:
            element.top_left =     (self.top_left[0]     + self.dims_override[0], self.top_left[1]     + self.dims_override[2])
            element.top_right =    (self.top_right[0]    + self.dims_override[1], self.top_right[1]    + self.dims_override[2])
            element.bottom_left =  (self.bottom_left[0]  + self.dims_override[0], self.bottom_left[1]  + self.dims_override[3])
            element.bottom_right = (self.bottom_right[0] + self.dims_override[1], self.bottom_right[1] + self.dims_override[3])
            element.draw()

        for element in self.temp_elements:
            element.top_left =     (self.top_left[0]     + self.dims_override[0], self.top_left[1]     + self.dims_override[2])
            element.top_right =    (self.top_right[0]    + self.dims_override[1], self.top_right[1]    + self.dims_override[2])
            element.bottom_left =  (self.bottom_left[0]  + self.dims_override[0], self.bottom_left[1]  + self.dims_override[3])
            element.bottom_right = (self.bottom_right[0] + self.dims_override[1], self.bottom_right[1] + self.dims_override[3])
            element.draw()