From fb983872d08cb2ae03e9495bf6b29c9eefb3bf63 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Wed, 25 Nov 2020 21:14:18 +0200 Subject: [PATCH] - using 'Escape' key shortcut while the focus is in the Tcl Shell command line will set focus on the main canvas --- CHANGELOG.md | 1 + appEditors/AppExcEditor.py | 14 ++++----- appEditors/AppGeoEditor.py | 26 ++++++++-------- appEditors/AppGerberEditor.py | 56 +++++++++++++++++------------------ appEditors/appGCodeEditor.py | 2 +- appGUI/GUIElements.py | 4 +++ appTools/ToolShell.py | 4 +++ 7 files changed, 58 insertions(+), 49 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c8ebf070..4edf640a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ CHANGELOG for FlatCAM beta - moved around portions of code in the App.__init__ for optimization; added a control in Preferences for usage of Log in Tcl Shell - added a text placeholder in the Tcl Shell - added Find function in Tcl Shell (will search for either the selected text in the command line or for the one stored on the clipboard) +- using 'Escape' key shortcut while the focus is in the Tcl Shell command line will set focus on the main canvas 24.11.2020 diff --git a/appEditors/AppExcEditor.py b/appEditors/AppExcEditor.py index 54e006a5..eb72bad1 100644 --- a/appEditors/AppExcEditor.py +++ b/appEditors/AppExcEditor.py @@ -1900,7 +1900,7 @@ class AppExcEditor(QtCore.QObject): self.app.ui.exc_move_drill_menuitem.triggered.connect(self.exc_move_drills) self.ui.exit_editor_button.clicked.connect(lambda: self.app.editor2object()) - log.debug("Initialization of the Excellon Editor is finished ...") + self.app.log.debug("Initialization of the Excellon Editor is finished ...") def make_callback(self, thetool): def f(): @@ -2058,7 +2058,7 @@ class AppExcEditor(QtCore.QObject): # # self.tot_slot_cnt += slot_cnt # except AttributeError: - # # log.debug("No slots in the Excellon file") + # # self.app.log.debug("No slots in the Excellon file") # # Find no of slots for the current tool # for tool_dia in self.slot_points_edit: # if float(tool_dia) == tool_no: @@ -2259,7 +2259,7 @@ class AppExcEditor(QtCore.QObject): try: self.ui.tools_table_exc.selectRow(row_to_be_selected) except TypeError as e: - log.debug("AppExcEditor.on_tool_add() --> %s" % str(e)) + self.app.log.debug("AppExcEditor.on_tool_add() --> %s" % str(e)) def on_tool_delete(self, dia=None): self.is_modified = True @@ -2335,7 +2335,7 @@ class AppExcEditor(QtCore.QObject): try: new_dia = float(self.ui.tools_table_exc.currentItem().text()) except ValueError as e: - log.debug("AppExcEditor.on_tool_edit() --> %s" % str(e)) + self.app.log.debug("AppExcEditor.on_tool_edit() --> %s" % str(e)) return row_of_item_changed = self.ui.tools_table_exc.currentRow() @@ -3081,7 +3081,7 @@ class AppExcEditor(QtCore.QObject): use_thread=False) except Exception as e: self.deactivate() - log.error("Error on Edited object creation: %s" % str(e)) + self.app.log.error("Error on Edited object creation: %s" % str(e)) return self.deactivate() @@ -3266,7 +3266,7 @@ class AppExcEditor(QtCore.QObject): self.app.ui.popMenu.popup(self.app.cursor.pos()) except Exception as e: - log.warning("AppExcEditor.on_exc_click_release() RMB click --> Error: %s" % str(e)) + self.app.log.warning("AppExcEditor.on_exc_click_release() RMB click --> Error: %s" % str(e)) raise # if the released mouse button was LMB then test if we had a right-to-left selection or a left-to-right @@ -3284,7 +3284,7 @@ class AppExcEditor(QtCore.QObject): if self.selected: self.replot() except Exception as e: - log.warning("AppExcEditor.on_exc_click_release() LMB click --> Error: %s" % str(e)) + self.app.log.warning("AppExcEditor.on_exc_click_release() LMB click --> Error: %s" % str(e)) raise def on_canvas_move(self, event): diff --git a/appEditors/AppGeoEditor.py b/appEditors/AppGeoEditor.py index e267c696..f1fb4130 100644 --- a/appEditors/AppGeoEditor.py +++ b/appEditors/AppGeoEditor.py @@ -3540,7 +3540,7 @@ class AppGeoEditor(QtCore.QObject): self.mm = None self.mr = None - log.debug("Initialization of the Geometry Editor is finished ...") + self.app.log.debug("Initialization of the Geometry Editor is finished ...") def make_callback(self, thetool): def f(): @@ -3592,7 +3592,7 @@ class AppGeoEditor(QtCore.QObject): self.options[opt] = float(text_value) except Exception as e: entry.set_value(self.app.defaults[opt]) - log.debug("AppGeoEditor.__init__().entry2option() --> %s" % str(e)) + self.app.log.debug("AppGeoEditor.__init__().entry2option() --> %s" % str(e)) return def grid_changed(self, goption, gentry): @@ -3754,7 +3754,7 @@ class AppGeoEditor(QtCore.QObject): self.geo_frame.show() - log.debug("Finished activating the Geometry Editor...") + self.app.log.debug("Finished activating the Geometry Editor...") def deactivate(self): try: @@ -3820,7 +3820,7 @@ class AppGeoEditor(QtCore.QObject): # for w in sel_tab_widget_list: # w.setEnabled(True) # except Exception as e: - # log.debug("AppGeoEditor.deactivate() --> %s" % str(e)) + # self.app.log.debug("AppGeoEditor.deactivate() --> %s" % str(e)) # Show original geometry if self.fcgeometry: @@ -3833,7 +3833,7 @@ class AppGeoEditor(QtCore.QObject): # hide the UI self.geo_frame.hide() - log.debug("Finished deactivating the Geometry Editor...") + self.app.log.debug("Finished deactivating the Geometry Editor...") def connect_canvas_event_handlers(self): # Canvas events @@ -4363,7 +4363,7 @@ class AppGeoEditor(QtCore.QObject): self.app.inform.emit('[success] %s' % _("Done.")) self.select_tool(self.active_tool.name) except Exception as e: - log.warning("FLatCAMGeoEditor.on_geo_click_release() --> Error: %s" % str(e)) + self.app.log.warning("FLatCAMGeoEditor.on_geo_click_release() --> Error: %s" % str(e)) return def draw_selection_area_handler(self, start_pos, end_pos, sel_type): @@ -4638,10 +4638,10 @@ class AppGeoEditor(QtCore.QObject): elif isinstance(geom, LineString) and geom is not None: geom = LineString(geom.coords[::-1]) else: - log.debug("AppGeoEditor.on_shape_complete() Error --> Unexpected Geometry %s" % + self.app.log.debug("AppGeoEditor.on_shape_complete() Error --> Unexpected Geometry %s" % type(geom)) except Exception as e: - log.debug("AppGeoEditor.on_shape_complete() Error --> %s" % str(e)) + self.app.log.debug("AppGeoEditor.on_shape_complete() Error --> %s" % str(e)) return 'fail' shape_list = [] @@ -4932,7 +4932,7 @@ class AppGeoEditor(QtCore.QObject): try: results = geo_shapes[0].geo except Exception as e: - log.debug("AppGeoEditor.intersection() --> %s" % str(e)) + self.app.log.debug("AppGeoEditor.intersection() --> %s" % str(e)) self.app.inform.emit('[WARNING_NOTCL] %s' % _("A selection of minimum two items is required to do Intersection.")) self.select_tool('select') @@ -4971,7 +4971,7 @@ class AppGeoEditor(QtCore.QObject): try: intersector = geo_shapes[0].geo except Exception as e: - log.debug("AppGeoEditor.intersection() --> %s" % str(e)) + self.app.log.debug("AppGeoEditor.intersection() --> %s" % str(e)) self.app.inform.emit('[WARNING_NOTCL] %s' % _("A selection of minimum two items is required to do Intersection.")) self.select_tool('select') @@ -5016,7 +5016,7 @@ class AppGeoEditor(QtCore.QObject): self.replot() except Exception as e: - log.debug(str(e)) + self.app.log.debug(str(e)) self.app.worker_task.emit({'fcn': work_task, 'params': []}) @@ -5035,7 +5035,7 @@ class AppGeoEditor(QtCore.QObject): self.replot() except Exception as e: - log.debug(str(e)) + self.app.log.debug(str(e)) self.app.worker_task.emit({'fcn': work_task, 'params': []}) @@ -5307,7 +5307,7 @@ class AppGeoEditor(QtCore.QObject): if cp is not None: local_results += list(cp.get_objects()) except Exception as e: - log.debug("Could not Paint the polygons. %s" % str(e)) + self.app.log.debug("Could not Paint the polygons. %s" % str(e)) self.app.inform.emit( '[ERROR] %s\n%s' % (_("Could not do Paint. Try a different combination of parameters. " "Or a different method of Paint"), str(e)) diff --git a/appEditors/AppGerberEditor.py b/appEditors/AppGerberEditor.py index 5c3f35aa..215a3c38 100644 --- a/appEditors/AppGerberEditor.py +++ b/appEditors/AppGerberEditor.py @@ -2948,7 +2948,7 @@ class AppGerberEditor(QtCore.QObject): self.complete = True self.set_ui() - log.debug("Initialization of the Gerber Editor is finished ...") + self.app.log.debug("Initialization of the Gerber Editor is finished ...") def make_callback(self, the_tool): def f(): @@ -3239,7 +3239,7 @@ class AppGerberEditor(QtCore.QObject): self.ui.apsize_entry.set_value(size_val) except Exception as e: - log.error("AppGerberEditor.on_aperture_add() --> the R or O aperture dims has to be in a " + self.app.log.error("AppGerberEditor.on_aperture_add() --> the R or O aperture dims has to be in a " "tuple format (x,y)\nError: %s" % str(e)) self.app.inform.emit('[WARNING_NOTCL] %s' % _("Aperture dimensions value is missing or wrong format. " @@ -3369,7 +3369,7 @@ class AppGerberEditor(QtCore.QObject): try: val_edited = int(self.ui.apertures_table.currentItem().text()) except ValueError as e: - log.debug("AppGerberEditor.on_tool_edit() --> %s" % str(e)) + self.app.log.debug("AppGerberEditor.on_tool_edit() --> %s" % str(e)) # self.ui.apertures_table.setCurrentItem(None) # we reactivate the signals after the after the tool editing self.ui.apertures_table.itemChanged.connect(self.on_tool_edit) @@ -3379,7 +3379,7 @@ class AppGerberEditor(QtCore.QObject): try: val_edited = float(self.ui.apertures_table.currentItem().text()) except ValueError as e: - log.debug("AppGerberEditor.on_tool_edit() --> %s" % str(e)) + self.app.log.debug("AppGerberEditor.on_tool_edit() --> %s" % str(e)) # self.ui.apertures_table.setCurrentItem(None) # we reactivate the signals after the after the tool editing self.ui.apertures_table.itemChanged.connect(self.on_tool_edit) @@ -3391,7 +3391,7 @@ class AppGerberEditor(QtCore.QObject): float(x.strip()) for x in self.ui.apertures_table.currentItem().text().split(",") if x != '' ] except ValueError as e: - log.debug("AppGerberEditor.on_tool_edit() --> %s" % str(e)) + self.app.log.debug("AppGerberEditor.on_tool_edit() --> %s" % str(e)) # we reactivate the signals after the after the tool editing self.ui.apertures_table.itemChanged.connect(self.on_tool_edit) return @@ -3595,7 +3595,7 @@ class AppGerberEditor(QtCore.QObject): try: QtGui.QGuiApplication.restoreOverrideCursor() except Exception as e: - log.debug("AppGerberEditor.deactivate_grb_editor() --> %s" % str(e)) + self.app.log.debug("AppGerberEditor.deactivate_grb_editor() --> %s" % str(e)) self.clear() @@ -3847,7 +3847,7 @@ class AppGerberEditor(QtCore.QObject): # we activate this after the initial build as we don't need to see the tool been populated self.ui.apertures_table.itemChanged.connect(self.on_tool_edit) except Exception as e: - log.debug("AppGerberEditor.edit_fcgerber() --> %s" % str(e)) + self.app.log.debug("AppGerberEditor.edit_fcgerber() --> %s" % str(e)) # apply the conversion factor on the obj.apertures conv_apertures = deepcopy(self.gerber_obj.apertures) @@ -3887,7 +3887,7 @@ class AppGerberEditor(QtCore.QObject): # else: # self.storage_dict[aperture_id][k] = self.gerber_obj.apertures[aperture_id][k] # except Exception as e: - # log.debug("AppGerberEditor.edit_fcgerber().job_thread() --> %s" % str(e)) + # self.app.log.debug("AppGerberEditor.edit_fcgerber().job_thread() --> %s" % str(e)) # # # Check promises and clear if exists # while True: @@ -3945,7 +3945,7 @@ class AppGerberEditor(QtCore.QObject): for elem in app_obj.gerber_obj.apertures[aper_id]['geometry']: if 'clear' in elem: global_clear_geo.append(elem['clear']) - log.warning("Found %d clear polygons." % len(global_clear_geo)) + self.app.log.warning("Found %d clear polygons." % len(global_clear_geo)) if global_clear_geo: global_clear_geo = unary_union(global_clear_geo) @@ -4008,7 +4008,8 @@ class AppGerberEditor(QtCore.QObject): app_obj.gerber_obj.apertures[ap_code]['geometry'] = deepcopy(temp_solid_geometry) - log.warning("Polygon difference done for %d apertures." % len(app_obj.gerber_obj.apertures)) + self.app.log.warning( + "Polygon difference done for %d apertures." % len(app_obj.gerber_obj.apertures)) try: # Loading the Geometry into Editor Storage @@ -4017,7 +4018,7 @@ class AppGerberEditor(QtCore.QObject): app_obj.pool.apply_async(app_obj.add_apertures, args=(ap_code, ap_dict)) ) except Exception as ee: - log.debug( + self.app.log.debug( "AppGerberEditor.edit_fcgerber.worker_job() Adding processes to pool --> %s" % str(ee)) traceback.print_exc() @@ -4056,7 +4057,7 @@ class AppGerberEditor(QtCore.QObject): else: storage_dict[k] = aperture_dict[k] except Exception as e: - log.debug("AppGerberEditor.edit_fcgerber().job_thread() --> %s" % str(e)) + self.app.log.debug("AppGerberEditor.edit_fcgerber().job_thread() --> %s" % str(e)) return [aperture_id, storage_dict] @@ -4085,7 +4086,7 @@ class AppGerberEditor(QtCore.QObject): try: self.plot_thread.stop() except Exception as e: - log.debug("AppGerberEditor.update_fcgerber() --> %s" % str(e)) + self.app.log.debug("AppGerberEditor.update_fcgerber() --> %s" % str(e)) if "_edit" in self.edited_obj_name: try: @@ -4222,7 +4223,7 @@ class AppGerberEditor(QtCore.QObject): try: self.app.app_obj.new_object("gerber", outname, obj_init) except Exception as e: - log.error("Error on Edited object creation: %s" % str(e)) + self.app.log.error("Error on Edited object creation: %s" % str(e)) # make sure to clean the previous results self.results = [] return @@ -4464,14 +4465,13 @@ class AppGerberEditor(QtCore.QObject): try: QtGui.QGuiApplication.restoreOverrideCursor() except Exception as e: - log.debug("AppGerberEditor.on_grb_click_release() --> %s" % str(e)) + self.app.log.debug("AppGerberEditor.on_grb_click_release() --> %s" % str(e)) if self.active_tool.complete is False and not isinstance(self.active_tool, SelectEditorGrb): self.active_tool.complete = True self.in_action = False self.delete_utility_geometry() - self.app.inform.emit('[success] %s' % - _("Done.")) + self.app.inform.emit('[success] %s' % _("Done.")) self.select_tool('select') else: self.app.cursor = QtGui.QCursor() @@ -4507,7 +4507,7 @@ class AppGerberEditor(QtCore.QObject): else: self.select_tool("select") except Exception as e: - log.warning("AppGerberEditor.on_grb_click_release() RMB click --> Error: %s" % str(e)) + self.app.log.warning("AppGerberEditor.on_grb_click_release() RMB click --> Error: %s" % str(e)) raise # if the released mouse button was LMB then test if we had a right-to-left selection or a left-to-right @@ -4525,7 +4525,7 @@ class AppGerberEditor(QtCore.QObject): # if self.selected: # self.plot_all() except Exception as e: - log.warning("AppGerberEditor.on_grb_click_release() LMB click --> Error: %s" % str(e)) + self.app.log.warning("AppGerberEditor.on_grb_click_release() LMB click --> Error: %s" % str(e)) raise def draw_selection_area_handler(self, start_pos, end_pos, sel_type): @@ -4561,7 +4561,7 @@ class AppGerberEditor(QtCore.QObject): try: self.ui.apertures_table.cellPressed.disconnect() except Exception as e: - log.debug("AppGerberEditor.draw_selection_Area_handler() --> %s" % str(e)) + self.app.log.debug("AppGerberEditor.draw_selection_Area_handler() --> %s" % str(e)) # select the aperture code of the selected geometry, in the tool table self.ui.apertures_table.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection) for aper in sel_aperture: @@ -4775,7 +4775,7 @@ class AppGerberEditor(QtCore.QObject): # # # self.plot_thread = threading.Thread(target=lambda: self.check_plot_finished(check_period)) # # self.plot_thread.start() - # log.debug("AppGerberEditor --> Delayed Plot started.") + # self.app.log.debug("AppGerberEditor --> Delayed Plot started.") # self.plot_thread = QtCore.QTimer() # self.plot_thread.setInterval(check_period) # self.plot_finished.connect(self.setup_ui_after_delayed_plot) @@ -4793,7 +4793,7 @@ class AppGerberEditor(QtCore.QObject): # if not self.grb_plot_promises: # self.plot_thread.stop() # self.plot_finished.emit() - # log.debug("AppGerberEditor --> delayed_plot finished") + # self.app.log.debug("AppGerberEditor --> delayed_plot finished") # except Exception as e: # traceback.print_exc() # @@ -4815,7 +4815,7 @@ class AppGerberEditor(QtCore.QObject): :return: None """ - log.debug("AppGerberEditor.on_zoom_fit()") + self.app.log.debug("AppGerberEditor.on_zoom_fit()") # calculate all the geometry in the edited Gerber object edit_geo = [] @@ -4991,7 +4991,7 @@ class AppGerberEditor(QtCore.QObject): def on_buffer(self): buff_value = 0.01 - log.debug("AppGerberEditor.on_buffer()") + self.app.log.debug("AppGerberEditor.on_buffer()") try: buff_value = float(self.ui.buffer_distance_entry.get_value()) @@ -5042,7 +5042,7 @@ class AppGerberEditor(QtCore.QObject): self.storage_dict[apcode]['geometry'] = [] self.storage_dict[apcode]['geometry'] = temp_storage except Exception as e: - log.debug("AppGerberEditor.buffer() --> %s" % str(e)) + self.app.log.debug("AppGerberEditor.buffer() --> %s" % str(e)) self.app.inform.emit('[ERROR_NOTCL] %s\n%s' % (_("Failed."), str(traceback.print_exc()))) return @@ -5051,7 +5051,7 @@ class AppGerberEditor(QtCore.QObject): def on_scale(self): scale_factor = 1.0 - log.debug("AppGerberEditor.on_scale()") + self.app.log.debug("AppGerberEditor.on_scale()") try: scale_factor = float(self.ui.scale_factor_entry.get_value()) @@ -5106,7 +5106,7 @@ class AppGerberEditor(QtCore.QObject): self.storage_dict[apcode]['geometry'] = temp_storage except Exception as e: - log.debug("AppGerberEditor.on_scale() --> %s" % str(e)) + self.app.log.debug("AppGerberEditor.on_scale() --> %s" % str(e)) self.plot_all() self.app.inform.emit('[success] %s' % _("Done.")) @@ -5181,7 +5181,7 @@ class AppGerberEditor(QtCore.QObject): if tool_name == 'markarea' or tool_name == 'all': self.ui.ma_tool_frame.hide() except Exception as e: - log.debug("AppGerberEditor.hide_tool() --> %s" % str(e)) + self.app.log.debug("AppGerberEditor.hide_tool() --> %s" % str(e)) self.app.ui.notebook.setCurrentWidget(self.app.ui.properties_tab) diff --git a/appEditors/appGCodeEditor.py b/appEditors/appGCodeEditor.py index f0bf185c..67313dc6 100644 --- a/appEditors/appGCodeEditor.py +++ b/appEditors/appGCodeEditor.py @@ -51,7 +51,7 @@ class AppGCodeEditor(QtCore.QObject): self.ui.update_gcode_sec_button.clicked.connect(self.insert_code_snippet_2) self.ui.exit_editor_button.clicked.connect(lambda: self.app.editor2object()) - log.debug("Initialization of the GCode Editor is finished ...") + self.app.log.debug("Initialization of the GCode Editor is finished ...") def set_ui(self): """ diff --git a/appGUI/GUIElements.py b/appGUI/GUIElements.py index ac52b897..727d38f5 100644 --- a/appGUI/GUIElements.py +++ b/appGUI/GUIElements.py @@ -3986,6 +3986,8 @@ class _ExpandableTextEdit(FCTextEdit): self.completer.insertText.connect(self.insertCompletion) self.completer.popup().clicked.connect(self.insert_completion_click) + self.on_escape_key = lambda: None + def set_model_data(self, keyword_list): self.model.setStringList(keyword_list) @@ -4054,6 +4056,8 @@ class _ExpandableTextEdit(FCTextEdit): return elif event.matches(QKeySequence.MoveToNextPage) or event.matches(QKeySequence.MoveToPreviousPage): return self._termWidget.browser().keyPressEvent(event) + elif event.key() == QtCore.Qt.Key_Escape: + self.on_escape_key() tc = self.textCursor() diff --git a/appTools/ToolShell.py b/appTools/ToolShell.py index 7f00dbed..a6ed0804 100644 --- a/appTools/ToolShell.py +++ b/appTools/ToolShell.py @@ -322,6 +322,10 @@ class FCShell(TermWidget): self.app.inform_shell[str, bool].connect(self.app.info_shell) self._browser.find_text = self.find_text + self._edit.on_escape_key = self.on_escape_key + + def on_escape_key(self): + self.app.plotcanvas.native.setFocus() def find_text(self): edit_cursor = self._edit.textCursor()