From e85b6f8d87a786ff80c7aa49a27c78d55155618a Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Sat, 13 Jun 2020 00:17:17 +0300 Subject: [PATCH] - Geometry UI - made again the header clickable and first click selects all rows, second click will deselect all rows. - Geometry UI - minor updates in the layout; moved the warning text to the tooltip of the generate_cncjob button - Geometry UI - working in making the modification of tool parameters such that if there is a selection of tools the modification in the Tool parameters will be applied to all selected --- CHANGELOG.md | 3 + appDatabase.py | 7 +-- appGUI/ObjectUI.py | 21 +++---- appObjects/FlatCAMGeometry.py | 115 ++++++++++++++++++++++------------ 4 files changed, 87 insertions(+), 59 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7bdf5b2c..1aa56b20 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,9 @@ CHANGELOG for FlatCAM beta - NCC Tool - allow no tool at NCC Tool start (the Preferences have no tool) - NCC Tool - optimized tool reset code - NCC Tool - fixed the non-rest copper clearing to work as expected: each tool in the tool table will make it's own copper clearing without interference from the rest of the tools +- Geometry UI - made again the header clickable and first click selects all rows, second click will deselect all rows. +- Geometry UI - minor updates in the layout; moved the warning text to the tooltip of the generate_cncjob button +- Geometry UI - working in making the modification of tool parameters such that if there is a selection of tools the modification in the Tool parameters will be applied to all selected 11.06.2020 diff --git a/appDatabase.py b/appDatabase.py index 01dba6e2..a99594f2 100644 --- a/appDatabase.py +++ b/appDatabase.py @@ -1973,11 +1973,7 @@ class ToolsDB2(QtWidgets.QWidget): self.on_tool_requested_from_app() def on_list_selection_change(self, current, previous): - # for idx in current.indexes(): - # print(idx.data()) - # print(current.text(0)) self.current_toolid = int(current.text(0)) - self.storage_to_form(self.db_tool_dict[current.text(0)]) def on_list_item_edited(self, item, column): @@ -2022,7 +2018,7 @@ class ToolsDB2(QtWidgets.QWidget): self.blockSignals(False) def setup_db_ui(self): - filename = self.app.data_path + '\geo_tools_db.FlatDB' + filename = self.app.data_path + '\\geo_tools_db.FlatDB' # load the database tools from the file try: @@ -2420,7 +2416,6 @@ class ToolsDB2(QtWidgets.QWidget): self.vdia_entry.valueChanged.connect(self.on_calculate_tooldia) self.vangle_entry.valueChanged.connect(self.on_calculate_tooldia) - def ui_disconnect(self): try: self.name_entry.editingFinished.disconnect(self.update_tree_name) diff --git a/appGUI/ObjectUI.py b/appGUI/ObjectUI.py index 3cad638a..3bf479a6 100644 --- a/appGUI/ObjectUI.py +++ b/appGUI/ObjectUI.py @@ -1005,8 +1005,8 @@ class ExcellonObjectUI(ObjectUI): "If no value is entered then there is no move\n" "on X,Y plane at the end of the job.") ) - self.endxy_entry = FCEntry() - + self.endxy_entry = NumericalEvalTupleEntry(border_color='#0069A9') + self.endxy_entry.setPlaceholderText(_("X,Y coordinates")) self.grid5.addWidget(endmove_xy_label, 12, 0) self.grid5.addWidget(self.endxy_entry, 12, 1) @@ -1907,7 +1907,8 @@ class GeometryObjectUI(ObjectUI): "If no value is entered then there is no move\n" "on X,Y plane at the end of the job.") ) - self.endxy_entry = FCEntry() + self.endxy_entry = NumericalEvalTupleEntry(border_color='#0069A9') + self.endxy_entry.setPlaceholderText(_("X,Y coordinates")) grid4.addWidget(endmove_xy_label, 10, 0) grid4.addWidget(self.endxy_entry, 10, 1) @@ -2033,19 +2034,15 @@ class GeometryObjectUI(ObjectUI): separator_line2.setFrameShadow(QtWidgets.QFrame.Sunken) grid4.addWidget(separator_line2, 15, 0, 1, 2) - warning_lbl = QtWidgets.QLabel( + # Button + self.generate_cnc_button = QtWidgets.QPushButton(_('Generate CNCJob object')) + self.generate_cnc_button.setToolTip('%s\n%s' % ( + _("Generate CNCJob object."), _( "Add / Select at least one tool in the tool-table.\n" "Click the # header to select all, or Ctrl + LMB\n" - "for custom selection of tools." - )) - grid4.addWidget(warning_lbl, 16, 0, 1, 2) + "for custom selection of tools."))) - # Button - self.generate_cnc_button = QtWidgets.QPushButton(_('Generate CNCJob object')) - self.generate_cnc_button.setToolTip( - _("Generate the CNC Job object.") - ) self.generate_cnc_button.setStyleSheet(""" QPushButton { diff --git a/appObjects/FlatCAMGeometry.py b/appObjects/FlatCAMGeometry.py index 60dffc96..935b6fd9 100644 --- a/appObjects/FlatCAMGeometry.py +++ b/appObjects/FlatCAMGeometry.py @@ -156,8 +156,7 @@ class GeometryObject(FlatCAMObj, Geometry): self.param_fields = {} # store here the state of the exclusion checkbox state to be restored after building the UI - # TODO add this in the sel.app.defaults dict and in Preferences - self.exclusion_area_cb_is_checked = False + self.exclusion_area_cb_is_checked = self.app.defaults["geometry_area_exclusion"] # Attributes to be included in serialization # Always append to it because it carries contents @@ -729,7 +728,7 @@ class GeometryObject(FlatCAMObj, Geometry): # self.ui.geo_tools_table.currentItemChanged.connect(self.on_row_selection_change) self.ui.geo_tools_table.clicked.connect(self.on_row_selection_change) - self.ui.geo_tools_table.horizontalHeader().sectionClicked.connect(self.on_row_selection_change) + self.ui.geo_tools_table.horizontalHeader().sectionClicked.connect(self.on_toggle_all_rows) self.ui.geo_tools_table.itemChanged.connect(self.on_tool_edit) self.ui.tool_offset_entry.returnPressed.connect(self.on_offset_value_edited) @@ -822,6 +821,26 @@ class GeometryObject(FlatCAMObj, Geometry): except (TypeError, AttributeError): pass + def on_toggle_all_rows(self): + """ + will toggle the selection of all rows in Tools table + + :return: + """ + sel_model = self.ui.geo_tools_table.selectionModel() + sel_indexes = sel_model.selectedIndexes() + + # it will iterate over all indexes which means all items in all columns too but I'm interested only on rows + sel_rows = set() + for idx in sel_indexes: + sel_rows.add(idx.row()) + + if len(sel_rows) == self.ui.geo_tools_table.rowCount(): + self.ui.geo_tools_table.clearSelection() + else: + self.ui.geo_tools_table.selectAll() + self.update_ui() + def on_row_selection_change(self): self.update_ui() @@ -849,6 +868,31 @@ class GeometryObject(FlatCAMObj, Geometry): else: self.ui.generate_cnc_button.setDisabled(False) + # update the QLabel that shows for which Tool we have the parameters in the UI form + if len(sel_rows) == 1: + current_row = sel_rows[0] + + # populate the form with the data from the tool associated with the row parameter + try: + item = self.ui.geo_tools_table.item(current_row, 5) + if type(item) is not None: + tooluid = int(item.text()) + else: + self.ui_connect() + return + except Exception as e: + log.debug("Tool missing. Add a tool in Geo Tool Table. %s" % str(e)) + self.ui_connect() + return + + self.ui.tool_data_label.setText( + "%s: %s %d" % (_('Parameters for'), _("Tool"), tooluid) + ) + else: + self.ui.tool_data_label.setText( + "%s: %s" % (_('Parameters for'), _("Multiple Tools")) + ) + for current_row in sel_rows: self.set_tool_offset_visibility(current_row) @@ -865,47 +909,36 @@ class GeometryObject(FlatCAMObj, Geometry): self.ui_connect() return - # update the QLabel that shows for which Tool we have the parameters in the UI form - if len(sel_rows) == 1: - self.ui.tool_data_label.setText( - "%s: %s %d" % (_('Parameters for'), _("Tool"), tooluid) - ) - - # update the form with the V-Shape fields if V-Shape selected in the geo_tool_table - # also modify the Cut Z form entry to reflect the calculated Cut Z from values got from V-Shape Fields - try: - item = self.ui.geo_tools_table.cellWidget(current_row, 4) - if item is not None: - tool_type_txt = item.currentText() - self.ui_update_v_shape(tool_type_txt=tool_type_txt) - else: - self.ui_connect() - return - except Exception as e: - log.debug("Tool missing in ui_update_v_shape(). Add a tool in Geo Tool Table. %s" % str(e)) + # update the form with the V-Shape fields if V-Shape selected in the geo_tool_table + # also modify the Cut Z form entry to reflect the calculated Cut Z from values got from V-Shape Fields + try: + item = self.ui.geo_tools_table.cellWidget(current_row, 4) + if item is not None: + tool_type_txt = item.currentText() + self.ui_update_v_shape(tool_type_txt=tool_type_txt) + else: + self.ui_connect() return + except Exception as e: + log.debug("Tool missing in ui_update_v_shape(). Add a tool in Geo Tool Table. %s" % str(e)) + return - try: - # set the form with data from the newly selected tool - for tooluid_key, tooluid_value in list(self.tools.items()): - if int(tooluid_key) == tooluid: - for key, value in list(tooluid_value.items()): - if key == 'data': - form_value_storage = tooluid_value['data'] - self.update_form(form_value_storage) - if key == 'offset_value': - # update the offset value in the entry even if the entry is hidden - self.ui.tool_offset_entry.set_value(tooluid_value['offset_value']) + try: + # set the form with data from the newly selected tool + for tooluid_key, tooluid_value in list(self.tools.items()): + if int(tooluid_key) == tooluid: + for key, value in list(tooluid_value.items()): + if key == 'data': + form_value_storage = tooluid_value['data'] + self.update_form(form_value_storage) + if key == 'offset_value': + # update the offset value in the entry even if the entry is hidden + self.ui.tool_offset_entry.set_value(tooluid_value['offset_value']) - if key == 'tool_type' and value == 'V': - self.update_cutz() - except Exception as e: - log.debug("GeometryObject.update_ui() -> %s " % str(e)) - - else: - self.ui.tool_data_label.setText( - "%s: %s" % (_('Parameters for'), _("Multiple Tools")) - ) + if key == 'tool_type' and value == 'V': + self.update_cutz() + except Exception as e: + log.debug("GeometryObject.update_ui() -> %s " % str(e)) self.ui_connect()