Add "live order" submission using ctl-<action key>
							parent
							
								
									7811119736
								
							
						
					
					
						commit
						f82127de31
					
				|  | @ -217,7 +217,11 @@ class LineEditor: | |||
|     _active_staged_line: LevelLine = None | ||||
|     _stage_line: LevelLine = None | ||||
| 
 | ||||
|     def stage_line(self, color: str = 'alert_yellow') -> LevelLine: | ||||
|     def stage_line( | ||||
|         self, | ||||
|         color: str = 'alert_yellow', | ||||
|         hl_on_hover: bool = False, | ||||
|     ) -> LevelLine: | ||||
|         """Stage a line at the current chart's cursor position | ||||
|         and return it. | ||||
| 
 | ||||
|  | @ -238,18 +242,24 @@ class LineEditor: | |||
|                 color=color, | ||||
| 
 | ||||
|                 # don't highlight the "staging" line | ||||
|                 hl_on_hover=False, | ||||
|                 hl_on_hover=hl_on_hover, | ||||
|             ) | ||||
|             self._stage_line = line | ||||
| 
 | ||||
|         else: | ||||
|             # use the existing staged line instead | ||||
|             # of allocating more mem / objects repeatedly | ||||
|             line.setValue(y) | ||||
|             line.show() | ||||
|             print(f'hl on hover: {hl_on_hover}') | ||||
|             line._hoh = hl_on_hover | ||||
|             line.color = color | ||||
|             line.label.color = color | ||||
|             line.label.show() | ||||
|             line.setMouseHover(hl_on_hover) | ||||
|             line.setValue(y) | ||||
|             line.update() | ||||
|             line.show() | ||||
| 
 | ||||
|             label = line.label | ||||
|             label.color = color | ||||
|             label.show() | ||||
| 
 | ||||
|         self._active_staged_line = line | ||||
| 
 | ||||
|  | @ -421,18 +431,26 @@ class OrderMode: | |||
|         'sell': 'sell_red', | ||||
|     } | ||||
|     _action: str = 'alert' | ||||
|     _exec_mode: str = 'dark' | ||||
| 
 | ||||
|     key_map: Dict[str, Callable] = field(default_factory=dict) | ||||
| 
 | ||||
|     def uuid(self) -> str: | ||||
|         return str(uuid.uuid4()) | ||||
| 
 | ||||
|     def set_exec(self, name: str) -> None: | ||||
|     def set_exec( | ||||
|         self, | ||||
|         action: str, | ||||
|         # mode: str, | ||||
|     ) -> None: | ||||
|         """Set execution mode. | ||||
| 
 | ||||
|         """ | ||||
|         self._action = name | ||||
|         self.lines.stage_line(color=self._colors[name]) | ||||
|         self._action = action | ||||
|         self.lines.stage_line( | ||||
|             color=self._colors[action], | ||||
|             hl_on_hover=True if self._exec_mode == 'live' else False, | ||||
|         ) | ||||
| 
 | ||||
|     def on_submit(self, uuid: str) -> dict: | ||||
|         """On order submitted event, commit the order line | ||||
|  | @ -523,6 +541,7 @@ class OrderMode: | |||
|             symbol=self.chart._lc._symbol, | ||||
|             price=y, | ||||
|             action=self._action, | ||||
|             exec_mode=self._exec_mode, | ||||
|         ) | ||||
| 
 | ||||
| 
 | ||||
|  | @ -582,6 +601,7 @@ class ChartView(ViewBox): | |||
| 
 | ||||
|         # kb ctrls processing | ||||
|         self._key_buffer = [] | ||||
|         self._key_active: bool = False | ||||
| 
 | ||||
|     @property | ||||
|     def chart(self) -> 'ChartPlotWidget':  # type: ignore # noqa | ||||
|  | @ -760,8 +780,9 @@ class ChartView(ViewBox): | |||
| 
 | ||||
|         elif button == QtCore.Qt.LeftButton: | ||||
|             # when in order mode, submit execution | ||||
|             ev.accept() | ||||
|             self.mode.submit_exec() | ||||
|             if self._key_active: | ||||
|                 ev.accept() | ||||
|                 self.mode.submit_exec() | ||||
| 
 | ||||
|     def keyReleaseEvent(self, ev): | ||||
|         """ | ||||
|  | @ -774,18 +795,25 @@ class ChartView(ViewBox): | |||
|             return | ||||
| 
 | ||||
|         ev.accept() | ||||
|         text = ev.text() | ||||
|         # text = ev.text() | ||||
|         key = ev.key() | ||||
|         # mods = ev.modifiers() | ||||
|         mods = ev.modifiers() | ||||
| 
 | ||||
|         if key == QtCore.Qt.Key_Shift: | ||||
|             # if self.state['mouseMode'] == ViewBox.RectMode: | ||||
|             self.setMouseMode(ViewBox.PanMode) | ||||
| 
 | ||||
|         if text in {'a', 'f', 's'}: | ||||
|             # draw "staged" line under cursor position | ||||
|         # if self.state['mouseMode'] == ViewBox.RectMode: | ||||
|         # if key == QtCore.Qt.Key_Space: | ||||
|         if mods == QtCore.Qt.ControlModifier or key == QtCore.Qt.Key_Control: | ||||
|             self.mode._exec_mode = 'dark' | ||||
| 
 | ||||
|         if key in {QtCore.Qt.Key_A, QtCore.Qt.Key_F, QtCore.Qt.Key_D}: | ||||
|             # remove "staged" level line under cursor position | ||||
|             self.mode.lines.unstage_line() | ||||
| 
 | ||||
|         self._key_active = False | ||||
| 
 | ||||
|     def keyPressEvent(self, ev): | ||||
|         """ | ||||
|         This routine should capture key presses in the current view box. | ||||
|  | @ -805,41 +833,52 @@ class ChartView(ViewBox): | |||
|             if self.state['mouseMode'] == ViewBox.PanMode: | ||||
|                 self.setMouseMode(ViewBox.RectMode) | ||||
| 
 | ||||
|         # ctl | ||||
|         # ctrl | ||||
|         ctrl = False | ||||
|         if mods == QtCore.Qt.ControlModifier: | ||||
|             # TODO: ctrl-c as cancel? | ||||
|             # https://forum.qt.io/topic/532/how-to-catch-ctrl-c-on-a-widget/9 | ||||
|             # if ev.text() == 'c': | ||||
|             #     self.rbScaleBox.hide() | ||||
|             print(f"CTRL + key:{key} + text:{text}") | ||||
|             ctrl = True | ||||
| 
 | ||||
|         print(mods) | ||||
|         if mods == QtCore.Qt.ControlModifier: | ||||
|             print('space') | ||||
|             self.mode._exec_mode = 'live' | ||||
| 
 | ||||
|         self._key_active = True | ||||
| 
 | ||||
|         # alt | ||||
|         if mods == QtCore.Qt.AltModifier: | ||||
|             pass | ||||
| 
 | ||||
|         # esc | ||||
|         if key == QtCore.Qt.Key_Escape: | ||||
|         if key == QtCore.Qt.Key_Escape or (ctrl and key == QtCore.Qt.Key_C): | ||||
|             # ctrl-c as cancel | ||||
|             # https://forum.qt.io/topic/532/how-to-catch-ctrl-c-on-a-widget/9 | ||||
|             self.select_box.clear() | ||||
| 
 | ||||
|             # delete any lines under the cursor | ||||
|             mode = self.mode | ||||
|             for line in mode.lines.lines_under_cursor(): | ||||
|                 mode.book.cancel(uuid=line.oid) | ||||
| 
 | ||||
|         self._key_buffer.append(text) | ||||
| 
 | ||||
|         # View modes | ||||
|         if text == 'r': | ||||
|         if key == QtCore.Qt.Key_R: | ||||
|             self.chart.default_view() | ||||
| 
 | ||||
|         # Order modes | ||||
|         # stage orders at the current cursor level | ||||
|         elif text == 's': | ||||
|         # Order modes: stage orders at the current cursor level | ||||
| 
 | ||||
|         elif key == QtCore.Qt.Key_D: | ||||
|             self.mode.set_exec('sell') | ||||
| 
 | ||||
|         elif text == 'f': | ||||
|         elif key == QtCore.Qt.Key_F: | ||||
|             self.mode.set_exec('buy') | ||||
| 
 | ||||
|         elif text == 'a': | ||||
|         elif key == QtCore.Qt.Key_A: | ||||
|             self.mode.set_exec('alert') | ||||
| 
 | ||||
|         # delete orders under cursor | ||||
|         elif text == 'd': | ||||
|         elif key == QtCore.Qt.Key_Delete: | ||||
| 
 | ||||
|             # delete any lines under the cursor | ||||
|             mode = self.mode | ||||
|  | @ -862,3 +901,4 @@ class ChartView(ViewBox): | |||
|         #     self.scaleHistory(len(self.axHistory)) | ||||
|         else: | ||||
|             ev.ignore() | ||||
|             self._key_active = False | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue