Browse Source

first pass at selecting points

tb-init-ui-render
Taylor Bockman 5 years ago
parent
commit
461452a838
  1. 10
      clusterview/mode_handlers.py
  2. 96
      clusterview/opengl_widget.py

10
clusterview/mode_handlers.py

@ -1,7 +1,8 @@
from PyQt5.QtCore import QEvent, Qt from PyQt5.QtCore import QEvent, Qt
from .mode import Mode from .mode import Mode
from .opengl_widget import (set_current_points, set_drawing_event, from .opengl_widget import (get_bb_bottom_right, get_bb_top_left,
set_current_points, set_drawing_event,
set_move_bb_top_left, set_move_bb_bottom_right, set_move_bb_top_left, set_move_bb_bottom_right,
reset_move_bbs) reset_move_bbs)
from .points import PointSet from .points import PointSet
@ -98,7 +99,6 @@ def __handle_move_points(ctx, event):
set_move_bb_bottom_right(event.x(), event.y()) set_move_bb_bottom_right(event.x(), event.y())
elif __left_click_flag and event.type() == QEvent.MouseButtonRelease: elif __left_click_flag and event.type() == QEvent.MouseButtonRelease:
__left_click_flag = False __left_click_flag = False
@ -106,12 +106,12 @@ def __handle_move_points(ctx, event):
# Final bottom right corner point # Final bottom right corner point
set_move_bb_bottom_right(event.x(), event.y()) set_move_bb_bottom_right(event.x(), event.y())
# Call the selection procedure
# TODO
# Satisfy the post condition by resetting the bounding box # Satisfy the post condition by resetting the bounding box
reset_move_bbs() reset_move_bbs()
# Fix the highlighted pointed into a set (separate from point_set) and
# prepare to move.
# Find and move all points from the old list to their new locations # Find and move all points from the old list to their new locations
ctx.opengl_widget.update() ctx.opengl_widget.update()

96
clusterview/opengl_widget.py

@ -15,8 +15,8 @@ Probably even into it's own module folder.
from enum import Enum from enum import Enum
from OpenGL.GL import (glBegin, glClearColor, glColor4f, glEnable, from OpenGL.GL import (glBegin, glClearColor, glColor3f, glEnable,
glEnd, GL_LIGHT0, GL_LIGHTING, GL_LINE_LOOP, GL_POINTS, glEnd, GL_LINE_LOOP, GL_POINTS,
glPointSize, glVertex3f, glViewport) glPointSize, glVertex3f, glViewport)
from .exceptions import handle_exceptions, InvalidModeError, InvalidStateError from .exceptions import handle_exceptions, InvalidModeError, InvalidStateError
@ -26,12 +26,14 @@ from .points import PointSet
class Color(Enum): class Color(Enum):
BLUE = 0 BLUE = 0
BLACK = 1 BLACK = 1
GREY = 2
# A simple map from Color -> RGBA 4-Tuple # A simple map from Color -> RGBA 4-Tuple
# Note: The color values in the tuple are not RGB, but # Note: The color values in the tuple are not RGB, but
# rather OpenGL percentage values for RGB. # rather OpenGL percentage values for RGB.
COLOR_TO_RGBA = { COLOR_TO_RGBA = {
Color.BLUE: (0, 0.5, 1.0, 0.0), Color.GREY: (0.827, 0.827, 0.826, 0.0),
Color.BLUE: (0.118, 0.565, 1.0, 0.0),
Color.BLACK: (0.0, 0.0, 0.0, 0.0) Color.BLACK: (0.0, 0.0, 0.0, 0.0)
} }
@ -151,6 +153,14 @@ def set_move_bb_bottom_right(x, y):
__move_bb_bottom_right = (x, y) __move_bb_bottom_right = (x, y)
def get_bb_top_left():
return __move_bb_top_left
def get_bb_bottom_right():
return __move_bb_bottom_right
def reset_move_bbs(): def reset_move_bbs():
global __move_bb_top_left global __move_bb_top_left
global __move_bb_bottom_right global __move_bb_bottom_right
@ -163,10 +173,6 @@ def initialize_gl():
""" """
Initializes the OpenGL context on the Window. Initializes the OpenGL context on the Window.
""" """
# Since we aren't using shaders lighting needs to be
# enabled.
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
# Set white background # Set white background
glClearColor(255, 255, 255, 0) glClearColor(255, 255, 255, 0)
@ -208,7 +214,7 @@ def paint_gl():
# the point set, which will be redrawn here. This action # the point set, which will be redrawn here. This action
# is the same as adding a point since we just draw what is in # is the same as adding a point since we just draw what is in
# the point set. # the point set.
draw_points(__current_points, Color.BLUE) draw_points(__current_points, Color.GREY)
elif __current_mode is Mode.EDIT: elif __current_mode is Mode.EDIT:
raise NotImplementedError("Drawing for EDIT not implemented.") raise NotImplementedError("Drawing for EDIT not implemented.")
@ -217,16 +223,21 @@ def paint_gl():
# We have to repeatedly draw the points while we are showing the # We have to repeatedly draw the points while we are showing the
# move box. # move box.
if __current_points is not None: if __current_points is not None:
draw_points(__current_points, Color.BLUE) draw_points(__current_points, Color.GREY)
draw_selection_box(Color.BLACK)
draw_selection_box(Color.BLACK) if (__move_bb_top_left is not None and
__move_bb_bottom_right is not None):
highlight_selection()
if __move_bb_top_left is None and __move_bb_bottom_right is None: if __move_bb_top_left is None and __move_bb_bottom_right is None:
# Currently this fires all the time - not great. Needs to only fire # Currently this fires all the time - not great. Needs to only fire
# when, additionally, we have a selection chosen based on the box # when, additionally, we have a selection chosen based on the box
# calculated in the mode handlers. # calculated in the mode handlers.
None
print("FIRE THE MOVE STUFF")
# Once the selection boxes go to None begin the highlight selected # Once the selection boxes go to None begin the highlight selected
# points procedure. This will store a point list of selected points # points procedure. This will store a point list of selected points
# highlight them, etc. # highlight them, etc.
@ -260,6 +271,63 @@ def __clamp_y(y):
return y_w return y_w
def box_hit(tx, ty, x1, y1, x2, y2):
"""
Calculates whether or not a given point collides with the given bounding
box.
@param tx The target x.
@param ty The target y.
@param x1 The top left x.
@param y1 The top left y.
@param x2 The bottom left x.
@param y2 The bottom left y.
"""
return (tx >= x1 and
tx <= x2 and
ty >= y1 and
ty <= y2)
def highlight_selection():
"""
Given the current move bounding box, highlights any points inside it.
"""
# TODO: There's an edge case here
# The edge case is that if you click and drag up top_left becomes
# bottom right so there must be a condition where they should be
# swapped.
top_left = get_bb_top_left()
bottom_right = get_bb_bottom_right()
ct = COLOR_TO_RGBA[Color.BLUE]
glBegin(GL_POINTS)
glColor3f(ct[0], ct[1], ct[2])
for point in __current_points.points:
if box_hit(point.x, point.y, top_left[0], top_left[1],
bottom_right[0], bottom_right[1]):
# Paint the point and draw over it.
# TODO: After the mouse drag drop these highlighted points should be
# stored in a move set. Make sure to update these in a set
# dropping each as it doesn't make the hit condition anymore.
#
#
# TODO: Demonstrating movement might be difficult... come up with a
# good way on paper.
#
#
# TODO: The highlight any direction bug needs to be fixed but it
# works, you need an algorithm for storing points selected,
# painting them permanently, and then moving them as the
# mouse drags.
glVertex3f(__clamp_x(point.x),
__clamp_y(point.y),
0.0)
glEnd()
def draw_selection_box(color): def draw_selection_box(color):
""" """
When the move bounding box state is populated and the mode is set When the move bounding box state is populated and the mode is set
@ -294,7 +362,7 @@ def draw_selection_box(color):
glBegin(GL_LINE_LOOP) glBegin(GL_LINE_LOOP)
glColor4f(ct[0], ct[1], ct[2], ct[3]) glColor3f(ct[0], ct[1], ct[2])
glVertex3f(__clamp_x(__move_bb_top_left[0]), glVertex3f(__clamp_x(__move_bb_top_left[0]),
__clamp_y(__move_bb_top_left[1]), __clamp_y(__move_bb_top_left[1]),
@ -341,11 +409,9 @@ def draw_points(point_set, color):
glBegin(GL_POINTS) glBegin(GL_POINTS)
glColor4f(ct[0], ct[1], ct[2], ct[3]) glColor3f(ct[0], ct[1], ct[2])
for point in point_set.points: for point in point_set.points:
glVertex3f(__clamp_x(point.x), glVertex3f(__clamp_x(point.x),
__clamp_y(point.y), __clamp_y(point.y),
0.0) # Z is currently fixed to 0 0.0) # Z is currently fixed to 0
glEnd() glEnd()

Loading…
Cancel
Save