-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathcursor.py
More file actions
140 lines (110 loc) · 3.23 KB
/
cursor.py
File metadata and controls
140 lines (110 loc) · 3.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# -*- coding: utf-8 -*-
from qtpy import QtCore as QC
from plotpy.config import _
from plotpy.constants import SHAPE_Z_OFFSET
from plotpy.events import QtDragHandler, setup_standard_tool_filter
from plotpy.items import Marker, XRangeSelection
from plotpy.tools.base import DefaultToolbarID, InteractiveTool
class BaseCursorTool(InteractiveTool):
""" """
TITLE = None
ICON = None
def __init__(
self,
manager,
toolbar_id=DefaultToolbarID,
title=None,
icon=None,
tip=None,
switch_to_default_tool=None,
):
super().__init__(
manager,
toolbar_id,
title=title,
icon=icon,
tip=tip,
switch_to_default_tool=switch_to_default_tool,
)
self.shape = None
def create_shape(self):
"""Create and return the cursor/range shape"""
raise NotImplementedError
def setup_filter(self, baseplot):
"""
:param baseplot:
:return:
"""
filter = baseplot.filter
# Initialisation du filtre
start_state = filter.new_state()
# Bouton gauche :
self.handler = QtDragHandler(
filter, QC.Qt.MouseButton.LeftButton, start_state=start_state
)
self.handler.SIG_MOVE.connect(self.move)
self.handler.SIG_STOP_NOT_MOVING.connect(self.end_move)
self.handler.SIG_STOP_MOVING.connect(self.end_move)
return setup_standard_tool_filter(filter, start_state)
def move(self, filter, event):
"""
:param filter:
:param event:
"""
plot = filter.plot
if not self.shape:
self.shape = self.create_shape()
self.shape.attach(plot)
self.shape.setZ(plot.get_max_z() + 1)
self.shape.move_local_point_to(0, event.pos())
self.shape.setVisible(True)
self.shape.move_local_point_to(1, event.pos())
plot.replot()
def end_move(self, filter, event):
"""
:param filter:
:param event:
"""
if self.shape is not None:
assert self.shape.plot() == filter.plot
filter.plot.add_item_with_z_offset(self.shape, SHAPE_Z_OFFSET)
self.shape = None
self.SIG_TOOL_JOB_FINISHED.emit()
class HRangeTool(BaseCursorTool):
TITLE = _("Horizontal selection")
ICON = "xrange.png"
def create_shape(self):
"""
:return:
"""
return XRangeSelection(0, 0)
class VCursorTool(BaseCursorTool):
TITLE = _("Vertical cursor")
ICON = "vcursor.png"
def create_shape(self):
"""
:return:
"""
marker = Marker()
marker.set_markerstyle("|")
return marker
class HCursorTool(BaseCursorTool):
TITLE = _("Horizontal cursor")
ICON = "hcursor.png"
def create_shape(self):
"""
:return:
"""
marker = Marker()
marker.set_markerstyle("-")
return marker
class XCursorTool(BaseCursorTool):
TITLE = _("Cross cursor")
ICON = "xcursor.png"
def create_shape(self):
"""
:return:
"""
marker = Marker()
marker.set_markerstyle("+")
return marker