diff --git a/FlatCAMApp.py b/FlatCAMApp.py index 151e50a5..408b23f6 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -964,8 +964,7 @@ class App(QtCore.QObject): self.plotcanvas.vis_connect('mouse_double_click', self.on_double_click_over_plot) # Keys over plot enabled - self.plotcanvas.vis_connect('key_press', self.on_key_over_plot) - self.plotcanvas.vis_connect('key_release', self.on_key_release_over_plot) + self.plotcanvas.vis_connect('key_press', self.ui.keyPressEvent) self.ui.splitter.setStretchFactor(1, 2) @@ -3934,223 +3933,224 @@ class App(QtCore.QObject): else: return 0 - def on_key_over_plot(self, event): - """ - Callback for the key pressed event when the canvas is focused. Keyboard - shortcuts are handled here. So far, these are the shortcuts: - - ========== ============================================ - Key Action - ========== ============================================ - '1' Zoom-fit. Fits the axes limits to the data. - '2' Zoom-out. - '3' Zoom-in. - 'ctrl+m' Toggle on-off the measuring tool. - ========== ============================================ - - :param event: Ignored. - :return: None - """ - - self.key_modifiers = QtWidgets.QApplication.keyboardModifiers() - - if self.key_modifiers == QtCore.Qt.ControlModifier: - if event.key == 'A': - self.on_selectall() - - if event.key == 'C': - self.on_copy_object() - - if event.key == 'E': - self.on_fileopenexcellon() - if event.key == 'G': - self.on_fileopengerber() - - if event.key == 'N': - self.on_file_new_click() - - if event.key == 'M': - self.measurement_tool.run() - - if event.key == 'O': - self.on_file_openproject() - - if event.key == 'S': - self.on_file_saveproject() - - # Toggle Plot Area - if event.key == 'F10': - self.on_toggle_plotarea() - - return - elif self.key_modifiers == QtCore.Qt.AltModifier: - # place holder for further shortcut key - - if event.key == '1': - self.enable_all_plots() - - if event.key == '2': - self.disable_all_plots() - - if event.key == '3': - self.disable_other_plots() - - if event.key == 'C': - self.calculator_tool.run() - - if event.key == 'D': - self.dblsidedtool.run() - - if event.key == 'L': - self.film_tool.run() - - if event.key == 'N': - self.ncclear_tool.run() - - if event.key == 'P': - self.paint_tool.run() - - if event.key == 'R': - self.transform_tool.run() - - if event.key == 'U': - self.cutout_tool.run() - - if event.key == 'Z': - self.panelize_tool.run() - - if event.key == 'F10': - self.on_fullscreen() - - return - elif self.key_modifiers == QtCore.Qt.ShiftModifier: - # place holder for further shortcut key - - if event.key == 'C': - self.on_copy_name() - - # Toggle axis - if event.key == 'G': - self.on_toggle_axis() - - # Open Preferences Window - if event.key == 'P': - self.on_preferences() - - # Rotate Object by 90 degree CCW - if event.key == 'R': - self.on_rotate(silent=True, preset=-90) - - # Run a Script - if event.key == 'S': - self.on_filerunscript() - - # Toggle Workspace - if event.key == 'W': - self.on_workspace_menu() - - # Skew on X axis - if event.key == 'X': - self.on_skewx() - - # Skew on Y axis - if event.key == 'Y': - self.on_skewy() - - else: - if event.key == 'F1': - webbrowser.open(self.manual_url) - return - - if event.key == 'F2': - webbrowser.open(self.video_url) - return - - if event.key == self.defaults['zoom_out_key']: # '-' - self.plotcanvas.zoom(1 / self.defaults['zoom_ratio'], self.mouse) - return - - if event.key == self.defaults['zoom_in_key']: # '=' - self.plotcanvas.zoom(self.defaults['zoom_ratio'], self.mouse) - return - - if event.key == 'Delete': - self.on_delete() - return - - if event.key == 'Space': - if self.collection.get_active() is not None: - self.collection.get_active().ui.plot_cb.toggle() - self.delete_selection_shape() - - if event.key == '1': - self.on_select_tab('project') - - if event.key == '2': - self.on_select_tab('selected') - - if event.key == '3': - self.on_select_tab('tool') - - if event.key == 'E': - self.object2editor() - - if event.key == self.defaults['grid_toggle_key']: # G - self.ui.grid_snap_btn.trigger() - - if event.key == 'J': - self.on_jump_to() - - if event.key == 'L': - self.new_excellon_object() - - if event.key == 'M': - self.move_tool.toggle() - return - - if event.key == 'N': - self.on_new_geometry() - - if event.key == 'O': - self.on_set_origin() - - if event.key == 'P': - self.properties_tool.run() - - if event.key == 'Q': - self.on_toggle_units_click() - - if event.key == 'R': - self.on_rotate(silent=True, preset=90) - - if event.key == 'S': - self.on_toggle_shell() - - if event.key == 'V': - self.on_zoom_fit(None) - - if event.key == 'X': - self.on_flipx() - - if event.key == 'Y': - self.on_flipy() - - if event.key == '`': - self.on_shortcut_list() - - def on_key_release_over_plot(self, event): - modifiers = QtWidgets.QApplication.keyboardModifiers() - - if modifiers == QtCore.Qt.ControlModifier: - return - elif modifiers == QtCore.Qt.AltModifier: - # place holder for further shortcut key - return - elif modifiers == QtCore.Qt.ShiftModifier: - # place holder for further shortcut key - return - else: - return + # def on_key_over_plot(self, event): + # """ + # Callback for the key pressed event when the canvas is focused. Keyboard + # shortcuts are handled here. So far, these are the shortcuts: + # + # ========== ============================================ + # Key Action + # ========== ============================================ + # '1' Zoom-fit. Fits the axes limits to the data. + # '2' Zoom-out. + # '3' Zoom-in. + # 'ctrl+m' Toggle on-off the measuring tool. + # ========== ============================================ + # + # :param event: Ignored. + # :return: None + # """ + # print(type(event.key), event.key) + # self.key_modifiers = QtWidgets.QApplication.keyboardModifiers() + # + # if self.key_modifiers == QtCore.Qt.ControlModifier: + # if event.key == 'A': + # self.on_selectall() + # + # if event.key == 'C': + # self.on_copy_object() + # + # if event.key == 'E': + # self.on_fileopenexcellon() + # + # if event.key == 'G': + # self.on_fileopengerber() + # + # if event.key == 'N': + # self.on_file_new_click() + # + # if event.key == 'M': + # self.measurement_tool.run() + # + # if event.key == 'O': + # self.on_file_openproject() + # + # if event.key == 'S': + # self.on_file_saveproject() + # + # # Toggle Plot Area + # if event.key == 'F10': + # self.on_toggle_plotarea() + # + # return + # elif self.key_modifiers == QtCore.Qt.AltModifier: + # # place holder for further shortcut key + # + # if event.key == '1': + # self.enable_all_plots() + # + # if event.key == '2': + # self.disable_all_plots() + # + # if event.key == '3': + # self.disable_other_plots() + # + # if event.key == 'C': + # self.calculator_tool.run() + # + # if event.key == 'D': + # self.dblsidedtool.run() + # + # if event.key == 'L': + # self.film_tool.run() + # + # if event.key == 'N': + # self.ncclear_tool.run() + # + # if event.key == 'P': + # self.paint_tool.run() + # + # if event.key == 'R': + # self.transform_tool.run() + # + # if event.key == 'U': + # self.cutout_tool.run() + # + # if event.key == 'Z': + # self.panelize_tool.run() + # + # if event.key == 'F10': + # self.on_fullscreen() + # + # return + # elif self.key_modifiers == QtCore.Qt.ShiftModifier: + # # place holder for further shortcut key + # + # if event.key == 'C': + # self.on_copy_name() + # + # # Toggle axis + # if event.key == 'G': + # self.on_toggle_axis() + # + # # Open Preferences Window + # if event.key == 'P': + # self.on_preferences() + # + # # Rotate Object by 90 degree CCW + # if event.key == 'R': + # self.on_rotate(silent=True, preset=-90) + # + # # Run a Script + # if event.key == 'S': + # self.on_filerunscript() + # + # # Toggle Workspace + # if event.key == 'W': + # self.on_workspace_menu() + # + # # Skew on X axis + # if event.key == 'X': + # self.on_skewx() + # + # # Skew on Y axis + # if event.key == 'Y': + # self.on_skewy() + # + # else: + # if event.key == 'F1': + # webbrowser.open(self.manual_url) + # return + # + # if event.key == 'F2': + # webbrowser.open(self.video_url) + # return + # + # if event.key == self.defaults['zoom_out_key']: # '-' + # self.plotcanvas.zoom(1 / self.defaults['zoom_ratio'], self.mouse) + # return + # + # if event.key == self.defaults['zoom_in_key']: # '=' + # self.plotcanvas.zoom(self.defaults['zoom_ratio'], self.mouse) + # return + # + # if event.key == 'Delete': + # self.on_delete() + # return + # + # if event.key == 'Space': + # if self.collection.get_active() is not None: + # self.collection.get_active().ui.plot_cb.toggle() + # self.delete_selection_shape() + # + # if event.key == '1': + # self.on_select_tab('project') + # + # if event.key == '2': + # self.on_select_tab('selected') + # + # if event.key == '3': + # self.on_select_tab('tool') + # + # if event.key == 'E': + # self.object2editor() + # + # if event.key == self.defaults['grid_toggle_key']: # G + # self.ui.grid_snap_btn.trigger() + # + # if event.key == 'J': + # self.on_jump_to() + # + # if event.key == 'L': + # self.new_excellon_object() + # + # if event.key == 'M': + # self.move_tool.toggle() + # return + # + # if event.key == 'N': + # self.on_new_geometry() + # + # if event.key == 'O': + # self.on_set_origin() + # + # if event.key == 'P': + # self.properties_tool.run() + # + # if event.key == 'Q': + # self.on_toggle_units_click() + # + # if event.key == 'R': + # self.on_rotate(silent=True, preset=90) + # + # if event.key == 'S': + # self.on_toggle_shell() + # + # if event.key == 'V': + # self.on_zoom_fit(None) + # + # if event.key == 'X': + # self.on_flipx() + # + # if event.key == 'Y': + # self.on_flipy() + # + # if event.key == '`': + # self.on_shortcut_list() + # + # def on_key_release_over_plot(self, event): + # modifiers = QtWidgets.QApplication.keyboardModifiers() + # + # if modifiers == QtCore.Qt.ControlModifier: + # return + # elif modifiers == QtCore.Qt.AltModifier: + # # place holder for further shortcut key + # return + # elif modifiers == QtCore.Qt.ShiftModifier: + # # place holder for further shortcut key + # return + # else: + # return def on_shortcut_list(self): self.report_usage("on_shortcut_list()") diff --git a/FlatCAMEditor.py b/FlatCAMEditor.py index a472da6b..84cb50d7 100644 --- a/FlatCAMEditor.py +++ b/FlatCAMEditor.py @@ -2134,19 +2134,20 @@ class FlatCAMGeoEditor(QtCore.QObject): # make sure that the shortcuts key and mouse events will no longer be linked to the methods from FlatCAMApp # but those from FlatCAMGeoEditor - self.app.plotcanvas.vis_disconnect('key_press', self.app.on_key_over_plot) + + self.app.plotcanvas.vis_disconnect('key_press', self.app.ui.keyPressEvent) self.app.plotcanvas.vis_disconnect('mouse_press', self.app.on_mouse_click_over_plot) self.app.plotcanvas.vis_disconnect('mouse_move', self.app.on_mouse_move_over_plot) self.app.plotcanvas.vis_disconnect('mouse_release', self.app.on_mouse_click_release_over_plot) self.app.plotcanvas.vis_disconnect('mouse_double_click', self.app.on_double_click_over_plot) - self.app.collection.view.keyPressed.disconnect() + self.app.collection.view.clicked.disconnect() self.canvas.vis_connect('mouse_press', self.on_canvas_click) self.canvas.vis_connect('mouse_move', self.on_canvas_move) self.canvas.vis_connect('mouse_release', self.on_canvas_click_release) self.canvas.vis_connect('key_press', self.on_canvas_key) - self.canvas.vis_connect('key_release', self.on_canvas_key_release) + def disconnect_canvas_event_handlers(self): @@ -2154,15 +2155,14 @@ class FlatCAMGeoEditor(QtCore.QObject): self.canvas.vis_disconnect('mouse_move', self.on_canvas_move) self.canvas.vis_disconnect('mouse_release', self.on_canvas_click_release) self.canvas.vis_disconnect('key_press', self.on_canvas_key) - self.canvas.vis_disconnect('key_release', self.on_canvas_key_release) + # we restore the key and mouse control to FlatCAMApp method - self.app.plotcanvas.vis_connect('key_press', self.app.on_key_over_plot) + self.app.plotcanvas.vis_connect('key_press', self.app.ui.keyPressEvent) self.app.plotcanvas.vis_connect('mouse_press', self.app.on_mouse_click_over_plot) self.app.plotcanvas.vis_connect('mouse_move', self.app.on_mouse_move_over_plot) self.app.plotcanvas.vis_connect('mouse_release', self.app.on_mouse_click_release_over_plot) self.app.plotcanvas.vis_connect('mouse_double_click', self.app.on_double_click_over_plot) - self.app.collection.view.keyPressed.connect(self.app.collection.on_key) self.app.collection.view.clicked.connect(self.app.collection.on_mouse_down) def add_shape(self, shape): @@ -4277,7 +4277,7 @@ class FlatCAMExcEditor(QtCore.QObject): # make sure that the shortcuts key and mouse events will no longer be linked to the methods from FlatCAMApp # but those from FlatCAMGeoEditor - self.app.plotcanvas.vis_disconnect('key_press', self.app.on_key_over_plot) + self.app.plotcanvas.vis_disconnect('key_press', self.app.ui.keyPressEvent) self.app.plotcanvas.vis_disconnect('mouse_press', self.app.on_mouse_click_over_plot) self.app.plotcanvas.vis_disconnect('mouse_move', self.app.on_mouse_move_over_plot) self.app.plotcanvas.vis_disconnect('mouse_release', self.app.on_mouse_click_release_over_plot) @@ -4289,10 +4289,9 @@ class FlatCAMExcEditor(QtCore.QObject): self.canvas.vis_connect('mouse_move', self.on_canvas_move) self.canvas.vis_connect('mouse_release', self.on_canvas_click_release) self.canvas.vis_connect('key_press', self.on_canvas_key) - self.canvas.vis_connect('key_release', self.on_canvas_key_release) + def disconnect_canvas_event_handlers(self): - self.canvas.vis_disconnect('mouse_press', self.on_canvas_click) self.canvas.vis_disconnect('mouse_move', self.on_canvas_move) self.canvas.vis_disconnect('mouse_release', self.on_canvas_click_release) @@ -4300,12 +4299,12 @@ class FlatCAMExcEditor(QtCore.QObject): self.canvas.vis_disconnect('key_release', self.on_canvas_key_release) # we restore the key and mouse control to FlatCAMApp method - self.app.plotcanvas.vis_connect('key_press', self.app.on_key_over_plot) + self.app.plotcanvas.vis_connect('key_press', self.app.ui.keyPressEvent) self.app.plotcanvas.vis_connect('mouse_press', self.app.on_mouse_click_over_plot) self.app.plotcanvas.vis_connect('mouse_move', self.app.on_mouse_move_over_plot) self.app.plotcanvas.vis_connect('mouse_release', self.app.on_mouse_click_release_over_plot) self.app.plotcanvas.vis_connect('mouse_double_click', self.app.on_double_click_over_plot) - self.app.collection.view.keyPressed.connect(self.app.collection.on_key) + self.app.collection.view.clicked.connect(self.app.collection.on_mouse_down) def clear(self): diff --git a/FlatCAMGUI.py b/FlatCAMGUI.py index 4f853936..beb885ea 100644 --- a/FlatCAMGUI.py +++ b/FlatCAMGUI.py @@ -1507,8 +1507,11 @@ class FlatCAMGUI(QtWidgets.QMainWindow): if type(event) is int: key = event # events from the GUI are of type QKeyEvent - else: + elif type(event) == QtGui.QKeyEvent: key = event.key() + # events from Vispy are of type KeyEvent + else: + key = event.key if modifiers == QtCore.Qt.ControlModifier: if key == QtCore.Qt.Key_A: @@ -1528,6 +1531,7 @@ class FlatCAMGUI(QtWidgets.QMainWindow): if key == QtCore.Qt.Key_M: self.app.measurement_tool.run() + if key == QtCore.Qt.Key_O: self.app.on_file_openproject() @@ -1603,16 +1607,30 @@ class FlatCAMGUI(QtWidgets.QMainWindow): if key == Qt.Key_3: self.app.disable_other_plots() + # Calculator Tool + if key == QtCore.Qt.Key_C: + self.app.calculator_tool.run() + # 2-Sided PCB Tool if key == QtCore.Qt.Key_D: self.app.dblsidedtool.run() return + # Film Tool + if key == QtCore.Qt.Key_L: + self.app.film_tool.run() + return + # Non-Copper Clear Tool if key == QtCore.Qt.Key_N: self.app.ncclear_tool.run() return + # Paint Tool + if key == QtCore.Qt.Key_P: + self.app.paint_tool.run() + return + # Transformation Tool if key == QtCore.Qt.Key_R: self.app.transform_tool.run() @@ -1623,6 +1641,15 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.app.cutout_tool.run() return + # Panelize Tool + if key == QtCore.Qt.Key_Z: + self.app.panelize_tool.run() + return + + # Toggle Fullscreen + if key == QtCore.Qt.Key_F10: + self.app.on_fullscreen() + return else: # Open Manual if key == QtCore.Qt.Key_F1: diff --git a/README.md b/README.md index 7acd5123..7941afd3 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ CAD program, and create G-Code for Isolation routing. - fixed the name self-insert in save dialog file for GCode; added protection in case the save path is None - fixed FlatCAM crash when trying to make drills GCode out of a file that have only slots. - changed the messages for Units Conversion -- all kwy shortcuts work across the entire application; started to move all the shortcuts definitions in FlatCAMGUI.keyPressEvent() +- all key shortcuts work across the entire application; moved all the shortcuts definitions in FlatCAMGUI.keyPressEvent() 5.02.3019 diff --git a/flatcamTools/ToolMeasurement.py b/flatcamTools/ToolMeasurement.py index 683bbbb0..9890f28a 100644 --- a/flatcamTools/ToolMeasurement.py +++ b/flatcamTools/ToolMeasurement.py @@ -184,25 +184,22 @@ class Measurement(FlatCAMTool): # disconnect the mouse/key events from functions of measurement tool self.app.plotcanvas.vis_disconnect('mouse_move', self.on_mouse_move_meas) self.app.plotcanvas.vis_disconnect('mouse_press', self.on_click_meas) - self.app.plotcanvas.vis_disconnect('key_release', self.on_key_release_meas) # reconnect the mouse/key events to the functions from where the tool was called if self.app.call_source == 'app': self.app.plotcanvas.vis_connect('mouse_move', self.app.on_mouse_move_over_plot) self.app.plotcanvas.vis_connect('mouse_press', self.app.on_mouse_click_over_plot) - self.app.plotcanvas.vis_connect('key_press', self.app.on_key_over_plot) + self.app.plotcanvas.vis_connect('key_press', self.app.ui.keyPressEvent) self.app.plotcanvas.vis_connect('mouse_release', self.app.on_mouse_click_release_over_plot) elif self.app.call_source == 'geo_editor': self.app.geo_editor.canvas.vis_connect('mouse_move', self.app.geo_editor.on_canvas_move) self.app.geo_editor.canvas.vis_connect('mouse_press', self.app.geo_editor.on_canvas_click) self.app.geo_editor.canvas.vis_connect('key_press', self.app.geo_editor.on_canvas_key) - self.app.geo_editor.canvas.vis_connect('key_release', self.app.geo_editor.on_canvas_key_release) self.app.geo_editor.canvas.vis_connect('mouse_release', self.app.geo_editor.on_canvas_click_release) elif self.app.call_source == 'exc_editor': self.app.exc_editor.canvas.vis_connect('mouse_move', self.app.exc_editor.on_canvas_move) self.app.exc_editor.canvas.vis_connect('mouse_press', self.app.exc_editor.on_canvas_click) self.app.exc_editor.canvas.vis_connect('key_press', self.app.exc_editor.on_canvas_key) - self.app.exc_editor.canvas.vis_connect('key_release', self.app.exc_editor.on_canvas_key_release) self.app.exc_editor.canvas.vis_connect('mouse_release', self.app.exc_editor.on_canvas_click_release) self.clicked_meas = 0 @@ -219,19 +216,17 @@ class Measurement(FlatCAMTool): if self.app.call_source == 'app': self.app.plotcanvas.vis_disconnect('mouse_move', self.app.on_mouse_move_over_plot) self.app.plotcanvas.vis_disconnect('mouse_press', self.app.on_mouse_click_over_plot) - self.app.plotcanvas.vis_disconnect('key_press', self.app.on_key_over_plot) + self.app.plotcanvas.vis_disconnect('key_press', self.app.ui.keyPressEvent) self.app.plotcanvas.vis_disconnect('mouse_release', self.app.on_mouse_click_release_over_plot) elif self.app.call_source == 'geo_editor': self.app.geo_editor.canvas.vis_disconnect('mouse_move', self.app.geo_editor.on_canvas_move) self.app.geo_editor.canvas.vis_disconnect('mouse_press', self.app.geo_editor.on_canvas_click) self.app.geo_editor.canvas.vis_disconnect('key_press', self.app.geo_editor.on_canvas_key) - self.app.geo_editor.canvas.vis_disconnect('key_release', self.app.geo_editor.on_canvas_key_release) self.app.geo_editor.canvas.vis_disconnect('mouse_release', self.app.geo_editor.on_canvas_click_release) elif self.app.call_source == 'exc_editor': self.app.exc_editor.canvas.vis_disconnect('mouse_move', self.app.exc_editor.on_canvas_move) self.app.exc_editor.canvas.vis_disconnect('mouse_press', self.app.exc_editor.on_canvas_click) self.app.exc_editor.canvas.vis_disconnect('key_press', self.app.exc_editor.on_canvas_key) - self.app.exc_editor.canvas.vis_disconnect('key_release', self.app.exc_editor.on_canvas_key_release) self.app.exc_editor.canvas.vis_disconnect('mouse_release', self.app.exc_editor.on_canvas_click_release) # we can safely connect the app mouse events to the measurement tool diff --git a/flatcamTools/ToolMove.py b/flatcamTools/ToolMove.py index 971d901f..562aff80 100644 --- a/flatcamTools/ToolMove.py +++ b/flatcamTools/ToolMove.py @@ -47,7 +47,7 @@ class ToolMove(FlatCAMTool): self.app.plotcanvas.vis_disconnect('mouse_move', self.on_move) self.app.plotcanvas.vis_disconnect('mouse_press', self.on_left_click) self.app.plotcanvas.vis_disconnect('key_release', self.on_key_press) - self.app.plotcanvas.vis_connect('key_press', self.app.on_key_over_plot) + self.app.plotcanvas.vis_connect('key_press', self.app.ui.keyPressEvent) self.clicked_move = 0