Skip to content

Commit

Permalink
Constraint item canvas and tree selection/hover logic
Browse files Browse the repository at this point in the history
mlau154 committed Feb 3, 2024

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
1 parent c708129 commit 4dd5973
Showing 4 changed files with 48 additions and 9 deletions.
3 changes: 3 additions & 0 deletions pymead/core/geometry_collection.py
Original file line number Diff line number Diff line change
@@ -259,6 +259,9 @@ def deselect_object(self, pymead_obj: PymeadObj):
for curve in pymead_obj.curves:
curve.canvas_item.hoverable = True
self.canvas.setItemStyle(curve.canvas_item, "default")
elif isinstance(pymead_obj, GeoCon):
pymead_obj.canvas_item.hoverable = True
pymead_obj.canvas_item.setStyle(theme=self.gui_obj.themes[self.gui_obj.current_theme])

# if isinstance(pymead_obj, Point):
# if pymead_obj in self.selected_objects:
19 changes: 19 additions & 0 deletions pymead/gui/airfoil_canvas.py
Original file line number Diff line number Diff line change
@@ -50,6 +50,7 @@ def __init__(self, parent, geo_col: GeometryCollection, gui_obj):
self.adding_point_to_curve = None
self.curve_hovered_item = None
self.point_hovered_item = None
self.constraint_hovered_item = None
self.point_text_item = None
self.geo_col = geo_col
self.geo_col.canvas = self
@@ -192,6 +193,9 @@ def addPymeadCanvasItem(self, pymead_obj: PymeadObj):

constraint_item.addItems(self)

# Connect hover/not hover signals
# TODO: need to connect these

elif isinstance(pymead_obj, Airfoil):

pymead_obj.canvas_item = PolygonItem(data=pymead_obj.coords, airfoil=pymead_obj)
@@ -547,6 +551,9 @@ def setItemStyle(self, item, style: str):
elif isinstance(item, HoverableCurve):
self.curve_hovered_item = item
item.setCurveStyle("hovered")
elif isinstance(item, ConstraintItem):
self.constraint_hovered_item = item
item.setStyle(mode="hovered")

elif style == "default":
# Point
@@ -559,6 +566,9 @@ def setItemStyle(self, item, style: str):
elif isinstance(item, HoverableCurve):
self.curve_hovered_item = None
item.setCurveStyle("default")
elif isinstance(item, ConstraintItem):
self.constraint_hovered_item = None
item.setStyle(theme=self.gui_obj.themes[self.gui_obj.current_theme])

elif style == "selected":
# Point
@@ -567,6 +577,9 @@ def setItemStyle(self, item, style: str):
self.removeItem(self.point_text_item)
self.point_text_item = None
item.setScatterStyle(mode="selected")
elif isinstance(item, ConstraintItem):
self.constraint_hovered_item = None
item.setStyle(mode="selected")
# Curve
# elif isinstance(item, HoverableCurve):
# self.curve_hovered_item = None
@@ -586,6 +599,12 @@ def curveHovered(self, item):
def curveLeaveHovered(self, item):
self.geo_col.hover_leave_obj(item.parametric_curve)

def constraintHovered(self, item):
self.geo_col.hover_enter_obj(item.canvas_item)

def constraintLeaveHovered(self, item):
self.geo_col.hover_leave_obj(item.canvas_item)

def airfoil_hovered(self, airfoil: Airfoil, x_centroid: float, y_centroid: float):
"""
Adds the name of the airfoil as a label to the airfoil's centroid when the airfoil shape is
29 changes: 23 additions & 6 deletions pymead/gui/constraint_items.py
Original file line number Diff line number Diff line change
@@ -3,24 +3,30 @@

import pyqtgraph as pg
import numpy as np
from PyQt5.QtCore import Qt
from PyQt5.QtCore import Qt, pyqtSignal, QObject
from PyQt5.QtGui import QFont, QImage, QTransform, QPainterPath, QBrush, QPen, QColor
import PIL

from pymead.core.constraints import *
from pymead import ICON_DIR
from pymead.utils.misc import get_setting


class ConstraintItem:
class ConstraintItem(QObject):

sigItemHovered = pyqtSignal()
sigItemLeaveHovered = pyqtSignal()

def __init__(self, constraint: GeoCon, canvas_items: list):
super().__init__()
self.constraint = constraint
self.constraint.canvas_item = self
self.canvas_items = canvas_items

def addItems(self, canvas):
for item in self.canvas_items:
canvas.addItem(item)
# TODO: connect hover leave/enter signals here

def hide(self):
for canvas_item in self.canvas_items:
@@ -34,16 +40,27 @@ def show(self):
def update(self):
pass

def setStyle(self, theme: dict):
def setStyle(self, theme: dict = None, mode: str = "default"):
if mode == "default" and theme is None:
raise ValueError("Must specify theme for default constraint style")
for item in self.canvas_items:
if isinstance(item, pg.ArrowItem):
item.setStyle(brush=theme["main-color"])
if mode == "default":
item.setStyle(brush=theme["main-color"])
else:
item.setStyle(brush=get_setting(f"curve_{mode}_pen_color"))
elif isinstance(item, pg.TextItem):
item.setColor(theme["main-color"])
if mode == "default":
item.setColor(theme["main-color"])
else:
item.setColor(get_setting(f"curve_{mode}_pen_color"))
elif isinstance(item, pg.PlotDataItem) or isinstance(item, pg.PlotCurveItem):
pen = item.opts["pen"]
if isinstance(pen, QPen):
pen.setColor(QColor(theme["main-color"]))
if mode == "default":
pen.setColor(QColor(theme["main-color"]))
else:
pen.setColor(QColor(get_setting(f"curve_{mode}_pen_color")))
item.setPen(pen)


6 changes: 3 additions & 3 deletions pymead/gui/parameter_tree.py
Original file line number Diff line number Diff line change
@@ -1018,9 +1018,9 @@ def leaveEvent(self, a0):
button. In this case, the mouseMoveEvent will not catch the hover leave, so we need to put that logic here.
"""
if self.previous_item_hovered is not None and self.previous_item_hovered.hoverable:
button = self.itemWidget(self.previous_item_hovered, 1)
if button is not None:
self.geo_col.hover_leave_obj(button.pymead_obj)
pymead_obj = self.getPymeadObjFromItem(self.previous_item_hovered)
if pymead_obj is not None:
self.geo_col.hover_leave_obj(pymead_obj)
else:
self.setItemStyle(self.previous_item_hovered, "default")
self.previous_item_hovered = None

0 comments on commit 4dd5973

Please sign in to comment.