Use label anchor
							parent
							
								
									422b81f0eb
								
							
						
					
					
						commit
						d25be4c970
					
				| 
						 | 
				
			
			@ -225,6 +225,8 @@ class Label:
 | 
			
		|||
        self.vb.scene().removeItem(self.txt)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# anchoring helper funcs
 | 
			
		||||
 | 
			
		||||
def vbr_left(label) -> Callable[..., float]:
 | 
			
		||||
    """Return a closure which gives the scene x-coordinate for the
 | 
			
		||||
    leftmost point of the containing view box.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -360,6 +360,8 @@ class LevelLine(pg.InfiniteLine):
 | 
			
		|||
            self._marker.setPos(
 | 
			
		||||
                QPointF(marker_right, self.scene_y())
 | 
			
		||||
            )
 | 
			
		||||
            # TODO: make this label update part of a scene-aware-marker
 | 
			
		||||
            # composed annotation
 | 
			
		||||
            self._marker.label.update()
 | 
			
		||||
 | 
			
		||||
        elif not self.use_marker_margin:
 | 
			
		||||
| 
						 | 
				
			
			@ -763,9 +765,7 @@ def position_line(
 | 
			
		|||
 | 
			
		||||
    # monkey-cache height for sizing on pp nav-hub
 | 
			
		||||
    arrow_path._height = path_br.height()
 | 
			
		||||
 | 
			
		||||
    arrow_path._width = path_br.width()
 | 
			
		||||
    # wp = QPointF(w, w)
 | 
			
		||||
 | 
			
		||||
    marker_label = Label(
 | 
			
		||||
        view=vb,
 | 
			
		||||
| 
						 | 
				
			
			@ -775,17 +775,18 @@ def position_line(
 | 
			
		|||
    )
 | 
			
		||||
    arrow_path.label = marker_label
 | 
			
		||||
 | 
			
		||||
    # def arrow_br():
 | 
			
		||||
    #     # get actual arrow graphics path
 | 
			
		||||
    #     path_br = arrow_path.mapToScene(
 | 
			
		||||
    #         arrow_path.path()
 | 
			
		||||
    #     ).boundingRect()
 | 
			
		||||
    def arrow_tr():
 | 
			
		||||
        # get actual arrow graphics path
 | 
			
		||||
        path_br = arrow_path.mapToScene(
 | 
			
		||||
            arrow_path.path()
 | 
			
		||||
        ).boundingRect()
 | 
			
		||||
 | 
			
		||||
    #     # vb.locate(arrow_path)  #, children=True)
 | 
			
		||||
        # vb.locate(arrow_path)  #, children=True)
 | 
			
		||||
 | 
			
		||||
    #     return path_br.bottomRight() - QPointF(0, marker_label.h / 2)
 | 
			
		||||
        return path_br.topRight() - QPointF(0, marker_label.h / 3)
 | 
			
		||||
 | 
			
		||||
    # marker_label.scene_anchor = arrow_br
 | 
			
		||||
 | 
			
		||||
    marker_label.scene_anchor = arrow_tr
 | 
			
		||||
 | 
			
		||||
    line._labels.append(marker_label)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -807,13 +808,9 @@ def position_line(
 | 
			
		|||
        ymn, ymx = vr[1]
 | 
			
		||||
        level = line.value()
 | 
			
		||||
 | 
			
		||||
        path = line._marker
 | 
			
		||||
        label = path.label
 | 
			
		||||
        marker = line._marker
 | 
			
		||||
        label = marker.label
 | 
			
		||||
 | 
			
		||||
        # get actual arrow-marker graphics path
 | 
			
		||||
        path_br = path.mapToScene(
 | 
			
		||||
            path.path()
 | 
			
		||||
        ).boundingRect()
 | 
			
		||||
 | 
			
		||||
        # provide "nav hub" like indicator for where
 | 
			
		||||
        # the position is on the y-dimension
 | 
			
		||||
| 
						 | 
				
			
			@ -821,33 +818,28 @@ def position_line(
 | 
			
		|||
        _, marker_right, _ = line.marker_right_points()
 | 
			
		||||
 | 
			
		||||
        if level > ymx:  # pin to top of view
 | 
			
		||||
            path.setPos(
 | 
			
		||||
            marker.setPos(
 | 
			
		||||
                QPointF(
 | 
			
		||||
                    marker_right,
 | 
			
		||||
                    path._height/3,
 | 
			
		||||
                    marker._height/3,
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
        elif level < ymn:  # pin to bottom of view
 | 
			
		||||
 | 
			
		||||
            path.setPos(
 | 
			
		||||
            marker.setPos(
 | 
			
		||||
                QPointF(
 | 
			
		||||
                    marker_right,
 | 
			
		||||
                    vb.height() - 4/3*path._height,
 | 
			
		||||
                    vb.height() - 4/3*marker._height,
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
            # adjust marker labels to be above bottom of view
 | 
			
		||||
            label.txt.setPos(path_br.topRight() - QPointF(0, label.h / 2))
 | 
			
		||||
 | 
			
		||||
        else:
 | 
			
		||||
            # pp line is viewable so show marker normally
 | 
			
		||||
            line._marker.show()
 | 
			
		||||
            marker.update()
 | 
			
		||||
 | 
			
		||||
            # place label at bottom right of pp marker
 | 
			
		||||
            label.txt.setPos(path_br.bottomRight() - QPointF(0, label.h / 2))
 | 
			
		||||
 | 
			
		||||
        line.show_labels()
 | 
			
		||||
        # re-anchor label (i.e. trigger call of ``arrow_tr()`` from above
 | 
			
		||||
        label.update()
 | 
			
		||||
 | 
			
		||||
    vb.sigRangeChanged.connect(update_pp_nav)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue